001 package org.maltparser.core.config;
002
003 import java.io.File;
004 import java.net.MalformedURLException;
005 import java.net.URL;
006
007 import org.maltparser.core.exception.MaltChainedException;
008 import org.maltparser.core.flow.FlowChartInstance;
009 import org.maltparser.core.flow.item.ChartItem;
010 import org.maltparser.core.flow.spec.ChartItemSpecification;
011 import org.maltparser.core.helper.SystemInfo;
012 import org.maltparser.core.helper.SystemLogger;
013 import org.maltparser.core.options.OptionManager;
014 /**
015 *
016 *
017 * @author Johan Hall
018 */
019 public class ConfigDirChartItem extends ChartItem {
020 private String idName;
021 private String taskName;
022 private String optionFileName;
023 private URL configDirURL;
024 private String configDirName;
025 private ConfigurationDir configDir;
026 private String outCharSet;
027 private String inCharSet;
028
029 public ConfigDirChartItem() {}
030
031 public void initialize(FlowChartInstance flowChartinstance, ChartItemSpecification chartItemSpecification) throws MaltChainedException {
032 super.initialize(flowChartinstance, chartItemSpecification);
033
034 for (String key : chartItemSpecification.getChartItemAttributes().keySet()) {
035 if (key.equals("id")) {
036 idName = chartItemSpecification.getChartItemAttributes().get(key);
037 } else if (key.equals("task")) {
038 taskName = chartItemSpecification.getChartItemAttributes().get(key);
039 }
040 }
041 if (idName == null) {
042 idName = getChartElement("configdir").getAttributes().get("id").getDefaultValue();
043 } else if (taskName == null) {
044 taskName = getChartElement("configdir").getAttributes().get("task").getDefaultValue();
045 }
046
047 if (OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "url") != null && OptionManager.instance().getOptionValue(getOptionContainerIndex(),"config", "url").toString().length() > 0) {
048 try {
049 configDirURL = new URL(OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "url").toString());
050 } catch (MalformedURLException e) {
051 throw new ConfigurationException("The URL '"+OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "url").toString()+"' is malformed. ", e);
052 }
053 }
054 if (OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "name").toString().endsWith(".mco")) {
055 int index = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "name").toString().lastIndexOf('.');
056 configDirName = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "name").toString().substring(0,index);
057 } else {
058 configDirName = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "name").toString();
059 }
060
061 try {
062 if (OptionManager.instance().getOptionValue(getOptionContainerIndex(), "system", "option_file") != null) {
063 optionFileName = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "system", "option_file").toString();
064 }
065 } catch (ConfigurationException e) {
066 throw new ConfigurationException("The option file '"+optionFileName+"' could not be copied. ",e);
067 }
068 if (OptionManager.instance().getOptionValue(getOptionContainerIndex(), "output", "charset") != null) {
069 outCharSet = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "output", "charset").toString();
070 } else {
071 outCharSet = "UTF-8";
072 }
073
074 if (OptionManager.instance().getOptionValue(getOptionContainerIndex(), "input", "charset") != null) {
075 inCharSet = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "input", "charset").toString();
076 } else {
077 inCharSet = "UTF-8";
078 }
079
080 configDir = (ConfigurationDir)flowChartinstance.getFlowChartRegistry(org.maltparser.core.config.ConfigurationDir.class, idName);
081 if (configDir == null) {
082 if (configDirURL != null) {
083 configDir = new ConfigurationDir(configDirURL);
084 } else {
085 configDir = new ConfigurationDir(configDirName, idName, getOptionContainerIndex());
086 }
087
088 flowChartinstance.addFlowChartRegistry(org.maltparser.core.config.ConfigurationDir.class, idName, configDir);
089 }
090 if (taskName.equals("versioning")) {
091 configDir.versioning();
092 } else if (taskName.equals("loadsavedoptions")) {
093 configDir.initCreatedByMaltParserVersionFromInfoFile();
094 if (configDir.getCreatedByMaltParserVersion() == null) {
095 SystemLogger.logger().warn("Couln't determine which version of MaltParser that created the parser model: " + configDirName+ ".mco\n MaltParser will terminate\n");
096 System.exit(1);
097 } else if (!configDir.getCreatedByMaltParserVersion().startsWith(SystemInfo.getVersion())) {
098 if (configDir.getCreatedByMaltParserVersion().startsWith("1.3")) {
099 SystemLogger.logger().warn("The parser model '"+ configDirName+ ".mco' is created by MaltParser "+configDir.getCreatedByMaltParserVersion()+".\n");
100 SystemLogger.logger().warn("You can convert the parser model to a MaltParser "+SystemInfo.getVersion()+" parser model:\n");
101 SystemLogger.logger().warn(" java -jar malt.jar -c "+configDirName+" -m versioning\n");
102 SystemLogger.logger().warn("MaltParser will terminate.\n");
103 } else {
104 SystemLogger.logger().warn("The parser model '"+ configDirName+ ".mco' is created by MaltParser "+configDir.getCreatedByMaltParserVersion()+", which cannot be used by MaltParser "+SystemInfo.getVersion()+".\n");
105 SystemLogger.logger().warn("Please retrain the parser model with MaltParser "+SystemInfo.getVersion()+" or download MaltParser "+configDir.getCreatedByMaltParserVersion()+" from http://maltparser.org/download.html\n");
106 SystemLogger.logger().warn("MaltParser will terminate\n");
107 }
108 System.exit(1);
109 }
110 OptionManager.instance().loadOptions(getOptionContainerIndex(), configDir.getInputStreamReaderFromConfigFile("savedoptions.sop"));
111 configDir.initDataFormat();
112 } else if (taskName.equals("createdir")) {
113 configDir.setCreatedByMaltParserVersion(SystemInfo.getVersion());
114 configDir.createConfigDirectory();
115 if (optionFileName != null && optionFileName.length() > 0) {
116 configDir.copyToConfig(new File(optionFileName));
117 }
118 configDir.initDataFormat();
119 }
120 }
121
122 public int preprocess(int signal) throws MaltChainedException {
123 if (taskName.equals("unpack")) {
124 SystemLogger.logger().info("Unpacking the parser model '"+ configDirName+ ".mco' ...\n");
125 configDir.unpackConfigFile();
126 } else if (taskName.equals("info")) {
127 configDir.echoInfoFile();
128 } else if (taskName.equals("loadsymboltables")) {
129 configDir.getSymbolTables().load(configDir.getInputStreamReaderFromConfigFileEntry("symboltables.sym",inCharSet));
130 }
131 return signal;
132 }
133
134
135 public int process(int signal) throws MaltChainedException {
136 return signal;
137 }
138
139 public int postprocess(int signal) throws MaltChainedException {
140 if (taskName.equals("createfile")) {
141 OptionManager.instance().saveOptions(getOptionContainerIndex(), configDir.getOutputStreamWriter("savedoptions.sop"));
142 configDir.createConfigFile();
143 } else if (taskName.equals("deletedir")) {
144 configDir.terminate();
145 configDir.deleteConfigDirectory();
146 } else if (taskName.equals("savesymboltables")) {
147 configDir.getSymbolTables().save(configDir.getOutputStreamWriter("symboltables.sym", outCharSet));
148 }
149 return signal;
150 }
151
152 public void terminate() throws MaltChainedException { }
153
154 public boolean equals(Object obj) {
155 if (this == obj)
156 return true;
157 if (obj == null)
158 return false;
159 if (getClass() != obj.getClass())
160 return false;
161 return obj.toString().equals(this.toString());
162 }
163
164 public int hashCode() {
165 return 217 + (null == toString() ? 0 : toString().hashCode());
166 }
167
168 public String toString() {
169 final StringBuilder sb = new StringBuilder();
170 sb.append(" configdir ");
171 sb.append("id:");sb.append(idName);
172 sb.append(' ');
173 sb.append("task:");sb.append(taskName);
174
175 return sb.toString();
176 }
177
178 }