package org.maltparser.core.config;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import org.maltparser.core.exception.MaltChainedException;
import org.maltparser.core.flow.FlowChartInstance;
import org.maltparser.core.flow.item.ChartItem;
import org.maltparser.core.flow.spec.ChartItemSpecification;
import org.maltparser.core.helper.SystemInfo;
import org.maltparser.core.helper.SystemLogger;
import org.maltparser.core.options.OptionManager;
/**
*
*
* @author Johan Hall
*/
public class ConfigDirChartItem extends ChartItem {
private String idName;
private String taskName;
private String optionFileName;
private URL configDirURL;
private String configDirName;
private ConfigurationDir configDir;
private String outCharSet;
private String inCharSet;
public ConfigDirChartItem() {
}
@Override
public void initialize(FlowChartInstance flowChartinstance, ChartItemSpecification chartItemSpecification) throws MaltChainedException {
super.initialize(flowChartinstance, chartItemSpecification);
for (String key : chartItemSpecification.getChartItemAttributes().keySet()) {
if (key.equals("id")) {
idName = chartItemSpecification.getChartItemAttributes().get(key);
} else if (key.equals("task")) {
taskName = chartItemSpecification.getChartItemAttributes().get(key);
}
}
if (idName == null) {
idName = getChartElement("configdir").getAttributes().get("id").getDefaultValue();
} else if (taskName == null) {
taskName = getChartElement("configdir").getAttributes().get("task").getDefaultValue();
}
if (OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "url") != null && OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "url").toString().length() > 0) {
try {
configDirURL = new URL(OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "url").toString());
} catch (MalformedURLException e) {
throw new ConfigurationException("The URL '" + OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "url").toString() + "' is malformed. ", e);
}
}
if (OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "name").toString().endsWith(".mco")) {
int index = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "name").toString().lastIndexOf('.');
configDirName = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "name").toString().substring(0, index);
} else {
configDirName = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "name").toString();
}
try {
if (OptionManager.instance().getOptionValue(getOptionContainerIndex(), "system", "option_file") != null) {
optionFileName = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "system", "option_file").toString();
}
} catch (ConfigurationException e) {
throw new ConfigurationException("The option file '" + optionFileName + "' could not be copied. ", e);
}
if (OptionManager.instance().getOptionValue(getOptionContainerIndex(), "output", "charset") != null) {
outCharSet = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "output", "charset").toString();
} else {
outCharSet = "UTF-8";
}
if (OptionManager.instance().getOptionValue(getOptionContainerIndex(), "input", "charset") != null) {
inCharSet = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "input", "charset").toString();
} else {
inCharSet = "UTF-8";
}
configDir = (ConfigurationDir) flowChartinstance.getFlowChartRegistry(org.maltparser.core.config.ConfigurationDir.class, idName);
if (configDir == null) {
if (configDirURL != null) {
configDir = new ConfigurationDir(configDirURL);
} else {
configDir = new ConfigurationDir(configDirName, idName, getOptionContainerIndex());
}
flowChartinstance.addFlowChartRegistry(org.maltparser.core.config.ConfigurationDir.class, idName, configDir);
}
if (taskName.equals("versioning")) {
configDir.versioning();
} else if (taskName.equals("loadsavedoptions")) {
configDir.initCreatedByMaltParserVersionFromInfoFile();
if (configDir.getCreatedByMaltParserVersion() == null) {
SystemLogger.logger().warn("Couln't determine which version of MaltParser that created the parser model: " + configDirName + ".mco\n MaltParser will terminate\n");
System.exit(1);
} else if (!configDir.getCreatedByMaltParserVersion().substring(0, 3).equals(SystemInfo.getVersion().substring(0, 3))) {
SystemLogger.logger().error("The parser model '" + configDirName + ".mco' is created by MaltParser " + configDir.getCreatedByMaltParserVersion() + ".\n");
SystemLogger.logger().error("You have to re-train the parser model to be able to parse with current version of MaltParser.\n");
System.exit(1);
}
OptionManager.instance().loadOptions(getOptionContainerIndex(), configDir.getInputStreamReaderFromConfigFile("savedoptions.sop"));
configDir.initDataFormat();
} else if (taskName.equals("createdir")) {
configDir.setCreatedByMaltParserVersion(SystemInfo.getVersion());
configDir.createConfigDirectory();
if (optionFileName != null && optionFileName.length() > 0) {
configDir.copyToConfig(new File(optionFileName));
}
configDir.initDataFormat();
}
}
public int preprocess(int signal) throws MaltChainedException {
if (taskName.equals("unpack")) {
SystemLogger.logger().info("Unpacking the parser model '" + configDirName + ".mco' ...\n");
configDir.unpackConfigFile();
} else if (taskName.equals("info")) {
configDir.echoInfoFile();
} else if (taskName.equals("loadsymboltables")) {
configDir.getSymbolTables().load(configDir.getInputStreamReaderFromConfigFileEntry("symboltables.sym", inCharSet));
}
return signal;
}
public int process(int signal) throws MaltChainedException {
return signal;
}
public int postprocess(int signal) throws MaltChainedException {
if (taskName.equals("createfile")) {
OptionManager.instance().saveOptions(getOptionContainerIndex(), configDir.getOutputStreamWriter("savedoptions.sop"));
configDir.createConfigFile();
} else if (taskName.equals("deletedir")) {
configDir.terminate();
configDir.deleteConfigDirectory();
} else if (taskName.equals("savesymboltables")) {
configDir.getSymbolTables().save(configDir.getOutputStreamWriter("symboltables.sym", outCharSet));
}
return signal;
}
public void terminate() throws MaltChainedException {
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
return obj.toString().equals(this.toString());
}
@Override
public int hashCode() {
return 217 + (null == toString() ? 0 : toString().hashCode());
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append(" configdir ");
sb.append("id:");
sb.append(idName);
sb.append(' ');
sb.append("task:");
sb.append(taskName);
return sb.toString();
}
}