001    package org.maltparser.core.syntaxgraph;
002    
003    import org.maltparser.core.config.ConfigurationDir;
004    import org.maltparser.core.exception.MaltChainedException;
005    import org.maltparser.core.flow.FlowChartInstance;
006    import org.maltparser.core.flow.FlowException;
007    import org.maltparser.core.flow.item.ChartItem;
008    import org.maltparser.core.flow.spec.ChartItemSpecification;
009    import org.maltparser.core.helper.HashSet;
010    import org.maltparser.core.io.dataformat.DataFormatInstance;
011    import org.maltparser.core.io.dataformat.DataFormatManager;
012    import org.maltparser.core.io.dataformat.DataFormatSpecification.DataStructure;
013    import org.maltparser.core.io.dataformat.DataFormatSpecification.Dependency;
014    import org.maltparser.core.options.OptionManager;
015    import org.maltparser.core.symbol.SymbolTableHandler;
016    import org.maltparser.core.syntaxgraph.ds2ps.LosslessMapping;
017    /**
018    *
019    *
020    * @author Johan Hall
021    */
022    public class SyntaxGraphChartItem extends ChartItem {
023            private String idName;
024            private String structureName;
025            private String taskName;
026            private TokenStructure graph;
027            
028            public SyntaxGraphChartItem() { super(); }
029            
030            public void initialize(FlowChartInstance flowChartinstance, ChartItemSpecification chartItemSpecification) throws MaltChainedException {
031                    super.initialize(flowChartinstance, chartItemSpecification);
032                    
033                    for (String key : chartItemSpecification.getChartItemAttributes().keySet()) {
034                            if (key.equals("id")) {
035                                    idName = chartItemSpecification.getChartItemAttributes().get(key);
036                            } else if (key.equals("structure")) {
037                                    structureName = chartItemSpecification.getChartItemAttributes().get(key);
038                            } else if (key.equals("task")) {
039                                    taskName = chartItemSpecification.getChartItemAttributes().get(key);
040                            }
041                    }
042                    if (idName == null) {
043                            idName = getChartElement("graph").getAttributes().get("id").getDefaultValue();
044                    } else if (structureName == null) {
045                            structureName = getChartElement("graph").getAttributes().get("structure").getDefaultValue();
046                    } else if (taskName == null) {
047                            taskName = getChartElement("graph").getAttributes().get("task").getDefaultValue();
048                    }
049            }
050            
051            public int preprocess(int signal) throws MaltChainedException {
052                    if (taskName.equals("create")) {
053                            boolean phrase = false;
054                            boolean dependency = false;
055                            ConfigurationDir configDir = (ConfigurationDir)flowChartinstance.getFlowChartRegistry(org.maltparser.core.config.ConfigurationDir.class, idName);
056                            DataFormatInstance dataFormatInstance = null;
057                            DataFormatManager dataFormatManager = configDir.getDataFormatManager();
058                            SymbolTableHandler symbolTables = configDir.getSymbolTables();
059    
060                            
061    
062                            for (String key : configDir.getDataFormatInstanceKeys()) {
063                                    DataFormatInstance dfi = configDir.getDataFormatInstance(key);
064                                    if (dfi.getDataFormarSpec().getDataStructure() == DataStructure.PHRASE) {
065                                            phrase = true;
066                                    }
067                                    if (dfi.getDataFormarSpec().getDataStructure() == DataStructure.DEPENDENCY) {
068                                            dependency = true;
069                                            dataFormatInstance = dfi;
070                                    }
071                            }
072    
073                            if (dependency == false && OptionManager.instance().getOptionValue(getOptionContainerIndex(), "config", "flowchart").toString().equals("learn")) {
074                                    dependency = true;
075                                    HashSet<Dependency> deps = dataFormatManager.getInputDataFormatSpec().getDependencies();
076                                    String nullValueStategy = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "singlemalt", "null_value").toString();
077                                    for (Dependency dep : deps) {
078                                            dataFormatInstance = dataFormatManager.getDataFormatSpec(dep.getDependentOn()).createDataFormatInstance(symbolTables, nullValueStategy);
079                                            configDir.addDataFormatInstance(dataFormatManager.getOutputDataFormatSpec().getDataFormatName(), dataFormatInstance);
080                                    }
081                            }
082    
083                            if (dependency == true && phrase == false) {
084                                    graph = new DependencyGraph(symbolTables);
085                                    flowChartinstance.addFlowChartRegistry(org.maltparser.core.syntaxgraph.DependencyStructure.class, structureName, graph);
086                            } else if (dependency == true && phrase == true) {
087                                    graph = new MappablePhraseStructureGraph(symbolTables);
088                                    final DataFormatInstance inFormat = configDir.getDataFormatInstance(dataFormatManager.getInputDataFormatSpec().getDataFormatName()); 
089                                    final DataFormatInstance outFormat = configDir.getDataFormatInstance(dataFormatManager.getOutputDataFormatSpec().getDataFormatName());
090    
091                                    if (inFormat != null && outFormat != null) {
092                                            LosslessMapping mapping = null;
093                                            if (inFormat.getDataFormarSpec().getDataStructure() == DataStructure.DEPENDENCY) {
094                                                    mapping = new LosslessMapping(inFormat, outFormat);
095                                            } else {
096                                                    mapping = new LosslessMapping(outFormat, inFormat);
097                                            }
098                                            if (inFormat.getDataFormarSpec().getDataStructure() == DataStructure.PHRASE) {
099                                                    mapping.setHeadRules(OptionManager.instance().getOptionValue(getOptionContainerIndex(), "graph", "head_rules").toString());
100                                            }
101                                            ((MappablePhraseStructureGraph)graph).setMapping(mapping);
102                                    } else {
103                                            throw new FlowException("Couldn't determine the input and output data format. ");
104                                    }
105                                    flowChartinstance.addFlowChartRegistry(org.maltparser.core.syntaxgraph.DependencyStructure.class, structureName, graph);
106                                    flowChartinstance.addFlowChartRegistry(org.maltparser.core.syntaxgraph.PhraseStructure.class, structureName, graph);
107                            } else if (dependency == false && phrase == true) {
108                                    graph = new PhraseStructureGraph(symbolTables);
109                                    flowChartinstance.addFlowChartRegistry(org.maltparser.core.syntaxgraph.PhraseStructure.class, structureName, graph);
110                            } else {
111                                    graph = new Sentence(symbolTables);
112                            }
113                            
114                            if (dataFormatInstance != null) {
115                                    ((DependencyStructure)graph).setDefaultRootEdgeLabels(
116                                                    OptionManager.instance().getOptionValue(getOptionContainerIndex(), "graph", "root_label").toString(), 
117                                                    dataFormatInstance.getDependencyEdgeLabelSymbolTables());
118                            }
119                            flowChartinstance.addFlowChartRegistry(org.maltparser.core.syntaxgraph.TokenStructure.class, structureName, graph);
120                    }
121                    return signal;
122            }
123            
124            public int process(int signal) throws MaltChainedException {
125                    return signal;
126            }
127            
128            public int postprocess(int signal) throws MaltChainedException {
129                    return signal;
130            }
131            
132            public void terminate() throws MaltChainedException {
133                    if (graph != null) {
134                            graph.clear();
135                            graph = null;
136                    }
137            }
138            
139            public boolean equals(Object obj) {
140                    if (this == obj)
141                            return true;
142                    if (obj == null)
143                            return false;
144                    if (getClass() != obj.getClass())
145                            return false;
146                    return obj.toString().equals(this.toString());
147            }
148            
149            public int hashCode() {
150                    return 217 + (null == toString() ? 0 : toString().hashCode());
151            }
152            
153            public String toString() {
154                    StringBuilder sb = new StringBuilder();
155                    sb.append("    graph ");
156                    sb.append("id:");sb.append(idName);
157                    sb.append(' ');
158                    sb.append("task:");
159                    sb.append(taskName);
160                    sb.append(' ');
161                    sb.append("structure:");
162                    sb.append(structureName);
163                    return sb.toString();
164            }
165    }