Property Listeners |
---|
A Property has a list of PropertyChangeListener. public interface PropertyChangeListener extends Serializable { public String getId(); public void changeSuccessfull(Property<?> property,String beforeValue,String afterValue) throws PropertyException; public void changeFailed(Property<?> property,String currentValue,String failedValue,PropertyException exception); }Which is executed to perform action after an change of Property has been attempted. Each PropertyChangeListener is identified with an ID and a Property can not have multiple PropertyChangeListeners with the same ID. A PropertyChangeListener has two methods:
|
PropertyCollections |
---|
To the PropertyCollection interface there have been added 3 methods on Collections.
The two implementations of PropertyCollection has the following rules when constructed. PropertyStaticCollection - Where a LoggingPropertyChangeListener instance is added per default at construction time. PropertyListCollection - Where NO PropertyChangeListeners is added per default. |
Implementations |
There are currently two implementations of PropertyChangeListener. LoggingPropertyChangeListener - which write a log message if the change is successful or not. //Actual implementation public class LoggingPropertyChangeListener implements PropertyChangeListener { public LoggingPropertyChangeListener() { super(); } @Override public String getId() { return getClass().getSimpleName(); } @Override public void changeSuccessfull(Property> property, String beforeValue,String afterValue) { property.getLogger().info("Property ["+property.getName()+"] has been changed from ["+beforeValue+"] to ["+afterValue+"]."); } @Override public void changeFailed(Property> property, String currentValue,String failedValue, PropertyException exception) { property.getLogger().error("Property ["+property.getName()+"] was NOT change from ["+currentValue+"] to ["+failedValue+"] it failed with ["+exception.getMessage()+"].",exception); } } UpdateLastChangedPropertyChangeListener - Which updates a Property of type Date with "new Date()" if another Property is changed successfully. This can typical be used to change a "my.password.last.changed" property when a "my.password" is actually sucessfully changed". It overrides the readonly restrictions (if any) on the Property "my.password.last.changed", because this property will usually be readonly. //Actual implementation public class UpdateLastChangedPropertyChangeListener implements PropertyChangeListener { private Property<Date> dateProperty; public UpdateLastChangedPropertyChangeListener(Property<Date> dateProperty) { super(); this.dateProperty=dateProperty; } @Override public String getId() { return getClass().getSimpleName(); } public Property<Date> getDateProperty() { return dateProperty; } @Override public void changeSuccessfull(Property<?> property, String beforeValue,String afterValue) { if (getDateProperty()!=null) { boolean p_readonly = getDateProperty().isReadonly(); if (p_readonly) { getDateProperty().setReadonly(false); } try { getDateProperty().setTypedValue(new Date()); } catch (PropertyException e) { getDateProperty().getLogger().error("Can not change ["+getDateProperty().getName()+"] property timestamp when Property ["+property.getName()+"] was updated, reason ["+e.getMessage()+"].",e); } if (p_readonly!=getDateProperty().isReadonly()) { getDateProperty().setReadonly(p_readonly); } } } @Override public void changeFailed(Property<?> property, String currentValue,String failedValue, PropertyException exception) { property.getLogger().error("Property ["+property.getName()+"] was NOT change from ["+currentValue+"] to ["+failedValue+"] it failed with ["+exception.getMessage()+"].",exception); } } Where the usages will be Property<PasswordTypeVO> MY_APP_PASSWORD_PROPERTY = new Property<PasswordTypeVO>("name", new PasswordPropertyType(new AESEncryption())); Property<Date> MY_APP_PASSWORD_LAST_CHANGED = new Property<Date>("my.app.password.last.changed", new DateTimePropertyType(new Date(0)),false,true); // UpdateLastChangedPropertyChangeListener updateListener = new UpdateLastChangedPropertyChangeListener(MY_APP_PASSWORD_LAST_CHANGED); MY_APP_PASSWORD_PROPERTY.addPropertyChangeListener(updateListener); |