/* * 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 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)); } }