    001    package org.maltparser.core.syntaxgraph;
    002
    003    import org.maltparser.core.exception.MaltChainedException;
    004    import org.maltparser.core.flow.FlowChartInstance;
    005    import org.maltparser.core.flow.item.ChartItem;
    006    import org.maltparser.core.flow.spec.ChartItemSpecification;
    007    import org.maltparser.core.options.OptionManager;
    008    import org.maltparser.core.symbol.SymbolTable;
    009    import org.maltparser.core.syntaxgraph.edge.Edge;
    010    import org.maltparser.core.syntaxgraph.node.DependencyNode;
    011    /**
    012    *
    013    *
    014    * @author Johan Hall
    015    */
    016    public 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    }