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 }