1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package org.nuiton.eugene.models.object;
24
25 import org.apache.commons.lang3.StringUtils;
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.nuiton.eugene.AbstractGenerator;
29 import org.nuiton.eugene.MonitorWriter;
30
31 import java.io.File;
32 import java.io.IOException;
33 import java.io.StringWriter;
34 import java.io.Writer;
35 import java.util.Collection;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 public class ObjectModelGenerator extends AbstractGenerator<ObjectModel> {
69
70
71 private static Log log = LogFactory.getLog(ObjectModelGenerator.class);
72
73 public ObjectModelGenerator() {
74 }
75
76 public ObjectModelGenerator(AbstractGenerator<ObjectModel> parent) {
77 super(parent);
78 }
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 @Override
99 public void applyTemplate(ObjectModel model, File destDir) throws IOException {
100
101 if (StringUtils.isEmpty(model.getName())) {
102 throw new IllegalArgumentException("No name defined on the model");
103 }
104
105
106 this.model = model;
107
108 String filename = getFilenameForModel(model);
109
110
111 generateFromElement(model, destDir, filename, ObjectModelType.OBJECT_MODEL);
112
113
114 generateFromElements(model.getClassifiers(), destDir, ObjectModelType.OBJECT_MODEL_CLASSIFIER);
115
116
117 generateFromElements(model.getInterfaces(), destDir, ObjectModelType.OBJECT_MODEL_INTERFACE);
118
119
120 generateFromElements(model.getClasses(), destDir, ObjectModelType.OBJECT_MODEL_CLASS);
121
122
123 generateFromElements(model.getEnumerations(), destDir, ObjectModelType.OBJECT_MODEL_ENUMERATION);
124
125 }
126
127
128
129
130
131
132
133
134
135
136
137
138
139 private void generateFromElements(Collection<? extends ObjectModelElement> elements,
140 File destDir,
141 ObjectModelType type) {
142
143 for (ObjectModelElement element : elements) {
144 String filename = "";
145
146 switch (type) {
147 case OBJECT_MODEL_CLASSIFIER:
148 filename = getFilenameForClassifier((ObjectModelClassifier) element);
149 break;
150 case OBJECT_MODEL_INTERFACE:
151 filename = getFilenameForInterface((ObjectModelInterface) element);
152 break;
153 case OBJECT_MODEL_CLASS:
154 filename = getFilenameForClass((ObjectModelClass) element);
155 break;
156 case OBJECT_MODEL_ENUMERATION:
157 filename = getFilenameForEnumeration((ObjectModelEnumeration) element);
158 }
159
160 generateFromElement(element, destDir, filename, type);
161 }
162 }
163
164
165
166
167
168
169
170
171
172
173
174
175
176 protected void generateFromElement(Object element,
177 File destDir,
178 String filename,
179 ObjectModelType type) {
180
181
182
183
184
185 if (canGenerateElement(element)) {
186
187 File outputFile = getDestinationFile(destDir, filename);
188 if (!isOverwrite() && isNewerThanSource(outputFile)) {
189 if (isVerbose()) {
190 if (log.isInfoEnabled()) {
191 log.info("Will not generate " + outputFile + " (up-to-date).");
192 }
193 }
194 return;
195 }
196 if (!outputFile.exists()) {
197 if (log.isDebugEnabled()) {
198 log.debug("not up-to-date " + outputFile.lastModified()
199 + " <" + outputFile + ">");
200 }
201 }
202 try {
203 StringWriter out = new StringWriter();
204
205 try (MonitorWriter monitorOut = new MonitorWriter(out)) {
206 switch (type) {
207 case OBJECT_MODEL:
208 generateFromModel(monitorOut, (ObjectModel) element);
209 break;
210 case OBJECT_MODEL_CLASSIFIER:
211 generateFromClassifier(monitorOut, (ObjectModelClassifier) element);
212 break;
213 case OBJECT_MODEL_INTERFACE:
214 generateFromInterface(monitorOut, (ObjectModelInterface) element);
215 break;
216 case OBJECT_MODEL_CLASS:
217 generateFromClass(monitorOut, (ObjectModelClass) element);
218 break;
219 case OBJECT_MODEL_ENUMERATION:
220 generateFromEnumeration(monitorOut, (ObjectModelEnumeration) element);
221 break;
222 }
223
224 write(outputFile, monitorOut);
225
226 }
227
228 } catch (Exception eee) {
229 if (log.isWarnEnabled()) {
230 log.warn("Erreur lors de la génération du fichier "
231 + outputFile);
232 }
233 throw new RuntimeException(
234 "Erreur lors de la génération du fichier "
235 + outputFile, eee);
236 }
237 }
238 }
239
240
241
242
243
244
245
246
247
248
249
250 protected boolean canGenerateElement(Object element) {
251
252 boolean canGenerate = true;
253
254
255 if (element instanceof ObjectModelClassifier) {
256 ObjectModelClassifier classifier = (ObjectModelClassifier) element;
257 String classifierPackage = classifier.getPackageName();
258
259 canGenerate = canGeneratePackage(classifierPackage);
260 }
261
262 return canGenerate;
263 }
264
265
266
267
268
269
270
271
272
273 public String getFilenameForModel(ObjectModel model) {
274 return model.getName();
275 }
276
277
278
279
280
281
282
283
284
285 public String getFilenameForPackage(ObjectModel model,
286 String packageName) {
287 return packageName.replace('.', File.separatorChar);
288 }
289
290
291
292
293
294
295
296
297 public String getFilenameForInterface(ObjectModelInterface interfacez) {
298 return getFilenameForClassifier(interfacez);
299 }
300
301
302
303
304
305
306
307
308 public String getFilenameForClass(ObjectModelClass clazz) {
309 return getFilenameForClassifier(clazz);
310 }
311
312
313
314
315
316
317
318
319 public String getFilenameForClassifier(ObjectModelClassifier classifier) {
320 return classifier.getQualifiedName().replace('.', File.separatorChar);
321 }
322
323 public String getFilenameForEnumeration(ObjectModelEnumeration enumeration) {
324 return getFilenameForClassifier(enumeration);
325 }
326
327 public void generateFromModel(Writer output,
328 ObjectModel input) throws IOException {
329 }
330
331 public void generateFromInterface(Writer output,
332 ObjectModelInterface input) throws IOException {
333 }
334
335 public void generateFromEnum(Writer output,
336 ObjectModelEnumeration input) throws IOException {
337 }
338
339 public void generateFromClass(Writer output,
340 ObjectModelClass input) throws IOException {
341 }
342
343 public void generateFromClassifier(Writer output,
344 ObjectModelClassifier input) throws IOException {
345 }
346
347 public void generateFromEnumeration(Writer output,
348 ObjectModelEnumeration input) throws IOException {
349 }
350 }