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    }