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().substring(0,3).equals(SystemInfo.getVersion().substring(0,3))) {
098                                    SystemLogger.logger().error("The parser model '"+ configDirName+ ".mco' is created by MaltParser "+configDir.getCreatedByMaltParserVersion()+".\n");
099                                    SystemLogger.logger().error("You have to re-train the parser model to be able to parse with current version of MaltParser.\n");
100                                    System.exit(1);
101                            }
102                            OptionManager.instance().loadOptions(getOptionContainerIndex(), configDir.getInputStreamReaderFromConfigFile("savedoptions.sop"));
103                            configDir.initDataFormat();
104                    } else if (taskName.equals("createdir")) {
105                            configDir.setCreatedByMaltParserVersion(SystemInfo.getVersion());
106                            configDir.createConfigDirectory();
107                            if (optionFileName != null && optionFileName.length() > 0) {
108                                    configDir.copyToConfig(new File(optionFileName));
109                            }
110                            configDir.initDataFormat();
111                    }
112            }
113            
114            public int preprocess(int signal) throws MaltChainedException {
115                    if (taskName.equals("unpack")) {
116                            SystemLogger.logger().info("Unpacking the parser model '"+ configDirName+ ".mco' ...\n");
117                            configDir.unpackConfigFile();
118                    } else if (taskName.equals("info")) {
119                            configDir.echoInfoFile();
120                    } else if (taskName.equals("loadsymboltables")) {
121                            configDir.getSymbolTables().load(configDir.getInputStreamReaderFromConfigFileEntry("symboltables.sym",inCharSet));
122                    }
123                    return signal;
124            }
125            
126            
127            public int process(int signal) throws MaltChainedException {
128                    return signal;
129            }
130            
131            public int postprocess(int signal) throws MaltChainedException {
132                    if (taskName.equals("createfile")) {
133                            OptionManager.instance().saveOptions(getOptionContainerIndex(), configDir.getOutputStreamWriter("savedoptions.sop"));
134                            configDir.createConfigFile();
135                    } else if (taskName.equals("deletedir")) {
136                            configDir.terminate();
137                            configDir.deleteConfigDirectory();
138                    } else if (taskName.equals("savesymboltables")) {
139                            configDir.getSymbolTables().save(configDir.getOutputStreamWriter("symboltables.sym", outCharSet));
140                    }
141                    return signal;
142            }
143            
144            public void terminate() throws MaltChainedException { }
145            
146            public boolean equals(Object obj) {
147                    if (this == obj)
148                            return true;
149                    if (obj == null)
150                            return false;
151                    if (getClass() != obj.getClass())
152                            return false;
153                    return obj.toString().equals(this.toString());
154            }
155            
156            public int hashCode() {
157                    return 217 + (null == toString() ? 0 : toString().hashCode());
158            }
159            
160            public String toString() {
161                    final StringBuilder sb = new StringBuilder();
162                    sb.append("    configdir ");
163                    sb.append("id:");sb.append(idName);
164                    sb.append(' ');
165                    sb.append("task:");sb.append(taskName);
166                    
167                    return sb.toString();
168            }
169    
170    }