001    package org.maltparser.core.config.version;
002    
003    import java.io.File;
004    import java.util.Date;
005    import java.util.jar.JarEntry;
006    
007    import org.maltparser.core.helper.SystemInfo;
008    import org.maltparser.core.helper.SystemLogger;
009    
010    public 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                            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                            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    }