001 package cpw.mods.fml.common.discovery;
002
003 import java.util.List;
004 import java.util.Map;
005 import java.util.Set;
006
007 import com.google.common.base.Predicate;
008 import com.google.common.collect.HashMultimap;
009 import com.google.common.collect.ImmutableMap;
010 import com.google.common.collect.ImmutableSetMultimap;
011 import com.google.common.collect.Lists;
012 import com.google.common.collect.Multimap;
013 import com.google.common.collect.Multimaps;
014 import com.google.common.collect.SetMultimap;
015
016 import cpw.mods.fml.common.ModContainer;
017
018 public 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 }