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    }