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(a)lists.jboss.org
[mailto:rules-users-bounces@lists.jboss.org] On Behalf Of stefano corna
Sent: 14 December 2009 11:00
To: rules-users(a)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(a)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(a)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(a)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.