View Javadoc
1   package fr.ifremer.quadrige2.magicdraw.action;
2   
3   /*-
4    * #%L
5    * Quadrige2 Core :: Quadrige2 Magicdraw plugin
6    * $Id:$
7    * $HeadURL:$
8    * %%
9    * Copyright (C) 2017 Ifremer
10   * %%
11   * This program is free software: you can redistribute it and/or modify
12   * it under the terms of the GNU Affero General Public License as published by
13   * the Free Software Foundation, either version 3 of the License, or
14   * (at your option) any later version.
15   * 
16   * This program is distributed in the hope that it will be useful,
17   * but WITHOUT ANY WARRANTY; without even the implied warranty of
18   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19   * GNU General Public License for more details.
20   * 
21   * You should have received a copy of the GNU Affero General Public License
22   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
23   * #L%
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   * Apply some transformations on model
60   * 
61   * @author >
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       * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
87       */
88      @Override
89      public void actionPerformed(ActionEvent e) {
90          // get project model
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                 // TODO Auto-generated catch block
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         // Load data types
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         // Get stereotype 'Entity'
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         // Get stereotype 'identifier'
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         // Get tagged property 'andromda_hibernate_generator_class'
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          * if (hibernateGeneratorClassMap.size() == 0) {
163          * JOptionPane.showMessageDialog
164          * (MDDialogParentProvider.getProvider().getDialogParent(),
165          * "Could not load 'andromda_hibernate_generator_class' in stereotype 'Entity' !"
166          * ); return false; }
167          */
168         /*
169          * if (hibernateGeneratorClassMap.get("assigned") == null) {
170          * JOptionPane.
171          * showMessageDialog(MDDialogParentProvider.getProvider().getDialogParent
172          * (),
173          * "Could not value 'assigned' from enumeration 'andromda_hibernate_generator_class' in stereotype 'Entity' !"
174          * ); return false; }
175          */
176 
177         // Load properties file
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                     // silent !
203                 }
204             }
205         }
206 
207         // Get Entity stereotype
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         // Get stereotype 'Entity'
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         // create package
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                 // Add
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         // Skip exists and no changes need
440         else if (id.getType() == integerType && id.getVisibility() == VisibilityKindEnum.PUBLIC && id.getLower() == 0 && id.getUpper() == 1) {
441             return "";
442         }
443 
444         // Set type
445         id.setType(integerType);
446 
447         // Set visibility
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         // HashMap<Type, Class> entitiesByType = new HashMap<Type, Class>();
476         Element migratePkg = null;
477 
478         for (Element e : model.getNestedPackage()) {
479             // System.out.println(e.getHumanName());
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                     // apply stereotype entity for all class
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                         // Apply Stereotype and check identifier to class only
490                         // (not to types)
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                         // entitiesByType.put(c.get)
500                         System.out.println(" ) ");
501                     }
502                     // Apply stereotype to relation?
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         // Dispatch Classes to correct package
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                         // dispatch class to the package
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                 // put element back to package 2migrate
550                 e.setOwner(package2migrate);
551             }
552         } else if (p.getHumanType().equals("Classe")) {
553             System.out.println(p.getHumanName());
554             // remove stereotype
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         // create 2migrate package
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             // System.out.println(e.getHumanName());
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         // add assigned to package under referential ie (referential, eunis,
614         // monitoringlocation,photo, pmfm,taxon)
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         // add assigned to package under referential ie (referential, eunis,
633         // monitoringlocation,photo, pmfm,taxon)
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     // TODO handle multiple association on same table (ie several fk of same
806     // table on a table)
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                 // if ("".equals(p.getName())) {
819                 if ((p.getLower() == 1 || p.getLower() == 0) && p.getUpper() == 1) {
820                     // Set Many side to not navigeable
821                     if (p.getOpposite().getUpper() == -1) {
822                         Property otherSide = p.getOpposite();
823                         // TODO : set not navigeable
824                         // otherSide.set
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 }