001    package org.maltparser;
002    
003    import java.util.SortedMap;
004    import java.util.TreeMap;
005    
006    import org.maltparser.core.exception.MaltChainedException;
007    import org.maltparser.core.flow.FlowChartInstance;
008    import org.maltparser.core.flow.FlowChartManager;
009    import org.maltparser.core.flow.item.ChartItem;
010    import org.maltparser.core.helper.SystemLogger;
011    import org.maltparser.core.helper.Util;
012    import org.maltparser.core.options.OptionManager;
013    import org.maltparser.core.plugin.PluginLoader;
014    
015    
016    public class Engine  {
017            private final long startTime;
018            private final FlowChartManager flowChartManager;
019            private final SortedMap<Integer,FlowChartInstance> flowChartInstances;
020            
021            public Engine() throws MaltChainedException {
022                    startTime = System.currentTimeMillis();
023                    flowChartManager = new FlowChartManager();
024                    flowChartManager.getFlowChartSystem().load(getClass().getResource("/appdata/flow/flowchartsystem.xml"));
025                    flowChartManager.getFlowChartSystem().load(PluginLoader.instance());
026                    flowChartManager.load(getClass().getResource("/appdata/flow/flowcharts.xml"));
027                    flowChartManager.load(PluginLoader.instance());
028                    flowChartInstances = new TreeMap<Integer,FlowChartInstance>();
029            }
030    
031            public FlowChartInstance initialize(int optionContainerIndex) throws MaltChainedException {
032                    String flowChartName = null;
033                    if (OptionManager.instance().getOptionValueNoDefault(optionContainerIndex, "config", "flowchart") != null) {
034                            flowChartName = OptionManager.instance().getOptionValue(optionContainerIndex, "config", "flowchart").toString();
035                    }
036                    if (flowChartName == null) {
037                            if (OptionManager.instance().getOptionValueNoDefault(optionContainerIndex, "singlemalt", "mode") != null) {
038                                    // This fix maps --singlemalt-mode option to --config-flowchart option because of historical reasons (version 1.0-1.1)
039                                    flowChartName = OptionManager.instance().getOptionValue(optionContainerIndex, "singlemalt", "mode").toString();
040                                    OptionManager.instance().overloadOptionValue(optionContainerIndex, "config", "flowchart", flowChartName);
041                            } else {
042                                    flowChartName = OptionManager.instance().getOptionValue(optionContainerIndex, "config", "flowchart").toString();
043                            }
044                    }
045                    FlowChartInstance flowChartInstance = flowChartManager.initialize(optionContainerIndex, flowChartName);
046                    flowChartInstances.put(optionContainerIndex, flowChartInstance);
047                    return flowChartInstance;
048            }
049            
050            public void process(int optionContainerIndex) throws MaltChainedException {
051                    FlowChartInstance flowChartInstance = flowChartInstances.get(optionContainerIndex);
052                    if (flowChartInstance.hasPreProcessChartItems()) {
053                            flowChartInstance.preprocess();
054                    }
055                    if (flowChartInstance.hasProcessChartItems()) {
056                            int signal = ChartItem.CONTINUE;
057                            int tic = 0;
058                            int sentenceCounter = 0;
059                            int nIteration = 1;
060                            flowChartInstance.setEngineRegistry("iterations", nIteration);
061                            while (signal != ChartItem.TERMINATE) {
062                                    signal = flowChartInstance.process();
063                                    if (signal == ChartItem.CONTINUE) {
064                                            sentenceCounter++;
065                                    } else if (signal == ChartItem.NEWITERATION) {
066                                            SystemLogger.logger().info("\n=== END ITERATION "+nIteration+" ===\n");
067                                            nIteration++;
068                                            flowChartInstance.setEngineRegistry("iterations", nIteration);
069                                    }
070    //                              System.out.println(sentenceCounter);
071                                    if (sentenceCounter < 101 && sentenceCounter == 1 || sentenceCounter == 10 || sentenceCounter == 100) {
072                                            Util.startTicer(SystemLogger.logger(), startTime, 10, sentenceCounter);
073                                    } 
074                                    if (sentenceCounter%100 == 0) {
075                                            tic = Util.simpleTicer(SystemLogger.logger(), startTime, 10, tic, sentenceCounter);
076                                    }
077                            }
078                            Util.endTicer(SystemLogger.logger(), startTime, 10, tic, sentenceCounter);
079                    }
080                    if (flowChartInstance.hasPostProcessChartItems()) {
081                            flowChartInstance.postprocess();
082                    }
083            }
084            
085            public void terminate(int optionContainerIndex) throws MaltChainedException {
086                    flowChartInstances.get(optionContainerIndex).terminate();
087            }
088    }