001package org.maltparser.core.config.version; 002 003import java.io.File; 004import java.util.Date; 005import java.util.jar.JarEntry; 006 007import org.maltparser.core.helper.SystemInfo; 008import org.maltparser.core.helper.SystemLogger; 009 010public class Versioning { 011 private String maltParserVersion; 012 private String parserModelVersion; 013 private File mcoPath; 014 private String configName; 015 private String newConfigName; 016 private String configType; 017 018 private String featureModelXML; 019 private String inputFormatXML; 020 021 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"}; 022 public static boolean[] supportVersions = {false, false, false, false, false, false, true, true, true}; 023 024 public Versioning(String configName, String configType, File mcoPath, String parserModelVersion) { 025 setConfigName(configName); 026 setConfigType(configType); 027 setMcoPath(mcoPath); 028 setMaltParserVersion(SystemInfo.getVersion()); 029 setParserModelVersion(parserModelVersion); 030 setNewConfigName(configName+"."+maltParserVersion); 031 } 032 033 public JarEntry getJarEntry(JarEntry in) { 034 if (maltParserVersion.equals(parserModelVersion)) { 035 return in; 036 } 037 String entryName = in.getName().replace(configName+File.separator, newConfigName+File.separator); 038 if (entryName.endsWith(".info")) { 039 return new JarEntry(entryName.replace(File.separator+configName+"_", File.separator+newConfigName+"_")); 040 } 041 return new JarEntry(entryName); 042 } 043 044 public boolean hasChanges(JarEntry in, JarEntry out) { 045 if (maltParserVersion.equals(parserModelVersion)) { 046 return false; 047 } 048 if (in.getName().endsWith(".info") || in.getName().endsWith(".sop")) { 049 return true; 050 } 051 return false; 052 } 053 054 public String modifyJarEntry(JarEntry in, JarEntry out, StringBuilder sb) { 055 if (maltParserVersion.equals(parserModelVersion)) { 056 return sb.toString(); 057 } 058 if (in.getName().endsWith(".info")) { 059 final StringBuilder outString = new StringBuilder(); 060 String[] lines = sb.toString().split("\\n"); 061 for (int i = 0; i < lines.length; i++) { 062 if (lines[i].startsWith("Configuration name:")) { 063 outString.append("Configuration name: "); 064 outString.append(configName); 065 outString.append('.'); 066 outString.append(maltParserVersion); 067 outString.append('\n'); 068 } else if (lines[i].startsWith("Created:")) { 069 outString.append(lines[i]); 070 outString.append('\n'); 071 outString.append("Converted: "); 072 outString.append(new Date(System.currentTimeMillis())); 073 outString.append('\n'); 074 } else if (lines[i].startsWith("Version:")) { 075 outString.append("Version: "); 076 outString.append(maltParserVersion); 077 outString.append('\n'); 078 outString.append("Created by: "); 079 outString.append(parserModelVersion); 080 outString.append('\n'); 081 } else if (lines[i].startsWith(" name ( -c) ")) { 082 outString.append(" name ( -c) "); 083 outString.append(newConfigName); 084 outString.append('\n'); 085 } else if (lines[i].startsWith(" format ( -if) /appdata/dataformat/")) { 086 outString.append(" format ( -if) "); 087 int index = lines[i].lastIndexOf("/"); 088 outString.append(lines[i].substring(index + 1)); 089 outString.append('\n'); 090 } else if (lines[i].startsWith(" format ( -of) /appdata/dataformat/")) { 091 outString.append(" format ( -of) "); 092 int index = lines[i].lastIndexOf("/"); 093 outString.append(lines[i].substring(index + 1)); 094 outString.append('\n'); 095 } else if (lines[i].startsWith("--guide-features ( -F) /appdata/features/")) { 096 outString.append("--guide-features ( -F) "); 097 int index = lines[i].lastIndexOf("/"); 098 outString.append(lines[i].substring(index + 1)); 099 outString.append('\n'); 100 } else { 101 outString.append(lines[i]); 102 outString.append('\n'); 103 } 104 } 105 return outString.toString(); 106 } else if (in.getName().endsWith(".sop")) { 107 final StringBuilder outString = new StringBuilder(); 108 String[] lines = sb.toString().split("\\n"); 109 for (int i = 0; i < lines.length; i++) { 110 int index = lines[i].indexOf('\t'); 111 int container = 0; 112 if (index > -1) { 113 container = Integer.parseInt(lines[i].substring(0,index)); 114 } 115 if (lines[i].startsWith(container+"\tguide\tfeatures")) { 116 int tabIndex = lines[i].lastIndexOf('\t'); 117 if (lines[i].substring(tabIndex+1).startsWith("/appdata/features/")) { 118 int slashIndex = lines[i].lastIndexOf("/"); 119 String xmlFile = lines[i].substring(slashIndex+1); 120 String path = lines[i].substring(tabIndex+1, slashIndex); 121 setFeatureModelXML(path + "/libsvm/" + xmlFile); 122 outString.append(container); 123 outString.append("\tguide\tfeatures\t"); 124 outString.append(xmlFile); 125 outString.append('\n'); 126 } else { 127 outString.append(lines[i]); 128 outString.append('\n'); 129 } 130 } else if (lines[i].startsWith(container+"\tinput\tformat")) { 131 int tabIndex = lines[i].lastIndexOf('\t'); 132 if (lines[i].substring(tabIndex+1).startsWith("/appdata/dataformat/")) { 133 int slashIndex = lines[i].lastIndexOf("/"); 134 String xmlFile = lines[i].substring(slashIndex+1); 135 String path = lines[i].substring(tabIndex+1, slashIndex); 136 setInputFormatXML(path + "/" + xmlFile); 137 outString.append(container); 138 outString.append("\tinput\tformat\t"); 139 outString.append(xmlFile); 140 outString.append('\n'); 141 } else { 142 outString.append(lines[i]); 143 outString.append('\n'); 144 } 145 } else if (earlierVersion("1.3")) { 146 if (lines[i].startsWith(container+"\tnivre\tpost_processing")) { 147 } else if (lines[i].startsWith(container+"\tmalt0.4\tbehavior")) { 148 if (lines[i].endsWith("true")) { 149 SystemLogger.logger().info("MaltParser "+maltParserVersion+" doesn't support MaltParser 0.4 emulation."); 150 } 151 } else if (lines[i].startsWith(container+"\tsinglemalt\tparsing_algorithm")) { 152 outString.append(container); 153 outString.append("\tsinglemalt\tparsing_algorithm\t"); 154 if (lines[i].endsWith("NivreStandard")) { 155 outString.append("class org.maltparser.parser.algorithm.nivre.NivreArcStandardFactory"); 156 } else if (lines[i].endsWith("NivreEager")) { 157 outString.append("class org.maltparser.parser.algorithm.nivre.NivreArcEagerFactory"); 158 } else if (lines[i].endsWith("CovingtonNonProjective")) { 159 outString.append("class org.maltparser.parser.algorithm.covington.CovingtonNonProjFactory"); 160 } else if (lines[i].endsWith("CovingtonProjective")) { 161 outString.append("class org.maltparser.parser.algorithm.covington.CovingtonProjFactory"); 162 } 163 outString.append('\n'); 164 } 165 } else { 166 outString.append(lines[i]); 167 outString.append('\n'); 168 } 169 } 170 return outString.toString(); 171 } 172 return sb.toString(); 173 } 174 175 176 public boolean earlierVersion(String version) { 177 boolean e = false; 178 for (int i = 0; i < availableVersions.length; i++) { 179 if (availableVersions[i].equals(version)) { 180 break; 181 } else if (availableVersions[i].equals(parserModelVersion)) { 182 e = true; 183 } 184 } 185 return e; 186 } 187 188 public boolean support(String version) { 189 for (int i = 0; i < availableVersions.length; i++) { 190 if (availableVersions[i].equals(version)) { 191 return supportVersions[i]; 192 } 193 } 194 return false; 195 } 196 197 public String getFeatureModelXML() { 198 return featureModelXML; 199 } 200 201 public void setFeatureModelXML(String featureModelXML) { 202 this.featureModelXML = featureModelXML; 203 } 204 205 public String getInputFormatXML() { 206 return inputFormatXML; 207 } 208 209 public void setInputFormatXML(String inputFormatXML) { 210 this.inputFormatXML = inputFormatXML; 211 } 212 213 public String getNewConfigName() { 214 return newConfigName; 215 } 216 217 public void setNewConfigName(String newConfigName) { 218 this.newConfigName = newConfigName; 219 } 220 221 public String getConfigName() { 222 return configName; 223 } 224 225 public void setConfigName(String configName) { 226 this.configName = configName; 227 } 228 229 public String getConfigType() { 230 return configType; 231 } 232 233 public void setConfigType(String configType) { 234 this.configType = configType; 235 } 236 237 public File getMcoPath() { 238 return mcoPath; 239 } 240 241 public void setMcoPath(File mcoPath) { 242 this.mcoPath = mcoPath; 243 } 244 245 public String getMaltParserVersion() { 246 return maltParserVersion; 247 } 248 249 public void setMaltParserVersion(String maltParserVersion) { 250 this.maltParserVersion = maltParserVersion; 251 } 252 253 public String getParserModelVersion() { 254 return parserModelVersion; 255 } 256 257 public void setParserModelVersion(String parserModelVersion) { 258 this.parserModelVersion = parserModelVersion; 259 } 260}