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    }