content: /*
   * Copyright (C) 2013 MILLAU Julien
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package io.github.tapcard.emvnfccard.parser.apdu.annotation;
  
  import java.lang.reflect.Field;
  import java.util.HashMap;
  import java.util.Map;
  import java.util.Set;
  import java.util.TreeSet;
  
  import io.github.tapcard.emvnfccard.iso7816emv.ITag;
  import io.github.tapcard.emvnfccard.model.EmvTransactionRecord;
  import io.github.tapcard.emvnfccard.parser.apdu.IFile;
  
  /**
   * Class used to manage all annotation
   * 
   * @author MILLAU Julien
   * 
   */
  public final class AnnotationUtils {
  
  	/**
  	 * List of annoted class
  	 */
  	@SuppressWarnings("unchecked")
  	private static final Class<? extends IFile>[] LISTE_CLASS = new Class[] { EmvTransactionRecord.class };
  
  	/**
  	 * AnnotationUtils singleton
  	 */
  	private static final AnnotationUtils INSTANCE = new AnnotationUtils();
  
  	/**
  	 * Method to get the unique instance of the class
  	 * 
  	 * @return AnnotationUtils instance
  	 */
  	public static AnnotationUtils getInstance() {
  		return INSTANCE;
  	}
  
  	/**
  	 * Map which contain
  	 */
  	private final Map<String, Map<ITag, AnnotationData>> map;
  	private final Map<String, Set<AnnotationData>> mapSet;
  
  	/**
  	 * Private default constructor
  	 */
  	private AnnotationUtils() {
  		map = new HashMap<String, Map<ITag, AnnotationData>>();
  		mapSet = new HashMap<String, Set<AnnotationData>>();
  		extractAnnotation();
  	}
  
  	/**
  	 * Method to extract all annotation information and store them in the map
  	 */
  	private void extractAnnotation() {
  		for (Class<? extends IFile> clazz : LISTE_CLASS) {
  
  			Map<ITag, AnnotationData> maps = new HashMap<ITag, AnnotationData>();
  			Set<AnnotationData> set = new TreeSet<AnnotationData>();
  
  			Field[] fields = clazz.getDeclaredFields();
  			for (Field field : fields) {
  				AnnotationData param = new AnnotationData();
  				field.setAccessible(true);
  				param.setField(field);
  				Data annotation = field.getAnnotation(Data.class);
  				if (annotation != null) {
  					param.initFromAnnotation(annotation);
  					maps.put(param.getTag(), param);
  					try {
  						set.add((AnnotationData) param.clone());
  					} catch (CloneNotSupportedException e) {
  						// do nothing
  					}
  				}
  			}
  			mapSet.put(clazz.getName(), set);
  			map.put(clazz.getName(), maps);
  		}
  	}
  
  	/**
  	 * Getter map set
  	 * 
  	 * @return the map
  	 */
  	public Map<String, Set<AnnotationData>> getMapSet() {
  		return mapSet;
  	}
  
  	/**
  	 * Getter map
  	 * 
  	 * @return the map
  	 */
  	public Map<String, Map<ITag, AnnotationData>> getMap() {
  		return map;
  	}
  
  }
  