001 package cpw.mods.fml.common;
002
003 import java.io.InputStream;
004 import java.io.InputStreamReader;
005 import java.util.Map;
006 import java.util.logging.Level;
007
008 import argo.jdom.JdomParser;
009 import argo.jdom.JsonNode;
010 import argo.jdom.JsonRootNode;
011 import argo.saj.InvalidSyntaxException;
012
013 import com.google.common.base.Throwables;
014 import com.google.common.collect.Maps;
015
016 public class MetadataCollection
017 {
018 private static JdomParser parser = new JdomParser();
019 private Map<String, ModMetadata> metadatas = Maps.newHashMap();
020 private int metadataVersion = 1;
021
022 public static MetadataCollection from(InputStream inputStream, String sourceName)
023 {
024 if (inputStream == null)
025 {
026 return new MetadataCollection();
027 }
028
029 InputStreamReader reader = new InputStreamReader(inputStream);
030 try
031 {
032 JsonRootNode root = parser.parse(reader);
033 if (root.hasElements())
034 {
035 return parse10ModInfo(root);
036 }
037 else
038 {
039 return parseModInfo(root);
040 }
041 }
042 catch (InvalidSyntaxException e)
043 {
044 FMLLog.log(Level.SEVERE, e, "The mcmod.info file in %s cannot be parsed as valid JSON. It will be ignored", sourceName);
045 return new MetadataCollection();
046 }
047 catch (Exception e)
048 {
049 throw Throwables.propagate(e);
050 }
051 }
052
053 private static MetadataCollection parseModInfo(JsonRootNode root)
054 {
055 MetadataCollection mc = new MetadataCollection();
056 mc.metadataVersion = Integer.parseInt(root.getNumberValue("modinfoversion"));
057 mc.parseModMetadataList(root.getNode("modlist"));
058 return mc;
059 }
060
061 private static MetadataCollection parse10ModInfo(JsonRootNode root)
062 {
063 MetadataCollection mc = new MetadataCollection();
064 mc.parseModMetadataList(root);
065 return mc;
066 }
067
068 private void parseModMetadataList(JsonNode metadataList)
069 {
070 for (JsonNode node : metadataList.getElements())
071 {
072 ModMetadata mmd = new ModMetadata(node);
073 metadatas.put(mmd.modId, mmd);
074 }
075 }
076
077 public ModMetadata getMetadataForId(String modId, Map<String, Object> extraData)
078 {
079 if (!metadatas.containsKey(modId))
080 {
081 ModMetadata dummy = new ModMetadata();
082 dummy.modId = modId;
083 dummy.name = (String) extraData.get("name");
084 dummy.version = (String) extraData.get("version");
085 dummy.autogenerated = true;
086 metadatas.put(modId, dummy);
087 }
088 return metadatas.get(modId);
089 }
090
091 }