001package org.maltparser.core.syntaxgraph;
002
003import org.maltparser.core.exception.MaltChainedException;
004import org.maltparser.core.flow.FlowChartInstance;
005import org.maltparser.core.flow.item.ChartItem;
006import org.maltparser.core.flow.spec.ChartItemSpecification;
007import org.maltparser.core.options.OptionManager;
008import org.maltparser.core.symbol.SymbolTable;
009import org.maltparser.core.syntaxgraph.edge.Edge;
010import org.maltparser.core.syntaxgraph.node.DependencyNode;
011/**
012*
013*
014* @author Johan Hall
015*/
016public class CopyChartItem extends ChartItem {
017        private String idName;
018        private String targetName;
019        private String sourceName;
020        private String taskName;
021        private boolean usePartialTree;
022        
023        private TokenStructure cachedSource = null;
024        private TokenStructure cachedTarget = null;
025        
026        public CopyChartItem() {}
027        
028        public void initialize(FlowChartInstance flowChartinstance, ChartItemSpecification chartItemSpecification) throws MaltChainedException {
029                super.initialize(flowChartinstance, chartItemSpecification);
030                for (String key : chartItemSpecification.getChartItemAttributes().keySet()) {
031                        if (key.equals("id")) {
032                                idName = chartItemSpecification.getChartItemAttributes().get(key);
033                        } else if (key.equals("target")) {
034                                targetName = chartItemSpecification.getChartItemAttributes().get(key);
035                        } else if (key.equals("source")) {
036                                sourceName = 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("copy").getAttributes().get("id").getDefaultValue();
043                } else if (targetName == null) {
044                        targetName = getChartElement("copy").getAttributes().get("target").getDefaultValue();
045                } else if (sourceName == null) {
046                        sourceName = getChartElement("copy").getAttributes().get("source").getDefaultValue();
047                } else if (taskName == null) {
048                        taskName = getChartElement("copy").getAttributes().get("task").getDefaultValue();
049                }
050                usePartialTree = OptionManager.instance().getOptionValue(getOptionContainerIndex(), "singlemalt", "use_partial_tree").toString().equals("true");
051        }
052        
053        public int preprocess(int signal) throws MaltChainedException {
054                return signal;
055        }
056        
057        public int process(int signal) throws MaltChainedException {
058                if (taskName.equals("terminals")) {
059                        if (cachedSource == null) {
060                                cachedSource = (TokenStructure)flowChartinstance.getFlowChartRegistry(org.maltparser.core.syntaxgraph.TokenStructure.class, sourceName);
061                        }
062                        if (cachedTarget == null) {
063                                cachedTarget = (TokenStructure)flowChartinstance.getFlowChartRegistry(org.maltparser.core.syntaxgraph.TokenStructure.class, targetName);
064                        }
065                        copyTerminalStructure(cachedSource, cachedTarget);
066//                      SystemLogger.logger().info("usePartialTree:" + usePartialTree);
067                        if (usePartialTree && cachedSource instanceof DependencyStructure && cachedTarget instanceof DependencyStructure) {
068                                copyPartialDependencyStructure((DependencyStructure)cachedSource, (DependencyStructure)cachedTarget);
069                        }
070                }
071                return signal;
072        }
073        
074        public int postprocess(int signal) throws MaltChainedException {
075                return signal;
076        }
077
078        
079        public void terminate() throws MaltChainedException {
080                cachedSource = null;
081                cachedTarget = null;
082        }
083        
084        public void copyTerminalStructure(TokenStructure sourceGraph, TokenStructure targetGraph) throws MaltChainedException {
085                targetGraph.clear();
086                for (int index : sourceGraph.getTokenIndices()) {
087                        DependencyNode gnode = sourceGraph.getTokenNode(index);
088                        DependencyNode pnode = targetGraph.addTokenNode(gnode.getIndex());
089                        for (SymbolTable table : gnode.getLabelTypes()) {
090                                pnode.addLabel(table, gnode.getLabelSymbol(table));
091                        }
092                }
093        }
094        
095        public void copyPartialDependencyStructure(DependencyStructure sourceGraph, DependencyStructure targetGraph) throws MaltChainedException {
096                SymbolTable partHead = cachedSource.getSymbolTables().getSymbolTable("PARTHEAD");
097                SymbolTable partDeprel = cachedSource.getSymbolTables().getSymbolTable("PARTDEPREL");
098                if (partHead == null || partDeprel == null) {
099                        return;
100                }
101                SymbolTable deprel = cachedTarget.getSymbolTables().getSymbolTable("DEPREL");
102                for (int index : sourceGraph.getTokenIndices()) {
103                        DependencyNode snode = sourceGraph.getTokenNode(index);
104                        DependencyNode tnode = targetGraph.getTokenNode(index);
105                        if (snode != null && tnode != null) {
106                                int spartheadindex = Integer.parseInt(snode.getLabelSymbol(partHead));
107                                String spartdeprel = snode.getLabelSymbol(partDeprel);
108                                if (spartheadindex > 0) {
109                                        Edge tedge = targetGraph.addDependencyEdge(spartheadindex, snode.getIndex());
110                                        tedge.addLabel(deprel, spartdeprel);
111                                }
112                        }
113                }
114        }
115        
116        public boolean equals(Object obj) {
117                if (this == obj)
118                        return true;
119                if (obj == null)
120                        return false;
121                if (getClass() != obj.getClass())
122                        return false;
123                return obj.toString().equals(this.toString());
124        }
125        
126        public int hashCode() {
127                return 217 + (null == toString() ? 0 : toString().hashCode());
128        }
129        
130        public String toString() {
131                final StringBuilder sb = new StringBuilder();
132                sb.append("    copy ");
133                sb.append("id:");sb.append(idName);
134                sb.append(' ');
135                sb.append("task:");
136                sb.append(taskName);
137                sb.append(' ');
138                sb.append("source:");
139                sb.append(sourceName);
140                sb.append(' ');
141                sb.append("target:");
142                sb.append(targetName);
143                return sb.toString();
144        }
145}