/* * Copyright (c) 1998-2002 Xerox Corporation, * 2004 Contributors. 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 declare a field on Point to hold the property * change support object. `this' is a reference to a Point object. */ private PropertyChangeSupport Point.support = new PropertyChangeSupport(this); /* * Declare property change registration methods on Point, * and 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; /** * Send property change event after X setter completes normally. * Use around advice to keep the old value on the stack. */ void around(Point p): execution(void Point.setX(int)) && target(p) { int oldValue = p.getX(); proceed(p); firePropertyChange(p, "x", oldValue, p.getX()); } /** * Send property change event after Y setter completes normally. * Use around advice to keep the old value on the stack. */ void around(Point p): execution(void Point.setY(int)) && target(p) { int oldValue = p.getY(); proceed(p); firePropertyChange(p, "y", oldValue, 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)); } }