Skip to main content



      Home
Home » Modeling » EMF » How to create genmodel from ecore programmatically without using headless invocation/eclipse plugins
How to create genmodel from ecore programmatically without using headless invocation/eclipse plugins [message #1095968] Tue, 27 August 2013 15:44 Go to next message
Eclipse UserFriend
I am working on an isolated tool (can't exeucte headless invocations, can't use eclipse installation) that will read/parse a source (e.g. DB, XML, etc) and generate both an ecore model as well as its associated gen model. I have been able to generate successfully the ecore model (model.ecore) programmatically using the dynamic generation feature provided by EMF. I would like to do the same for the model.genmodel as I need to set certain properties/features which are dependent on the source and time of generation of the ecore.

Any advice on how to accomplish this without the use of headless invocation/ant tasks will be appreciated
Re: How to create genmodel from ecore programmatically without using headless invocation/eclipse plu [message #1096207 is a reply to message #1095968] Wed, 28 August 2013 00:43 Go to previous messageGo to next message
Eclipse UserFriend
Juan,

The best I can do is suggest you look at source code. E.g., look at how
org.eclipse.emf.codegen.ecore.genmodel.presentation.GenModelActionBarContributor.GenerateAction
invokes the generator and at the Ant tasks.


On 27/08/2013 9:44 PM, juan velez wrote:
> I am working on an isolated tool (can't exeucte headless invocations,
> can't use eclipse installation) that will read/parse a source (e.g.
> DB, XML, etc) and generate both an ecore model as well as its
> associated gen model. I have been able to generate successfully the
> ecore model (model.ecore) programmatically using the dynamic
> generation feature provided by EMF. I would like to do the same for
> the model.genmodel as I need to set certain properties/features which
> are dependent on the source and time of generation of the ecore.
>
> Any advice on how to accomplish this without the use of headless
> invocation/ant tasks will be appreciated
Re: How to create genmodel from ecore programmatically without using headless invocation/eclipse plu [message #1096532 is a reply to message #1096207] Wed, 28 August 2013 10:19 Go to previous messageGo to next message
Eclipse UserFriend
Ed,

Thanks for the advice. I might have misread the code you pointed at, but it looks like this generates code from an existing GenModel. What I am trying to accomplish is to generate the GenModel file itself. Any experience/ideas?

Thanks
Re: How to create genmodel from ecore programmatically without using headless invocation/eclipse plu [message #1096591 is a reply to message #1096532] Wed, 28 August 2013 11:55 Go to previous messageGo to next message
Eclipse UserFriend
Juan,

I see. The importer framework does that type of thing:
org.eclipse.emf.importer.ecore.EcoreImporter. For simple cases, i.e., a
self-contain Ecore model, it's as simple as creating a GenModel instance
and calling
org.eclipse.emf.codegen.ecore.genmodel.GenModel.initialize(Collection<?
extends EPackage>)...

On 28/08/2013 4:19 PM, juan velez wrote:
> Ed,
>
> Thanks for the advice. I might have misread the code you pointed at,
> but it looks like this generates code from an existing GenModel. What
> I am trying to accomplish is to generate the GenModel file itself. Any
> experience/ideas?
>
> Thanks
Re: How to create genmodel from ecore programmatically without using headless invocation/eclipse plu [message #1096737 is a reply to message #1096591] Wed, 28 August 2013 16:09 Go to previous messageGo to next message
Eclipse UserFriend
For those who end up here doing a google search this is my solution based on Ed's last advice. Please note that this generates a gen model file based on an existing ecore model which has already been imported into an EPackage by reading it using a Resource. Also, not shown here, the resource associated to the EPackage needs to have its URI set to the correct ecore file.

    private void createGenModel(final EPackage rootPackage, final String ecoreLocation,
        final String genModelLocation) {

        GenModel genModel = GenModelFactory.eINSTANCE.createGenModel();
        genModel.setComplianceLevel(GenJDKLevel.JDK70_LITERAL);
        genModel.setModelDirectory(Constants.GEN_MODEL_MODEL_DIR.getValue());
        genModel.getForeignModel().add(new Path(ecoreLocation).lastSegment());
        genModel.setModelName(Constants.GEN_MODEL_MODEL_NAME.getValue());
        genModel.setRootExtendsInterface(Constants.GEN_MODEL_EXTENDS_INTERFACE.getValue());
        genModel.initialize(Collections.singleton(rootPackage));

        GenPackage genPackage = (GenPackage)genModel.getGenPackages().get(0);
        genPackage.setPrefix(Constants.GEN_MODEL_PACKAGE_PREFIX.getValue());

        try {
            URI genModelURI = URI.createFileURI(genModelLocation);
            final XMIResourceImpl genModelResource = new XMIResourceImpl(genModelURI);
            genModelResource.getDefaultSaveOptions().put(XMLResource.OPTION_ENCODING,
                Constants.GEN_MODEL_XML_ENCODING.getValue());
            genModelResource.getContents().add(genModel);
            genModelResource.save(Collections.EMPTY_MAP);
        } catch (IOException e) {
            String msg = null;
            final String genModelLocationCleaned = LogUtil.stripForgeChars(genModelLocation);
            if (e instanceof FileNotFoundException) {
                msg = "Unable to open output file " + genModelLocationCleaned;
            } else {
                msg = "Unexpected IO Exception writing " + genModelLocationCleaned;
            }
            LOGGER.error(msg, e);
            throw new RuntimeException(msg, e);
        }
    }

Re: How to create genmodel from ecore programmatically without using headless invocation/eclipse plu [message #1097121 is a reply to message #1096737] Thu, 29 August 2013 04:58 Go to previous messageGo to next message
Eclipse UserFriend
Juan,

Thanks for sharing your results!!

On 28/08/2013 10:09 PM, juan velez wrote:
> For those who end up here doing a google search this is my solution
> based on Ed's last advice. Please note that this generates a gen model
> file based on an existing ecore model which has already been imported
> into an EPackage by reading it using a Resource. Also, not shown here,
> the resource associated to the EPackage needs to have its URI set to
> the correct ecore file.
>
>
> private void createGenModel(final EPackage rootPackage, final
> String ecoreLocation,
> final String genModelLocation) {
>
> GenModel genModel = GenModelFactory.eINSTANCE.createGenModel();
> genModel.setComplianceLevel(GenJDKLevel.JDK70_LITERAL);
> genModel.setModelDirectory(Constants.GEN_MODEL_MODEL_DIR.getValue());
> genModel.getForeignModel().add(new
> Path(ecoreLocation).lastSegment());
> genModel.setModelName(Constants.GEN_MODEL_MODEL_NAME.getValue());
> genModel.setRootExtendsInterface(Constants.GEN_MODEL_EXTENDS_INTERFACE.getValue());
> genModel.initialize(Collections.singleton(rootPackage));
>
> GenPackage genPackage =
> (GenPackage)genModel.getGenPackages().get(0);
> genPackage.setPrefix(Constants.GEN_MODEL_PACKAGE_PREFIX.getValue());
>
> try {
> URI genModelURI = URI.createFileURI(genModelLocation);
> final XMIResourceImpl genModelResource = new
> XMIResourceImpl(genModelURI);
> genModelResource.getDefaultSaveOptions().put(XMLResource.OPTION_ENCODING,
> Constants.GEN_MODEL_XML_ENCODING.getValue());
> genModelResource.getContents().add(genModel);
> genModelResource.save(Collections.EMPTY_MAP);
> } catch (IOException e) {
> String msg = null;
> final String genModelLocationCleaned =
> LogUtil.stripForgeChars(genModelLocation);
> if (e instanceof FileNotFoundException) {
> msg = "Unable to open output file " +
> genModelLocationCleaned;
> } else {
> msg = "Unexpected IO Exception writing " +
> genModelLocationCleaned;
> }
> LOGGER.error(msg, e);
> throw new RuntimeException(msg, e);
> }
> }
>
>
Re: How to create genmodel from ecore programmatically without using headless invocation/eclipse plu [message #1723040 is a reply to message #1096737] Thu, 11 February 2016 03:44 Go to previous messageGo to next message
Eclipse UserFriend
Hi Juan,

I am trying to use your code to generate genmodel for my ecore model. Can you please specify what is 'Constants' in this code. I dont see any static class with this name. Can you please elaborate further.
Re: How to create genmodel from ecore programmatically without using headless invocation/eclipse plu [message #1723056 is a reply to message #1723040] Thu, 11 February 2016 05:13 Go to previous messageGo to next message
Eclipse UserFriend
Apparently that's his own class with hard coded (constant) values that
he wants to use.

On 11.02.2016 09:44, Zille Huma wrote:
> Hi Juan,
>
> I am trying to use your code to generate genmodel for my ecore model.
> Can you please specify what is 'Constants' in this code. I dont see
> any static class with this name. Can you please elaborate further.
Re: How to create genmodel from ecore programmatically without using headless invocation/eclipse plu [message #1811269 is a reply to message #1096737] Thu, 29 August 2019 19:42 Go to previous messageGo to next message
Eclipse UserFriend
Hi,

I have just tested the code provided bellow but I have the following execption :
Exception in thread "main" java.lang.NoSuchMethodError: org.eclipse.emf.codegen.util.CodeGenUtil.capName(Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String;
at org.eclipse.emf.codegen.ecore.genmodel.impl.GenBaseImpl.capName(GenBaseImpl.java:319)
at org.eclipse.emf.codegen.ecore.genmodel.impl.GenPackageImpl.initialize(GenPackageImpl.java:3068)
at org.eclipse.emf.codegen.ecore.genmodel.impl.GenModelImpl.initialize(GenModelImpl.java:2672)


I have tried another code snipet that uses the same initalize method and I have the same error.

Note there are two packages implementing this method :
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.uml2.codegen.ecore.genmodel.GenModel;

I have tried importing both (not the same time of course)

Any hints?
Re: How to create genmodel from ecore programmatically without using headless invocation/eclipse plu [message #1811272 is a reply to message #1811269] Thu, 29 August 2019 22:03 Go to previous messageGo to next message
Eclipse UserFriend
The method it says doesn't exist has existed since EMF 2.4 so I don't know where you got your libraries from. You should get them from a recent version from here:

https://download.eclipse.org/modeling/emf/emf/builds/index.html

It's also easy to set up a development environment with all of EMF's source:

https://ci.eclipse.org/emf/

Then you can more easily look at how other parts of the code do the same things as what you're trying to do.
Re: How to create genmodel from ecore programmatically without using headless invocation/eclipse plu [message #1811277 is a reply to message #1811272] Fri, 30 August 2019 01:08 Go to previous messageGo to next message
Eclipse UserFriend
Thanks again for your reply.

I downloaded from here : https://jar-download.com/?search_box=org.eclipse.emf.ecore

I will have a look at the links at code and will lets you know.
Re: How to create genmodel from ecore programmatically without using headless invocation/eclipse plu [message #1811289 is a reply to message #1811277] Fri, 30 August 2019 03:17 Go to previous message
Eclipse UserFriend
Hi

"Last update 22. July 2009" is a bit of a clue. Use the official version applicable to your version of Eclipse at Help->Install New Software.... Work with e.g. 2019-06 - http://download.eclipse.org/releases/2019-06 and select Modeling->EMF - Eclipse Modeling Framework SDK.

Regards

Ed Willink
Previous Topic:Do I need to generate the code of the meta model to explore/edit existing models
Next Topic:Single references of EObject type in Dynamic Model
Goto Forum:
  


Current Time: Tue Jul 15 15:34:56 EDT 2025

Powered by FUDForum. Page generated in 0.04708 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top