    001package cpw.mods.fml.common.discovery;
    002
    003import java.util.List;
    004import java.util.Map;
    005import java.util.Set;
    006
    007import com.google.common.base.Predicate;
    008import com.google.common.collect.HashMultimap;
    009import com.google.common.collect.ImmutableMap;
    010import com.google.common.collect.ImmutableSetMultimap;
    011import com.google.common.collect.Lists;
    012import com.google.common.collect.Multimap;
    013import com.google.common.collect.Multimaps;
    014import com.google.common.collect.SetMultimap;
    015
    016import cpw.mods.fml.common.ModContainer;
    017
    018public class ASMDataTable
    019{
    020    public static class ASMData
    021    {
    022        private ModCandidate candidate;
    023        private String annotationName;
    024        private String className;
    025        private String objectName;
    026        private Map<String,Object> annotationInfo;
    027        public ASMData(ModCandidate candidate, String annotationName, String className, String objectName, Map<String,Object> info)
    028        {
    029            this.candidate = candidate;
    030            this.annotationName = annotationName;
    031            this.className = className;
    032            this.objectName = objectName;
    033            this.annotationInfo = info;
    034        }
    035        public ModCandidate getCandidate()
    036        {
    037            return candidate;
    038        }
    039        public String getAnnotationName()
    040        {
    041            return annotationName;
    042        }
    043        public String getClassName()
    044        {
    045            return className;
    046        }
    047        public String getObjectName()
    048        {
    049            return objectName;
    050        }
    051        public Map<String, Object> getAnnotationInfo()
    052        {
    053            return annotationInfo;
    054        }
    055    }
    056
    057    private static class ModContainerPredicate implements Predicate<ASMData>
    058    {
    059        private ModContainer container;
    060        public ModContainerPredicate(ModContainer container)
    061        {
    062            this.container = container;
    063        }
    064        public boolean apply(ASMData data)
    065        {
    066            return container.getSource().equals(data.candidate.getModContainer());
    067        }
    068    }
    069    private SetMultimap<String, ASMData> globalAnnotationData = HashMultimap.create();
    070    private Map<ModContainer, SetMultimap<String,ASMData>> containerAnnotationData;
    071
    072    private List<ModContainer> containers = Lists.newArrayList();
    073
    074    public SetMultimap<String,ASMData> getAnnotationsFor(ModContainer container)
    075    {
    076        if (containerAnnotationData == null)
    077        {
    078            ImmutableMap.Builder<ModContainer, SetMultimap<String, ASMData>> mapBuilder = ImmutableMap.<ModContainer, SetMultimap<String,ASMData>>builder();
    079            for (ModContainer cont : containers)
    080            {
    081                Multimap<String, ASMData> values = Multimaps.filterValues(globalAnnotationData, new ModContainerPredicate(cont));
    082                mapBuilder.put(cont, ImmutableSetMultimap.copyOf(values));
    083            }
    084            containerAnnotationData = mapBuilder.build();
    085        }
    086        return containerAnnotationData.get(container);
    087    }
    088
    089    public Set<ASMData> getAll(String annotation)
    090    {
    091        return globalAnnotationData.get(annotation);
    092    }
    093
    094    public void addASMData(ModCandidate candidate, String annotation, String className, String objectName, Map<String,Object> annotationInfo)
    095    {
    096        globalAnnotationData.put(annotation, new ASMData(candidate, annotation, className, objectName, annotationInfo));
    097    }
    098
    099    public void addContainer(ModContainer container)
    100    {
    101        this.containers.add(container);
    102    }
    103}