blob: 08f49d713cb4aef730e6ddedd51f67a1d5c620c1 [file] [log] [blame]
package org.eclipse.papyrus.emfgen.core;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.emf.codegen.ecore.generator.Generator;
import org.eclipse.emf.codegen.ecore.generator.GeneratorAdapterFactory;
import org.eclipse.emf.codegen.ecore.genmodel.GenJDKLevel;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.codegen.ecore.genmodel.generator.GenBaseGeneratorAdapter;
import org.eclipse.emf.codegen.ecore.genmodel.generator.GenModelGeneratorAdapterFactory;
import org.eclipse.emf.codegen.merge.java.JControlModel;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.URIConverter;
import org.eclipse.emf.ecore.resource.impl.ExtensibleURIConverterImpl;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
/**
* @author CEA Tech - Francois Le Fevre
* 2014
*/
public class EmfGenerator {
private static Logger logger = Logger.getLogger(EmfGenerator.class);
static{
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("genmodel", new XMIResourceFactoryImpl());
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("ecore", new XMIResourceFactoryImpl());
//Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
}
private ResourceSet resourceSet;
public GenModel getGenModel(EmfModel emfModel, EmfGeneratorOptions emfGeneratorOptions ) throws IOException {
GenModel genModel = null;
URIConverter converter = new ExtensibleURIConverterImpl();
logger.info("Dealing with genmodel ini: "+emfModel.getGenModel());
URI genModelURI = URI.createURI(emfModel.getGenModel());
URI genmodelNormalized = converter.normalize(genModelURI);
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getPackageRegistry().put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE);
resourceSet.getPackageRegistry().put(GenModelPackage.eNS_URI, GenModelPackage.eINSTANCE);
//Dealing with outdir uri
URI outdir = URI.createFileURI(emfGeneratorOptions.getOutputDirectory());
logger.info("outdir emfgen: "+outdir);
URI outdirNormalized = converter.normalize(outdir);
resourceSet.getURIConverter().getURIMap().put(URI.createURI("platform:/resource/"), outdirNormalized);
//Managing Ecore uri
logger.warn("By default load ecore environment but no code to load additional ecore model inside your initial model");
URI ecoreEcoreUri= URI.createURI("jar:"+EcorePlugin.INSTANCE.getBaseURL().getFile());
URI ecoreEcoreNormalized = converter.normalize(ecoreEcoreUri);
URI ecoreGenUri= URI.createURI("jar:"+EcorePlugin.INSTANCE.getBaseURL().getFile()+"/model/Ecore.genmodel");
URI ecoreGenNormalized = converter.normalize(ecoreGenUri);
logger.debug("ecoreEcoreUri="+ecoreEcoreUri);
logger.debug("ecoreEcoreNormalized="+ecoreEcoreNormalized);
logger.debug("ecoreGenUri="+ecoreGenUri);
logger.debug("ecoreGenNormalized="+ecoreGenNormalized);
resourceSet.getURIConverter().getURIMap().put(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/"),ecoreEcoreNormalized );
resourceSet.getURIConverter().getURIMap().put(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore"),ecoreGenNormalized );
Resource resource = resourceSet.getResource(genmodelNormalized, true);
//resource.load(null);
URI ecoreUri = URI.createURI(emfModel.getEcore());
logger.info("ecoreUri: "+ecoreUri);
URI ecoreUriNormalized = converter.normalize(ecoreUri);
logger.info("ecoreUri normalized: "+ecoreUriNormalized);
Resource ecoreResource = resourceSet.getResource(ecoreUriNormalized, true);
//ecoreResource.load(null);
logger.info("resource.getContents().size() : "+resource.getContents().size() );
if (resource.getContents().size() != 1) {
System.out.println("Resource has " +
resource.getContents().size()
+ " loaded objects");
} else {
Object o = resource.getContents().get(0);
logger.info("o: "+o.getClass() );
genModel = (GenModel) resource.getContents().get(0);
genModel.validate();
genModel.reconcile();
List<GenPackage> genPackages = genModel.getAllGenAndUsedGenPackagesWithClassifiers();
for(GenPackage genPackage : genPackages){
logger.info("genPackage: "+genPackage.getPackageName() );
}
logger.info("genModel.getModelDirectory(): "+genModel.getModelDirectory() );
logger.info("genModel.getEditDirectory(): "+genModel.getEditDirectory() );
logger.info("genModel.getEditorDirectory(): "+genModel.getEditorDirectory() );
logger.info("genModel.getTestsDirectory(): "+genModel.getTestsDirectory() );
if(emfGeneratorOptions.isRelocate()){
logger.info("relocate: active");
genModel.setModelDirectory("/");
genModel.setEditDirectory("/");
genModel.setEditorDirectory("/");
}
genModel.setValidateModel(true); // The more checks the better
genModel.setCodeFormatting(true); // Normalize layout
genModel.setForceOverwrite(false); // Don't overwrite read-only files
genModel.setCanGenerate(true);
// genModel.setFacadeHelperClass(null); // Non-null gives JDT default NPEs
//genModel.setFacadeHelperClass(StandaloneASTFacadeHelper.class.getName()); // Bug 308069
genModel.setBundleManifest(false); // New manifests should be generated manually
genModel.setUpdateClasspath(false); // New class-paths should be generated manually
if (genModel.getComplianceLevel().compareTo(GenJDKLevel.JDK50_LITERAL) < 0) {
genModel.setComplianceLevel(GenJDKLevel.JDK50_LITERAL);
}
// genModel.setRootExtendsClass("org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container");
/*
* JavaModelManager.getJavaModelManager().initializePreferences();
* new
* JavaCorePreferenceInitializer().initializeDefaultPreferences();
*
* GenJDKLevel genSDKcomplianceLevel =
* genModel.getComplianceLevel(); String complianceLevel =
* JavaCore.VERSION_1_5; switch (genSDKcomplianceLevel) { case
* JDK60_LITERAL: complianceLevel = JavaCore.VERSION_1_6; case
* JDK14_LITERAL: complianceLevel = JavaCore.VERSION_1_4; default:
* complianceLevel = JavaCore.VERSION_1_5; } // Hashtable<?,?>
* defaultOptions = JavaCore.getDefaultOptions(); //
* JavaCore.setComplianceOptions(complianceLevel, defaultOptions);
* // JavaCore.setOptions(defaultOptions);
*/
//
// Diagnostic diagnostic = genModel.diagnose();
// // Globally register the default generator adapter factory for
// // GenModel
// // elements (only needed in standalone).
// //
// GeneratorAdapterFactory.Descriptor.Registry.INSTANCE.addDescriptor(GenModelPackage.eNS_URI,GenModelGeneratorAdapterFactory.DESCRIPTOR);
//
// /**
// * have a look to https://eclipse.googlesource.com/emf/org.eclipse.mwe/+/v2.5.1/plugins/org.eclipse.emf.mwe2.lib/src/org/eclipse/emf/mwe2/ecore/EcoreGenerator.java
// */
// // Create the generator and set the model-level input object.
// //
// generator = setup();//new Generator();
// generator.setInput(genModel);
// generator.getAdapterFactoryDescriptorRegistry().addDescriptor(GenModelPackage.eNS_URI,GenModelGeneratorAdapterFactory.DESCRIPTOR);
}
return genModel;
}
public Generator getGenerator(GenModel genModel ){
/**
* have a look to https://eclipse.googlesource.com/emf/org.eclipse.mwe/+/v2.5.1/plugins/org.eclipse.emf.mwe2.lib/src/org/eclipse/emf/mwe2/ecore/EcoreGenerator.java
*/
// Create the generator and set the model-level input object.
//
Generator generator = setup();//new Generator();
generator.setInput(genModel);
generator.getAdapterFactoryDescriptorRegistry().addDescriptor(GenModelPackage.eNS_URI,GenModelGeneratorAdapterFactory.DESCRIPTOR);
return generator;
}
public void execute(EmfModel emfModel, EmfGeneratorOptions emfGeneratorOptions ) throws IOException {
GenModel genModel = getGenModel(emfModel, emfGeneratorOptions );
Generator generator = getGenerator(genModel);
generateProjectTypeModel(generator,genModel, emfGeneratorOptions);
generateProjectTypeEdit(generator,genModel, emfGeneratorOptions);
generateProjectTypeEditor(generator,genModel, emfGeneratorOptions);
generateProjectTypeTest(generator,genModel, emfGeneratorOptions);
// URIConverter converter = new ExtensibleURIConverterImpl();
//
// logger.info("Dealing with genmodel ini: "+emfModel.getGenModel());
// URI genModelURI = URI.createURI(emfModel.getGenModel());
//
// URI genmodelNormalized = converter.normalize(genModelURI);
//
// ResourceSet resourceSet = new ResourceSetImpl();
// resourceSet.getPackageRegistry().put(EcorePackage.eNS_URI, EcorePackage.eINSTANCE);
// resourceSet.getPackageRegistry().put(GenModelPackage.eNS_URI, GenModelPackage.eINSTANCE);
//
// //Dealing with outdir uri
// URI outdir = URI.createFileURI(emfGeneratorOptions.getOutputDirectory());
// logger.info("outdir emfgen: "+outdir);
// URI outdirNormalized = converter.normalize(outdir);
// resourceSet.getURIConverter().getURIMap().put(URI.createURI("platform:/resource/"), outdirNormalized);
//
// //Managing Ecore uri
// logger.warn("By default load ecore environment but no code to load additional ecore model inside your initial model");
// URI ecoreEcoreUri= URI.createURI("jar:"+EcorePlugin.INSTANCE.getBaseURL().getFile());
// URI ecoreEcoreNormalized = converter.normalize(ecoreEcoreUri);
// URI ecoreGenUri= URI.createURI("jar:"+EcorePlugin.INSTANCE.getBaseURL().getFile()+"/model/Ecore.genmodel");
// URI ecoreGenNormalized = converter.normalize(ecoreGenUri);
// logger.debug("ecoreEcoreUri="+ecoreEcoreUri);
// logger.debug("ecoreEcoreNormalized="+ecoreEcoreNormalized);
// logger.debug("ecoreGenUri="+ecoreGenUri);
// logger.debug("ecoreGenNormalized="+ecoreGenNormalized);
// resourceSet.getURIConverter().getURIMap().put(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/"),ecoreEcoreNormalized );
// resourceSet.getURIConverter().getURIMap().put(URI.createURI("platform:/plugin/org.eclipse.emf.ecore/model/Ecore.genmodel#//ecore"),ecoreGenNormalized );
//
// Resource resource = resourceSet.getResource(genmodelNormalized, true);
// //resource.load(null);
//
// URI ecoreUri = URI.createURI(emfModel.getEcore());
// logger.info("ecoreUri: "+ecoreUri);
// URI ecoreUriNormalized = converter.normalize(ecoreUri);
// logger.info("ecoreUri normalized: "+ecoreUriNormalized);
// Resource ecoreResource = resourceSet.getResource(ecoreUriNormalized, true);
// //ecoreResource.load(null);
//
// logger.info("resource.getContents().size() : "+resource.getContents().size() );
// if (resource.getContents().size() != 1) {
// System.out.println("Resource has " +
// resource.getContents().size()
// + " loaded objects");
// } else {
// Object o = resource.getContents().get(0);
// logger.info("o: "+o.getClass() );
// GenModel genModel = (GenModel) resource.getContents().get(0);
// genModel.validate();
// genModel.reconcile();
//
// List<GenPackage> genPackages = genModel.getAllGenAndUsedGenPackagesWithClassifiers();
// for(GenPackage genPackage : genPackages){
// logger.info("genPackage: "+genPackage.getPackageName() );
// }
//
// logger.info("genModel.getModelDirectory(): "+genModel.getModelDirectory() );
// logger.info("genModel.getEditDirectory(): "+genModel.getEditDirectory() );
// logger.info("genModel.getEditorDirectory(): "+genModel.getEditorDirectory() );
// logger.info("genModel.getTestsDirectory(): "+genModel.getTestsDirectory() );
//
// if(emfGeneratorOptions.isRelocate()){
// logger.info("relocate: active");
// genModel.setModelDirectory("/");
// genModel.setEditDirectory("/");
// genModel.setEditorDirectory("/");
// }
//
// genModel.setValidateModel(true); // The more checks the better
// genModel.setCodeFormatting(true); // Normalize layout
// genModel.setForceOverwrite(false); // Don't overwrite read-only files
// genModel.setCanGenerate(true);
// // genModel.setFacadeHelperClass(null); // Non-null gives JDT default NPEs
// //genModel.setFacadeHelperClass(StandaloneASTFacadeHelper.class.getName()); // Bug 308069
// genModel.setBundleManifest(false); // New manifests should be generated manually
// genModel.setUpdateClasspath(false); // New class-paths should be generated manually
// if (genModel.getComplianceLevel().compareTo(GenJDKLevel.JDK50_LITERAL) < 0) {
// genModel.setComplianceLevel(GenJDKLevel.JDK50_LITERAL);
// }
// // genModel.setRootExtendsClass("org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container");
// /*
// * JavaModelManager.getJavaModelManager().initializePreferences();
// * new
// * JavaCorePreferenceInitializer().initializeDefaultPreferences();
// *
// * GenJDKLevel genSDKcomplianceLevel =
// * genModel.getComplianceLevel(); String complianceLevel =
// * JavaCore.VERSION_1_5; switch (genSDKcomplianceLevel) { case
// * JDK60_LITERAL: complianceLevel = JavaCore.VERSION_1_6; case
// * JDK14_LITERAL: complianceLevel = JavaCore.VERSION_1_4; default:
// * complianceLevel = JavaCore.VERSION_1_5; } // Hashtable<?,?>
// * defaultOptions = JavaCore.getDefaultOptions(); //
// * JavaCore.setComplianceOptions(complianceLevel, defaultOptions);
// * // JavaCore.setOptions(defaultOptions);
// */
//
// Diagnostic diagnostic = genModel.diagnose();
// // Globally register the default generator adapter factory for
// // GenModel
// // elements (only needed in standalone).
// //
// GeneratorAdapterFactory.Descriptor.Registry.INSTANCE.addDescriptor(GenModelPackage.eNS_URI,GenModelGeneratorAdapterFactory.DESCRIPTOR);
//
// /**
// * have a look to https://eclipse.googlesource.com/emf/org.eclipse.mwe/+/v2.5.1/plugins/org.eclipse.emf.mwe2.lib/src/org/eclipse/emf/mwe2/ecore/EcoreGenerator.java
// */
// // Create the generator and set the model-level input object.
// //
// Generator generator = setup();//new Generator();
// generator.setInput(genModel);
// generator.getAdapterFactoryDescriptorRegistry().addDescriptor(GenModelPackage.eNS_URI,GenModelGeneratorAdapterFactory.DESCRIPTOR);
//
// // Generator model code.
// if(emfGeneratorOptions.isProjectTypeModel()){
// logger.info("Generating Model");
// generator.generate(genModel,
// GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE,
// new BasicMonitor.Printing(System.out));
// System.out.println("diagnostic="+diagnostic.getMessage());
//
//
// if (diagnostic.getSeverity() != Diagnostic.OK){
// logger.info(diagnostic);
// }
// }
//
// if(emfGeneratorOptions.isProjectTypeEdit()){
// logger.info("Generating Edit");
// Diagnostic editDiag = generator.generate(genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE,
// new BasicMonitor());
// if (editDiag.getSeverity() != Diagnostic.OK)
// logger.info(editDiag);
// }
//
// if(emfGeneratorOptions.isProjectTypeEditor()){
// logger.info("Generating Editor");
// Diagnostic editorDiag = generator.generate(genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE,
// new BasicMonitor());
// if (editorDiag.getSeverity() != Diagnostic.OK)
// logger.info(editorDiag);
// }
//
//
// if(emfGeneratorOptions.isProjectTypeTests()){
// logger.info("Generating Tests");
// logger.warn("Tests generation is not taken into account for this version");
// /*
// Diagnostic editorDiag = generator.generate(genModel, GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE,
// new BasicMonitor());
// if (editorDiag.getSeverity() != Diagnostic.OK)
// logger.info(editorDiag);
// */
// }
// }
}
public void generateProjectTypeTest(Generator generator, GenModel genModel, EmfGeneratorOptions emfGeneratorOptions) {
if(emfGeneratorOptions.isProjectTypeTests()){
logger.info("Generating Tests");
logger.warn("Tests generation is not taken into account for this version");
/*
Diagnostic editorDiag = generator.generate(genModel, GenBaseGeneratorAdapter.TESTS_PROJECT_TYPE,
new BasicMonitor());
if (editorDiag.getSeverity() != Diagnostic.OK)
logger.info(editorDiag);
*/
}
}
public void generateProjectTypeEditor(Generator generator, GenModel genModel,
EmfGeneratorOptions emfGeneratorOptions) {
if(emfGeneratorOptions.isProjectTypeEditor()){
logger.info("Generating Editor");
Diagnostic editorDiag = generator.generate(genModel, GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE,
new BasicMonitor());
if (editorDiag.getSeverity() != Diagnostic.OK)
logger.info(editorDiag);
}
}
public void generateProjectTypeEdit(Generator generator, GenModel genModel, EmfGeneratorOptions emfGeneratorOptions) {
if(emfGeneratorOptions.isProjectTypeEdit()){
logger.info("Generating Edit");
Diagnostic editDiag = generator.generate(genModel, GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE,
new BasicMonitor());
if (editDiag.getSeverity() != Diagnostic.OK)
logger.info(editDiag);
}
}
public void generateProjectTypeModel(Generator generator, GenModel genModel, EmfGeneratorOptions emfGeneratorOptions) {
// Generator model code.
Diagnostic diagnostic = genModel.diagnose();
if(emfGeneratorOptions.isProjectTypeModel()){
logger.info("Generating Model");
generator.generate(genModel,
GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE,
new BasicMonitor.Printing(System.out));
System.out.println("diagnostic="+diagnostic.getMessage());
if (diagnostic.getSeverity() != Diagnostic.OK){
logger.info(diagnostic);
}
}
}
private static Generator setup(
) {
GenModelPackage.eINSTANCE.getGenAnnotation();
EcorePackage.eINSTANCE.getEFactoryInstance();
GenModelPackage.eINSTANCE.getEFactoryInstance();
//PlatformInitializer platformInitializer = new PlatformInitializer();
//platformInitializer.setPlatformUri(platform);
if (!Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().containsKey("genmodel"))
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("genmodel",
new org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl());
org.eclipse.emf.codegen.ecore.generator.Generator generator = new org.eclipse.emf.codegen.ecore.generator.Generator(){
@Override
public JControlModel getJControlModel() {
if (jControlModel == null) {
jControlModel = new JControlModel();
jControlModel.initialize(null, options.mergeRulesURI);
}
return jControlModel;
}
};
generator.getAdapterFactoryDescriptorRegistry().addDescriptor(GenModelPackage.eNS_URI,org.eclipse.emf.codegen.ecore.genmodel.generator.GenModelGeneratorAdapterFactory.DESCRIPTOR);
return generator;
}
}