[rules-users] rule on Array of custom Object

stefano82 illidan.guru at gmail.com
Mon Dec 14 06:45:29 EST 2009


hello Thomas,
yes my 2 classes are both beans, on the post i writed fast only the
attributes and method than interest my problem.
here the full class so all can had a better overview:
-------------------------------------------------------------------------------------------
package com.sample;

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.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;

/**
 * This is a sample class to launch a rule.
 */
public class DroolsTest {

	public static final void main(String[] args) {
		try {
			DroolsTest test = new DroolsTest();
			// load up the knowledge base
			KnowledgeBase kbase = readKnowledgeBase();
			StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
			KnowledgeRuntimeLogger logger =
KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
			// go !
			Message message = new Message();
			message.setMessage("Hello World1");
			message.setStatus(Message.HELLO);
			message.setId(1);
			
			Message message2 = new Message();
			message2.setMessage("Hello World1");
			message2.setStatus(Message.HELLO);
			message2.setId(2);
			
			message.arrai[0]= 1;
			message.arrai[1]= 2;
			
			message.arrai_numeri[0] = new Numbers(2,3);
			
			message2.arrai[0]= 3;
			message2.arrai[1]= 4;	
			
        	ksession.insert(message2);
			ksession.insert(message);
			
			ksession.fireAllRules();
			
			System.out.println(message2.arrai[1]);
			
			logger.close();
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}

	private static KnowledgeBase readKnowledgeBase() throws Exception {
		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
		kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"),
ResourceType.DRL);
		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;
	}
	
	public static class Numbers {

	    private int first;
	    private int last;

	    public Numbers(int first, int last){
	    	this.first = first;
	    	this.last = last;
	    }
	    
	    protected int getFirst() {

	        return first;

	    }

	    protected void setFirst(int first) {

	        this.first = first;

	    }

	    protected int getLast() {

	        return last;

	    }

	    protected void setLast(int last) {

	        this.last = last;

	    }

	}
	
	
	public static class Message {
		
		public static final int HELLO = 0;
		public static final int GOODBYE = 1;

		private String message;
        public int id;
		private int status;

		public int[] arrai;
		public Numbers[] arrai_numeri;
		
		public Message(){
		this.arrai = new int[2];
		this.arrai_numeri = new Numbers[1];
		}
		
		protected Numbers[] getNumbersArray() {

	        return arrai_numeri;
	    }

	    protected void setNumbersArray(Numbers[] arrai_numeri) {

	        this.arrai_numeri = arrai_numeri;
	    }	
		public String getMessage() {
			return this.message;
		}
		
		public int getId() {
			return this.id;
		}

		public void setId(int id) {
		   this.id = id;
		}
		
		public void setMessage(String message) {
			this.message = message;
		}

		public int getStatus() {
			return this.status;
		}

		public void setStatus(int status) {
			this.status = status;
		}
		
	}

}
----------------------------------------------------------------------------------------------
and rule=
rule "rule_001"

dialect "mvel"
when
        $msg : Message(numbersArray[0].first=="1")

then
                System.out.println("something....");
end
------------------------------------------------------------------------------



