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 }