    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                            System.gc();
    062                            while (signal != ChartItem.TERMINATE) {
    063                                    signal = flowChartInstance.process();
    064                                    if (signal == ChartItem.CONTINUE) {
    065                                            sentenceCounter++;
    066                                    } else if (signal == ChartItem.NEWITERATION) {
    067                                            SystemLogger.logger().info("\n=== END ITERATION "+nIteration+" ===\n");
    068                                            nIteration++;
    069                                            flowChartInstance.setEngineRegistry("iterations", nIteration);
    070                                    }
    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    }