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}