[rules-users] Beginner question about Dynamic Beans

Marcus Ilgner marcus.ilgner at gmail.com
Wed Jul 2 05:24:55 EDT 2008


Hi Francesco,

On Wed, Jul 2, 2008 at 10:28 AM, fmarchioni <f.marchioni at pride.it> wrote:
>
> Hi all drools users!
> I'm just learning Drools from the manual, I have a question about Dynamic
> Beans. I have added PropertyChangeSupport and listeners to my Beans: I can
> see that inside my rule, if I change
> one property the bean.....
>
> rule "Check Age"
>
> salience 20
>
>  when
>     b : Buyer (age <18)
>  then
>      bankApp.addMessage(Messages.AGE_UNDER_18);
>      b.setCash(40000); // CHANGE OF PROPERTY
> end
>
> ..then all rules are fired back again. Is it the correct behaviour ? is
> there a way to re-evaluate only some of the Rules back again ?
> thanks a lot
> Francesco
> --

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?

Here's some sample code from one of my projects:

public abstract class BindObject { /* simple proxy */
	private PropertyChangeSupport propertyChangeSupport = new
PropertyChangeSupport(this);

    public void addPropertyChangeListener(PropertyChangeListener _listener) {
            propertyChangeSupport.addPropertyChangeListener(_listener);
    }

    public void addPropertyChangeListener(String _propertyName,
PropertyChangeListener _listener) {
            propertyChangeSupport.addPropertyChangeListener(_propertyName,
_listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener _listener) {
            propertyChangeSupport.removePropertyChangeListener(_listener);
    }

    public void removePropertyChangeListener(String _propertyName,
PropertyChangeListener _listener) {
            propertyChangeSupport.removePropertyChangeListener(_propertyName,
_listener);
    }

    protected void firePropertyChange(String _propertyName, Object
_oldValue, Object _newValue) {
            propertyChangeSupport.firePropertyChange(_propertyName,
_oldValue, _newValue);
    }

    protected void firePropertyChange(String _propertyName, int
_oldValue, int _newValue) {
            propertyChangeSupport.firePropertyChange(_propertyName,
_oldValue, _newValue);
    }

    protected void firePropertyChange(String _propertyName, boolean
_oldValue, boolean _newValue) {
            propertyChangeSupport.firePropertyChange(_propertyName,
_oldValue, _newValue);
    }
}

Now I simply inherit my classes from BindObject and write my setters like this:

public final static String PROPERTY_ARTICLE_NUMBER = "articleNumber";
public void setArticleNumber(String _articleNumber) {
	String oldValue = _articleNumber;
	articleNumber = _articleNumber;
	firePropertyChange(PROPERTY_ARTICLE_NUMBER, oldValue, articleNumber);
}

This has been working great for me so far.

HTH
Marcus



More information about the rules-users mailing list