/* | |
* Copyright (c) 1998-2002 Xerox Corporation. All rights reserved. | |
* | |
* Use and copying of this software and preparation of derivative works based | |
* upon this software are permitted. Any distribution of this software or | |
* derivative works must comply with all applicable United States export | |
* control laws. | |
* | |
* This software is made available AS IS, and Xerox Corporation makes no | |
* warranty about the software, its performance or its conformity to any | |
* specification. | |
*/ | |
package bean; | |
import java.beans.*; | |
import java.io.Serializable; | |
/* | |
* Add bound properties and serialization to point objects | |
*/ | |
aspect BoundPoint { | |
/* | |
* privately introduce a field into Point to hold the property | |
* change support object. `this' is a reference to a Point object. | |
*/ | |
private PropertyChangeSupport Point.support = new PropertyChangeSupport(this); | |
/* | |
* Introduce the property change registration methods into Point. | |
* also introduce implementation of the Serializable interface. | |
*/ | |
public void Point.addPropertyChangeListener(PropertyChangeListener listener){ | |
support.addPropertyChangeListener(listener); | |
} | |
public void Point.addPropertyChangeListener(String propertyName, | |
PropertyChangeListener listener){ | |
support.addPropertyChangeListener(propertyName, listener); | |
} | |
public void Point.removePropertyChangeListener(String propertyName, | |
PropertyChangeListener listener) { | |
support.removePropertyChangeListener(propertyName, listener); | |
} | |
public void Point.removePropertyChangeListener(PropertyChangeListener listener) { | |
support.removePropertyChangeListener(listener); | |
} | |
public void Point.hasListeners(String propertyName) { | |
support.hasListeners(propertyName); | |
} | |
declare parents: Point implements Serializable; | |
/** | |
* Pointcut describing the set<property> methods on Point. | |
* (uses a wildcard in the method name) | |
*/ | |
pointcut setter(Point p): call(void Point.set*(*)) && target(p); | |
/** | |
* Advice to get the property change event fired when the | |
* setters are called. It's around advice because you need | |
* the old value of the property. | |
*/ | |
void around(Point p): setter(p) { | |
String propertyName = | |
thisJoinPointStaticPart.getSignature().getName().substring("set".length()); | |
int oldX = p.getX(); | |
int oldY = p.getY(); | |
proceed(p); | |
if (propertyName.equals("X")){ | |
firePropertyChange(p, propertyName, oldX, p.getX()); | |
} else { | |
firePropertyChange(p, propertyName, oldY, p.getY()); | |
} | |
} | |
/* | |
* Utility to fire the property change event. | |
*/ | |
void firePropertyChange(Point p, | |
String property, | |
double oldval, | |
double newval) { | |
p.support.firePropertyChange(property, | |
new Double(oldval), | |
new Double(newval)); | |
} | |
} |