001package org.maltparser.core.flow; 002 003import java.util.HashMap; 004import java.util.LinkedHashSet; 005 006import org.maltparser.core.exception.MaltChainedException; 007import org.maltparser.core.flow.item.ChartItem; 008import org.maltparser.core.flow.spec.ChartItemSpecification; 009import org.maltparser.core.flow.spec.ChartSpecification; 010 011/** 012* 013* 014* @author Johan Hall 015*/ 016public class FlowChartInstance { 017 private FlowChartManager flowChartManager; 018 private int optionContainerIndex; 019 private String name; 020 private ChartSpecification chartSpecification; 021 private final LinkedHashSet<ChartItem> preProcessChartItems; 022 private final LinkedHashSet<ChartItem> processChartItems; 023 private final LinkedHashSet<ChartItem> postProcessChartItems; 024 025// private SymbolTableHandler symbolTables; 026// private DataFormatManager dataFormatManager; 027// private final HashMap<String,DataFormatInstance> dataFormatInstances; 028 private final HashMap<String,Object> flowChartRegistry; 029 private final HashMap<String,Object> engineRegistry; 030 private final StringBuilder flowChartRegistryKey; 031 032 033 public FlowChartInstance(int optionContainerIndex, ChartSpecification chartSpecification, FlowChartManager flowChartManager) throws MaltChainedException { 034 setFlowChartManager(flowChartManager); 035 setOptionContainerIndex(optionContainerIndex); 036 setChartSpecification(chartSpecification); 037 038 flowChartRegistry = new HashMap<String,Object>(); 039 engineRegistry = new HashMap<String,Object>(); 040 flowChartRegistryKey = new StringBuilder(); 041// dataFormatInstances = new HashMap<String, DataFormatInstance>(3); 042// 043// String inputFormatName = OptionManager.instance().getOptionValue(0, "input", "format").toString(); 044// String outputFormatName = OptionManager.instance().getOptionValue(0, "output", "format").toString(); 045// SystemLogger.logger().info(inputFormatName + "\n"); 046// SystemLogger.logger().info(outputFormatName + "\n"); 047//// featureModelFileName = configDir.copyToConfig(Util.findURLinJars(featureModelFileName)); 048// dataFormatManager = new DataFormatManager(inputFormatName, outputFormatName); 049// symbolTables = new TrieSymbolTableHandler(); 050 051 preProcessChartItems = new LinkedHashSet<ChartItem>(); 052 for (ChartItemSpecification chartItemSpecification : chartSpecification.getPreProcessChartItemSpecifications()) { 053 preProcessChartItems.add(initChartItem(chartItemSpecification)); 054 } 055 processChartItems = new LinkedHashSet<ChartItem>(); 056 for (ChartItemSpecification chartItemSpecification : chartSpecification.getProcessChartItemSpecifications()) { 057 processChartItems.add(initChartItem(chartItemSpecification)); 058 } 059 060 postProcessChartItems = new LinkedHashSet<ChartItem>(); 061 for (ChartItemSpecification chartItemSpecification : chartSpecification.getPostProcessChartItemSpecifications()) { 062 postProcessChartItems.add(initChartItem(chartItemSpecification)); 063 } 064 065 066 } 067 068 protected ChartItem initChartItem(ChartItemSpecification chartItemSpecification) throws MaltChainedException { 069 ChartItem chartItem = null; 070 try { 071 chartItem = chartItemSpecification.getChartItemClass().newInstance(); 072 chartItem.initialize(this, chartItemSpecification); 073 } catch (InstantiationException e) { 074 throw new FlowException("The chart item '"+chartItemSpecification.getChartItemName()+"' could not be created. ", e); 075 } catch (IllegalAccessException e) { 076 throw new FlowException("The chart item '"+chartItemSpecification.getChartItemName()+"' could not be created. ", e); 077 } 078 return chartItem; 079 } 080 081// public SymbolTableHandler getSymbolTables() { 082// return symbolTables; 083// } 084// 085// public void setSymbolTables(SymbolTableHandler symbolTables) { 086// this.symbolTables = symbolTables; 087// } 088// 089// public DataFormatManager getDataFormatManager() { 090// return dataFormatManager; 091// } 092// 093// public void setDataFormatManager(DataFormatManager dataFormatManager) { 094// this.dataFormatManager = dataFormatManager; 095// } 096 097 private void setFlowChartRegistryKey(Class<?> entryClass, String identifier) { 098 flowChartRegistryKey.setLength(0); 099 flowChartRegistryKey.append(identifier.toString()); 100 flowChartRegistryKey.append(entryClass.toString()); 101 } 102 103 public void addFlowChartRegistry(Class<?> entryClass, String identifier, Object entry) { 104 setFlowChartRegistryKey(entryClass, identifier); 105 flowChartRegistry.put(flowChartRegistryKey.toString(), entry); 106 } 107 108 public void removeFlowChartRegistry(Class<?> entryClass, String identifier) { 109 setFlowChartRegistryKey(entryClass, identifier); 110 flowChartRegistry.remove(flowChartRegistryKey.toString()); 111 } 112 113 public Object getFlowChartRegistry(Class<?> entryClass, String identifier) { 114 setFlowChartRegistryKey(entryClass, identifier); 115 return flowChartRegistry.get(flowChartRegistryKey.toString()); 116 } 117 118 public void setEngineRegistry(String key, Object value) { 119 engineRegistry.put(key, value); 120 } 121 122 public Object getEngineRegistry(String key) { 123 return engineRegistry.get(key); 124 } 125 126// public HashMap<String, DataFormatInstance> getDataFormatInstances() { 127// return dataFormatInstances; 128// } 129 130 public FlowChartManager getFlowChartManager() { 131 return flowChartManager; 132 } 133 134 protected void setFlowChartManager(FlowChartManager flowChartManager) { 135 this.flowChartManager = flowChartManager; 136 } 137 138 public int getOptionContainerIndex() { 139 return optionContainerIndex; 140 } 141 142 protected void setOptionContainerIndex(int optionContainerIndex) { 143 this.optionContainerIndex = optionContainerIndex; 144 } 145 146 public ChartSpecification getChartSpecification() { 147 return chartSpecification; 148 } 149 150 protected void setChartSpecification(ChartSpecification chartSpecification) { 151 this.chartSpecification = chartSpecification; 152 } 153 154 public LinkedHashSet<ChartItem> getPreProcessChartItems() { 155 return preProcessChartItems; 156 } 157 158 public LinkedHashSet<ChartItem> getProcessChartItems() { 159 return processChartItems; 160 } 161 162 public LinkedHashSet<ChartItem> getPostProcessChartItems() { 163 return postProcessChartItems; 164 } 165 166 public boolean hasPreProcessChartItems() { 167 return !(preProcessChartItems.size() == 0); 168 } 169 170 public boolean hasProcessChartItems() { 171 return !(processChartItems.size() == 0); 172 } 173 174 public boolean hasPostProcessChartItems() { 175 return !(postProcessChartItems.size() == 0); 176 } 177 178 public int preprocess() throws MaltChainedException { 179 LinkedHashSet<ChartItem> chartItems = getPreProcessChartItems(); 180 if (chartItems.size() == 0) { 181 return ChartItem.TERMINATE; 182 } 183 int signal = ChartItem.CONTINUE; 184 for (ChartItem chartItem : chartItems) { 185 signal = chartItem.preprocess(signal); 186 if (signal == ChartItem.TERMINATE) { 187 return signal; 188 } 189 } 190 return signal; 191 } 192 193 public int process() throws MaltChainedException { 194 LinkedHashSet<ChartItem> chartItems = getProcessChartItems(); 195 if (chartItems.size() == 0) { 196 return ChartItem.TERMINATE; 197 } 198 int signal = ChartItem.CONTINUE; 199 for (ChartItem chartItem : chartItems) { 200 signal = chartItem.process(signal); 201// if (!more) { 202// return false; 203// } 204 } 205 return signal; 206 } 207 208 public int postprocess() throws MaltChainedException { 209 LinkedHashSet<ChartItem> chartItems = getPostProcessChartItems(); 210 if (chartItems.size() == 0) { 211 return ChartItem.TERMINATE; 212 } 213 int signal = ChartItem.CONTINUE; 214 for (ChartItem chartItem : chartItems) { 215 signal = chartItem.postprocess(signal); 216 if (signal == ChartItem.TERMINATE) { 217 return signal; 218 } 219 } 220 return signal; 221 } 222 223 public void terminate() throws MaltChainedException { 224 LinkedHashSet<ChartItem> chartItems = getPreProcessChartItems(); 225 for (ChartItem chartItem : chartItems) { 226 chartItem.terminate(); 227 } 228 chartItems = getProcessChartItems(); 229 for (ChartItem chartItem : chartItems) { 230 chartItem.terminate(); 231 } 232 chartItems = getPostProcessChartItems(); 233 for (ChartItem chartItem : chartItems) { 234 chartItem.terminate(); 235 } 236 flowChartRegistry.clear(); 237 engineRegistry.clear(); 238 flowChartRegistryKey.setLength(0); 239// symbolTables = null; 240 241 } 242 243 public String getName() { 244 return name; 245 } 246 247 public void setName(String name) { 248 this.name = name; 249 } 250 251 public int hashCode() { 252 final int prime = 31; 253 int result = 1; 254 result = prime * result + optionContainerIndex; 255 result = prime * result + ((name == null) ? 0 : name.hashCode()); 256 result = prime * result + ((chartSpecification == null) ? 0 : chartSpecification.hashCode()); 257// result = prime * result + ((dataFormatInstances == null) ? 0 : dataFormatInstances.hashCode()); 258// result = prime * result + ((dataFormatManager == null) ? 0 : dataFormatManager.hashCode()); 259 result = prime * result + ((flowChartRegistry == null) ? 0 : flowChartRegistry.hashCode()); 260 result = prime * result + ((postProcessChartItems == null) ? 0 : postProcessChartItems.hashCode()); 261 result = prime * result + ((preProcessChartItems == null) ? 0 : preProcessChartItems.hashCode()); 262 result = prime * result + ((processChartItems == null) ? 0 : processChartItems.hashCode()); 263// result = prime * result + ((symbolTables == null) ? 0 : symbolTables.hashCode()); 264 return result; 265 } 266 267 public boolean equals(Object obj) { 268 if (this == obj) 269 return true; 270 if (obj == null) 271 return false; 272 if (getClass() != obj.getClass()) 273 return false; 274 FlowChartInstance other = (FlowChartInstance) obj; 275 if (optionContainerIndex != other.optionContainerIndex) 276 return false; 277 if (name == null) { 278 if (other.name != null) 279 return false; 280 } else if (!name.equals(other.name)) 281 return false; 282 if (chartSpecification == null) { 283 if (other.chartSpecification != null) 284 return false; 285 } else if (!chartSpecification.equals(other.chartSpecification)) 286 return false; 287// if (dataFormatInstances == null) { 288// if (other.dataFormatInstances != null) 289// return false; 290// } else if (!dataFormatInstances.equals(other.dataFormatInstances)) 291// return false; 292// if (dataFormatManager == null) { 293// if (other.dataFormatManager != null) 294// return false; 295// } else if (!dataFormatManager.equals(other.dataFormatManager)) 296// return false; 297 if (flowChartRegistry == null) { 298 if (other.flowChartRegistry != null) 299 return false; 300 } else if (!flowChartRegistry.equals(other.flowChartRegistry)) 301 return false; 302 if (postProcessChartItems == null) { 303 if (other.postProcessChartItems != null) 304 return false; 305 } else if (!postProcessChartItems.equals(other.postProcessChartItems)) 306 return false; 307 if (preProcessChartItems == null) { 308 if (other.preProcessChartItems != null) 309 return false; 310 } else if (!preProcessChartItems.equals(other.preProcessChartItems)) 311 return false; 312 if (processChartItems == null) { 313 if (other.processChartItems != null) 314 return false; 315 } else if (!processChartItems.equals(other.processChartItems)) 316 return false; 317// if (symbolTables == null) { 318// if (other.symbolTables != null) 319// return false; 320// } else if (!symbolTables.equals(other.symbolTables)) 321// return false; 322 return true; 323 } 324 325 public String toString() { 326 final StringBuilder sb = new StringBuilder(); 327 sb.append(name);sb.append('\n'); 328 if (preProcessChartItems.size() > 0) { 329 sb.append(" preprocess:");sb.append('\n'); 330 for (ChartItem key : preProcessChartItems) { 331 sb.append(key); 332 sb.append('\n'); 333 } 334 } 335 if (processChartItems.size() > 0) { 336 sb.append(" process:");sb.append('\n'); 337 for (ChartItem key : processChartItems) { 338 sb.append(key); 339 sb.append('\n'); 340 } 341 } 342 if (postProcessChartItems.size() > 0) { 343 sb.append(" postprocess:");sb.append('\n'); 344 for (ChartItem key : postProcessChartItems) { 345 sb.append(key); 346 sb.append('\n'); 347 } 348 } 349 350 return sb.toString(); 351 } 352}