1 package fr.ifremer.quadrige2.magicdraw.action;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import com.nomagic.ci.persistence.IAttachedProject;
27 import com.nomagic.ci.persistence.IProject;
28 import com.nomagic.magicdraw.actions.MDAction;
29 import com.nomagic.magicdraw.core.Application;
30 import com.nomagic.magicdraw.core.Project;
31 import com.nomagic.magicdraw.core.ProjectUtilities;
32 import com.nomagic.magicdraw.core.project.ProjectDescriptorsFactory;
33 import com.nomagic.magicdraw.openapi.uml.ModelElementsManager;
34 import com.nomagic.magicdraw.openapi.uml.ReadOnlyElementException;
35 import com.nomagic.magicdraw.openapi.uml.SessionManager;
36 import com.nomagic.magicdraw.ui.dialogs.MDDialogParentProvider;
37 import com.nomagic.uml2.ext.jmi.helpers.ModelHelper;
38 import com.nomagic.uml2.ext.jmi.helpers.StereotypesHelper;
39 import com.nomagic.uml2.ext.magicdraw.auxiliaryconstructs.mdmodels.Model;
40 import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.*;
41 import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class;
42 import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Enumeration;
43 import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Package;
44 import com.nomagic.uml2.ext.magicdraw.mdprofiles.Profile;
45 import com.nomagic.uml2.ext.magicdraw.mdprofiles.Stereotype;
46 import com.nomagic.uml2.impl.ElementsFactory;
47 import fr.ifremer.quadrige2.magicdraw.helper.TransformModelHelper;
48
49 import javax.swing.JOptionPane;
50 import java.awt.event.ActionEvent;
51 import java.io.File;
52 import java.io.FileInputStream;
53 import java.io.IOException;
54 import java.io.InputStream;
55 import java.net.URI;
56 import java.util.*;
57
58
59
60
61
62
63 public class TransformModelQuadrigeAction extends MDAction {
64
65 private static final long serialVersionUID = 1L;
66 private Map<String, DataType> types = null;
67 private Profile persistenceProfile = null;
68 private Stereotype entityStereotype = null;
69 private Stereotype identifierStereotype = null;
70 private Map<String, EnumerationLiteral> hibernateGeneratorClassMap = null;
71 private Stereotype embeddedValueStereotype = null;
72 private Stereotype persistentPropertyStereotype = null;
73 private Stereotype persistentAttributeStereotype = null;
74 private Stereotype naturalIdStereotype = null;
75 private Properties properties = null;
76 private String propertyFile = null;
77 private TransformationType transformationType = null;
78
79 public TransformModelQuadrigeAction(String id, String name, TransformationType transformationType, String propertyFile) {
80 super(id, name, null, null);
81 this.propertyFile = propertyFile;
82 this.transformationType = transformationType;
83 }
84
85
86
87
88 @Override
89 public void actionPerformed(ActionEvent e) {
90
91 Project project = Application.getInstance().getProject();
92 if (project == null) {
93 JOptionPane.showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent(), "Please load a project first.");
94 return;
95 }
96
97 boolean isInit = init(project);
98
99 if (isInit) {
100 Model model = project.getModel();
101 if (model == null) {
102 JOptionPane.showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent(), "No model found !");
103 release(project);
104 return;
105 }
106
107 try {
108 processModel(project, model);
109 } catch (Exception e1) {
110
111 e1.printStackTrace();
112 }
113 }
114
115 release(project);
116 }
117
118 private boolean init(Project project) {
119
120 SessionManager.getInstance().createSession(project, "Transform model: " + transformationType.name());
121
122 types = new HashMap<String, DataType>();
123 IAttachedProject datatypeModule = getModule(project, "andromda-profile-datatype-3.4.xml.zip");
124 if (datatypeModule == null) {
125 JOptionPane.showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent(),
126 "Could not load module andromda-profile-datatype-3.4.xml.zip");
127 return false;
128 }
129 boolean dataTypeLoaded =
130 loadDataType(datatypeModule, "Integer", types, true) && loadDataType(datatypeModule, "String", types, true)
131 && loadDataType(datatypeModule, "Date", types, true) && loadDataType(datatypeModule, "Double", types, true)
132 && loadDataType(datatypeModule, "Float", types, true) && loadDataType(datatypeModule, "Timestamp", types, true);
133 if (!dataTypeLoaded) {
134 return false;
135 }
136
137
138 entityStereotype = StereotypesHelper.getStereotype(project, "Entity", persistenceProfile);
139 if (entityStereotype == null) {
140 JOptionPane.showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent(), "Could not load Stereotype 'Entity' !");
141 return false;
142 }
143
144
145 identifierStereotype = StereotypesHelper.getStereotype(project, "Identifier", persistenceProfile);
146 if (identifierStereotype == null) {
147 JOptionPane.showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent(), "Could not load Stereotype 'Entity' !");
148 return false;
149 }
150
151
152 hibernateGeneratorClassMap = new HashMap<String, EnumerationLiteral>();
153 for (Property entityProperty : entityStereotype.getOwnedAttribute()) {
154 if ("andromda_hibernate_generator_class".equals(entityProperty.getName()) && entityProperty.getType() instanceof Enumeration) {
155 Enumeration generatorClassEnum = (Enumeration) entityProperty.getType();
156 for (EnumerationLiteral generatorClassValue : ModelHelper.getAllLiterals(generatorClassEnum)) {
157 hibernateGeneratorClassMap.put(generatorClassValue.getName(), generatorClassValue);
158 }
159 }
160 }
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 properties = new Properties();
179 InputStream is = null;
180 try {
181 if (new File(propertyFile).exists()) {
182 is = new FileInputStream(new File(propertyFile));
183 } else {
184 is = getClass().getClassLoader().getResourceAsStream(propertyFile);
185 }
186 if (is == null) {
187 JOptionPane.showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent(), "Could not load properties file '"
188 + propertyFile + "' in the plugin classloader. Please check 'plugin.xml' file validity");
189 return false;
190 }
191
192 properties.load(is);
193 } catch (IOException e) {
194 JOptionPane.showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent(),
195 "Error while loadinf the properties file '" + propertyFile);
196 return false;
197 } finally {
198 if (is != null) {
199 try {
200 is.close();
201 } catch (IOException ex) {
202
203 }
204 }
205 }
206
207
208 persistenceProfile = StereotypesHelper.getProfile(project, "andromda-persistence");
209 if (persistenceProfile == null) {
210 JOptionPane.showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent(),
211 "Could not load profile 'andromda-persistence' !");
212 return false;
213 }
214
215
216 entityStereotype = StereotypesHelper.getStereotype(project, "Entity", persistenceProfile);
217 if (entityStereotype == null) {
218 JOptionPane.showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent(), "Could not load Stereotype 'Entity' !");
219 return false;
220 }
221 persistentPropertyStereotype = StereotypesHelper.getStereotype(project, "PersistentProperty", persistenceProfile);
222 if (persistentPropertyStereotype == null) {
223 JOptionPane.showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent(),
224 "Could not load Stereotype 'PersistentProperty' !");
225 return false;
226 }
227
228 return true;
229
230 }
231
232 private void release(Project project) {
233 SessionManager.getInstance().closeSession(project);
234
235 entityStereotype = null;
236 persistenceProfile = null;
237 persistentPropertyStereotype = null;
238 persistentAttributeStereotype = null;
239 naturalIdStereotype = null;
240 properties = null;
241 hibernateGeneratorClassMap = null;
242 }
243
244 private HashMap<String, Element> CreateQuadrige2Package(Model model) {
245 HashMap<String, Element> MapPackage = new HashMap<String, Element>();
246 String TempName = "";
247 ElementsFactory ef1 = Application.getInstance().getProject().getElementsFactory();
248
249
250 Package packageFr = ef1.createPackageInstance();
251 packageFr.setName("fr");
252 packageFr.setOwner(model);
253 TempName = packageFr.getHumanName().substring(packageFr.getHumanType().length() + 1);
254 MapPackage.put(TempName, packageFr);
255
256 Package packageIfremer = ef1.createPackageInstance();
257 packageIfremer.setName("ifremer");
258 packageIfremer.setOwner(packageFr);
259 TempName = packageIfremer.getHumanName().substring(packageIfremer.getHumanType().length() + 1);
260 MapPackage.put(TempName, packageIfremer);
261
262 Package packageQuadrige2 = ef1.createPackageInstance();
263 packageQuadrige2.setName("quadrige2");
264 packageQuadrige2.setOwner(packageIfremer);
265 TempName = packageQuadrige2.getHumanName().substring(packageQuadrige2.getHumanType().length() + 1);
266 MapPackage.put(TempName, packageQuadrige2);
267
268 Package packageCore = ef1.createPackageInstance();
269 packageCore.setName("core");
270 packageCore.setOwner(packageQuadrige2);
271 TempName = packageCore.getHumanName().substring(packageCore.getHumanType().length() + 1);
272 MapPackage.put(TempName, packageCore);
273
274 Package packageAquaculture = ef1.createPackageInstance();
275 packageAquaculture.setName("aquaculture");
276 packageAquaculture.setOwner(packageCore);
277 TempName = packageAquaculture.getHumanName().substring(packageAquaculture.getHumanType().length() + 1);
278 MapPackage.put(TempName, packageAquaculture);
279
280 Package packageEvent = ef1.createPackageInstance();
281 packageEvent.setName("event");
282 packageEvent.setOwner(packageCore);
283 TempName = packageEvent.getHumanName().substring(packageEvent.getHumanType().length() + 1);
284 MapPackage.put(TempName, packageEvent);
285
286 Package packageMeasurement = ef1.createPackageInstance();
287 packageMeasurement.setName("measurement");
288 packageMeasurement.setOwner(packageCore);
289 TempName = packageMeasurement.getHumanName().substring(packageMeasurement.getHumanType().length() + 1);
290 MapPackage.put(TempName, packageMeasurement);
291
292 Package packageMetaprogamme = ef1.createPackageInstance();
293 packageMetaprogamme.setName("metaprogamme");
294 packageMetaprogamme.setOwner(packageCore);
295 TempName = packageMetaprogamme.getHumanName().substring(packageMetaprogamme.getHumanType().length() + 1);
296 MapPackage.put(TempName, packageMetaprogamme);
297
298 Package packageProgamme = ef1.createPackageInstance();
299 packageProgamme.setName("program");
300 packageProgamme.setOwner(packageCore);
301 TempName = packageProgamme.getHumanName().substring(packageProgamme.getHumanType().length() + 1);
302 MapPackage.put(TempName, packageProgamme);
303
304 Package packageReferential = ef1.createPackageInstance();
305 packageReferential.setName("referential");
306 packageReferential.setOwner(packageCore);
307 TempName = packageReferential.getHumanName().substring(packageReferential.getHumanType().length() + 1);
308 MapPackage.put(TempName, packageReferential);
309
310 Package packageEunis = ef1.createPackageInstance();
311 packageEunis.setName("eunis");
312 packageEunis.setOwner(packageReferential);
313 TempName = packageEunis.getHumanName().substring(packageEunis.getHumanType().length() + 1);
314 MapPackage.put(TempName, packageEunis);
315
316 Package packageMonitoringlocation = ef1.createPackageInstance();
317 packageMonitoringlocation.setName("monitoringLocation");
318 packageMonitoringlocation.setOwner(packageReferential);
319 TempName = packageMonitoringlocation.getHumanName().substring(packageMonitoringlocation.getHumanType().length() + 1);
320 MapPackage.put(TempName, packageMonitoringlocation);
321
322 Package packagePhoto = ef1.createPackageInstance();
323 packagePhoto.setName("photo");
324 packagePhoto.setOwner(packageReferential);
325 TempName = packagePhoto.getHumanName().substring(packagePhoto.getHumanType().length() + 1);
326 MapPackage.put(TempName, packagePhoto);
327
328 Package packagePmfm = ef1.createPackageInstance();
329 packagePmfm.setName("pmfm");
330 packagePmfm.setOwner(packageReferential);
331 TempName = packagePmfm.getHumanName().substring(packagePmfm.getHumanType().length() + 1);
332 MapPackage.put(TempName, packagePmfm);
333
334 Package packageTaxon = ef1.createPackageInstance();
335 packageTaxon.setName("taxon");
336 packageTaxon.setOwner(packageReferential);
337 TempName = packageTaxon.getHumanName().substring(packageTaxon.getHumanType().length() + 1);
338 MapPackage.put(TempName, packageTaxon);
339
340 Package packageSample = ef1.createPackageInstance();
341 packageSample.setName("sample");
342 packageSample.setOwner(packageCore);
343 TempName = packageSample.getHumanName().substring(packageSample.getHumanType().length() + 1);
344 MapPackage.put(TempName, packageSample);
345
346 Package packageSamplingoperation = ef1.createPackageInstance();
347 packageSamplingoperation.setName("samplingoperation");
348 packageSamplingoperation.setOwner(packageCore);
349 TempName = packageSamplingoperation.getHumanName().substring(packageSamplingoperation.getHumanType().length() + 1);
350 MapPackage.put(TempName, packageSamplingoperation);
351
352 Package packageSandre = ef1.createPackageInstance();
353 packageSandre.setName("sandre");
354 packageSandre.setOwner(packageCore);
355 TempName = packageSandre.getHumanName().substring(packageSandre.getHumanType().length() + 1);
356 MapPackage.put(TempName, packageSandre);
357
358 Package packageStrategy = ef1.createPackageInstance();
359 packageStrategy.setName("strategy");
360 packageStrategy.setOwner(packageCore);
361 TempName = packageStrategy.getHumanName().substring(packageStrategy.getHumanType().length() + 1);
362 MapPackage.put(TempName, packageStrategy);
363
364 Package packageSurvey = ef1.createPackageInstance();
365 packageSurvey.setName("survey");
366 packageSurvey.setOwner(packageCore);
367 TempName = packageSurvey.getHumanName().substring(packageSurvey.getHumanType().length() + 1);
368 MapPackage.put(TempName, packageSurvey);
369
370 Package packageSystem = ef1.createPackageInstance();
371 packageSystem.setName("system");
372 packageSystem.setOwner(packageCore);
373 TempName = packageSystem.getHumanName().substring(packageSystem.getHumanType().length() + 1);
374 MapPackage.put(TempName, packageSystem);
375
376 Package packageType = ef1.createPackageInstance();
377 packageType.setName("type");
378 packageType.setOwner(packageCore);
379 TempName = packageType.getHumanName().substring(packageType.getHumanType().length() + 1);
380 MapPackage.put(TempName, packageType);
381
382 return MapPackage;
383 }
384
385 private boolean hasIdentifier(Class c) {
386 boolean result = false;
387 result =
388 !Arrays.asList(properties.getProperty("entity.multipleIdentifier").split(",")).contains(
389 TransformModelHelper.getTableNameFromEntityName(c.getName()));
390 result =
391 result
392 && !Arrays.asList(properties.getProperty("entity.identifierIsFk").split(",")).contains(
393 TransformModelHelper.getTableNameFromEntityName(c.getName()));
394 result =
395 result
396 && !Arrays.asList(properties.getProperty("entity.withoutIdentifier").split(",")).contains(
397 TransformModelHelper.getTableNameFromEntityName(c.getName()));
398 System.out.print(result);
399 return result;
400 }
401
402 private Property getId(Class c) {
403 String classNameForId = TransformModelHelper.getClassNameForId(c);
404 for (Property p : c.getOwnedAttribute()) {
405 if ((classNameForId + "Id").equals(p.getName())) {
406 return p;
407 }
408 }
409 return null;
410 }
411
412 @SuppressWarnings("unused")
413 private String transformAddId(Class entity) {
414 DataType integerType = types.get("Integer");
415 if (integerType == null) {
416 return "";
417 }
418
419 ElementsFactory ef = Application.getInstance().getProject().getElementsFactory();
420
421 String classNameForId = TransformModelHelper.getClassNameForId(entity);
422
423 Property id = getId(entity);
424 if (id == null) {
425 id = ef.createPropertyInstance();
426 id.setName(classNameForId + "Id");
427 try {
428
429 ModelElementsManager.getInstance().addElement(id, entity);
430 } catch (ReadOnlyElementException e) {
431 return "";
432 }
433 }
434
435 if (!StereotypesHelper.hasStereotype(id, identifierStereotype)) {
436 StereotypesHelper.addStereotype(id, identifierStereotype);
437 }
438
439
440 else if (id.getType() == integerType && id.getVisibility() == VisibilityKindEnum.PUBLIC && id.getLower() == 0 && id.getUpper() == 1) {
441 return "";
442 }
443
444
445 id.setType(integerType);
446
447
448 id.setVisibility(VisibilityKindEnum.PUBLIC);
449
450 StereotypesHelper.addStereotype(id, identifierStereotype);
451
452 return (classNameForId + "Id");
453 }
454
455 private String transformRemoveId(Class entity) {
456 Property toRemove = null;
457 String classNameForId = TransformModelHelper.getClassNameForId(entity);
458 for (Property p : entity.getAttribute()) {
459 if ((classNameForId + "Id").equals(p.getName()) || (entity.getName() + "Id").equals(p.getName())) {
460 toRemove = p;
461 }
462 }
463 if (toRemove != null) {
464 String result = " Remove " + toRemove.getName() + " ";
465 toRemove.dispose();
466 return result;
467 }
468 return "";
469 }
470
471 private void initModel(Project project, Model model) {
472 HashMap<String, Element> MapPackage = CreateQuadrige2Package(model);
473 HashMap<String, Element> MapElement = new HashMap<String, Element>();
474 HashMap<String, Integer> usedAssociations = new HashMap<String, Integer>();
475
476 Element migratePkg = null;
477
478 for (Element e : model.getNestedPackage()) {
479
480 String name = ((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Package) e).getName();
481 if ("2migrate".equals(name)) {
482 migratePkg = e;
483 System.out.println("Package 2migrate found");
484 for (Element elem : e.getOwnedElement()) {
485
486 if (elem.getHumanType().equals("Classe")) {
487 Class c = ((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class) elem);
488 System.out.print(c.getName() + " (");
489
490
491 if (!Arrays.asList(properties.getProperty("types").split(",")).contains(c.getName())) {
492 StereotypesHelper.addStereotype(elem, entityStereotype);
493 if (!hasIdentifier(c)) {
494 TransformModelHelper.removeStereotype(c, identifierStereotype);
495 System.out.print(", Add : " + transformAddId(c) + " ");
496 }
497 }
498 MapElement.put(c.getName(), elem);
499
500 System.out.println(" ) ");
501 }
502
503 if (elem.getHumanType().equals("Association")) {
504 Association a = (com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Association) elem;
505 debugAssociation(a);
506 processAssociation(a, usedAssociations);
507 }
508
509 }
510 }
511 }
512
513 for (Object keyObj : properties.keySet()) {
514 String key = (String) keyObj;
515 for (String mapKey : MapElement.keySet()) {
516 Element ElementTemp = null;
517 String Concat = "";
518 ElementTemp = MapElement.get(mapKey);
519 Concat =
520 "class."
521 + TransformModelHelper.getClassName2TableName(ElementTemp.getHumanName().substring(
522 ElementTemp.getHumanType().length() + 1));
523 if (key.equals(Concat)) {
524 if (MapPackage != null) {
525
526 ElementTemp.setOwner(MapPackage.get(properties.getProperty(key)));
527 }
528 }
529
530 }
531 }
532 if (migratePkg != null && migratePkg.getOwnedElement().isEmpty()) {
533 migratePkg.dispose();
534 }
535 }
536
537 private Element resetElement(Element p, Element package2migrate) {
538 if (p.getHumanType().equals("Paquet")) {
539 System.out.println(p.getHumanName());
540 Collection<Element> ownedElement = p.getOwnedElement();
541 Collection<Element> toMoveElement = new ArrayList<Element>();
542 for (Element e : ownedElement) {
543 Element el = resetElement(e, package2migrate);
544 if (el != null) {
545 toMoveElement.add(el);
546 }
547 }
548 for (Element e : toMoveElement) {
549
550 e.setOwner(package2migrate);
551 }
552 } else if (p.getHumanType().equals("Classe")) {
553 System.out.println(p.getHumanName());
554
555 StereotypesHelper.removeStereotype(p, entityStereotype);
556 if (!hasIdentifier((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class) p)) {
557 transformRemoveId((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class) p);
558 }
559 return p;
560 }
561 return null;
562 }
563
564 private Element get2MigratePkg(Model model) {
565 for (Element e : model.getNestedPackage()) {
566 String name = ((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Package) e).getName();
567 if ("2migrate".equals(name)) {
568 System.out.println("Package 2migrate found");
569 return e;
570 }
571 }
572 ElementsFactory ef1 = Application.getInstance().getProject().getElementsFactory();
573
574 Package package2migrate = ef1.createPackageInstance();
575 package2migrate.setName("2migrate");
576 package2migrate.setOwner(model);
577 return package2migrate;
578 }
579
580 private void resetModel(Project project, Model model) {
581 for (Element e : model.getNestedPackage()) {
582
583 String name = ((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Package) e).getName();
584 if ("fr".equals(name)) {
585 System.out.println("Package fr found");
586 for (Element p : e.getOwnedElement()) {
587 resetElement(p, get2MigratePkg(model));
588 }
589 e.dispose();
590 }
591 }
592 }
593
594 private void addAssignedForAllClasses(Element packages, EnumerationLiteral value) {
595 for (Element e : packages.getOwnedElement()) {
596 if ("Classe".equals(e.getHumanType())) {
597 StereotypesHelper.setStereotypePropertyValue(e, entityStereotype, "andromda_hibernate_generator_class", value);
598 }
599 }
600 }
601
602 private void removeAssignedForAllClasses(Element packages, EnumerationLiteral value) {
603 for (Element e : packages.getOwnedElement()) {
604 if ("Classe".equals(e.getHumanType())) {
605 StereotypesHelper.removeStereotype(e, entityStereotype);
606 }
607 }
608 }
609
610 private void addAssigned(Project project, Model model) {
611 System.out.println("Todo Assigned for *_CD");
612 EnumerationLiteral value = hibernateGeneratorClassMap.get("assigned");
613
614
615 Element pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential", model, null);
616 addAssignedForAllClasses(pkg, value);
617 pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential.eunis", model, null);
618 addAssignedForAllClasses(pkg, value);
619 pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential.monitoringLocation", model, null);
620 addAssignedForAllClasses(pkg, value);
621 pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential.photo", model, null);
622 addAssignedForAllClasses(pkg, value);
623 pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential.pmfm", model, null);
624 addAssignedForAllClasses(pkg, value);
625 pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential.taxon", model, null);
626 addAssignedForAllClasses(pkg, value);
627 }
628
629 private void removeAssigned(Project project, Model model) {
630 System.out.println("Todo Assigned for *_CD");
631 EnumerationLiteral value = hibernateGeneratorClassMap.get("assigned");
632
633
634 Element pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential", model, null);
635 removeAssignedForAllClasses(pkg, value);
636 pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential.eunis", model, null);
637 removeAssignedForAllClasses(pkg, value);
638 pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential.monitoringLocation", model, null);
639 removeAssignedForAllClasses(pkg, value);
640 pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential.photo", model, null);
641 removeAssignedForAllClasses(pkg, value);
642 pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential.pmfm", model, null);
643 removeAssignedForAllClasses(pkg, value);
644 pkg = TransformModelHelper.getPackageFromFullQualifiedName("fr.ifremer.quadrige2.core.referential.taxon", model, null);
645 removeAssignedForAllClasses(pkg, value);
646 }
647
648 private void processModel(Project project, Model model) throws Exception {
649
650 if (transformationType == TransformationType.QUADRIGE2_INIT) {
651 initModel(project, model);
652 }
653 if (transformationType == TransformationType.QUADRIGE2_RESET) {
654 resetModel(project, model);
655 }
656 if (transformationType == TransformationType.QUADRIGE2_APPLY_STEREOTYPE_ASSIGNED) {
657 addAssigned(project, model);
658 }
659 if (transformationType == TransformationType.QUADRIGE2_REMOVE_STEREOTYPE_ASSIGNED) {
660 removeAssigned(project, model);
661 }
662
663 }
664
665 private IAttachedProject getModule(Project project, String filename) {
666 File projectFile = getProjectFile(project);
667
668 URI moduleFileURI = new File(projectFile.getParent(), filename).toURI();
669 com.nomagic.magicdraw.core.project.ProjectDescriptor projectDescriptor =
670 ProjectDescriptorsFactory.createProjectDescriptor(moduleFileURI);
671
672 IAttachedProject ap = Application.getInstance().getProjectsManager().findAttachedProject(project, projectDescriptor);
673 return ap;
674
675 }
676
677 private File getProjectFile(Project project) {
678 com.nomagic.magicdraw.core.project.ProjectDescriptor projectDescriptor =
679 ProjectDescriptorsFactory.createLocalProjectDescriptor(project);
680 File projectFile = new File(projectDescriptor.getURI());
681 return projectFile;
682 }
683
684 private boolean loadDataType(IProject project, String name, Map<String, DataType> types, boolean displayError) {
685
686 final Collection<com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Package> sharedPackages =
687 ProjectUtilities.getSharedPackages(project);
688 final com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Package aPackage = sharedPackages.iterator().next();
689
690 NamedElement foundElement = null;
691 for (NamedElement ne : aPackage.getMember()) {
692 if (name.equals(ne.getName())) {
693 foundElement = ne;
694 }
695 }
696
697 if (foundElement != null || (foundElement instanceof DataType)) {
698 types.put(name, (DataType) foundElement);
699 return true;
700 }
701
702 if (displayError) {
703 JOptionPane.showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent(),
704 String.format("Could not load data type %s", name));
705 }
706 return false;
707 }
708
709 private void debugAssociation(Association a) {
710 System.out.print("Association " + a.getName() + " [endType : (");
711 for (Type t : a.getEndType()) {
712 System.out.print(t.getName() + ", ");
713 }
714 System.out.print("], [OwnedEnd : (");
715 for (Property p : a.getOwnedEnd()) {
716 System.out.print(p.getName() + "(" + p.getOwner().getHumanName() + "," + p.getLower() + "," + p.getUpper() + "), ");
717 }
718 System.out.print("], [NavigableOwnedEnd : (");
719 for (Property p : a.getNavigableOwnedEnd()) {
720 System.out.print(p.getName() + "(" + p.getOwner().getHumanName() + "," + p.getLower() + "," + p.getUpper() + "), ");
721 }
722 System.out.print("], [MemberEnd : (");
723 for (Property p : a.getMemberEnd()) {
724 System.out.print(p.getName() + "(" + p.getOwner().getHumanName() + "," + p.getLower() + "," + p.getUpper() + "), ");
725 }
726 System.out.println("] ) ");
727 }
728
729 private String getAssocNameFromProps(List<Type> types, int idx, HashMap<String, Integer> usedAssociations) {
730 String associationKey = "association.";
731 String associationPropKey = "";
732 int use = 1;
733 int idx2 = 1;
734 if (idx >= 1) {
735 idx2 = 0;
736 }
737 if (types.size() > 1) {
738 associationKey +=
739 TransformModelHelper.getClassName2TableName(((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class) types.get(idx))
740 .getName());
741 associationKey +=
742 "."
743 + TransformModelHelper.getClassName2TableName(((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class) types.get(idx2))
744 .getName());
745 } else {
746 associationKey +=
747 TransformModelHelper.getClassName2TableName(((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class) types.get(0))
748 .getName());
749 associationKey +=
750 "."
751 + TransformModelHelper.getClassName2TableName(((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class) types.get(0))
752 .getName());
753 }
754 if (usedAssociations.containsKey(associationKey)) {
755 use = usedAssociations.get(associationKey) + 1;
756 }
757 associationPropKey = associationKey + "." + (use);
758
759 String result = properties.getProperty(associationPropKey);
760 if (result != null) {
761 usedAssociations.put(associationKey, use);
762 }
763 return result;
764 }
765
766 private void setAndromdaPersistenceColumn(Property id, Property p) {
767 if (id != null)
768 setAndromdaPersistenceColumn(id.getName(), p);
769
770 }
771
772 private void setAndromdaPersistenceColumn(String propName, Property p) {
773
774 if (StereotypesHelper.hasStereotype(p, persistentPropertyStereotype) == true) {
775 String naturalIdIndex =
776 TransformModelHelper.getStereotypePropertyValue(p, persistentPropertyStereotype, "andromda_persistence_column");
777 if ("".equals(naturalIdIndex)) {
778 StereotypesHelper.setStereotypePropertyValue(p, persistentPropertyStereotype, "andromda_persistence_column",
779 TransformModelHelper.getAttributeName2TableName(propName));
780 }
781 } else {
782 StereotypesHelper.setStereotypePropertyValue(p, persistentPropertyStereotype, "andromda_persistence_column",
783 TransformModelHelper.getAttributeName2TableName(propName));
784 }
785
786 }
787
788 private Property feedProperty(Class c, Association a) {
789
790 if (!hasIdentifier(c)) {
791 transformAddId(c);
792 }
793 Property id = null;
794 for (Property pc : c.getAttribute()) {
795 if (TransformModelHelper.isIdentifier(c, pc, properties) && TransformModelHelper.isQuadrigeIdentifier(c, pc)) {
796 if (!(id != null && id.getName().endsWith("Id"))) {
797 id = pc;
798 System.out.println(a.getName() + ":" + pc.getName() + " id of " + c.getName());
799 }
800 }
801 }
802 return id;
803 }
804
805
806
807 private void processAssociation(Association a, HashMap<String, Integer> usedAssociations) {
808 int endTypeIndex = 0;
809 List<Type> types = a.getEndType();
810 boolean is1n = false;
811
812 if (types != null && !types.isEmpty()) {
813 for (Property p : a.getOwnedEnd()) {
814 if (StereotypesHelper.hasStereotype(p, identifierStereotype)) {
815 StereotypesHelper.removeStereotype(p, identifierStereotype);
816 }
817 String newName = getAssocNameFromProps(types, endTypeIndex, usedAssociations);
818
819 if ((p.getLower() == 1 || p.getLower() == 0) && p.getUpper() == 1) {
820
821 if (p.getOpposite().getUpper() == -1) {
822 Property otherSide = p.getOpposite();
823
824
825 }
826 if (newName != null) {
827 p.setName(newName);
828 setAndromdaPersistenceColumn(p.getName(), p);
829 } else if (types.size() > endTypeIndex) {
830 Class c = ((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class) types.get(endTypeIndex));
831 Property id = feedProperty(c, a);
832 setAndromdaPersistenceColumn(id, p);
833 if (id != null) {
834 p.setName(id.getName());
835 }
836 }
837 } else if (p.getUpper() == -1) {
838 if (newName != null) {
839 p.setName(newName);
840 setAndromdaPersistenceColumn(p.getName(), p);
841 } else if (types.size() > endTypeIndex) {
842 Class c = ((com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class) types.get(endTypeIndex));
843 Property id = feedProperty(c, a);
844 setAndromdaPersistenceColumn(id, p);
845 if (id != null) {
846 p.setName(id.getName());
847 }
848 }
849
850 }
851 endTypeIndex++;
852 }
853
854 }
855 }
856 }