[jboss-jira] [JBoss JIRA] (JBRULES-2457) Wrong evaluation of rules and PseudoClock NPE

Geoffrey De Smet (JIRA) jira-events at lists.jboss.org
Wed Feb 1 05:26:43 EST 2012


     [ https://issues.jboss.org/browse/JBRULES-2457?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Geoffrey De Smet updated JBRULES-2457:
--------------------------------------

    Fix Version/s: 5.4.0.Beta3
                       (was: 5.4.0.Beta2)

    
> Wrong evaluation of rules and PseudoClock NPE
> ---------------------------------------------
>
>                 Key: JBRULES-2457
>                 URL: https://issues.jboss.org/browse/JBRULES-2457
>             Project: Drools
>          Issue Type: Bug
>      Security Level: Public(Everyone can see) 
>    Affects Versions: 5.0.1.FINAL, 5.1.0.M1
>         Environment: Windows 7, Eclipse 3.4, Java 1.6.0_u18, JUnit 4
>            Reporter: Vítor Moreira
>            Assignee: Edson Tirelli
>             Fix For: 5.4.0.Beta3
>
>
> I've got a DRL file, having the following rules:
> - offline event for 3 minutes withou any online event meanwhile => send an offline notification
> - online event after offline event (within 3 minute range) => send an online notification
> I've also got an junit test:
> - insert offline event
> - pseudoclock advances 2m50s
> - insert online event
> - pseudoclock advances 15s
> - check if there's any notification
> And the result of the junit is:
> 1) NPE when clock advances 15s
> java.lang.NullPointerException
>        at org.drools.util.LinkedList.remove(LinkedList.java:113)
>        at org.drools.common.Scheduler$DuractionJob.execute(Scheduler.java:71)
>        at org.drools.time.impl.PseudoClockScheduler$ScheduledJob.call(PseudoClockScheduler.java:219)
>        at org.drools.time.impl.PseudoClockScheduler.runCallBacks(PseudoClockScheduler.java:168)
>    at org.drools.time.impl.PseudoClockScheduler.advanceTime(PseudoClockScheduler.java:130)
> 2) When checking for a notification, it should have one online notification but has on offline notification
> At the bottom of this issue, there are snippets of junit code and drools rule file.
> Probably, the problem relies on Junit initialization code.
> T.I.A.
> -- DRL file (snippet) --
> dialect "java"
> declare Event
>     @role( event )
>     @expires ( 7d )
> end
> global ISnmpNotifier snmpNotifier;
> /*************************/
> /* OFFLINE FOR 3 MINUTES */
> /*************************/
> rule "bit\dom - events offline (device offline for 3 minutes)"
> 	when
> 		$offline : Event( freeField == "101", $offlineLane : lane ) from entry-point "incoming"
> 		not ( $online : Event (freeField == "102", lane == $offlineLane, this after [0s,3m] $offline ) from entry-point "incoming" )
> 	then
> 		snmpNotifier.send( new Notification("101", "offline") );
> end
> rule "bit\dom - events online (device offline for 3 minutes)"
> 	when
> 		$offline: Event( freeField == "101", $lane : lane ) from entry-point "incoming"
> 		$online : Event( freeField == "102", lane == $lane, this after [3m] $offline ) from entry-point "incoming"
> 	then
> 		snmpNotifier.send( new Notification("102", "online") );
> end 
> -- DRL file (snippet) --
> -- JUnit code (snippet) --
> package pt.brisa.sam.agent.rules.bit_dom;
> import java.util.concurrent.TimeUnit;
> 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.KnowledgeSessionConfiguration;
> import org.drools.runtime.StatefulKnowledgeSession;
> import org.drools.runtime.conf.ClockTypeOption;
> import org.drools.runtime.rule.WorkingMemoryEntryPoint;
> import org.drools.time.impl.PseudoClockScheduler;
> import org.junit.Assert;
> import org.junit.Before;
> import org.junit.Test;
> public class Jira_Drools {
> 	
> 	// values used to create test
> 	private String offlineEventCode = "101";
> 	private String onlineEventCode  = "102";
> 	private String device           = "device";
> 	
> 	// drools specific vars
> 	private WorkingMemoryEntryPoint		workingMemoryEntryPoint;
> 	private PseudoClockScheduler			clock = null;
> 	
> 	private StatefulKnowledgeSession		kSession;
> 	
> 	/**
> 	 * SnmpNotificationEventCase.getNumberOfNotificationsByExample(example)
> 	 * 	.getNumberOfNotificationsByExample => from the notification queue, returns the number of notifications matching the given example
> 	 */
> 	private SnmpNotificationEventCase		snmpNotificationEventCase;
> 	
> 	@Before
> 	public void droolsSetup() {
>     	KnowledgeBaseConfiguration baseConfig;
> 		KnowledgeSessionConfiguration sessionConfig;
> 		KnowledgeBase kBase;
> 		KnowledgeBuilder kBuilder;
> 		
> 		
> 		baseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
> 		baseConfig.setOption( EventProcessingOption.STREAM );		// Use stream mode
> 		kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
> 		kBuilder.add(ResourceFactory.newFileResource( "test.drl"), ResourceType.DRL);
> 		kBase = KnowledgeBaseFactory.newKnowledgeBase(baseConfig);
> 		kBase.addKnowledgePackages(kBuilder.getKnowledgePackages());			
> 		sessionConfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
> 		sessionConfig.setOption( ClockTypeOption.get( "pseudo" ) );
> 		
> 		kSession = kBase.newStatefulKnowledgeSession( sessionConfig, null );
>         kSession.setGlobal( "snmpNotifier", snmpNotificationEventCase );
>         workingMemoryEntryPoint = kSession.getWorkingMemoryEntryPoint("incoming");
> 		
> 		clock = (PseudoClockScheduler) kSession.getSessionClock();	
> 		snmpNotificationEventCase = new SnmpNotificationEventCase();
> 	}
> 	
> 	
>     /*    offline            online  3min          */
>     /* -----|-------------------|------/----^----- */
>     /*                                    check    */
>     @Test
>     public void deviceOffline_onlineBefore3minutes_checkAfter3minutes() {
>     	/* alocates OFFLINE and ONLINE events, EXAMPLE */
>     	Event offlineEvent = new Event();
>     	Event onlineEvent = new Event();
>     	Notification example = new Notification();
>     	
> 		/* configures the events */
> 		offlineEvent.setFreeField( offlineEventCode );
> 		offlineEvent.setEventType( (byte)5 );
> 		offlineEvent.setEventCode( "0001000" + offlineEventCode );
> 		offlineEvent.setFormattedMessage( "JUnit string test" );
> 		offlineEvent.setLane( "102" );
> 		
> 		onlineEvent.setFreeField( onlineEventCode );
> 		onlineEvent.setEventType( (byte)3 );
> 		onlineEvent.setEventCode( "0001000" + onlineEventCode );
> 		onlineEvent.setFormattedMessage( "JUnit string test" );
> 		onlineEvent.setLane( "102" );
> 		
> 		/* insert offline event */
> 		workingMemoryEntryPoint.insert( offlineEvent );
> 		kSession.fireAllRules();
> 		
> 		/* intermediary check - offline notification */
> 		example.setRuleCode( "31" );
> 		example.setEventCode( offlineEventCode );
> 		Assert.assertTrue(
> 				"(device "+device+")(ruleCode 31): There are OFFLINE notifications, when it shouldn't have",
> 				snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 0 );
> 		
> 		/* advances the clock */
> 		clock.advanceTime(  2, TimeUnit.MINUTES );
> 		clock.advanceTime( 50, TimeUnit.SECONDS );
> 				
> 		/* intermediary check - offline notification */
> 		example.setRuleCode( "31" );
> 		example.setEventCode( offlineEventCode );
> 		Assert.assertTrue(
> 				"(device "+device+")(ruleCode 31): There are OFFLINE notifications, when it shouldn't have",
> 				snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 0 );
> 		
> 		/* insert online event */
> 		workingMemoryEntryPoint.insert( onlineEvent );
> 		kSession.fireAllRules();
> 		
> 		/* intermediary check - offline notification */
> 		example.setRuleCode( "31" );
> 		example.setEventCode( offlineEventCode );
> 		Assert.assertTrue(
> 				"(device "+device+")(ruleCode 31): There are OFFLINE notifications, when it shouldn't have",
> 				snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 0 );
> 		/* intermediary check - online notification */
> 		example.setRuleCode( "31" );
> 		example.setEventCode( onlineEventCode );
> 		Assert.assertTrue(
> 				"(device "+device+")(ruleCode 31): There are ONLINE notifications, when it shouldn't have",
> 				snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 0 );
> 		
> 		/* advances the clock */
> 		clock.advanceTime( 15, TimeUnit.SECONDS );
> 			
> 		/* since there's an ONLINE before the 3 minute's limit, there shouldn't be any trap regarding "last offline 3 minutes ago" */
> 		example.setRuleCode( "31" );
> 		example.setEventCode( offlineEventCode );
> 		Assert.assertTrue(
> 				"(device "+device+")(ruleCode 31): There are OFFLINE notifications, when it shouldn't have",
> 				snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 0 );
> 		example.setRuleCode( "31" );
> 		example.setEventCode( onlineEventCode );
> 		Assert.assertTrue(
> 				"(device "+device+")(ruleCode 31): There are ONLINE notifications, when it shouldn't have",
> 				snmpNotificationEventCase.getNumberOfNotificationsByExample(example) == 1 );
>     }
> }
> -- JUnit code (snippet) --

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.jboss.org/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

       



More information about the jboss-jira mailing list