package sk.tomsik68.mclauncher.impl.versions.mcdownload; import net.minidev.json.JSONArray; import net.minidev.json.JSONObject; import sk.tomsik68.mclauncher.api.common.MCLauncherAPI; import sk.tomsik68.mclauncher.api.json.IJSONSerializable; import sk.tomsik68.mclauncher.api.versions.IVersion; import sk.tomsik68.mclauncher.api.versions.IVersionInstaller; import sk.tomsik68.mclauncher.api.versions.IVersionLauncher; import sk.tomsik68.mclauncher.impl.versions.mcdownload.Rule.Action; import java.util.ArrayList; import java.util.List; final class MCDownloadVersion implements IVersion, IJSONSerializable { private static final MCDownloadVersionInstaller installer = new MCDownloadVersionInstaller(); private static final IVersionLauncher launcher = new MCDownloadVersionLauncher(); private static final String DEFAULT_ASSETS_INDEX = "legacy"; private String id, time, releaseTime, type, minecraftArgs, mainClass, jarVersion; private int minimumLauncherVersion; private final JSONObject json; private String incompatibilityReason, processArgs, assets, inheritsFrom; private ArrayList<Rule> rules = new ArrayList<Rule>(); private ArrayList<Library> libraries = new ArrayList<Library>(); private boolean needsInheritance; MCDownloadVersion(JSONObject json) { this.json = json; id = json.get("id").toString(); if(json.containsKey("jar")) { jarVersion = json.get("jar").toString(); } else { jarVersion = id; } time = json.get("time").toString(); releaseTime = json.get("releaseTime").toString(); type = json.get("type").toString(); if (json.containsKey("processArguments")) processArgs = json.get("processArguments").toString(); minecraftArgs = json.get("minecraftArguments").toString(); minimumLauncherVersion = Integer.parseInt(json.get("minimumLauncherVersion").toString()); mainClass = json.get("mainClass").toString(); if (json.containsKey("assets")) assets = json.get("assets").toString(); else assets = DEFAULT_ASSETS_INDEX; if (json.containsKey("rules")) { JSONArray rulesArray = (JSONArray) json.get("rules"); for (Object o : rulesArray) { JSONObject jsonRule = (JSONObject) o; rules.add(new Rule(jsonRule)); } } if (json.containsKey("libraries")) { JSONArray libs = (JSONArray) json.get("libraries"); for (int i = 0; i < libs.size(); ++i) { libraries.add(new Library((JSONObject) libs.get(i))); } } if (json.containsKey("incompatibilityReason")) incompatibilityReason = json.get("incompatibilityReason").toString(); if (json.containsKey("inheritsFrom")) { inheritsFrom = json.get("inheritsFrom").toString(); needsInheritance = true; } else needsInheritance = false; } @Override public int compareTo(IVersion arg0) { return getId().compareTo(arg0.getId()); } @Override public String getDisplayName() { return type.concat(" ").concat(id); } @Override public String getId() { return id; } @Override public String getUniqueID() { return type.charAt(0) + getId(); } String getTime() { return time; } String getReleaseTime() { return releaseTime; } String getType() { return type; } String getProcessArgs() { return processArgs; } String getMinecraftArgs() { return minecraftArgs; } int getMinimumLauncherVersion() { return minimumLauncherVersion; } String getMainClass() { return mainClass; } String getInheritsFrom(){ return inheritsFrom; } @Override public String getIncompatibilityReason() { return incompatibilityReason; } @Override public IVersionInstaller getInstaller() { return installer; } @Override public IVersionLauncher getLauncher() { return launcher; } List<Library> getLibraries() { return libraries; } /** * * @return True if this version is compatible with our current operating system */ public boolean isCompatible() { Action action = null; for (Rule rule : rules) { if (rule.applies()) action = rule.getAction(); } return rules.isEmpty() || action == Action.ALLOW; } @Override public JSONObject toJSON() { return json; } String getAssetsIndexName() { return assets; } boolean needsInheritance(){ return needsInheritance; } String getJarVersion(){ return jarVersion; } void doInherit(MCDownloadVersion parent) { MCLauncherAPI.log.finer("Inheriting version ".concat(id).concat(" from ").concat(parent.getId())); if(!parent.getId().equals(getInheritsFrom())){ throw new IllegalArgumentException("Wrong inheritance version passed!"); } if(minecraftArgs == null) minecraftArgs = parent.getMinecraftArgs(); if(mainClass == null) mainClass = parent.getMainClass(); if(incompatibilityReason == null) incompatibilityReason = parent.getIncompatibilityReason(); if(assets == null) assets = parent.getAssetsIndexName(); libraries.addAll(parent.getLibraries()); rules.addAll(parent.rules); if(jarVersion == null || jarVersion.isEmpty()){ jarVersion = parent.getJarVersion(); } if(rules.isEmpty()) rules.addAll(parent.rules); needsInheritance = false; MCLauncherAPI.log.finer("Inheriting version ".concat(id).concat(" finished.")); } }