[jboss-svn-commits] JBL Code SVN: r17019 - in labs/jbossrules/branches/temporal_rete/drools-compiler/src/test: java/org/drools/integrationtests/eventgenerator and 2 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Tue Dec 4 11:29:14 EST 2007
Author: mgroch
Date: 2007-12-04 11:29:14 -0500 (Tue, 04 Dec 2007)
New Revision: 17019
Added:
labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/
labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java
labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java
labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java
labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java
labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java
labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java
labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/
labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl
Log:
initial import event generator + test case
Added: labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java (rev 0)
+++ labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/AbstractEventListener.java 2007-12-04 16:29:14 UTC (rev 17019)
@@ -0,0 +1,32 @@
+/**
+ *
+ */
+package org.drools.integrationtests.eventgenerator;
+
+import org.drools.WorkingMemory;
+
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public abstract class AbstractEventListener {
+
+ WorkingMemory wm;
+
+ /**
+ * @param wm
+ */
+ public AbstractEventListener(WorkingMemory wm) {
+ this.wm = wm;
+ }
+
+ public void addEventToWM (Event ev){
+ wm.insert(ev);
+ wm.fireAllRules();
+ }
+
+ // send generated event and execute corresponding actions
+ public abstract void generatedEventSent(Event e);
+
+}
Added: labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java (rev 0)
+++ labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/Event.java 2007-12-04 16:29:14 UTC (rev 17019)
@@ -0,0 +1,163 @@
+/**
+ *
+ */
+package org.drools.integrationtests.eventgenerator;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class Event implements Cloneable{
+
+ public enum EventType {CUSTOM, PRODUCTION, STATUSCHANGED, HEARTBEAT, FAILURE};
+
+ private EventType eventId;
+ private String parentId;
+ private Map<String,String> parameters;
+ private long startTime, endTime;
+
+ public Event() {
+ this.parameters = new HashMap <String, String>();
+ }
+
+ /**
+ * @param eventId The name of the event.
+ * @param parentId The id of the corresponding site, resource, ...
+ */
+ public Event(EventType eventId, String parentId) {
+ this();
+ this.eventId = eventId;
+ this.parentId = parentId;
+ }
+
+ /**
+ * @param eventId The name of the event.
+ * @param parentId The id of the corresponding site, resource, ...
+ * @param start The start instance of the event.
+ * @param end The end instance of the event.
+ */
+ public Event(EventType eventId, String parentId, long start, long end) {
+ this(eventId, parentId);
+ this.startTime = start;
+ this.endTime = end;
+ }
+
+ /**
+ * @return the event id
+ */
+ public EventType getEventId() {
+ return this.eventId;
+ }
+
+ /**
+ * @param eventId the event name to set
+ */
+ public void setEventType(EventType eventId) {
+ this.eventId = eventId;
+ }
+
+ /**
+ * @return the endTime
+ */
+ public long getEndTime() {
+ return endTime;
+ }
+
+ /**
+ * @param endTime the endTime to set
+ *//*
+ public void setEndTime(Calendar endTime) {
+ this.endTime = (Calendar)endTime.clone();
+ }*/
+
+ /**
+ * @return the startTime
+ */
+ public long getStartTime() {
+ return startTime;
+ }
+
+ /**
+ * @param startTime the startTime to set
+ *//*
+ public void setStartTime(Calendar startTime) {
+ this.startTime = (Calendar)startTime.clone();
+ }*/
+
+ /**
+ * @param startTime the startTime to set
+ * @param endTime the endTime to set
+ */
+ public void setTimes(long startTime, long endTime) {
+ this.startTime = startTime;
+ this.endTime = endTime;
+ }
+
+ /**
+ * @param startTime the startTime to set
+ * @param endTime the endTime to set
+ */
+ // used for primitive events where start end end time are equal
+ public void setTimes(long startAndEndTime) {
+ this.startTime = startAndEndTime;
+ this.endTime = startAndEndTime;
+ }
+
+ /**
+ * @return the parentId
+ */
+ public String getParentId() {
+ return parentId;
+ }
+
+ /**
+ * @param ressourceId the ressourceId to set
+ */
+ public void setParentId(String parentId) {
+ this.parentId = parentId;
+ }
+
+ /**
+ * @return the parameters
+ */
+ public Map<String, String> getParameters() {
+ return parameters;
+ }
+
+ /**
+ * @param parameter name of the parameter
+ * @return value of the specified parameter
+ */
+ public String getParamValue(String parameter) {
+ return parameters.get(parameter);
+ }
+
+ /**
+ * @param parameters the parameters to set
+ */
+ public void addParameters(Map<String, String> parameters) {
+ this.parameters.putAll(parameters);
+ }
+
+ /**
+ * @param paramName the name of the added parameter to set
+ * @param paramValue the value of the added parameter to set
+ */
+ public void addParameter(String paramName, String paramValue) {
+ this.parameters.put(paramName, paramValue);
+ }
+
+ public Object clone(){
+ try
+ {
+ return super.clone();
+ }
+ catch ( CloneNotSupportedException e ) {
+ // this shouldnt happen, since we are Cloneable
+ throw new InternalError();
+ }
+ }
+}
Added: labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java (rev 0)
+++ labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/PseudoSessionClock.java 2007-12-04 16:29:14 UTC (rev 17019)
@@ -0,0 +1,65 @@
+/**
+ *
+ */
+package org.drools.integrationtests.eventgenerator;
+
+
+public class PseudoSessionClock
+ {
+
+ private long timer;
+
+ public PseudoSessionClock() {
+ this.timer = 0;
+ }
+
+ /* (non-Javadoc)
+ * @see org.drools.temporal.SessionClock#getCurrentTime()
+ */
+ public long getCurrentTime() {
+ return this.timer;
+ }
+
+ public long advanceTime( long millisecs ) {
+ this.timer += millisecs;
+ return this.timer;
+ }
+
+ public long setTime( long timer ) {
+ this.timer = timer;
+ return this.timer;
+ }
+
+ // using current system time as reference
+ public long calcFuturePointInTime (long timeToAdd){
+ return this.timer+timeToAdd;
+ }
+
+ // ------------------------------------------------------------------------------------
+ // static convenience methods
+
+ // using an arbitrary starting point as reference
+ public static long calcFuturePointInTime (long currentTime, long timeToAdd){
+ return currentTime+timeToAdd;
+ }
+
+ // convert seconds to milliseconds
+ public static long timeInSeconds (long timeInSecs){
+ return timeInSecs*1000;
+ }
+
+ // convert seconds to milliseconds
+ public static long timeInMinutes (long timeInMins){
+ return timeInSeconds(timeInMins)*60;
+ }
+
+ // convert seconds to milliseconds
+ public static long timeInHours (long timeInHrs){
+ return timeInMinutes(timeInHrs)*60;
+ }
+
+ // convert time given as hours, minutes, seconds, milliseconds to milliseconds
+ public static long timeinHMSM (long hours, long mins, long secs, long msecs){
+ return timeInHours(hours) + timeInMinutes(mins) + timeInSeconds(secs) + msecs;
+ }
+ }
Added: labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java (rev 0)
+++ labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGenerator.java 2007-12-04 16:29:14 UTC (rev 17019)
@@ -0,0 +1,239 @@
+/**
+ *
+ */
+package org.drools.integrationtests.eventgenerator;
+
+/**
+ * @author Matthias Groch
+ *
+ */
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Random;
+
+import org.drools.FactHandle;
+import org.drools.WorkingMemory;
+
+
+
+public class SimpleEventGenerator {
+
+ private WorkingMemory wm;
+ private long generationEndTime;
+ private static AbstractEventListener sendListener;
+ private boolean endInfinite;
+ private int eventSourceIdCounter;
+ private Map<String, Integer> eventSourceIds;
+ private LinkedList<EventOccurrence> nextEventSource;
+ private PseudoSessionClock myClock;
+ FactHandle clockHandle;
+
+ /**
+ * @param wm
+ */
+ public SimpleEventGenerator(WorkingMemory wm, AbstractEventListener l) {
+ this (wm, l, 0);
+ }
+
+ /**
+ * @param wm
+ * @param generationDuration
+ *
+ */
+ public SimpleEventGenerator(WorkingMemory wm, AbstractEventListener l, long generationDuration) {
+ this.wm = wm;
+ this.sendListener = l;
+ // add session clock to working memory
+ this.myClock = new PseudoSessionClock();
+ this.clockHandle = wm.insert(myClock);
+
+ this.generationEndTime = this.myClock.calcFuturePointInTime(generationDuration);
+ this.endInfinite = (generationDuration == 0);
+ this.eventSourceIdCounter = 0;
+ this.eventSourceIds = new HashMap<String, Integer>();
+ this.nextEventSource = new LinkedList<EventOccurrence>();
+ }
+
+ /**
+ * @return the endInfinite
+ */
+ public boolean isEndInfinite() {
+ return endInfinite;
+ }
+
+ // add source which will generate events from current clock time on, possibly forever (i.e. no boundaries)
+ public EventOccurrence addEventSource(String id, Event ev, long minOccur, long avgOccur){
+ return addEventSource (id, ev, minOccur, avgOccur, 0, 0);
+ }
+
+ // add source which will generate events from current clock time on, but only maxItems instances at the most AND not exceeding the time specified by maxDuration
+ public EventOccurrence addEventSource(String id, Event ev, long minOccur, long avgOccur, long maxDuration, int maxItems){
+ if (!eventSourceIds.containsKey(id)){
+ this.eventSourceIds.put(id, new Integer(eventSourceIdCounter++));
+ EventOccurrence evOcc = new EventOccurrence(id, ev, minOccur, avgOccur, this.myClock.getCurrentTime(), maxDuration, maxItems);
+ this.nextEventSource.add (evOcc);
+ return evOcc;
+ }
+ return null;
+ }
+
+ // add source which will generate events from the given start time on, possibly forever (i.e. no boundaries)
+ public EventOccurrence addDelayedEventSource(String id, Event ev, long minOccur, long avgOccur, long startTime){
+ return addDelayedEventSource (id, ev, minOccur, avgOccur, startTime, 0, 0);
+ }
+
+ // add source which will generate events from the given start time on, but only maxItems instances at the most AND not exceeding the time specified by maxDuration
+ public EventOccurrence addDelayedEventSource(String id, Event ev, long minOccur, long avgOccur, long startTime, long maxDuration, int maxItems){
+ if (!eventSourceIds.containsKey(id)){
+ this.eventSourceIds.put(id, new Integer(eventSourceIdCounter++));
+ EventOccurrence evOcc = new EventOccurrence(id, ev, minOccur, avgOccur, startTime, maxDuration, maxItems);
+ this.nextEventSource.add (evOcc);
+ return evOcc;
+ }
+ return null;
+ }
+
+ public void removeEventSource(String id){
+ Integer hashValue = eventSourceIds.get(id);
+ if (hashValue != null){
+ this.nextEventSource.remove(hashValue.intValue());
+ this.eventSourceIds.remove(id);
+ this.eventSourceIdCounter--;
+ }
+ }
+
+ public static void sendGeneratedEvent(Event ev){
+ sendListener.generatedEventSent(ev);
+ }
+
+
+ public void generate() {
+ EventOccurrence currentEGT;
+ Event currentEvent;
+
+ //sort all events according to their first occurrence
+ Collections.sort(nextEventSource, new EventGenerationTimeComparator());
+
+ // simulate ongoing simulation time and upcoming events
+ while (!nextEventSource.isEmpty()) {
+
+ // get next event generation time from queue
+ currentEGT = nextEventSource.removeFirst();
+ currentEvent = (Event)currentEGT.getEvent().clone();
+
+ // advance clock to time of currentEGT
+ myClock.setTime(currentEGT.getNextOccurrenceTime());
+
+ // send event corresponding to currentEGT
+ sendGeneratedEvent(currentEvent);
+ //System.out.println ("Sender "+currentEGT.getEventSenderId() + ": Sent "+currentEvent.getEventId()+" event for parent id " + currentEvent.getParentId() + " at " + Tools.formattedDate(currentEGT.getNextOccurrenceTime()));
+
+ //update clock in working memory in order being able to process time sensitive rules
+ wm.update(clockHandle, myClock);
+
+ // determine new event generation time for this event type
+ boolean occIsValid = currentEGT.calculateNextEventOccurrence();
+ // add the new generation time to the right position in the queue,
+ // but only if the generated event met its local restrictions plus
+ // it is going to occur within the global time boundaries (or there are no such boundaries, respectively)
+ if (occIsValid && (isEndInfinite() || currentEGT.getNextOccurrenceTime() < this.generationEndTime)) {
+ int index = Collections.binarySearch(nextEventSource, currentEGT, new EventGenerationTimeComparator());
+ if (index < 0)
+ nextEventSource.add(-index-1, currentEGT);
+ }
+ //session.out.print ("\nQueue nach Bearbeitung: ");
+ //for (int i = 0; i < nextEventSource.size(); i++)
+ // session.out.print (Tools.formattedDate(nextEventSource.get(i).getGenerationTime())+"\""+nextEventSource.get(i).getEventSenderId()+"; ");
+
+ };
+
+ //System.out.println ("\nSending of messages finished");
+ }
+
+}
+
+class EventOccurrence{
+
+ private static Random myRandom = new Random();;
+
+ private String eventSenderId;
+ private Event event;
+ private long evDeviation, evMinDur;
+ private int itemCounter, maxItems;
+ private long latestEnd;
+ private boolean infinite;
+
+ public EventOccurrence(String eventSenderId, Event ev, long evMinDur, long avgOccur, long earliestStart, long maxDuration, int maxItems) {
+ this.eventSenderId = eventSenderId;
+ this.evMinDur = evMinDur;
+ this.evDeviation = 2*(avgOccur-evMinDur);
+
+ this.event = ev;
+ this.event.setTimes(earliestStart);
+ this.latestEnd = earliestStart+maxDuration;
+ this.maxItems = maxItems;
+ this.itemCounter = 0;
+ this.infinite = maxDuration<=0;
+ calculateNextEventOccurrence();
+ }
+
+ // returns true if event source has no boundaries or all restrictions (i.e. a generation duration or max. number of event instances) are met, false otherwise
+ public boolean calculateNextEventOccurrence (){
+ this.event.setTimes(this.event.getEndTime()+myRandom.nextInt((int)this.evDeviation)+this.evMinDur);
+ if (maxItems <=0){
+ if (isInfinite())
+ return true;
+ else return event.getEndTime()<this.latestEnd;
+ }
+ else {
+ this.itemCounter++;
+ if (this.itemCounter>this.maxItems)
+ return false;
+ if (isInfinite())
+ return true;
+ else return (event.getEndTime()<this.latestEnd);
+ }
+ }
+
+ /**
+ * @return the infinite
+ */
+ private boolean isInfinite() {
+ return infinite;
+ }
+
+ /**
+ * @return the eventSenderId
+ */
+ public String getEventSenderId() {
+ return eventSenderId;
+ }
+
+ /**
+ * @return the time
+ */
+ public long getNextOccurrenceTime() {
+ return this.event.getEndTime();
+ }
+
+ /**
+ * @return the event
+ */
+ public Event getEvent() {
+ return event;
+ }
+
+}
+
+class EventGenerationTimeComparator implements Comparator<EventOccurrence>{
+
+ @Override
+ public int compare(EventOccurrence o1, EventOccurrence o2) {
+ return (int)(o1.getNextOccurrenceTime()-o2.getNextOccurrenceTime());
+ }
+
+}
Added: labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java (rev 0)
+++ labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventGeneratorTest.java 2007-12-04 16:29:14 UTC (rev 17019)
@@ -0,0 +1,168 @@
+package org.drools.integrationtests.eventgenerator;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.drools.RuleBase;
+import org.drools.RuleBaseFactory;
+import org.drools.WorkingMemory;
+import org.drools.compiler.DrlParser;
+import org.drools.compiler.DroolsParserException;
+import org.drools.compiler.PackageBuilder;
+import org.drools.integrationtests.eventgenerator.Event.EventType;
+import org.drools.lang.descr.PackageDescr;
+import org.drools.rule.Package;
+
+
+public class SimpleEventGeneratorTest extends TestCase {
+
+ private final static String TEST_RULE_FILE = "test_eventGenerator.drl";
+
+ protected RuleBase getRuleBase() throws Exception {
+
+ return RuleBaseFactory.newRuleBase( RuleBase.RETEOO,
+ null );
+ }
+
+ private RuleBase loadRuleBase(final Reader reader) throws IOException,
+ DroolsParserException,
+ Exception {
+ final DrlParser parser = new DrlParser();
+ final PackageDescr packageDescr = parser.parse( reader );
+ if ( parser.hasErrors() ) {
+ System.out.println( parser.getErrors() );
+ Assert.fail( "Error messages in parser, need to sort this our (or else collect error messages)" );
+ }
+ // pre build the package
+ final PackageBuilder builder = new PackageBuilder();
+ builder.addPackage( packageDescr );
+ final Package pkg = builder.getPackage();
+
+ // add the package to a rulebase
+ final RuleBase ruleBase = getRuleBase();
+ ruleBase.addPackage( pkg );
+ // load up the rulebase
+ return ruleBase;
+ }
+
+ public void testEventGenerationMaxItems() throws DroolsParserException, IOException, Exception{
+ final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+ final RuleBase ruleBase = loadRuleBase( reader );
+ final WorkingMemory wm = ruleBase.newStatefulSession();
+ final SimpleEventGenerator myGenerator;
+
+ // create unrestricted event generator
+ myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+ // generate 10 events, starting from the session clock
+ myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), 0, 10);
+ myGenerator.generate();
+ assertEquals(wm.getQueryResults("all inserted events").size(), 10);
+ }
+
+ public void testEventGenerationMaxTime() throws DroolsParserException, IOException, Exception{
+ final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+ final RuleBase ruleBase = loadRuleBase( reader );
+ final WorkingMemory wm = ruleBase.newStatefulSession();
+ final SimpleEventGenerator myGenerator;
+
+ // create unrestricted event generator
+ myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+ // generate events for 1 min, starting from the session clock
+ myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(1), 0);
+ myGenerator.generate();
+ assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with generation time < 1 min").size());
+ }
+
+ public void testEventGenerationMaxTimeAndMaxItems() throws DroolsParserException, IOException, Exception{
+ final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+ final RuleBase ruleBase = loadRuleBase( reader );
+ final WorkingMemory wm = ruleBase.newStatefulSession();
+ final SimpleEventGenerator myGenerator;
+
+ // create unrestricted event generator
+ myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+ // generate at most 10 events not exceeding 1 min, starting from the session clock
+ myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(1), 10);
+ myGenerator.generate();
+ assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with generation time < 1 min").size());
+ assertTrue(wm.getQueryResults("all inserted events with generation time < 1 min").size()<=10);
+ }
+
+ public void testEventGenerationDelayedMaxItems() throws DroolsParserException, IOException, Exception{
+ final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+ final RuleBase ruleBase = loadRuleBase( reader );
+ final WorkingMemory wm = ruleBase.newStatefulSession();
+ final SimpleEventGenerator myGenerator;
+
+ // create unrestricted event generator
+ myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+ // generate 10 events, delayed by 2 minutes from start session clock
+ myGenerator.addDelayedEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(2), 0, 10);
+ myGenerator.generate();
+ assertEquals(wm.getQueryResults("all inserted events").size(), 10);
+ }
+
+ public void testEventGenerationDelayedMaxTime() throws DroolsParserException, IOException, Exception{
+ final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+ final RuleBase ruleBase = loadRuleBase( reader );
+ final WorkingMemory wm = ruleBase.newStatefulSession();
+ final SimpleEventGenerator myGenerator;
+
+ // create unrestricted event generator
+ myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+ // generate events for 1 min, delayed by 2 minutes from start session clock
+ myGenerator.addDelayedEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(2), PseudoSessionClock.timeInMinutes(1), 0);
+ myGenerator.generate();
+ assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with 2 min < generation time < 3 min").size());
+ }
+
+ public void testEventGenerationDelayedMaxTimeAndMaxItems() throws DroolsParserException, IOException, Exception{
+ final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+ final RuleBase ruleBase = loadRuleBase( reader );
+ final WorkingMemory wm = ruleBase.newStatefulSession();
+ final SimpleEventGenerator myGenerator;
+
+ // create unrestricted event generator
+ myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+ // generate at most 10 events not exceeding 1 min, delayed by 2 minutes from start session clock
+ myGenerator.addDelayedEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(2), PseudoSessionClock.timeInMinutes(1), 10);
+ myGenerator.generate();
+ assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with 2 min < generation time < 3 min").size());
+ assertTrue(wm.getQueryResults("all inserted events with 2 min < generation time < 3 min").size()<=10);
+ }
+
+ public void testEventGenerationGlobalMaxTime() throws DroolsParserException, IOException, Exception{
+ final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+ final RuleBase ruleBase = loadRuleBase( reader );
+ final WorkingMemory wm = ruleBase.newStatefulSession();
+ final SimpleEventGenerator myGenerator;
+
+ // create unrestricted event generator
+ myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm), PseudoSessionClock.timeInMinutes(1));
+ // generate events for 1 min, starting from the session clock
+ myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, null), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), PseudoSessionClock.timeInMinutes(3), 0);
+ myGenerator.generate();
+ assertEquals(wm.getQueryResults("all inserted events").size(), wm.getQueryResults("all inserted events with generation time < 1 min").size());
+ }
+
+ public void testEventGenerationMultipleSources() throws DroolsParserException, IOException, Exception{
+ final Reader reader = new InputStreamReader( getClass().getResourceAsStream( TEST_RULE_FILE ) );
+ final RuleBase ruleBase = loadRuleBase( reader );
+ final WorkingMemory wm = ruleBase.newStatefulSession();
+ final SimpleEventGenerator myGenerator;
+
+ // create unrestricted event generator
+ myGenerator = new SimpleEventGenerator(wm , new SimpleEventListener(wm));
+ // generate 15 events with parent resource A and 20 events with parent resource B
+ myGenerator.addEventSource("Conveyor1", new Event(EventType.CUSTOM, "resA"), PseudoSessionClock.timeInSeconds(4), PseudoSessionClock.timeInSeconds(6), 0, 15);
+ myGenerator.addEventSource("Conveyor2", new Event(EventType.CUSTOM, "resB"), PseudoSessionClock.timeInSeconds(3), PseudoSessionClock.timeInSeconds(5), 0, 20);
+ myGenerator.generate();
+ assertEquals(wm.getQueryResults("all inserted events with parent resource A").size(), 15);
+ assertEquals(wm.getQueryResults("all inserted events with parent resource B").size(), 20);
+ }
+
+}
Added: labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java (rev 0)
+++ labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/java/org/drools/integrationtests/eventgenerator/SimpleEventListener.java 2007-12-04 16:29:14 UTC (rev 17019)
@@ -0,0 +1,28 @@
+/**
+ *
+ */
+package org.drools.integrationtests.eventgenerator;
+
+import org.drools.WorkingMemory;
+
+
+/**
+ * @author Matthias Groch
+ *
+ */
+public class SimpleEventListener extends AbstractEventListener {
+
+ public SimpleEventListener(WorkingMemory wm) {
+ super(wm);
+ // TODO Auto-generated constructor stub
+ }
+
+ /* (non-Javadoc)
+ * @see com.event.AbstractEventListener#generatedEventSent(com.event.Event)
+ */
+ @Override
+ public void generatedEventSent(Event e) {
+ addEventToWM(e);
+ }
+
+}
Added: labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl
===================================================================
--- labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl (rev 0)
+++ labs/jbossrules/branches/temporal_rete/drools-compiler/src/test/resources/org/drools/integrationtests/eventgenerator/test_eventGenerator.drl 2007-12-04 16:29:14 UTC (rev 17019)
@@ -0,0 +1,23 @@
+package com.test;
+
+import org.drools.integrationtests.eventgenerator.*;
+
+query "all inserted events"
+ Event()
+end
+
+query "all inserted events with generation time < 1 min"
+ Event(eval(endTime<PseudoSessionClock.timeInMinutes(1)))
+end
+
+query "all inserted events with 2 min < generation time < 3 min"
+ Event(eval (endTime>PseudoSessionClock.timeInMinutes(2)), eval(endTime<PseudoSessionClock.timeInMinutes(3)))
+end
+
+query "all inserted events with parent resource A"
+ Event(parentId=="resA")
+end
+
+query "all inserted events with parent resource B"
+ Event(parentId=="resB")
+end
\ No newline at end of file
More information about the jboss-svn-commits
mailing list