Changed propertylistening and quantitychecking to aspects
[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 import javax.swing.event.ChangeListener;
9
10 import com.billkuker.rocketry.motorsim.grain.MultiGrain;
11
12 public aspect ChangeListening {
13
14         public interface Subject {
15                 // public void addPropertyChangeListener(PropertyChangeListener l);
16         }
17
18         private PropertyChangeSupport Subject.pcs;
19
20         public void Subject.addPropertyChangeListener(PropertyChangeListener l) {
21                 //System.out.println("PCS Added");
22                 pcs.addPropertyChangeListener(l);
23         }
24         
25         public void Subject.removePropertyChangeListener(PropertyChangeListener l) {
26                 //System.out.println("PCS Removed");
27                 pcs.addPropertyChangeListener(l);
28         }
29         
30         public void Subject.firePropertyChange(PropertyChangeEvent e) {
31                 pcs.firePropertyChange(e);
32         }
33
34         declare parents: Motor || Grain || Chamber || Nozzle || Fuel implements Subject;
35
36         void around(Subject s, Object newVal):
37                 execution(void Subject+.set*(..)) && target(s) && args(newVal) {
38                 System.out.println(s);
39                 String name = thisJoinPointStaticPart.getSignature().getName();
40                 name = name.replaceFirst("set", "");
41                 Object old = null;
42                 try {
43                         String pre = "get";
44                         if (newVal instanceof Boolean)
45                                 pre = "is";
46                         Method m = s.getClass().getMethod(pre + name);
47                         old = m.invoke(s);
48
49                 } catch (Throwable t) {
50                         System.err.print("Error getting old value for " + name);
51                 }
52                 proceed(s, newVal);
53                 if (old != newVal) {
54                         System.out.println(name + " changed from " + old + " to "
55                                         + newVal);
56                         s.pcs.firePropertyChange(name, old, newVal);
57                 }
58         }
59
60         after(Subject s) returning: this(s) && initialization(Subject.new(..)) {
61                 s.pcs = new PropertyChangeSupport(s);
62         }
63 }