fix [Bug 408542] Duplicated declaration of "generated_package" extensions in plugin.xml with a generation chain
fix issues related to multiple ecore generation
diff --git a/portfolio/org.eclipse.egf.portfolio.genchain.tools/generated/fcore/builder/patterns/ModelGenmodelPattern.java b/portfolio/org.eclipse.egf.portfolio.genchain.tools/generated/fcore/builder/patterns/ModelGenmodelPattern.java
index 215c4ee..d25bd4d 100644
--- a/portfolio/org.eclipse.egf.portfolio.genchain.tools/generated/fcore/builder/patterns/ModelGenmodelPattern.java
+++ b/portfolio/org.eclipse.egf.portfolio.genchain.tools/generated/fcore/builder/patterns/ModelGenmodelPattern.java
@@ -135,7 +135,6 @@
 
     protected void method_save(final StringBuffer out, final PatternContext ctx) throws Exception {
         if (importer != null) {
-            importer.prepareGenModelAndEPackages(new BasicMonitor());
             importer.saveGenModelAndEPackages(new BasicMonitor());
         }
 
diff --git a/portfolio/org.eclipse.egf.portfolio.genchain.tools/src/org/eclipse/egf/portfolio/genchain/tools/utils/EcoreImporterHelper.java b/portfolio/org.eclipse.egf.portfolio.genchain.tools/src/org/eclipse/egf/portfolio/genchain/tools/utils/EcoreImporterHelper.java
index d67552e..c9b2195 100644
--- a/portfolio/org.eclipse.egf.portfolio.genchain.tools/src/org/eclipse/egf/portfolio/genchain/tools/utils/EcoreImporterHelper.java
+++ b/portfolio/org.eclipse.egf.portfolio.genchain.tools/src/org/eclipse/egf/portfolio/genchain/tools/utils/EcoreImporterHelper.java
@@ -6,10 +6,10 @@
  *  are made available under the terms of the Eclipse Public License v1.0
  *  which accompanies this distribution, and is available at
  *  http://www.eclipse.org/legal/epl-v10.html
- * 
+ *
  *  Contributors:
  *      Thales Corporate Services S.A.S - initial API and implementation
- * 
+ *
  * </copyright>
  */
 
@@ -18,9 +18,11 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.regex.Pattern;
 
 import org.eclipse.core.resources.IFile;
@@ -34,7 +36,9 @@
 import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
 import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
 import org.eclipse.emf.common.util.BasicMonitor;
+import org.eclipse.emf.common.util.Diagnostic;
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.Monitor;
 import org.eclipse.emf.common.util.TreeIterator;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.common.util.UniqueEList;
@@ -62,6 +66,7 @@
     protected static final String ECORE_EXT = ".ecore";
 
     private EcoreImporter importer;
+    final Set<String> mainPackages = new HashSet<String>();
 
     public static EcoreImporter createDefaultEcoreImporter() throws Exception {
         return new EcoreImporter();
@@ -71,9 +76,20 @@
         return doCreateEcoreImporter(new EcoreImporterHelper(), containterPath, ecoreURI, model);
     }
 
-    protected static EcoreImporter doCreateEcoreImporter(EcoreImporterHelper helper, IPath containterPath, URI ecoreURI, EmfGeneration model) throws Exception {
+    protected static EcoreImporter doCreateEcoreImporter(final EcoreImporterHelper helper, IPath containterPath, URI ecoreURI, EmfGeneration model) throws Exception {
         helper.importer = new EcoreImporter() {
 
+            @Override
+            public Diagnostic computeEPackages(Monitor monitor) throws Exception {
+                // for (EPackage ePackage : getEPackages()) {
+                // getEPackageImportInfo(ePackage).setConvert(true);
+                // }
+                // final EPackage ePackage = getEPackages().get(0);
+                final Diagnostic computeEPackages = super.computeEPackages(monitor);
+                // getEPackageImportInfo(ePackage).setConvert(true);
+                return computeEPackages;
+            }
+
             protected List<Resource> computeResourcesToBeSaved() {
                 List<Resource> resources = new UniqueEList.FastCompare<Resource>();
                 Resource genModelResource = getGenModel().eResource();
@@ -94,6 +110,10 @@
                 // disable behavior
             }
 
+            protected boolean canConvert(EPackage ePackage) {
+                return helper.mainPackages.contains(ePackage.getNsURI());
+            }
+
         };
         helper.importer.setGenModelContainerPath(containterPath);
         String name = ecoreURI.lastSegment().replace(ECORE_EXT, GENMODEL_EXT);
@@ -103,10 +123,12 @@
         // helper.importer.computeEPackages(MONITOR);
         // helper.importer.adjustEPackages(MONITOR);
         helper.importer.computeDefaultGenModelFileName();
+        List<EPackage> ePackages = getOwnEPackages(helper.importer.getGenModelResourceSet(), ecoreURI);
+        helper.addEPackages(ePackages, helper.importer, model);
+        helper.importer.prepareGenModelAndEPackages(MONITOR);
+        helper.fixGenPackages(ePackages, helper.importer, model);
         EList<GenPackage> genPackages = helper.importer.getGenModel().getGenPackages();
-        helper.addEPackages(containterPath, ecoreURI, helper.importer, model);
 
-        // helper.importer.prepareGenModelAndEPackages(MONITOR);
         // helper.importer.saveGenModelAndEPackages(MONITOR);
         return helper.importer;
     }
@@ -118,7 +140,61 @@
         return uri2package;
     }
 
-    protected void addEPackages(IPath containterPath, URI ecoreURI, EcoreImporter ecoreImporter, EmfGeneration model) throws Exception {
+    protected void addEPackages(List<EPackage> ePackages, EcoreImporter ecoreImporter, EmfGeneration model) throws Exception {
+        for (EPackage pack : ePackages)
+            mainPackages.add(pack.getNsURI());
+        ecoreImporter.getEPackages().addAll(ePackages);
+        ecoreImporter.computeEPackages(MONITOR);
+        ecoreImporter.adjustEPackages(MONITOR);
+
+    }
+
+    // protected void addEPackages(IPath containtersPath, URI ecorerURI,
+    // EcoreImporter ecoreImporter, EmfGeneration model) throws Exception {
+    // ResourceSet resourceSet = ecoreImporter.getGenModelResourceSet();
+    // List<EPackage> ePackages = getOwnEPackages(resourceSet, ecoreURI);
+    //
+    // ecoreImporter.getEPackages().addAll(ePackages);
+    // ecoreImporter.computeEPackages(MONITOR);
+    // ecoreImporter.adjustEPackages(MONITOR);
+    //
+    // }
+    protected void fixGenPackages(List<EPackage> ePackages, EcoreImporter ecoreImporter, EmfGeneration model) {
+        ResourceSet resourceSet = ecoreImporter.getGenModelResourceSet();
+        List<EPackage> allEPackages = ecoreImporter.getEPackages();
+        Map<String, EPackage> requiredEPackages = asMap(allEPackages);
+
+        GenModel genModel = ecoreImporter.getGenModel();
+        // genModel.setModelName(value);
+        for (EPackage ePackage : ePackages)
+            requiredEPackages.remove(ePackage.getNsURI());
+
+        for (EPackage ePackage : requiredEPackages.values()) {
+            List<GenPackage> genModels = getPluginGenModel(ePackage);
+            if (genModels.isEmpty()) {
+                IPath ecorePath = new Path(ePackage.eResource().getURI().toString());
+                Resource resource = getGenModelResource(ecorePath, genModel, model);
+
+                if (resource != null && !resource.getContents().isEmpty()) {
+                    for (EObject obj : resource.getContents()) {
+                        for (GenPackage genPackage : ((GenModel) obj).getGenPackages()) {
+                            final GenPackage refGenPackage = genModel.findGenPackage(genPackage.getEcorePackage());
+                            if (refGenPackage != null)
+                                genModel.getGenPackages().remove(refGenPackage);
+                            genModel.getUsedGenPackages().add(genPackage);
+                        }
+                    }
+                } else {
+                    handleMissingGenmodel(resourceSet, genModel, ecorePath);
+                }
+
+            } else
+                genModel.getUsedGenPackages().addAll(genModels);
+        }
+
+    }
+
+    protected void addEPackages1(IPath containterPath, URI ecoreURI, EcoreImporter ecoreImporter, EmfGeneration model) throws Exception {
 
         ResourceSet resourceSet = ecoreImporter.getGenModelResourceSet();
         List<EPackage> ePackages = getOwnEPackages(resourceSet, ecoreURI);
@@ -132,6 +208,7 @@
         List<EPackage> allEPackages = ecoreImporter.getEPackages();
         Map<String, EPackage> requiredEPackages = asMap(allEPackages);
 
+        // genModel.setModelName(value);
         for (EPackage ePackage : ePackages)
             requiredEPackages.remove(ePackage.getNsURI());
 
@@ -151,6 +228,7 @@
             } else
                 genModel.getUsedGenPackages().addAll(genModels);
         }
+
     }
 
     protected void handleMissingGenmodel(ResourceSet resourceSet, GenModel genModel, IPath ecorePath) {
@@ -173,8 +251,17 @@
         URI uri = URI.createPlatformResourceURI(genModelFile.object.getFullPath().toString(), false);
         Resource resource = resourceSet.getResource(uri, true);
         if (resource != null && !resource.getContents().isEmpty()) {
-            for (EObject obj : resource.getContents())
-                genModel.getUsedGenPackages().addAll(((GenModel) obj).getGenPackages());
+            for (EObject obj : resource.getContents()) {
+                // genModel.getUsedGenPackages().addAll(((GenModel)
+                // obj).getGenPackages());
+                for (GenPackage genPackage : ((GenModel) obj).getGenPackages()) {
+                    final GenPackage refGenPackage = genModel.findGenPackage(genPackage.getEcorePackage());
+                    if (refGenPackage != null)
+                        genModel.getGenPackages().remove(refGenPackage);
+                    genModel.getUsedGenPackages().add(genPackage);
+                }
+
+            }
         } else
             throw new RuntimeException("can't find genmodel for " + ecorePath);
     }
diff --git a/portfolio/org.eclipse.egf.portfolio.genchain.tools/templates/pattern._2-eB0Ij9Ed-AZ6r6cIc0dQ/method._BLrqUIqLEd-SmaLnSW-4HQ.pt b/portfolio/org.eclipse.egf.portfolio.genchain.tools/templates/pattern._2-eB0Ij9Ed-AZ6r6cIc0dQ/method._BLrqUIqLEd-SmaLnSW-4HQ.pt
index a506650..b82bf58 100644
--- a/portfolio/org.eclipse.egf.portfolio.genchain.tools/templates/pattern._2-eB0Ij9Ed-AZ6r6cIc0dQ/method._BLrqUIqLEd-SmaLnSW-4HQ.pt
+++ b/portfolio/org.eclipse.egf.portfolio.genchain.tools/templates/pattern._2-eB0Ij9Ed-AZ6r6cIc0dQ/method._BLrqUIqLEd-SmaLnSW-4HQ.pt
@@ -1,4 +1,3 @@
         if (importer != null) {

-            importer.prepareGenModelAndEPackages(new BasicMonitor());

             importer.saveGenModelAndEPackages(new BasicMonitor());

         }