KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > ch > ethz > prose > jvmai > jikesrvm > advice_weaver > FieldWeaver


1 package ch.ethz.prose.jvmai.jikesrvm.advice_weaver;
2
3 import java.lang.reflect.Field JavaDoc;
4 import java.lang.reflect.Method JavaDoc;
5 import java.util.*;
6
7 import com.ibm.JikesRVM.classloader.*;
8
9 /**
10  * Remembers the fields where a callback should be inserted. For each method
11  * that references the specified field, a callback is woven using the
12  * MethodWeaver class.
13  *
14  * @author Johann Gyger
15  */

16 public class FieldWeaver {
17
18   /**
19    * Collection of all field weavers. For each field there exists exactly one
20    * field weaver in the system.
21    */

22   protected static Map weavers = new HashMap();
23
24   /**
25    * Get a unique field weaver for `target'.
26    *
27    * @param target field that will be woven
28    */

29   public static synchronized FieldWeaver getWeaver(Field JavaDoc target) {
30     if (target == null)
31       throw new NullPointerException JavaDoc("Parameter `target' must not be null.");
32
33     FieldWeaver result = (FieldWeaver) weavers.get(target.toString());
34     if (result == null) {
35       result = new FieldWeaver(target);
36       weavers.put(target.toString(), result);
37     }
38
39     return result;
40   };
41
42   /**
43    * Re-weave all modified f and activate them in the VM.
44    */

45   public static synchronized void commit() {
46     Iterator it = weavers.values().iterator();
47     while (it.hasNext()) {
48       FieldWeaver fw = (FieldWeaver) it.next();
49       if (fw.modified) {
50         //System.out.println("FieldWeaver.commit(): " + fw.debugString());
51
fw.weave();
52       }
53     }
54   }
55
56   /**
57    * Reset all field weavers.
58    */

59   public static synchronized void resetAll() {
60     weavers = new HashMap();
61   }
62
63   /**
64    * Field bound to this weaver.
65    */

66   protected Field JavaDoc target;
67
68   /**
69    * Is field access join point activated?
70    */

71   protected boolean fieldAccessEnabled;
72
73   /**
74    * Is field modificatin join point activated?
75    */

76   protected boolean fieldModificationEnabled;
77
78   /**
79    * Is a re-weaving of the callbacks for the field in this weaver necessary?
80    */

81   protected boolean modified;
82
83   /**
84    * Create a new field weaver.
85    *
86    * @param target target field for which callbacks will be woven
87    */

88   protected FieldWeaver(Field JavaDoc target) {
89     this.target = target;
90   }
91
92   /**
93    * Enable field access join point.
94    *
95    * @param flag enable/disable
96    */

97   public void setFieldAccessEnabled(boolean flag) {
98     fieldAccessEnabled = flag;
99     modified = true;
100   }
101
102   /**
103    * Enable field modification join point.
104    *
105    * @param flag enable/disable
106    */

107   public void setFieldModificationEnabled(boolean flag) {
108     fieldModificationEnabled = flag;
109     modified = true;
110   }
111
112   public String JavaDoc debugString() {
113     StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
114
115     sb.append("FieldWeaver for: ");
116     sb.append(target);
117     sb.append("\n\tfieldAccessEnabled: ");
118     sb.append(fieldAccessEnabled);
119     sb.append("\n\tfieldModificationEnabled: ");
120     sb.append(fieldModificationEnabled);
121     sb.append("\n\tmodified: ");
122     sb.append(modified);
123
124     return sb.toString();
125   }
126
127   /**
128    * Weave advice that are associated with the field in this weaver. The
129    * weaving is actually done by the MethodWeaver. This method only informs the
130    * MethodWeaver instances that are involved.
131    */

132   protected void weave() {
133     VM_Field f = java.lang.reflect.JikesRVMSupport.getFieldOf(target);
134     VM_FieldReference fr = f.getMemberRef().asFieldReference();
135
136     Iterator it = fr.accessors.iterator();
137     while (it.hasNext()) {
138       Method JavaDoc m = getMethod(((Integer JavaDoc) it.next()).intValue());
139
140       if (fieldAccessEnabled)
141         MethodWeaver.getWeaver(m).addFieldAccessor(target);
142       else
143         MethodWeaver.getWeaver(m).removeFieldAccessor(target);
144     }
145
146     it = fr.modifiers.iterator();
147     while (it.hasNext()) {
148       Method JavaDoc m = getMethod(((Integer JavaDoc) it.next()).intValue());
149
150       if (fieldModificationEnabled)
151         MethodWeaver.getWeaver(m).addFieldModifier(target);
152       else
153         MethodWeaver.getWeaver(m).removeFieldModifier(target);
154     }
155
156     modified = false;
157   }
158
159   /**
160    * Get the method with id `id'
161    *
162    * @param id method id
163    * @return method
164    */

165   protected Method JavaDoc getMethod(int id) {
166     VM_MethodReference mr = VM_MemberReference.getMemberRef(id).asMethodReference();
167     VM_Method m = (VM_NormalMethod) mr.resolve();
168
169     return java.lang.reflect.JikesRVMSupport.createMethod(m);
170   }
171
172 }
173
Popular Tags