001/* 002 * Forge Mod Loader 003 * Copyright (c) 2012-2013 cpw. 004 * All rights reserved. This program and the accompanying materials 005 * are made available under the terms of the GNU Lesser Public License v2.1 006 * which accompanies this distribution, and is available at 007 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html 008 * 009 * Contributors: 010 * cpw - implementation 011 */ 012 013package cpw.mods.fml.common; 014 015import java.io.InputStream; 016import java.io.InputStreamReader; 017import java.util.Map; 018import java.util.logging.Level; 019 020import argo.jdom.JdomParser; 021import argo.jdom.JsonNode; 022import argo.jdom.JsonRootNode; 023import argo.saj.InvalidSyntaxException; 024 025import com.google.common.base.Throwables; 026import com.google.common.collect.Maps; 027 028public class MetadataCollection 029{ 030 private static JdomParser parser = new JdomParser(); 031 private Map<String, ModMetadata> metadatas = Maps.newHashMap(); 032 private int metadataVersion = 1; 033 034 public static MetadataCollection from(InputStream inputStream, String sourceName) 035 { 036 if (inputStream == null) 037 { 038 return new MetadataCollection(); 039 } 040 041 InputStreamReader reader = new InputStreamReader(inputStream); 042 try 043 { 044 JsonRootNode root = parser.parse(reader); 045 if (root.hasElements()) 046 { 047 return parse10ModInfo(root); 048 } 049 else 050 { 051 return parseModInfo(root); 052 } 053 } 054 catch (InvalidSyntaxException e) 055 { 056 FMLLog.log(Level.SEVERE, e, "The mcmod.info file in %s cannot be parsed as valid JSON. It will be ignored", sourceName); 057 return new MetadataCollection(); 058 } 059 catch (Exception e) 060 { 061 throw Throwables.propagate(e); 062 } 063 } 064 065 private static MetadataCollection parseModInfo(JsonRootNode root) 066 { 067 MetadataCollection mc = new MetadataCollection(); 068 mc.metadataVersion = Integer.parseInt(root.getNumberValue("modinfoversion")); 069 mc.parseModMetadataList(root.getNode("modlist")); 070 return mc; 071 } 072 073 private static MetadataCollection parse10ModInfo(JsonRootNode root) 074 { 075 MetadataCollection mc = new MetadataCollection(); 076 mc.parseModMetadataList(root); 077 return mc; 078 } 079 080 private void parseModMetadataList(JsonNode metadataList) 081 { 082 for (JsonNode node : metadataList.getElements()) 083 { 084 ModMetadata mmd = new ModMetadata(node); 085 metadatas.put(mmd.modId, mmd); 086 } 087 } 088 089 public ModMetadata getMetadataForId(String modId, Map<String, Object> extraData) 090 { 091 if (!metadatas.containsKey(modId)) 092 { 093 ModMetadata dummy = new ModMetadata(); 094 dummy.modId = modId; 095 dummy.name = (String) extraData.get("name"); 096 dummy.version = (String) extraData.get("version"); 097 dummy.autogenerated = true; 098 metadatas.put(modId, dummy); 099 } 100 return metadatas.get(modId); 101 } 102 103}