package org.maltparserx.core.syntaxgraph;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import org.maltparserx.core.config.ConfigurationDir;
import org.maltparserx.core.exception.MaltChainedException;
import org.maltparserx.core.flow.FlowChartInstance;
import org.maltparserx.core.flow.item.ChartItem;
import org.maltparserx.core.flow.spec.ChartItemSpecification;
import org.maltparserx.core.io.dataformat.DataFormatException;
import org.maltparserx.core.options.OptionManager;
import org.maltparserx.core.syntaxgraph.node.DependencyNode;
public class GraphAnalyzerChartItem extends ChartItem {
private String idName;
private String sourceName;
private String task;
private ConfigurationDir configDir;
private DependencyStructure cachedSource = null;
private BufferedWriter writer;
private boolean closeStream = true;
private int graphCounter = 1;
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("source")) {
sourceName = chartItemSpecification.getChartItemAttributes().get(key);
}
}
if (idName == null) {
idName = getChartElement("analyzer").getAttributes().get("id").getDefaultValue();
} else if (sourceName == null) {
sourceName = getChartElement("analyzer").getAttributes().get("source").getDefaultValue();
}
task = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "analyzer", "task").toString();
configDir = (ConfigurationDir)flowChartinstance.getFlowChartRegistry(org.maltparserx.core.config.ConfigurationDir.class, idName);
open(task+".dat",OptionManager.instance().getOptionValue(getOptionContainerIndex(), "input", "charset").toString());
}
public int preprocess(int signal) throws MaltChainedException {
return signal;
}
public int process(int signal) throws MaltChainedException {
if (task.equals("projectivity")) {
if (cachedSource == null) {
cachedSource = (DependencyStructure)flowChartinstance.getFlowChartRegistry(org.maltparserx.core.syntaxgraph.DependencyStructure.class, sourceName);
}
try {
writer.append("graph # ");
writer.append(Integer.toString(graphCounter));
writer.append('\n');
for (int index : cachedSource.getTokenIndices()) {
DependencyNode node = cachedSource.getDependencyNode(index);
writer.append(Integer.toString(node.getIndex()));
writer.append('\t');
writer.append(Integer.toString(node.getHead().getIndex()));
writer.append('\t');
writer.append('#');
writer.append('\t');
if (node.isProjective()) {
writer.append("@P");
} else {
writer.append("@N");
}
writer.append('\n');
}
writer.append('\n');
} catch (IOException e) {
throw new MaltChainedException("", e);
}
graphCounter++;
}
return signal;
}
public int postprocess(int signal) throws MaltChainedException {
return signal;
}
public void terminate() throws MaltChainedException {
cachedSource = null;
close();
}
private void open(String fileName, String charsetName) throws MaltChainedException {
try {
open(new OutputStreamWriter(new FileOutputStream(fileName),charsetName));
} catch (FileNotFoundException e) {
throw new DataFormatException("The output file '"+fileName+"' cannot be found.", e);
} catch (UnsupportedEncodingException e) {
throw new DataFormatException("The character encoding set '"+charsetName+"' isn't supported.", e);
}
}
private void open(OutputStreamWriter osw) throws MaltChainedException {
setWriter(new BufferedWriter(osw));
}
private void setWriter(BufferedWriter writer) throws MaltChainedException {
close();
this.writer = writer;
}
private void close() throws MaltChainedException {
try {
if (writer != null) {
writer.flush();
if (closeStream) {
writer.close();
}
writer = null;
}
} catch (IOException e) {
throw new DataFormatException("Could not close the output file. ", e);
}
}
}