ForgePatch/src/main/java/net/minecraftforge/fml/common/MetadataCollection.java

128 lines
4.2 KiB
Java
Raw Normal View History

/*
* Minecraft Forge
* Copyright (c) 2016-2018.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
2014-09-23 05:01:24 +00:00
package net.minecraftforge.fml.common;
2012-07-22 14:26:38 +00:00
import java.io.IOException;
2012-07-22 14:26:38 +00:00
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
2012-07-22 14:26:38 +00:00
import java.util.Map;
2014-09-23 05:01:24 +00:00
import net.minecraftforge.fml.common.versioning.ArtifactVersion;
import net.minecraftforge.fml.common.versioning.VersionParser;
2012-07-22 14:26:38 +00:00
import com.google.common.collect.Maps;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonParser;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
2012-07-22 14:26:38 +00:00
import javax.annotation.Nullable;
2012-07-22 14:26:38 +00:00
public class MetadataCollection
{
private String modListVersion;
private ModMetadata[] modList;
2012-07-22 14:26:38 +00:00
private Map<String, ModMetadata> metadatas = Maps.newHashMap();
public static MetadataCollection from(@Nullable InputStream inputStream, String sourceName)
2012-07-22 14:26:38 +00:00
{
2012-07-23 19:03:17 +00:00
if (inputStream == null)
{
return new MetadataCollection();
}
2012-08-23 20:43:28 +00:00
InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
2012-07-22 14:26:38 +00:00
try
{
MetadataCollection collection;
Gson gson = new GsonBuilder().registerTypeAdapter(ArtifactVersion.class, new ArtifactVersionAdapter()).create();
JsonParser parser = new JsonParser();
JsonElement rootElement = parser.parse(reader);
if (rootElement.isJsonArray())
2012-07-22 14:26:38 +00:00
{
collection = new MetadataCollection();
JsonArray jsonList = rootElement.getAsJsonArray();
collection.modList = new ModMetadata[jsonList.size()];
int i = 0;
for (JsonElement mod : jsonList)
{
collection.modList[i++]=gson.fromJson(mod, ModMetadata.class);
}
2012-07-22 14:26:38 +00:00
}
else
{
collection = gson.fromJson(rootElement, MetadataCollection.class);
2012-07-22 14:26:38 +00:00
}
collection.parseModMetadataList();
return collection;
2012-07-22 14:26:38 +00:00
}
catch (JsonParseException e)
2012-08-23 20:43:28 +00:00
{
FMLLog.log.error("The mcmod.info file in {} cannot be parsed as valid JSON. It will be ignored", sourceName, e);
2012-08-23 21:27:53 +00:00
return new MetadataCollection();
2012-08-23 20:43:28 +00:00
}
2012-07-22 14:26:38 +00:00
}
private void parseModMetadataList()
2012-07-22 14:26:38 +00:00
{
for (ModMetadata modMetadata : modList)
2012-07-22 14:26:38 +00:00
{
metadatas.put(modMetadata.modId, modMetadata);
2012-07-22 14:26:38 +00:00
}
}
2012-07-23 19:03:17 +00:00
public ModMetadata getMetadataForId(String modId, Map<String, Object> extraData)
2012-07-22 14:26:38 +00:00
{
2012-07-23 19:03:17 +00:00
if (!metadatas.containsKey(modId))
{
ModMetadata dummy = new ModMetadata();
dummy.modId = modId;
dummy.name = (String) extraData.get("name");
dummy.version = (String) extraData.get("version");
dummy.autogenerated = true;
metadatas.put(modId, dummy);
}
2012-07-22 14:26:38 +00:00
return metadatas.get(modId);
}
public static class ArtifactVersionAdapter extends TypeAdapter<ArtifactVersion>
{
@Override
public void write(JsonWriter out, ArtifactVersion value) throws IOException
{
// no op - we never write these out
}
@Override
public ArtifactVersion read(JsonReader in) throws IOException
{
return VersionParser.parseVersionReference(in.nextString());
}
}
2012-07-22 14:26:38 +00:00
}