1 package com.billkuker.rocketry.motorsim;
3 import java.beans.PropertyChangeEvent;
4 import java.beans.PropertyChangeListener;
5 import java.beans.PropertyChangeSupport;
6 import java.lang.reflect.Method;
8 import org.apache.log4j.Logger;
10 public aspect ChangeListening {
12 private static Logger log = Logger.getLogger(ChangeListening.class);
13 public interface Subject {
14 // public void addPropertyChangeListener(PropertyChangeListener l);
17 private PropertyChangeSupport Subject.pcs;
19 public void Subject.addPropertyChangeListener(PropertyChangeListener l) {
20 pcs.addPropertyChangeListener(l);
23 public void Subject.removePropertyChangeListener(PropertyChangeListener l) {
24 pcs.removePropertyChangeListener(l);
27 public void Subject.firePropertyChange(PropertyChangeEvent e) {
28 pcs.firePropertyChange(e);
31 declare parents: Motor || Grain || Chamber || Nozzle || Fuel implements Subject;
33 void around(Subject s, Object newVal):
34 execution(void Subject+.set*(..)) && target(s) && args(newVal) {
35 String name = thisJoinPointStaticPart.getSignature().getName();
36 name = name.replaceFirst("set", "");
40 if (newVal instanceof Boolean)
42 Method m = s.getClass().getMethod(pre + name);
45 } catch (Throwable t) {
46 log.warn("Error getting old value for " + name);
50 s.pcs.firePropertyChange(name, old, newVal);
54 after(Subject s) returning: this(s) && initialization(Subject.new(..)) {
55 s.pcs = new PropertyChangeSupport(s);