/* * 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 com.github.devnied.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 com.github.devnied.emvnfccard.iso7816emv.ITag; import com.github.devnied.emvnfccard.model.EmvTransactionRecord; import com.github.devnied.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; } }