1
2
3
4
5
6
7
8
9
10 package pt.digitalis.dif.codegen.util;
11
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16
17 import pt.digitalis.dif.startup.DIFStartupConfiguration;
18 import pt.digitalis.dif.utils.ObjectFormatter;
19 import pt.digitalis.log.LogLevel;
20 import pt.digitalis.utils.bytecode.exceptions.CodeGenerationException;
21 import pt.digitalis.utils.bytecode.holders.ClassHolder;
22 import pt.digitalis.utils.inspection.exception.ResourceNotFoundException;
23
24
25
26
27
28
29
30
31 public class ClassEnhancements {
32
33
34 private String className;
35
36
37 private List<String> incrementalMethods = new ArrayList<String>();
38
39
40 private Map<String, ClassMethodEnhancement> methodEnhancements = new HashMap<String, ClassMethodEnhancement>();
41
42
43 private ClassHolder theClassObject;
44
45
46
47
48
49
50
51 public ClassEnhancements(ClassHolder clazz) {
52 this.className = clazz.getFQName();
53 this.theClassObject = clazz;
54 }
55
56
57
58
59
60
61
62 public void addEnhancement(ClassMethodEnhancement enhancement) {
63 methodEnhancements.put(enhancement.getMethodName(), enhancement);
64 }
65
66
67
68
69
70
71
72
73
74 public void addSource(String methodName, String methodSource) {
75 ClassMethodEnhancement methodEnhancement = methodEnhancements.get(methodName);
76
77 if (methodEnhancement == null)
78 methodEnhancement = new ClassMethodEnhancement(methodName, incrementalMethods.contains(methodName));
79 else
80 methodSource = "\n" + methodSource;
81
82 methodEnhancement.addSource(methodSource);
83 methodEnhancements.put(methodName, methodEnhancement);
84 }
85
86
87
88
89
90
91
92
93
94 public void commitEnhancements() throws ResourceNotFoundException, CodeGenerationException {
95
96
97 for (String methodName : methodEnhancements.keySet()) {
98 String source = methodEnhancements.get(methodName).getSource();
99
100
101 if (DIFStartupConfiguration.getLogLevel() == LogLevel.DEBUG
102 || DIFStartupConfiguration.getLogLevel() == LogLevel.TRACE)
103 source = getSourceWithTraceInfo(methodName, source);
104
105 if (!source.startsWith("{"))
106 source = "{" + source + "}";
107
108 this.theClassObject.updateMethodSource(methodName, source);
109 }
110
111
112 this.theClassObject.writeClass();
113 }
114
115
116
117
118
119
120 public String getClassName() {
121 return className;
122 }
123
124
125
126
127
128
129 public ClassHolder getClassObject() {
130 return this.theClassObject;
131 }
132
133
134
135
136
137
138 public Map<String, ClassMethodEnhancement> getMethodEnhancements() {
139 return methodEnhancements;
140 }
141
142
143
144
145
146
147
148
149
150
151
152
153 private String getSourceWithTraceInfo(String methodName, String source) throws ResourceNotFoundException {
154 String[] lines = source.split("\n");
155 StringBuffer temp = new StringBuffer();
156
157 for (String line : lines) {
158 temp.append("System.out.println(\"" + this.theClassObject.getName() + " [" + methodName + "]: Executing - "
159 + line.replaceAll("\\\"", "\\\\\"").replaceAll("\\\\", "\\\\") + "\");\n");
160 temp.append(line);
161 temp.append("\n");
162 }
163
164 return temp.toString();
165
166 }
167
168
169
170
171
172
173
174 public void registerMethodAsIncremental(String methodName) {
175 incrementalMethods.add(methodName);
176 }
177
178
179
180
181
182
183
184
185
186 public void setTerminator(String methodName, String terminator) {
187 ClassMethodEnhancement methodEnhancement = methodEnhancements.get(methodName);
188
189 methodEnhancement.setTerminator(terminator);
190 methodEnhancements.put(methodName, methodEnhancement);
191 }
192
193
194
195
196 @Override
197 public String toString() {
198 ObjectFormatter formatter = new ObjectFormatter();
199
200 formatter.addItem("Class Name", this.className);
201 formatter.addItem("Incremental Methods", this.incrementalMethods);
202 formatter.addItem("Method Enhancements", this.methodEnhancements);
203
204 return formatter.getFormatedObject();
205 }
206 }