[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