organized imports
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / ChangeListening.aj
1 package com.billkuker.rocketry.motorsim;
2
3 import java.beans.PropertyChangeEvent;
4 import java.beans.PropertyChangeListener;
5 import java.beans.PropertyChangeSupport;
6 import java.lang.reflect.Method;
7
8 public aspect ChangeListening {
9
10         public interface Subject {
11                 // public void addPropertyChangeListener(PropertyChangeListener l);
12         }
13
14         private PropertyChangeSupport Subject.pcs;
15
16         public void Subject.addPropertyChangeListener(PropertyChangeListener l) {
17                 //System.out.println("PCS Added");
18                 pcs.addPropertyChangeListener(l);
19         }
20         
21         public void Subject.removePropertyChangeListener(PropertyChangeListener l) {
22                 //System.out.println("PCS Removed");
23                 pcs.addPropertyChangeListener(l);
24         }
25         
26         public void Subject.firePropertyChange(PropertyChangeEvent e) {
27                 pcs.firePropertyChange(e);
28         }
29
30         declare parents: Motor || Grain || Chamber || Nozzle || Fuel implements Subject;
31
32         void around(Subject s, Object newVal):
33                 execution(void Subject+.set*(..)) && target(s) && args(newVal) {
34                 System.out.println(s);
35                 String name = thisJoinPointStaticPart.getSignature().getName();
36                 name = name.replaceFirst("set", "");
37                 Object old = null;
38                 try {
39                         String pre = "get";
40                         if (newVal instanceof Boolean)
41                                 pre = "is";
42                         Method m = s.getClass().getMethod(pre + name);
43                         old = m.invoke(s);
44
45                 } catch (Throwable t) {
46                         System.err.print("Error getting old value for " + name);
47                 }
48                 proceed(s, newVal);
49                 if (old != newVal) {
50                         System.out.println(name + " changed from " + old + " to "
51                                         + newVal);
52                         s.pcs.firePropertyChange(name, old, newVal);
53                 }
54         }
55
56         after(Subject s) returning: this(s) && initialization(Subject.new(..)) {
57                 s.pcs = new PropertyChangeSupport(s);
58         }
59 }