package de.tobiyas.racesandclasses.standalonegui.data.option; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Set; import de.tobiyas.racesandclasses.standalonegui.data.GuiTrait; import de.tobiyas.racesandclasses.traitcontainer.interfaces.annotations.configuration.RemoveSuperConfigField; import de.tobiyas.racesandclasses.traitcontainer.interfaces.annotations.configuration.TraitConfigurationField; import de.tobiyas.racesandclasses.traitcontainer.interfaces.annotations.configuration.TraitInfos; import de.tobiyas.racesandclasses.util.traitutil.TraitConfigParser; public class TraitGuiConfigParser { /** * Parses a Trait. * * @param clazz to parse. * * @return the parsed Trait. */ public static GuiTrait generateEmptyConfig(Class<? extends de.tobiyas.racesandclasses.traitcontainer.interfaces.markerinterfaces.Trait> clazz){ //first read the needed fields and generate own data. List<TraitConfigurationField> annotationList = TraitConfigParser.getAllTraitConfigFieldsOfTrait(clazz); List<RemoveSuperConfigField> removedFields = TraitConfigParser.getAllTraitRemovedFieldsOfTrait(clazz); Iterator<TraitConfigurationField> it = annotationList.iterator(); List<TraitConfigOption> neededOptions = new LinkedList<TraitConfigOption>(); List<TraitConfigOption> optionalOptions = new LinkedList<TraitConfigOption>(); Set<String> seen = new HashSet<String>(); while(it.hasNext()){ TraitConfigurationField field = it.next(); boolean optional = field.optional(); String name = field.fieldName(); if(!optional){ for(RemoveSuperConfigField val : removedFields){ if(val.name().equalsIgnoreCase(name)) optional = true; } } TraitConfigOption option = ConfigOptionFactory.generateOverride(field, optional); if(option == null) continue; if(seen.contains(name)) continue; seen.add(name); if(optional) optionalOptions.add(option); else neededOptions.add(option); } //now we have the data. //We still need the name. String traitName = ""; try{ TraitInfos infos = clazz.getMethod("importTrait").getAnnotation(TraitInfos.class); if(infos == null) return null; traitName = infos.traitName(); }catch(Throwable exp){ exp.printStackTrace(); return null; } //now we have the name and the config. //let's build it. GuiTrait trait = new GuiTrait(traitName, neededOptions, optionalOptions); return trait; } }