package com.test;
import java.io.StringReader;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseConfiguration;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.conf.EventProcessingOption;
import org.drools.io.ResourceFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.WorkingMemoryEntryPoint;

public class Main {
    
    public class Foo {
        private Double value;

        public Foo(Double value) {
            this.value = value;
        }

        public Double getValue() {
            return value;
        }

        public void setValue(Double value) {
            this.value = value;
        }
    }
    
    private static String rule = 
        "import java.util.Date\n" +
        "import com.test.Main.Foo\n" +
        "declare Foo @role (event) end\n" +
        "rule test no-loop true\n" + 
        "when\n" + 
        "	Double() from accumulate(\n" +
        "		$c : Foo($value : value)\n" +
        "		over window:length(3)\n" +
        "		from entry-point EntryPoint,\n" +
        "		average($value))\n" +
        "then\n" +
        "	System.out.println(new Date() + \" Fired\");\n" +
        "end";

    public Main() {
	
	    final StatefulKnowledgeSession session;
	    final WorkingMemoryEntryPoint entryPoint;

	    KnowledgeBaseConfiguration kbaseConf = KnowledgeBaseFactory
		    .newKnowledgeBaseConfiguration();

        kbaseConf.setOption(EventProcessingOption.STREAM);
        
        KnowledgeBuilder builder = KnowledgeBuilderFactory
        	.newKnowledgeBuilder();
        
        builder.add(ResourceFactory.newReaderResource(new StringReader(rule)),
        	ResourceType.DRL);

        if (builder.hasErrors()) {
            throw new RuntimeException(builder.getErrors().toString());
        }
        
        final KnowledgeBase knowledgeBase = KnowledgeBaseFactory
        	.newKnowledgeBase(kbaseConf);
        knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());
        
        session = knowledgeBase.newStatefulKnowledgeSession();
        
        entryPoint = session
        	.getWorkingMemoryEntryPoint("EntryPoint");
        
        new Thread(new Runnable() {
	        public void run() {
		        session.fireUntilHalt();
	        }
        }).start();
 
	    for (int x = 1;;x++) {
	        if (session == null) {
		        continue;
	        }

	        entryPoint.insert(new Foo(Math.random()));
	        System.out.println("Inserted obj #" + x);
	    }
    }
    
    public static void main(String [] args) {
	    new Main();
    }
}

