package com.ajay.test;

import org.apache.log4j.Logger;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.process.WorkItem;
import org.drools.runtime.process.WorkItemHandler;
import org.drools.runtime.process.WorkItemManager;

public class MyTimerTest {
    private static final Logger logger = Logger.getLogger(MyTimerTest.class);

    public static void main(String[] args) {
        try {
            logger.info("Starting main");

            final KnowledgeBase kbase = readKnowledgeBase();
            final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
            new Thread(new Runnable() {
                public void run() {
                  ksession.fireUntilHalt();
                }
              }).start();

            ksession.getWorkItemManager().registerWorkItemHandler( "Log", new WorkItemHandler() {
                public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
                    logger.info("=== message from flow ===>> "+ workItem.getParameter("Message"));

                    manager.completeWorkItem(workItem.getId(), null);

                    logger.info("Work item completed!");
                }
                public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
                    logger.info("Log task abort called!!!");
                }
            } );

            ksession.startProcess("com.ajay.test.MyTimer");
        } catch (Throwable t) {
            t.printStackTrace();
        }

        logger.info("main finished!");
    }

    private static KnowledgeBase readKnowledgeBase() throws Exception {
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newClassPathResource("my-timer.rf"), ResourceType.DRF);
        KnowledgeBuilderErrors errors = kbuilder.getErrors();
        if (errors.size() > 0) {
            for (KnowledgeBuilderError error: errors) {
                System.err.println(error);
            }
            throw new IllegalArgumentException("Could not parse knowledge.");
        }
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        return kbase;
    }

}
