1 package de.fhdw.wtf.facade;
2
3 import java.io.IOException;
4 import java.util.Collection;
5 import java.util.concurrent.ExecutionException;
6
7 import de.fhdw.wtf.common.ast.Model;
8 import de.fhdw.wtf.common.exception.editor.GeneralCheckException;
9 import de.fhdw.wtf.common.exception.editor.MultipleCheckExceptions;
10 import de.fhdw.wtf.common.exception.walker.CyclicDependencyException;
11 import de.fhdw.wtf.common.exception.walker.CyclicPartDefinitionException;
12 import de.fhdw.wtf.common.task.DependencyTask;
13 import de.fhdw.wtf.common.task.GroupDependencyTask;
14 import de.fhdw.wtf.common.task.TaskExecutorFixed;
15 import de.fhdw.wtf.common.task.result.ExceptionalTaskResult;
16 import de.fhdw.wtf.common.task.result.OKTaskResult;
17 import de.fhdw.wtf.common.task.result.TaskResult;
18 import de.fhdw.wtf.common.task.result.visitor.TaskResultVisitor;
19 import de.fhdw.wtf.generator.database.generation.InitialGenerator;
20 import de.fhdw.wtf.generator.database.tasks.AttributeGenerationTask;
21 import de.fhdw.wtf.generator.database.tasks.SpecializationGenerationTask;
22 import de.fhdw.wtf.generator.database.tasks.TypeGenerationTask;
23 import de.fhdw.wtf.generator.java.generatorModel.GeneratorModel;
24 import de.fhdw.wtf.generator.transformer.clipper.ClipToFileTask;
25 import de.fhdw.wtf.generator.transformer.clipper.ClipperConfiguration;
26 import de.fhdw.wtf.generator.transformer.clipper.LinkToGenClassTask;
27 import de.fhdw.wtf.generator.transformer.transformers.classTransformer.AppStarterTransformer;
28 import de.fhdw.wtf.generator.transformer.transformers.classTransformer.ConstructorSymmetricAttribute;
29 import de.fhdw.wtf.generator.transformer.transformers.classTransformer.DelegationTransformer;
30 import de.fhdw.wtf.generator.transformer.transformers.classTransformer.FactoryTransformer;
31 import de.fhdw.wtf.generator.transformer.transformers.classTransformer.InheritanceTransformer;
32 import de.fhdw.wtf.generator.transformer.transformers.classTransformer.OperationAttributeTransformer;
33 import de.fhdw.wtf.generator.transformer.transformers.classTransformer.SuperGenerationTransformer;
34 import de.fhdw.wtf.generator.transformer.transformers.classTransformer.TypeTransformer;
35 import de.fhdw.wtf.generator.transformer.visitorTransformation.VisitorTypeTransformer;
36 import de.fhdw.wtf.generator.writer.tasks.FileWriterTask;
37 import de.fhdw.wtf.persistence.exception.PersistenceException;
38 import de.fhdw.wtf.persistence.facade.OracleDataBasePreparator;
39 import de.fhdw.wtf.persistence.facade.OracleDatabaseManager;
40 import de.fhdw.wtf.persistence.facade.OracleObjectFacadeImplementation;
41 import de.fhdw.wtf.persistence.utils.PropertiesReaderFile;
42 import de.fhdw.wtf.tooling.SyntaxCheckAbstract;
43
44
45
46
47 public final class ModelManager extends SyntaxCheckAbstract {
48
49
50
51
52 private static ModelManager instance;
53
54
55
56
57
58
59 public static synchronized ModelManager getInstance() {
60 if (instance == null) {
61 instance = new ModelManager();
62 }
63 return instance;
64 }
65
66
67
68
69 private ModelManager() {
70
71 }
72
73
74
75
76
77
78
79
80
81
82
83
84 public GeneratorModel generateJava(final Model referencedModel, final String modelRootDirectory)
85 throws MultipleCheckExceptions {
86 final ClipperConfiguration configurationClip =
87 new ClipperConfiguration(modelRootDirectory + "clipper/generated/model", modelRootDirectory
88 + "/generated/model");
89 final ClipperConfiguration configurationLink =
90 new ClipperConfiguration(modelRootDirectory + "clipper/", modelRootDirectory);
91 return this.generateJava(referencedModel, modelRootDirectory, configurationClip, configurationLink, true);
92 }
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111 public GeneratorModel generateJava(final Model referencedModel,
112 final String modelRootDirectory,
113 final ClipperConfiguration configurationClip,
114 final ClipperConfiguration configurationLink,
115 final boolean runVisitorAndFactoryGenerators) throws MultipleCheckExceptions {
116 final MultipleCheckExceptions results = new MultipleCheckExceptions();
117 final TaskExecutorFixed exec = TaskExecutorFixed.create();
118 final GeneratorModel javaGeneratorModel = GeneratorModel.create();
119
120 final GroupDependencyTask transformers = new GroupDependencyTask(exec);
121
122 try {
123 final TypeTransformer typeTransformer = new TypeTransformer(referencedModel, exec, javaGeneratorModel);
124
125 final OperationAttributeTransformer operationAttributeTransformer =
126 OperationAttributeTransformer.create(referencedModel, exec, javaGeneratorModel, typeTransformer);
127
128 final DelegationTransformer delegationTransformer =
129 new DelegationTransformer(referencedModel, exec, javaGeneratorModel);
130 delegationTransformer.addDependency(operationAttributeTransformer);
131
132 final SuperGenerationTransformer constructorCallGenerationTask =
133 new SuperGenerationTransformer(referencedModel, exec, javaGeneratorModel);
134
135 constructorCallGenerationTask.addDependency(delegationTransformer);
136
137 final InheritanceTransformer inheritanceTransformer =
138 new InheritanceTransformer(referencedModel, exec, javaGeneratorModel, operationAttributeTransformer);
139
140 final ConstructorSymmetricAttribute constructorSymmetricAttribute =
141 new ConstructorSymmetricAttribute(referencedModel, exec, javaGeneratorModel);
142
143 constructorSymmetricAttribute.addDependency(constructorCallGenerationTask);
144 constructorSymmetricAttribute.addDependency(operationAttributeTransformer);
145
146 transformers.addMembers(
147 typeTransformer,
148 operationAttributeTransformer,
149 constructorCallGenerationTask,
150 inheritanceTransformer,
151 delegationTransformer,
152 constructorSymmetricAttribute);
153
154 if (runVisitorAndFactoryGenerators) {
155 final VisitorTypeTransformer typeVisitor =
156 VisitorTypeTransformer
157 .create(referencedModel, exec, javaGeneratorModel, inheritanceTransformer);
158 delegationTransformer.addDependency(typeVisitor);
159 final DependencyTask appStarterTransformer =
160 new AppStarterTransformer(exec, javaGeneratorModel, inheritanceTransformer);
161 appStarterTransformer.addDependency(typeVisitor);
162 final DependencyTask factoryTransformer =
163 new FactoryTransformer(exec, javaGeneratorModel, inheritanceTransformer);
164 factoryTransformer.addDependency(appStarterTransformer);
165
166
167
168 transformers.addMembers(typeVisitor, appStarterTransformer, factoryTransformer);
169
170 }
171 } catch (final CyclicPartDefinitionException | CyclicDependencyException e) {
172 throw new SystemException(e);
173 }
174
175
176 final GroupDependencyTask clipper = new GroupDependencyTask(exec);
177 final ClipToFileTask clipperImport = new ClipToFileTask(exec, configurationClip);
178 final LinkToGenClassTask methodInsertion =
179 new LinkToGenClassTask(exec, javaGeneratorModel, configurationLink, clipperImport);
180 try {
181 clipper.addMembers(clipperImport, methodInsertion);
182 clipper.addDependency(transformers);
183 } catch (final CyclicPartDefinitionException | CyclicDependencyException e) {
184 throw new SystemException(e);
185 }
186
187 if (modelRootDirectory != null) {
188 new FileWriterTask(exec, javaGeneratorModel, modelRootDirectory, clipper);
189 }
190
191 try {
192 exec.startAllKnownTasks();
193 final Collection<TaskResult> resultTasks = exec.getResultsAndShutdown();
194 this.addsExceptionalTasksToMultipleExceptions(results, resultTasks);
195
196 } catch (final InterruptedException | ExecutionException e) {
197 throw new SystemException(e);
198 }
199
200 if (!results.isEmpty()) {
201 throw results;
202 }
203
204 return javaGeneratorModel;
205 }
206
207
208
209
210
211
212
213
214
215
216
217
218
219 public void generatePersistence(final Model model, final GeneratorModel genModel, final String dbPropertiesPath)
220 throws MultipleCheckExceptions {
221 final MultipleCheckExceptions results = new MultipleCheckExceptions();
222 try {
223 this.prepareDatabase(dbPropertiesPath);
224
225 final InitialGenerator generator = new InitialGenerator();
226 final TaskExecutorFixed taskManager = TaskExecutorFixed.create();
227
228 final TypeGenerationTask typeGenerationTask =
229 new TypeGenerationTask(model, genModel, taskManager, generator);
230 final AttributeGenerationTask attributeGenerationTask =
231 new AttributeGenerationTask(model, taskManager, generator);
232 final SpecializationGenerationTask specializationGenerationTask =
233 new SpecializationGenerationTask(model, taskManager, generator);
234
235 attributeGenerationTask.addDependency(typeGenerationTask);
236 specializationGenerationTask.addDependency(typeGenerationTask);
237
238 taskManager.startAllKnownTasks();
239
240 final Collection<TaskResult> resultTasks = taskManager.getResultsAndShutdown();
241 this.addsExceptionalTasksToMultipleExceptions(results, resultTasks);
242 } catch (final PersistenceException e) {
243 results.add(new GeneralCheckException(e));
244 } catch (final InterruptedException | ExecutionException | CyclicDependencyException | IOException e) {
245 throw new SystemException(e);
246 }
247 if (!results.isEmpty()) {
248 throw results;
249 }
250
251 }
252
253
254
255
256
257
258
259
260
261 private void addsExceptionalTasksToMultipleExceptions(final MultipleCheckExceptions list,
262 final Collection<TaskResult> taskresults) {
263 for (final TaskResult taskResult : taskresults) {
264 taskResult.accept(new TaskResultVisitor() {
265
266 @Override
267 public void handleOkTaskResult(final OKTaskResult result) {
268
269 }
270
271 @Override
272 public void handleExceptionalTaskResult(final ExceptionalTaskResult result) {
273
274 list.add(new GeneralCheckException(result.getError()));
275 }
276 });
277 }
278 }
279
280
281
282
283
284
285
286
287
288
289
290 private void prepareDatabase(final String propertiesPath) throws IOException, PersistenceException {
291
292 final OracleDatabaseManager oracleDatabaseManager = OracleDatabaseManager.getInstance();
293 final PropertiesReaderFile prop = new PropertiesReaderFile();
294 prop.initialize(propertiesPath);
295 oracleDatabaseManager.setConnectionConstantsFromFile(prop);
296 oracleDatabaseManager.connect();
297
298 final OracleDataBasePreparator preparator = new OracleDataBasePreparator();
299 if (!preparator.isTableStructureValid()) {
300 preparator.dropWholeSchema();
301 preparator.createWholeSchema();
302 }
303 if (!preparator.areProceduresCreated()) {
304 preparator.createProcedures();
305 }
306 new OracleObjectFacadeImplementation(oracleDatabaseManager, null).clear();
307 oracleDatabaseManager.getClassFacade().clear();
308 }
309 }