HTTP://RAONINERY.CGSOCIETY.ORG/GALLERY/853975/(C) RAONI NERY (RAONINERY@GMAIL.COM)                                        ...
POINTS OF INTEREST Multiple Ecore       Wipe out                                                                     Make ...
PARENTALADVISORYKEEP OUT        POSSIBILITY OFBACKWARD INCOMPATIBILITY
USE CASE 1ECORE MODEL V1   ECORE MODEL V2 Tool Vendor 1    Tool Vendor 2
WAIT, I CAN’T USETOOLS FROM THESETWO VENDORS ATTHE SAME TIME?I don’t care if they are based onsome data model whosediffere...
HTTP://WWW.FLICKR.COM/PHOTOS/RUSSMORRIS/181933880/                     HTTP://WWW.FLICKR.COM/PHOTOS/ITSGREG/2634229136/   ...
FIRST GUILTY:EXTENSIONSOSGi is modular and dynamic by nature.Extensions are reducing some of theseadvantages by forcing pl...
FIRST SOLUTIONMimic GeneratedPackageRegistryReader andDynamicPackageRegistryReader during activationof model plug-ins.Adva...
SECOND SOLUTIONUse OSGi (declarative) services.Advantages: simple and mostly backwardcompatible. Once defined as a service,...
HTTP://WWW.FLICKR.COM/PHOTOS/FIDDLEDYDEE/4349596304/SECOND GUILTYEPACKAGE.REGISTRY KEY
SECOND GUILTY:REGISTRY KEYSEPackage instances are identified by namespaceURI in the Registry.  Best practice (workaround?) ...
SOLUTIONNeed a specific EPackage.Registryimplementation that handle versions   public interface VersionedRegistry extends E...
USE CASE 2« If the interfaces can be kept "clean", i.e.without any references to EMF-generatedimplementation classes or to...
HTTP://WWW.FLICKR.COM/PHOTOS/DCJOHN/12852539/GUILTY:EPACKAGE.EINSTANCE
acesInterf                    EMF              YOUR MODEL
acesInterf        EObject   EPackage   EFactory                                              EMF                          ...
acesInterf        EObject   EPackage     EFactory                                                  EMF          Foo     Ba...
acesInterf          EObject   EPackage     EFactory                                                    EMF           Foo  ...
acesInterf          EObject    EPackage       EFactory                                                        EMF         ...
acesInterf          EObject     EPackage         EFactory                                                            EMF  ...
acesInterf          EObject     EPackage         EFactory                                                            EMF  ...
acesInterf          EObject     EPackage         EFactory                                                            EMF  ...
acesInterf          EObject     EPackage         EFactory                                                            EMF  ...
acesInterf          EObject     EPackage         EFactory                                                            EMF  ...
BENEFITSMake generation gap pattern very natural andeasy.Change from plain EMF objects to CDO nativeobjects.
SOLUTION                                 EObjectImpl                                  FooImpl      BarPackageImplAdd a met...
SOLUTION                                         EObjectImpl                                          FooImpl      BarPack...
SOLUTION Some adapter factories need to be modified too (AdapterFactory for models) Need to introduce a new interface exten...
SOLUTIONpublic interface ModelAdapterFactory<P extends EPackage, F extends EFactory>    extends AdapterFactory {	 P getEPa...
BIND IT ALLThis solution perfectly fitswith registration ofEPackages as OSGi(declarative) services
USE CASE 3« I want to use EMF models on another OSGiruntime than Equinox »
ECLIPSE                  RICH CLIENT      ECLIPSE   WORKBENCH                  PLATFORM       HEADLESS            IDE     ...
What about other OSGi            runtimes?                                                     When running in an OSGi con...
SOLUTION 1 & 2(Repackage EMF bundles)Big refactoring to separateEclipse/Equinox related bitsfrom OSGi related bitsUse impo...
SOLUTION 3There are some less radical changes that can bedone in a backward compatible fashion, but  Introduces even more ...
CONCLUSIONEMF is a great piece of engineeringOSGi is a great piece of engineering too3MF is an experimentation to make EMF...
CONCLUSIONEMF is a great piece of engineeringOSGi is a great piece of engineering too3MF is an experimentation to make EMF...
HTTPS://GITHUB.COM/MBARBERO/EMF/TREE/3MFHTTP://WWW.SLIDESHARE.NET/MIKAELBARBERO/                                HTTP://WWW...
3mf infinity-and-beyond
3mf infinity-and-beyond
Upcoming SlideShare
Loading in …5
×

3mf infinity-and-beyond

2,622 views

Published on

Make EMF more modular

Published in: Technology, Sports
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,622
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
14
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide
  • (c) Raoni Nery (raoninery@gmail.com)\nhttp://raoninery.cgsociety.org/gallery/853975/\nexperiment, available on my github, anchors @ the end\n
  • EMF is cool, it&amp;#x2019;s a great piece of software, and \nfrom a software engineering point of view, it&amp;#x2019;s really smart.\nroom for improvments? DO NOT TALK ABOUT BACKWARD COMPATIBILITY\n
  • some patterns in EMF are keeping it from being more modular and dynamic\n
  • Backward compatibility is a day-to-day issue\nSometimes, to reach the next big step, we may break it\nmajor concern\nbenefits outweigh the costs\n
  • one ecore model, multiple version, say from a standard consortium\nTwo tools vendors implement tools on 2 different versions of this model\nOne end user wants to use those two tools at the same time, in the same Eclipse instance\n
  • oh crap! he does not care, from its point of view it&amp;#x2019;s implementation details\nif you are one of these tool vendor, you may loose a customer because of your underlying technology. You may be ready to loose a customer because of anything else than the technology used two or more layers deeper than you \n\n
  • Who are the guilty? First Eclipse extensions mechanism, now built upon OSGi (since 3.0)\n
  • Extensions force singleton and reduce dynamicity for good technical reasons, but it introduces some very crappy thing (think of restart after installing plug-in, &amp;#xAB;Do you want to restart? Yes, Apply change, Cancel&amp;#xBB; \nEMF use extension because it started in pre-OSGi eclipse, this was the way to do it. It has been kept since then.\nRemove generated_packages and dynamic_packages extensions\n
  • RegistryReader are classes that are responsible to read plugins&amp;#x2019; extensions from Eclipse extension registry @ startup time of the ecore plugin and then fill the EPackage registry with proper values (with gracefull handling of class loading (and then activation) of contributed plugins).\n\n
  • declare that MyPackageImpl provides an EPackage service, it can be listened by ServiceTracker\nwhat to do when several MyPackageImpl provides EPackage with same nsURI\n
  • crap, it&amp;#x2019;s a single strign\n
  • nsURI MUST identify the EPackage artifact the same as the FQN of a Java package is identifying it.\nVersion has to be handled separatly from the identity.\nThen, if we want to have a single place to get EPckages, the map&amp;#x2019;keys must be a tuple\n
  • EPackage.Registry.getEPackage(String) could return the highest version for instance\ncontribution through xtension point is valid only if the declaring plugins is installed into the OSGi before Ecore plugin is started, otherwise, it will use its default implementation (EPackageRegistryImpl)\n
  • \n
  • \n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • FooImpl refers to BarPackage.Literals static final fields by protected method eStaticClass()\nBarPackage.Literals refers to BarPackage.eINSTANCE\nBarPackage.eINSTANCE refers to BarPackageImpl by static init()\n\n
  • you can make your own implementation of interfaces, or an extending implementation of the generated one\nprovide your implementation as a service to the interface. Requiring bundles will either filter to have your implementation, or you can remove the generated component to have only yours...\nI have to be honest, I didnot have test it with CDO, but to me, CDOObject interface does not need to be exposed in the very first set of interfaces. The separtion of interface and implementation is necessary to make the CDO legacy mode useless\n
  • \n
  • Implementation of this method can be done at by three means\nWhy the package to get the EClass, could&amp;#x2019;n we give the Eclass only ?\n&amp;#xAB;give the package because of some advanced generation pattern with FeatureMap and extended_metadata..&amp;#xBB;\n
  • \n
  • \n
  • we inject epackage into the Epckage.registry and Service Registry through services\nany depending plugin is able to ask from one or the other registry\nno more simple singleton (less easy for newcomers) but much more modularity\n\n
  • emf has a great runtime, and when you are used to create thing with it, you can&amp;#x2019;t do without it\nwhat if you have to do something with emf and another osgi runtime\n
  • it runs on several platforms but, some of them are hardwired to the target (but their lack are handled gracefully)\n
  • \n
  • poor solution to repackage\n\n
  • optional requirements and even more conditionnals into the code.\n
  • - EMF has tons of qualities\n- But not so much modular and dynamic regarding the models it creates\n- spread its usage on several osgi runtime, be used in more and more environment and from more and more people.\nIt would ease also version management of ecore models.\n
  • \n
  • 3mf infinity-and-beyond

    1. 1. HTTP://RAONINERY.CGSOCIETY.ORG/GALLERY/853975/(C) RAONI NERY (RAONINERY@GMAIL.COM) 3MF: EMF TO THE INFINITY... AND BEYONDECON 2012 SPEAKER MARCH 27TH, 2012 MIKAEL BARBERO – OBEO
    2. 2. POINTS OF INTEREST Multiple Ecore Wipe out Make EMF amodel versions in dependency from better OSGi the same OSGi Java interfaces to citizen container implementation Work inspired from Alex Blewit and Neil Bartlett following posts [1, 2] and bugs [3, 4] (1) http://njbartlett.name/2011/02/07/emf-in-osgi.html (2) http://alblue.bandlem.com/2010/11/using-emf-for-osgi-service-creation.html (3) https://bugs.eclipse.org/bugs/show_bug.cgi?id=329209 (4) https://bugs.eclipse.org/bugs/show_bug.cgi?id=328227
    3. 3. PARENTALADVISORYKEEP OUT POSSIBILITY OFBACKWARD INCOMPATIBILITY
    4. 4. USE CASE 1ECORE MODEL V1 ECORE MODEL V2 Tool Vendor 1 Tool Vendor 2
    5. 5. WAIT, I CAN’T USETOOLS FROM THESETWO VENDORS ATTHE SAME TIME?I don’t care if they are based onsome data model whosedifferent versions can not livetogether. HTTP://WWW.FLICKR.COM/PHOTOS/KALEXANDERSON/6237846841/
    6. 6. HTTP://WWW.FLICKR.COM/PHOTOS/RUSSMORRIS/181933880/ HTTP://WWW.FLICKR.COM/PHOTOS/ITSGREG/2634229136/ HTTP://WWW.FLICKR.COM/PHOTOS/RUSSMORRIS/181933880/FIRST GUILTY:ECLIPSE EXTENSIONS
    7. 7. FIRST GUILTY:EXTENSIONSOSGi is modular and dynamic by nature.Extensions are reducing some of theseadvantages by forcing plug-in to be singleton.EMF uses extensions to contribute generated anddynamic EPackages.
    8. 8. FIRST SOLUTIONMimic GeneratedPackageRegistryReader andDynamicPackageRegistryReader during activationof model plug-ins.Advantages: simple and mostly backwardcompatible.Drawbacks: plug-in must be activated tocontribute its model and some boilerplate codeneeds to be written.
    9. 9. SECOND SOLUTIONUse OSGi (declarative) services.Advantages: simple and mostly backwardcompatible. Once defined as a service, anyrequiring class can be made a componentrequiring this service (DI).Drawbacks: needs a ServiceTracker to trackservices that can come and go anytimeEVEN BETTER OSGI R4.3: CREATE A CAPABILITY FOR EPACKAGES
    10. 10. HTTP://WWW.FLICKR.COM/PHOTOS/FIDDLEDYDEE/4349596304/SECOND GUILTYEPACKAGE.REGISTRY KEY
    11. 11. SECOND GUILTY:REGISTRY KEYSEPackage instances are identified by namespaceURI in the Registry. Best practice (workaround?) today is to include version into namespace URI.It should be a tuple (URI, Version)
    12. 12. SOLUTIONNeed a specific EPackage.Registryimplementation that handle versions public interface VersionedRegistry extends EPackage.Registry { EPackage getEPackage(String nsURI, String version); EFactory getEFactory(String nsURI, String version); }Contributed throughpackage_registry_implementation extension point.Version can be valued from a property of serviceor from version of contributing bundle (or fromcapability?)
    13. 13. USE CASE 2« If the interfaces can be kept "clean", i.e.without any references to EMF-generatedimplementation classes or to EMF itself, then theAPIs can be used standalone, for example in amemory constrained environment. In this scenario,normal hand-coded implementation classes couldbe used. » Neil Bartlett https://bugs.eclipse.org/bugs/show_bug.cgi?id=329209
    14. 14. HTTP://WWW.FLICKR.COM/PHOTOS/DCJOHN/12852539/GUILTY:EPACKAGE.EINSTANCE
    15. 15. acesInterf EMF YOUR MODEL
    16. 16. acesInterf EObject EPackage EFactory EMF YOUR MODEL
    17. 17. acesInterf EObject EPackage EFactory EMF Foo BarPackage BarFactory YOUR MODEL
    18. 18. acesInterf EObject EPackage EFactory EMF Foo BarPackage BarFactory YOUR MODEL Impl EMF YOUR MODEL
    19. 19. acesInterf EObject EPackage EFactory EMF Foo BarPackage BarFactory YOUR MODEL Impl EObjectImpl EPackageImpl EFactoryImpl EMF YOUR MODEL
    20. 20. acesInterf EObject EPackage EFactory EMF Foo BarPackage BarFactory YOUR MODEL Impl EObjectImpl EPackageImpl EFactoryImpl EMF FooImpl BarPackageImpl BarFactoryImpl YOUR MODEL
    21. 21. acesInterf EObject EPackage EFactory EMF Foo BarPackage BarFactory YOUR MODEL Impl EObjectImpl EPackageImpl EFactoryImpl EMF FooImpl BarPackageImpl BarFactoryImpl YOUR MODEL
    22. 22. acesInterf EObject EPackage EFactory EMF Foo BarPackage BarFactory YOUR MODEL Impl EObjectImpl EPackageImpl EFactoryImpl EMF FooImpl BarPackageImpl BarFactoryImpl YOUR MODEL
    23. 23. acesInterf EObject EPackage EFactory EMF Foo BarPackage BarFactory YOUR MODEL Impl EObjectImpl EPackageImpl EFactoryImpl EMF FooImpl BarPackageImpl BarFactoryImpl YOUR MODEL
    24. 24. acesInterf EObject EPackage EFactory EMF Foo BarPackage BarFactory YOUR MODEL Impl EObjectImpl EPackageImpl EFactoryImpl EMF FooImpl BarPackageImpl BarFactoryImpl YOUR MODEL
    25. 25. BENEFITSMake generation gap pattern very natural andeasy.Change from plain EMF objects to CDO nativeobjects.
    26. 26. SOLUTION EObjectImpl FooImpl BarPackageImplAdd a method to (Internal)EObject abstract EPackage ePackage();Can be done in an extending interfaceimplemented by only newly generated models
    27. 27. SOLUTION EObjectImpl FooImpl BarPackageImpl Field in Field in EPropertiesHolder XXXObjectImpl Access to EPackage.Registry.INSTANCEIn all cases, it requires to give its defining EPackage to theEObject’s constructor, and then to modify XXXFactoryImpl
    28. 28. SOLUTION Some adapter factories need to be modified too (AdapterFactory for models) Need to introduce a new interface extending AdapterFactorypublic interface ModelAdapterFactory<P extends EPackage, F extends EFactory> extends AdapterFactory { P getEPackage(); F getEFactory();}
    29. 29. SOLUTIONpublic interface ModelAdapterFactory<P extends EPackage, F extends EFactory> extends AdapterFactory { P getEPackage(); F getEFactory();} XXXItemProviderAdapterFactory is also implementing it XXXItemProviders are taking this interface as argument to their constructor instead of simple AdapterFactory.
    30. 30. BIND IT ALLThis solution perfectly fitswith registration ofEPackages as OSGi(declarative) services
    31. 31. USE CASE 3« I want to use EMF models on another OSGiruntime than Equinox »
    32. 32. ECLIPSE RICH CLIENT ECLIPSE WORKBENCH PLATFORM HEADLESS IDE RCP EQUINOX STANDALONE ECLIPSE RICH GOOGLE WEB AJAX PLATFORM TOOLKIT JAVA RUNTIME RAP GWTSUPPORTED PLATFORMSRAP AND GWT SINCE EMF 2.6
    33. 33. What about other OSGi runtimes? When running in an OSGi container, EMF explicitly requires the following 8 bundles: org.eclipse.core.runtime org.eclipse.equinox.common org.eclipse.core.jobs org.eclipse.equinox.registry org.eclipse.equinox.preferences org.eclipse.core.contenttype org.eclipse.equinox.app org.eclipse.osgiHTTP://NJBARTLETT.NAME/2011/02/07/EMF-IN-OSGI.HTML
    34. 34. SOLUTION 1 & 2(Repackage EMF bundles)Big refactoring to separateEclipse/Equinox related bitsfrom OSGi related bitsUse import-package insteador require-bundle
    35. 35. SOLUTION 3There are some less radical changes that can bedone in a backward compatible fashion, but Introduces even more graceful handling of target running platform into the runtime Ex: rewriting EMFPlugin.IS_ECLIPSE_RUNNING in a similar way to IS_RESOURCE_BUNDLE_AVAILABLE in the term of a new EMFPlugin.IS_OSGI_RUNNING.
    36. 36. CONCLUSIONEMF is a great piece of engineeringOSGi is a great piece of engineering too3MF is an experimentation to make EMF mimic /use some of the best qualities of OSGi (modularity,dynamicity)With these, EMF would reach the infinity... andbeyond!
    37. 37. CONCLUSIONEMF is a great piece of engineeringOSGi is a great piece of engineering too3MF is an experimentation to make EMF mimic /use some of the best qualities of OSGi (modularity,dynamicity)With these, EMF would reach the infinity... andbeyond!
    38. 38. HTTPS://GITHUB.COM/MBARBERO/EMF/TREE/3MFHTTP://WWW.SLIDESHARE.NET/MIKAELBARBERO/ HTTP://WWW.FLICKR.COM/PHOTOS/B-LOVE/5032931614/ MIKAEL.BARBERO@OBEO.FR HTTP://WWW.OBEO.FR

    ×