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.ListIterator;
16 import java.util.Map;
17
18 import com.google.inject.Inject;
19
20 import pt.digitalis.dif.dem.DEMAnnotationLogic;
21 import pt.digitalis.utils.bytecode.holders.AnnotationHolder;
22 import pt.digitalis.utils.bytecode.holders.ClassHolder;
23 import pt.digitalis.utils.inspection.ResourceUtils;
24 import pt.digitalis.utils.inspection.exception.AuxiliaryOperationException;
25 import pt.digitalis.utils.inspection.exception.ResourceNotFoundException;
26
27
28
29
30
31
32
33
34
35 final public class DEMLoaderHelper {
36
37
38 final static public String PROVIDERS_DIR = "providers";
39
40
41 final static public String APPLICATIONS_DIR = "applications";
42
43
44 final static public String SERVICES_DIR = "services";
45
46
47 final static public String STAGES_DIR = "stages";
48
49
50 final static public String VALIDATORS_DIR = "validators";
51
52
53 static private List<String> packagesToSearch = new ArrayList<String>();
54
55
56 final static private String DEM_ANNOTATIONS_CLASS_PATH = "pt.digitalis.dif.dem.annotations";
57
58
59 final static private String DEM_ENTITIES_ANNOTATIONS_CLASS_PATH = DEM_ANNOTATIONS_CLASS_PATH + ".entities";
60
61
62
63
64 final static private String ANNOTATION_LOGIC_CLASS = DEM_ANNOTATIONS_CLASS_PATH
65 + ".metaannotations.AnnotationLogicClass";
66
67
68 static private List<String> DEMEntitiesAnnontations = null;
69
70
71 static private Map<String, DEMAnnotationLogic> annotationLogicMap = null;
72
73
74 private DEMLoaderHelper()
75 {}
76
77
78
79
80
81
82
83
84
85 static public boolean addPackage(String packageName)
86 {
87
88 if (packagesToSearch == null)
89 packagesToSearch = new ArrayList<String>();
90
91 if (!packagesToSearch.contains(packageName))
92 {
93 if (!isPackageContained(packageName))
94 {
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 for (ListIterator<String> iter = packagesToSearch.listIterator(); iter.hasNext();)
112 {
113 String registeredPackage = (String) iter.next();
114
115 if (registeredPackage.startsWith(packageName))
116 iter.remove();
117 }
118
119
120 packagesToSearch.add(packageName);
121
122 return true;
123 }
124 }
125
126 return false;
127 }
128
129
130
131
132
133
134
135
136 static private boolean isPackageContained(String packageName)
137 {
138
139 for (String registeredPackage: packagesToSearch)
140 {
141 if (packageName.startsWith(registeredPackage))
142 return true;
143 }
144 return false;
145 }
146
147
148
149
150
151
152 static public List<String> getPackageList()
153 {
154 return packagesToSearch;
155 }
156
157
158
159
160
161 static public void cleanUp()
162 {
163 packagesToSearch = null;
164 DEMEntitiesAnnontations = null;
165 }
166
167
168
169
170
171
172
173
174
175
176 static public List<ClassHolder> getDEMEntityClassesInPackage(String packageName) throws ResourceNotFoundException
177 {
178
179
180 List<String> packageClasses = ResourceUtils.getClassesInDeepPackage(packageName);
181
182
183 ArrayList<ClassHolder> entityClasses = new ArrayList<ClassHolder>();
184
185 ClassHolder tempClass;
186
187
188 for (String className: packageClasses)
189 {
190
191
192 try
193 {
194 tempClass = new ClassHolder(className);
195
196 }
197 catch (ResourceNotFoundException e)
198 {
199 tempClass = null;
200 }
201
202 if (tempClass != null)
203 {
204
205 if (isDEMAnnotatedClass(tempClass))
206 entityClasses.add(tempClass);
207 else
208
209 tempClass.deleteClassFromRepository();
210 }
211 }
212
213 return entityClasses;
214 }
215
216
217
218
219
220
221
222
223
224
225 static private boolean isDEMAnnotatedClass(ClassHolder clazz) throws ResourceNotFoundException
226 {
227
228 boolean isDEMAnnotatedClass = false;
229
230
231 for (String annotationName: getDEMEntitiesAnnontations())
232 {
233
234 if (clazz.containsAnnotation(annotationName))
235 {
236 isDEMAnnotatedClass = true;
237 break;
238 }
239 }
240
241 return isDEMAnnotatedClass;
242 }
243
244
245
246
247
248
249
250
251
252
253 static public Map<String, DEMAnnotationLogic> getAnnotationLogicMap() throws ResourceNotFoundException,
254 AuxiliaryOperationException
255 {
256
257 if (annotationLogicMap == null)
258 {
259
260 List<String> demAnnotationsClasses = getDEMAnnotations();
261
262 annotationLogicMap = new HashMap<String, DEMAnnotationLogic>();
263
264
265 ClassHolder tempAnnotationClass;
266 AnnotationHolder annotationLogicClassAnnotation;
267
268
269 for (String annotationClassName: demAnnotationsClasses)
270 {
271
272
273 tempAnnotationClass = new ClassHolder(annotationClassName);
274
275
276 annotationLogicClassAnnotation = tempAnnotationClass.getAnnotations().get(ANNOTATION_LOGIC_CLASS);
277
278
279 if (annotationLogicClassAnnotation != null)
280 {
281
282
283 annotationLogicMap.put(tempAnnotationClass.getFQName(), DEMAnnotationLogic.makeObject(
284 annotationLogicClassAnnotation.getMembers().get("value").toString(), tempAnnotationClass));
285
286 }
287 else
288 {
289
290
291 annotationLogicMap.put(tempAnnotationClass.getFQName(), DEMAnnotationLogic.makeObject(
292 DEMAnnotationLogic.DEFAULT_DEM_ANNOTATION_LOGIC_CLASS, tempAnnotationClass));
293 }
294
295 }
296
297
298 annotationLogicMap.put(Inject.class.getCanonicalName(), DEMAnnotationLogic.makeObject(
299 DEMAnnotationLogic.DEFAULT_DEM_ANNOTATION_LOGIC_CLASS, new ClassHolder(Inject.class
300 .getCanonicalName())));
301
302 }
303
304
305 return annotationLogicMap;
306 }
307
308
309
310
311
312
313
314
315 static public List<String> getDEMAnnotations() throws ResourceNotFoundException
316 {
317 return ResourceUtils.getClassesInDeepPackage(DEM_ANNOTATIONS_CLASS_PATH);
318 }
319
320
321
322
323
324
325
326
327 public static List<String> getDEMEntitiesAnnontations() throws ResourceNotFoundException
328 {
329
330 if (DEMEntitiesAnnontations == null)
331 try
332 {
333 try
334 {
335
336
337 DEMEntitiesAnnontations = ResourceUtils.getClassesInPackage(DEM_ENTITIES_ANNOTATIONS_CLASS_PATH);
338 }
339 catch (ResourceNotFoundException resourceNotFoundException)
340 {
341 throw new ResourceNotFoundException("Could not found DEM annotations on "
342 + DEM_ENTITIES_ANNOTATIONS_CLASS_PATH, resourceNotFoundException);
343 }
344
345
346 if (DEMEntitiesAnnontations.size() == 0 || DEMEntitiesAnnontations == null)
347 DEMEntitiesAnnontations = null;
348
349 }
350 catch (ResourceNotFoundException resourceNotFoundException)
351 {
352
353
354
355 DEMEntitiesAnnontations = null;
356
357 throw resourceNotFoundException;
358 }
359
360 return DEMEntitiesAnnontations;
361 }
362 }