Swindells, Thomas wrote:
> 
> Have you tried making your classes beans?
> Eg adding getters and setters. (As a style guide in java you should
> generally avoid public fields and class names should start with a capital
> letter).
> 
> This would give you the following:
> public class Message {
>     private Numbers[] numbersArray;
> 
> 
>     protected Numbers[] getNumbersArray() {
>         return numbersArray;
>     }
> 
>     protected void setNumbersArray(Numbers[] numbersArray) {
>         this.numbersArray = numbersArray;
>     }
> }
> 
> public class Numbers {
>     private int first;
>     private int last;
> 
>     protected int getFirst() {
>         return first;
>     }
> 
>     protected void setFirst(int first) {
>         this.first = first;
>     }
> 
>     protected int getLast() {
>         return last;
>     }
> 
>     protected void setLast(int last) {
>         this.last = last;
>     }
> }
> 
> Thomas
> 
> From: rules-users-bounces at lists.jboss.org
> [mailto:rules-users-bounces at lists.jboss.org] On Behalf Of stefano corna
> Sent: 14 December 2009 11:00
> To: rules-users at lists.jboss.org
> Subject: [rules-users] rule on Array of custom Object
> 
> hello,
> im using drools 5.0 on eclipse and i have a problem. i want to use an
> array of object in my rule condition.
> now i try to explain:
> i have my java class with the array attribute
> -------------------------------------------------
> public static class Message {
> 
>    public numbers[] numbersArray;
> 
> }
> --------------------------------------------
> and the numbers class that rapresent the objects contained in numbersArray
> ----------------------------------------------
> public static class numbers
> {
>    public int first;
>    public int last;
> }
> --------------------------------------------------
> my goal is make a rule that check if Message.numbersArray[0].first="value"
> i use
> -------------------------------------------------
> rule "rule_001"
> 
> dialect "mvel"
> when
>         $msg : Message(numbersArray[0].first=="1")
> 
> then
>                 System.out.println("something....");
> end
> -------------------------------
> and on runtime it give me this error:
> ---------------------------------------
> org.drools.RuntimeDroolsException: Exception executing predicate
> numbersArray[0].first=="1"
>         at
> org.drools.rule.PredicateConstraint.isAllowed(PredicateConstraint.java:279)
>         at org.drools.reteoo.AlphaNode.assertObject(AlphaNode.java:143)
>         at
> org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateAssertObject(CompositeObjectSinkAdapter.java:360)
>         at
> org.drools.reteoo.CompositeObjectSinkAdapter.propagateAssertObject(CompositeObjectSinkAdapter.java:344)
>         at
> org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:185)
>         at
> org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:146)
>         at
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1046)
>         at
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:1001)
>         at
> org.drools.common.AbstractWorkingMemory.insert(AbstractWorkingMemory.java:788)
>         at
> org.drools.impl.StatefulKnowledgeSessionImpl.insert(StatefulKnowledgeSessionImpl.java:216)
>         at com.sample.DroolsTest.main(DroolsTest.java:47)
> Caused by: [Error: unable to access property (null parent): first]
> [Near : {... Unknown ....}]
>              ^
> [Line: 1, Column: 0]
>         at
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:861)
>         at
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getBeanProperty(ReflectiveAccessorOptimizer.java:585)
>         at
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.compileGetChain(ReflectiveAccessorOptimizer.java:313)
>         at
> org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeAccessor(ReflectiveAccessorOptimizer.java:138)
>         at
> org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:133)
>         at
> org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:102)
>         at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
>         at
> org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:107)
>         at org.mvel2.MVEL.executeExpression(MVEL.java:978)
>         at
> org.drools.base.mvel.MVELPredicateExpression.evaluate(MVELPredicateExpression.java:75)
>         at
> org.drools.rule.PredicateConstraint.isAllowed(PredicateConstraint.java:272)
>         ... 10 more
> -------------------------------------------------------
> moreover if i try to print the "first" value:
> .
> .
> .
> then
>                 System.out.println(numbersArray[0].first);
> end
> appear this new error and i cant compile:
> "BuildError: Unable to build expression for 'consequence': Failed to
> compile: 1 compilation error(s):
>  - (1,12) unqualified type in strict mode for: numbersArray'
> System.out.println(numbersArray[0].first);
> '"
> 
> someone can kindly help me?
> 
> ________________________________
> 
> **************************************************************************************
> This message is confidential and intended only for the addressee. If you
> have received this message in error, please immediately notify the
> postmaster at nds.com and delete it from your system as well as any copies.
> The content of e-mails as well as traffic data may be monitored by NDS for
> employment and security purposes. To protect the environment please do not
> print this e-mail unless necessary.
> 
> NDS Limited. Registered Office: One London Road, Staines, Middlesex, TW18
> 4EX, United Kingdom. A company registered in England and Wales. Registered
> no. 3080780. VAT no. GB 603 8808 40-00
> **************************************************************************************
> 
> ________________________________
> This message is confidential and intended only for the addressee. If you
> have received this message in error, please immediately notify the
> postmaster at nds.com and delete it from your system as well as any copies.
> The content of e-mails as well as traffic data may be monitored by NDS for
> employment and security purposes.
> To protect the environment please do not print this e-mail unless
> necessary.
> 
> An NDS Group Limited company. www.nds.com
> 
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
> 
> 

-- 
View this message in context: http://n3.nabble.com/rule-on-Array-of-custom-Object-tp90115p90134.html
Sent from the Drools - User mailing list archive at Nabble.com.



More information about the rules-users mailing list