001package org.maltparser.core.config;
002
003import java.io.File;
004import java.net.MalformedURLException;
005import java.net.URL;
006
007import org.maltparser.core.exception.MaltChainedException;
008import org.maltparser.core.flow.FlowChartInstance;
009import org.maltparser.core.flow.item.ChartItem;
010import org.maltparser.core.flow.spec.ChartItemSpecification;
011import org.maltparser.core.helper.SystemInfo;
012import org.maltparser.core.helper.SystemLogger;
013import org.maltparser.core.options.OptionManager;
014/**
015*
016*
017* @author Johan Hall
018*/
019public 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                        } 
098                        else if (!configDir.getCreatedByMaltParserVersion().substring(0,3).equals(SystemInfo.getVersion().substring(0,3))) { 
099                                if ( !((configDir.getCreatedByMaltParserVersion().substring(0,3).equals("1.7") 
100                                                || configDir.getCreatedByMaltParserVersion().substring(0,3).equals("1.8") || configDir.getCreatedByMaltParserVersion().substring(0,3).equals("1.9")) 
101                                                && SystemInfo.getVersion().substring(0,3).equals("1.9")) ) {
102                                        SystemLogger.logger().error("The parser model '"+ configDirName+ ".mco' is created by MaltParser "+configDir.getCreatedByMaltParserVersion()+".\n");
103                                        SystemLogger.logger().error("You have to re-train the parser model to be able to parse with current version of MaltParser.\n");
104                                        System.exit(1);
105                                }
106                        }
107                        OptionManager.instance().loadOptions(getOptionContainerIndex(), configDir.getInputStreamReaderFromConfigFile("savedoptions.sop"));
108                        configDir.initDataFormat();
109                } else if (taskName.equals("createdir")) {
110                        configDir.setCreatedByMaltParserVersion(SystemInfo.getVersion());
111                        configDir.createConfigDirectory();
112                        if (optionFileName != null && optionFileName.length() > 0) {
113                                configDir.copyToConfig(new File(optionFileName));
114                        }
115                        configDir.initDataFormat();
116                }
117        }
118        
119        public int preprocess(int signal) throws MaltChainedException {
120                if (taskName.equals("unpack")) {
121                        SystemLogger.logger().info("Unpacking the parser model '"+ configDirName+ ".mco' ...\n");
122                        configDir.unpackConfigFile();
123                } else if (taskName.equals("info")) {
124                        configDir.echoInfoFile();
125                } else if (taskName.equals("loadsymboltables")) {
126                        configDir.getSymbolTables().load(configDir.getInputStreamReaderFromConfigFileEntry("symboltables.sym",inCharSet));
127                }
128                return signal;
129        }
130        
131        
132        public int process(int signal) throws MaltChainedException {
133                return signal;
134        }
135        
136        public int postprocess(int signal) throws MaltChainedException {
137                if (taskName.equals("createfile")) {
138                        OptionManager.instance().saveOptions(getOptionContainerIndex(), configDir.getOutputStreamWriter("savedoptions.sop"));
139                        configDir.createConfigFile();
140                } else if (taskName.equals("deletedir")) {
141                        configDir.terminate();
142                        configDir.deleteConfigDirectory();
143                } else if (taskName.equals("savesymboltables")) {
144                        configDir.getSymbolTables().save(configDir.getOutputStreamWriter("symboltables.sym", outCharSet));
145                }
146                return signal;
147        }
148        
149        public void terminate() throws MaltChainedException { }
150        
151        public boolean equals(Object obj) {
152                if (this == obj)
153                        return true;
154                if (obj == null)
155                        return false;
156                if (getClass() != obj.getClass())
157                        return false;
158                return obj.toString().equals(this.toString());
159        }
160        
161        public int hashCode() {
162                return 217 + (null == toString() ? 0 : toString().hashCode());
163        }
164        
165        public String toString() {
166                final StringBuilder sb = new StringBuilder();
167                sb.append("    configdir ");
168                sb.append("id:");sb.append(idName);
169                sb.append(' ');
170                sb.append("task:");sb.append(taskName);
171                
172                return sb.toString();
173        }
174
175}