[ATL Launch] ATL from JAVA whithout serialization [message #666687] |
Thu, 21 April 2011 11:34  |
Eclipse User |
|
|
|
Hello everybody !
I use ATL 3.1.2 and when I create an ATL Plugin from my ATL transformation, ATL SDK generates a very useful Java Class to launch an ATL transformation. So I can call my transformation from Java simply using:
/* sourceModelPath and destModelPath are path Strings */
String args [] = {sourceModelPath, destModelPath};
ModelA2ModelB.main(args);
I would like to make more:
- I want to call my ATL transformation from Java but instead of using file path, I want to use directly my EMF Model (Ecore Objects). I don't want to use serialization, physical files.
To resume, I want a class (or a function I don't know) who consumes an EMF Model, made the transformation, and provides a new model.
I want to know if we can do this with the actual ATL API, or if I have to re-write the ATL Launcher ?
Thank you for those who have some ideas to make this !!
Antoine
|
|
|
Re: [ATL Launch] ATL from JAVA whithout serialization [message #669781 is a reply to message #666687] |
Wed, 11 May 2011 10:10  |
Eclipse User |
|
|
|
Hello !
I up this topic because I advanced but there is something very strange with EMF Resource.
I wrote all the code to manage myself the ATL transformation with the EMFVMLauncher, this is the code :
//Factory to create models and metamodels, injector to inject data in models
ModelFactory factory = new EMFModelFactory();
IInjector injector = new EMFInjector();
//MetaModelA, ModelA and injection of data from my resource (resourceModelA)
IReferenceModel metaModelA = factory.newReferenceModel();
injector.inject(metaModelA, metaModelAEcorePath); /* metaModelAEcorePath is the string path of my ecore file */
IModel modelA = factory.newModel(metaModelA);
((EMFInjector)injector).inject(modelA, resourceModelA);
/* My resourceModelA is already created and filled (I checked this by saving it and verifying the XMI file */
//MetaModelB, ModelB but no injection (it's the destination model)
IReferenceModel metaModelB = factory.newReferenceModel();
injector.inject(metaModelB, metaModelBEcorePath); /* metaModelAEcorePath is the string path of my ecore file */
IModel modelB = factory.newModel(metaModelB);
//Parameterization of the launcher (adding models, ASM File) and launch
ILauncher launcher = new EMFVMLauncher();
launcher.initialize(null);
launcher.addInModel(modelA, "ModelA", "MyFirstModelA");
launcher.addOutModel(modelB, "ModelB", "MyFirstModelB");
InputStream tabIS[] = new InputStream[1];
tabIS[0] = new URL(asmFilePath).openStream(); /* asmFilePath is the complete string path of my transformation (the asm file) */
Map<String, Object> launcherOptions = new HashMap<String, Object>();
launcher.launch("run", null, launcherOptions, (Object[]) tabIS);
//Extraction of data in the ModelB
IExtractor extractor = new EMFExtractor();
extractor.extract(modelB, fileModelB); /* fileModelB is the path string of my result modelB */
If I run this, my fileModelB is empty. When I try by using the Java Class ModelA2ModelB generated by ATL, it works good (but I must save my resourceModelA in a file before... and it's precisely this that I want to avoid...)
But if I save my resourceModelA, then I reload it like this, it works :
_resourceSet = ((EMFModelFactory)modelA.getModelFactory()).getResourceSet();
_resourceModelA = _resourceSet.getResource(modelAFilePath, true);
/* Then I use it in my injector (replacing the 6th line) */
((EMFInjector)injector).inject(modelA, _resourceModelA);
This works good but I must save my file and reload it, I don't know why. I want to only inject my resource without save it before... !
If anybody have some ideas to fix this, I would appreciate very much!
Thanks to all,
Antoine
[Updated on: Wed, 11 May 2011 10:18] by Moderator
|
|
|
Powered by
FUDForum. Page generated in 0.04904 seconds