package org.maltparser.core.config.version; import java.io.File; import java.util.Date; import java.util.jar.JarEntry; import org.maltparser.core.helper.SystemInfo; import org.maltparser.core.helper.SystemLogger; public class Versioning { private String maltParserVersion; private String parserModelVersion; private File mcoPath; private String configName; private String newConfigName; private String configType; private String featureModelXML; private String inputFormatXML; public static String[] availableVersions = {"1.0.0", "1.0.1", "1.0.2", "1.0.3", "1.1", "1.2", "1.3", "1.3.1", "1.4", "1.4.1"}; public static boolean[] supportVersions = {false, false, false, false, false, false, true, true, true}; public Versioning(String configName, String configType, File mcoPath, String parserModelVersion) { setConfigName(configName); setConfigType(configType); setMcoPath(mcoPath); setMaltParserVersion(SystemInfo.getVersion()); setParserModelVersion(parserModelVersion); setNewConfigName(configName+"."+maltParserVersion); } public JarEntry getJarEntry(JarEntry in) { if (maltParserVersion.equals(parserModelVersion)) { return in; } String entryName = in.getName().replace(configName+File.separator, newConfigName+File.separator); if (entryName.endsWith(".info")) { return new JarEntry(entryName.replace(File.separator+configName+"_", File.separator+newConfigName+"_")); } return new JarEntry(entryName); } public boolean hasChanges(JarEntry in, JarEntry out) { if (maltParserVersion.equals(parserModelVersion)) { return false; } if (in.getName().endsWith(".info") || in.getName().endsWith(".sop")) { return true; } return false; } public String modifyJarEntry(JarEntry in, JarEntry out, StringBuilder sb) { if (maltParserVersion.equals(parserModelVersion)) { return sb.toString(); } if (in.getName().endsWith(".info")) { final StringBuilder outString = new StringBuilder(); String[] lines = sb.toString().split("\\n"); for (int i = 0; i < lines.length; i++) { if (lines[i].startsWith("Configuration name:")) { outString.append("Configuration name: "); outString.append(configName); outString.append('.'); outString.append(maltParserVersion); outString.append('\n'); } else if (lines[i].startsWith("Created:")) { outString.append(lines[i]); outString.append('\n'); outString.append("Converted: "); outString.append(new Date(System.currentTimeMillis())); outString.append('\n'); } else if (lines[i].startsWith("Version:")) { outString.append("Version: "); outString.append(maltParserVersion); outString.append('\n'); outString.append("Created by: "); outString.append(parserModelVersion); outString.append('\n'); } else if (lines[i].startsWith(" name ( -c) ")) { outString.append(" name ( -c) "); outString.append(newConfigName); outString.append('\n'); } else if (lines[i].startsWith(" format ( -if) /appdata/dataformat/")) { outString.append(" format ( -if) "); int index = lines[i].lastIndexOf("/"); outString.append(lines[i].substring(index + 1)); outString.append('\n'); } else if (lines[i].startsWith(" format ( -of) /appdata/dataformat/")) { outString.append(" format ( -of) "); int index = lines[i].lastIndexOf("/"); outString.append(lines[i].substring(index + 1)); outString.append('\n'); } else if (lines[i].startsWith("--guide-features ( -F) /appdata/features/")) { outString.append("--guide-features ( -F) "); int index = lines[i].lastIndexOf("/"); outString.append(lines[i].substring(index + 1)); outString.append('\n'); } else { outString.append(lines[i]); outString.append('\n'); } } return outString.toString(); } else if (in.getName().endsWith(".sop")) { final StringBuilder outString = new StringBuilder(); String[] lines = sb.toString().split("\\n"); for (int i = 0; i < lines.length; i++) { int index = lines[i].indexOf('\t'); int container = 0; if (index > -1) { container = Integer.parseInt(lines[i].substring(0,index)); } if (lines[i].startsWith(container+"\tguide\tfeatures")) { int tabIndex = lines[i].lastIndexOf('\t'); if (lines[i].substring(tabIndex+1).startsWith("/appdata/features/")) { int slashIndex = lines[i].lastIndexOf("/"); String xmlFile = lines[i].substring(slashIndex+1); String path = lines[i].substring(tabIndex+1, slashIndex); setFeatureModelXML(path + "/libsvm/" + xmlFile); outString.append(container); outString.append("\tguide\tfeatures\t"); outString.append(xmlFile); outString.append('\n'); } else { outString.append(lines[i]); outString.append('\n'); } } else if (lines[i].startsWith(container+"\tinput\tformat")) { int tabIndex = lines[i].lastIndexOf('\t'); if (lines[i].substring(tabIndex+1).startsWith("/appdata/dataformat/")) { int slashIndex = lines[i].lastIndexOf("/"); String xmlFile = lines[i].substring(slashIndex+1); String path = lines[i].substring(tabIndex+1, slashIndex); setInputFormatXML(path + "/" + xmlFile); outString.append(container); outString.append("\tinput\tformat\t"); outString.append(xmlFile); outString.append('\n'); } else { outString.append(lines[i]); outString.append('\n'); } } else if (earlierVersion("1.3")) { if (lines[i].startsWith(container+"\tnivre\tpost_processing")) { } else if (lines[i].startsWith(container+"\tmalt0.4\tbehavior")) { if (lines[i].endsWith("true")) { SystemLogger.logger().info("MaltParser "+maltParserVersion+" doesn't support MaltParser 0.4 emulation."); } } else if (lines[i].startsWith(container+"\tsinglemalt\tparsing_algorithm")) { outString.append(container); outString.append("\tsinglemalt\tparsing_algorithm\t"); if (lines[i].endsWith("NivreStandard")) { outString.append("class org.maltparser.parser.algorithm.nivre.NivreArcStandardFactory"); } else if (lines[i].endsWith("NivreEager")) { outString.append("class org.maltparser.parser.algorithm.nivre.NivreArcEagerFactory"); } else if (lines[i].endsWith("CovingtonNonProjective")) { outString.append("class org.maltparser.parser.algorithm.covington.CovingtonNonProjFactory"); } else if (lines[i].endsWith("CovingtonProjective")) { outString.append("class org.maltparser.parser.algorithm.covington.CovingtonProjFactory"); } outString.append('\n'); } } else { outString.append(lines[i]); outString.append('\n'); } } return outString.toString(); } return sb.toString(); } public boolean earlierVersion(String version) { boolean e = false; for (int i = 0; i < availableVersions.length; i++) { if (availableVersions[i].equals(version)) { break; } else if (availableVersions[i].equals(parserModelVersion)) { e = true; } } return e; } public boolean support(String version) { for (int i = 0; i < availableVersions.length; i++) { if (availableVersions[i].equals(version)) { return supportVersions[i]; } } return false; } public String getFeatureModelXML() { return featureModelXML; } public void setFeatureModelXML(String featureModelXML) { this.featureModelXML = featureModelXML; } public String getInputFormatXML() { return inputFormatXML; } public void setInputFormatXML(String inputFormatXML) { this.inputFormatXML = inputFormatXML; } public String getNewConfigName() { return newConfigName; } public void setNewConfigName(String newConfigName) { this.newConfigName = newConfigName; } public String getConfigName() { return configName; } public void setConfigName(String configName) { this.configName = configName; } public String getConfigType() { return configType; } public void setConfigType(String configType) { this.configType = configType; } public File getMcoPath() { return mcoPath; } public void setMcoPath(File mcoPath) { this.mcoPath = mcoPath; } public String getMaltParserVersion() { return maltParserVersion; } public void setMaltParserVersion(String maltParserVersion) { this.maltParserVersion = maltParserVersion; } public String getParserModelVersion() { return parserModelVersion; } public void setParserModelVersion(String parserModelVersion) { this.parserModelVersion = parserModelVersion; } }