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 }