    001    package org.maltparser.core.flow.spec;
    002
    003    import java.util.LinkedHashSet;
    004
    005    import org.maltparser.core.exception.MaltChainedException;
    006    import org.maltparser.core.flow.FlowChartManager;
    007    import org.maltparser.core.flow.FlowException;
    008    import org.w3c.dom.Element;
    009    import org.w3c.dom.NodeList;
    010    /**
    011    *
    012    *
    013    * @author Johan Hall
    014    */
    015    public class ChartSpecification {
    016            private String name;
    017            private LinkedHashSet<ChartItemSpecification> preProcessChartItemSpecifications;
    018            private LinkedHashSet<ChartItemSpecification> processChartItemSpecifications;
    019            private LinkedHashSet<ChartItemSpecification> postProcessChartItemSpecifications;
    020
    021            public ChartSpecification() {
    022                    preProcessChartItemSpecifications = new LinkedHashSet<ChartItemSpecification>(7);
    023                    processChartItemSpecifications = new LinkedHashSet<ChartItemSpecification>(7);
    024                    postProcessChartItemSpecifications = new LinkedHashSet<ChartItemSpecification>(7);
    025            }
    026
    027            public String getName() {
    028                    return name;
    029            }
    030            public void setName(String name) {
    031                    this.name = name;
    032            }
    033
    034            public LinkedHashSet<ChartItemSpecification> getPreProcessChartItemSpecifications() {
    035                    return preProcessChartItemSpecifications;
    036            }
    037
    038            public void addPreProcessChartItemSpecifications(ChartItemSpecification chartItemSpecification) {
    039                    preProcessChartItemSpecifications.add(chartItemSpecification);
    040            }
    041
    042            public void removePreProcessChartItemSpecifications(ChartItemSpecification chartItemSpecification) {
    043                    preProcessChartItemSpecifications.remove(chartItemSpecification);
    044            }
    045
    046            public LinkedHashSet<ChartItemSpecification> getProcessChartItemSpecifications() {
    047                    return processChartItemSpecifications;
    048            }
    049
    050            public void addProcessChartItemSpecifications(ChartItemSpecification chartItemSpecification) {
    051                    processChartItemSpecifications.add(chartItemSpecification);
    052            }
    053
    054            public void removeProcessChartItemSpecifications(ChartItemSpecification chartItemSpecification) {
    055                    processChartItemSpecifications.remove(chartItemSpecification);
    056            }
    057
    058            public LinkedHashSet<ChartItemSpecification> getPostProcessChartItemSpecifications() {
    059                    return postProcessChartItemSpecifications;
    060            }
    061
    062            public void addPostProcessChartItemSpecifications(ChartItemSpecification chartItemSpecification) {
    063                    postProcessChartItemSpecifications.add(chartItemSpecification);
    064            }
    065
    066            public void removePostProcessChartItemSpecifications(ChartItemSpecification chartItemSpecification) {
    067                    postProcessChartItemSpecifications.remove(chartItemSpecification);
    068            }
    069
    070            public void read(Element chartElem, FlowChartManager flowCharts) throws MaltChainedException {
    071                    setName(chartElem.getAttribute("name"));
    072                    NodeList flowChartProcessList = chartElem.getElementsByTagName("preprocess");
    073                    if (flowChartProcessList.getLength() == 1) {
    074                            readChartItems((Element)flowChartProcessList.item(0), flowCharts, preProcessChartItemSpecifications);
    075                    } else if (flowChartProcessList.getLength() > 1) {
    076                            throw new FlowException("The flow chart '"+getName()+"' has more than one preprocess elements. ");
    077                    }
    078
    079                    flowChartProcessList = chartElem.getElementsByTagName("process");
    080                    if (flowChartProcessList.getLength() == 1) {
    081                            readChartItems((Element)flowChartProcessList.item(0), flowCharts, processChartItemSpecifications);
    082                    } else if (flowChartProcessList.getLength() > 1) {
    083                            throw new FlowException("The flow chart '"+getName()+"' has more than one process elements. ");
    084                    }
    085
    086                    flowChartProcessList = chartElem.getElementsByTagName("postprocess");
    087                    if (flowChartProcessList.getLength() == 1) {
    088                            readChartItems((Element)flowChartProcessList.item(0), flowCharts, postProcessChartItemSpecifications);
    089                    } else if (flowChartProcessList.getLength() > 1) {
    090                            throw new FlowException("The flow chart '"+getName()+"' has more than one postprocess elements. ");
    091                    }
    092            }
    093
    094            private void readChartItems(Element chartElem, FlowChartManager flowCharts, LinkedHashSet<ChartItemSpecification> chartItemSpecifications) throws MaltChainedException {
    095                    NodeList flowChartItemList = chartElem.getElementsByTagName("chartitem");
    096                    for (int i = 0; i < flowChartItemList.getLength(); i++) {
    097                            ChartItemSpecification chartItemSpecification = new ChartItemSpecification();
    098                            chartItemSpecification.read((Element)flowChartItemList.item(i), flowCharts);
    099                            chartItemSpecifications.add(chartItemSpecification);
    100                    }
    101            }
    102
    103            public int hashCode() {
    104                    final int prime = 31;
    105                    int result = 1;
    106                    result = prime * result + ((name == null) ? 0 : name.hashCode());
    107                    result = prime * result + ((postProcessChartItemSpecifications == null) ? 0 : postProcessChartItemSpecifications.hashCode());
    108                    result = prime * result + ((preProcessChartItemSpecifications == null) ? 0 : preProcessChartItemSpecifications.hashCode());
    109                    result = prime * result + ((processChartItemSpecifications == null) ? 0 : processChartItemSpecifications.hashCode());
    110                    return result;
    111            }
    112
    113            public boolean equals(Object obj) {
    114                    if (this == obj)
    115                            return true;
    116                    if (obj == null)
    117                            return false;
    118                    if (getClass() != obj.getClass())
    119                            return false;
    120                    ChartSpecification other = (ChartSpecification) obj;
    121                    if (name == null) {
    122                            if (other.name != null)
    123                                    return false;
    124                    } else if (!name.equals(other.name))
    125                            return false;
    126                    if (postProcessChartItemSpecifications == null) {
    127                            if (other.postProcessChartItemSpecifications != null)
    128                                    return false;
    129                    } else if (!postProcessChartItemSpecifications
    130                                    .equals(other.postProcessChartItemSpecifications))
    131                            return false;
    132                    if (preProcessChartItemSpecifications == null) {
    133                            if (other.preProcessChartItemSpecifications != null)
    134                                    return false;
    135                    } else if (!preProcessChartItemSpecifications
    136                                    .equals(other.preProcessChartItemSpecifications))
    137                            return false;
    138                    if (processChartItemSpecifications == null) {
    139                            if (other.processChartItemSpecifications != null)
    140                                    return false;
    141                    } else if (!processChartItemSpecifications
    142                                    .equals(other.processChartItemSpecifications))
    143                            return false;
    144                    return true;
    145            }
    146
    147            public String toString() {
    148                    StringBuilder sb = new StringBuilder();
    149                    sb.append(name);sb.append('\n');
    150                    if (preProcessChartItemSpecifications.size() > 0) {
    151                            sb.append("  preprocess:");sb.append('\n');
    152                            for (ChartItemSpecification key : preProcessChartItemSpecifications) {
    153                                    sb.append(key);sb.append('\n');
    154                            }
    155                    }
    156                    if (processChartItemSpecifications.size() > 0) {
    157                            sb.append("  process:");sb.append('\n');
    158                            for (ChartItemSpecification key : processChartItemSpecifications) {
    159                                    sb.append(key);sb.append('\n');
    160                            }
    161                    }
    162                    if (postProcessChartItemSpecifications.size() > 0) {
    163                            sb.append("  postprocess:");sb.append('\n');
    164                            for (ChartItemSpecification key : postProcessChartItemSpecifications) {
    165                                    sb.append(key);sb.append('\n');
    166                            }
    167                    }
    168                    return sb.toString();
    169            }
    170    }