that's strange. From my experience, only those rules that depend
on
the cash property should be fired if the new value triggers an
activation that wouldn't have been triggered for the old value. Could
you post the code of your PropertyChangeSupport implementation?
Hi Marcus,
thanks for your reply, well my Bean implementation is:
public class Buyer {
int age;
double yearlyIncome;
double cash;
private final PropertyChangeSupport changes = new PropertyChangeSupport(
this );
public void addPropertyChangeListener(final PropertyChangeListener l) {
this.changes.addPropertyChangeListener( l );
}
public void removePropertyChangeListener(final PropertyChangeListener l) {
this.changes.removePropertyChangeListener( l );
}
public int getAge() {
return age;
}
public void setAge(int newAge) {
int oldAge = this.age;
this.age = newAge;
this.changes.firePropertyChange("age", oldAge, newAge);
}
public double getCash() {
return cash;
}
public void setCash(double newCash) {
double oldCash = this.cash;
this.cash = newCash;
System.out.println("[Buyer ] cash is " + this.cash);
this.changes.firePropertyChange("cash", oldCash, newCash);
}
public double getYearlyIncome() {
return yearlyIncome;
}
public void setYearlyIncome(double newYearlyIncome) {
double oldYearlyIncome = this.yearlyIncome;
this.yearlyIncome = newYearlyIncome;
this.changes.firePropertyChange("yearlyIncome", oldYearlyIncome,
newYearlyIncome);
}
}
And my complete Rule file is:
global drools.BankApplication bankApp;
rule "Check Age"
when
b : Buyer (age <18)
then
System.out.println("[Rule.drl] Checking age");
bankApp.addMessage(Messages.AGE_UNDER_18);
b.setCash(40000);
end
rule "Check Cash"
when
b : Buyer (cash <5000)
then
System.out.println("[Rule.drl] Checking cash");
System.out.println("[Rule.drl] cash is " + b.getCash());
bankApp.addMessage(Messages.CASH_LOW );
end
rule "Check Income"
when
b : Buyer (yearlyIncome <50000)
then
System.out.println("[Rule.drl] Checking income");
bankApp.addMessage(Messages.INCOME_LOW );
end
And facts are passed to the Working memory this way:
Buyer buyer = new Buyer();
BankApplication bankApp = new BankApplication();
buyer.setAge(15);
buyer.setCash(1000);
buyer.setYearlyIncome(30000);
workingMemory.setGlobal("bankApp", bankApp);
workingMemory.insert(buyer,true);
workingMemory.fireAllRules();
Looking at the log file:
14:23:47,109 INFO [STDOUT] [Buyer ] Setted cash with 1000.0
14:23:47,109 INFO [STDOUT] [Rule.drl] Checking income
14:23:47,125 INFO [STDOUT] [Rule.drl] Checking cash
14:23:47,125 INFO [STDOUT] [Rule.drl] cash is 1000.0
14:23:47,125 INFO [STDOUT] [Rule.drl] Checking age
14:23:47,125 INFO [STDOUT] [Buyer ] Setted cash with 40000.0
14:23:47,125 INFO [STDOUT] [Rule.drl] Checking income
14:23:47,125 INFO [STDOUT] [Rule.drl] Checking age
14:23:47,125 INFO [STDOUT] [Buyer ]Setted cash with 40000.0
I can see that the Rule "income" has been invoked twice: why if it doesn't
use the cash attribute in it ?
Thanks a lot for your time
Francesco
--
View this message in context:
http://www.nabble.com/Beginner-question-about-Dynamic-Beans-tp18232282p18...
Sent from the drools - user mailing list archive at
Nabble.com.