Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Difference between revisions of "JCR Management"
(→The Framework) |
(→The Framework) |
||
Line 36: | Line 36: | ||
== The Framework == | == The Framework == | ||
public static void main(String[] args) { | public static void main(String[] args) { | ||
− | // Create | + | // Create an EMF resource set to hold the resources. |
ResourceSet resourceSet = new ResourceSetImpl(); | ResourceSet resourceSet = new ResourceSetImpl(); | ||
− | // Register the appropriate resource factory to handle | + | // Register the appropriate EMF resource factory to handle the file |
+ | // extension "mydomainmodel" | ||
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put | resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put | ||
("mydomainmodel", new demo.MyResourceFactory()); | ("mydomainmodel", new demo.MyResourceFactory()); | ||
− | // Register the package to ensure it is available during loading. | + | // Register the EMF package to ensure it is available during loading. |
resourceSet.getPackageRegistry().put | resourceSet.getPackageRegistry().put | ||
(MyDomainModelPackage.eNS_URI, | (MyDomainModelPackage.eNS_URI, | ||
Line 49: | Line 50: | ||
try { | try { | ||
− | // Create | + | // Create an EMF resource using the registered "mydomainmodel" extension |
Resource resource = resourceSet.createResource(URI.createURI("http:///My.mydomainmodel")); | Resource resource = resourceSet.createResource(URI.createURI("http:///My.mydomainmodel")); | ||
− | // | + | // Create a domain object. The constructor is initially generated by EMF to be protected |
− | // can make it public if you want. | + | // but you can make it public if you want. |
Library library = MyDomainModelFactory.eINSTANCE.createLibrary(); | Library library = MyDomainModelFactory.eINSTANCE.createLibrary(); | ||
Line 65: | Line 66: | ||
// As soon as an object is added to it's containing object it also get it's | // As soon as an object is added to it's containing object it also get it's | ||
− | // node injected. In this case the library object is added to the residual | + | // node injected. In this case the library object is added to the "residual |
− | // definition feature of the rootObject. | + | // definition" feature of the rootObject. That calls addNode() on the |
// node that is contained within the rootObject. The resulting node | // node that is contained within the rootObject. The resulting node | ||
// is then injected in the library object. | // is then injected in the library object. | ||
Line 80: | Line 81: | ||
library.setNodeName("MyLibraryNodeNameByAPI"); | library.setNodeName("MyLibraryNodeNameByAPI"); | ||
Book aBook = MyDomainModelFactory.eINSTANCE.createBook(); | Book aBook = MyDomainModelFactory.eINSTANCE.createBook(); | ||
− | |||
library.getResidualDefinition_Book().add(aBook); | library.getResidualDefinition_Book().add(aBook); | ||
Writer aWriter = MyDomainModelFactory.eINSTANCE.createGuideBookWriter(); | Writer aWriter = MyDomainModelFactory.eINSTANCE.createGuideBookWriter(); |
Revision as of 10:26, 17 August 2008
Contents
JCR Mangement (JCRM)
JCR Management will provide tooling and a JCR (http://en.wikipedia.org/wiki/Content_repository_API_for_Java) persistence framework for EMF with pluggable JCR implementations.
The Contributions
- My employer inovex GmbH (http://www.inovex.de) contributes 7 person days where I can work on this project within working hours.
- Ed Merks:
- helps as a mentor for questions regarding the Eclipse foundation.
- implemented a new feature request for EMF that I had (dynamic feature delegation)
- answers a lot of my questions in the newsgroup
- The ATL team contributed an initial meta model and transformation that will speed up ATL integration.
- Nick Boldt created the initial JCR Management (CVS, website, ...) setup at eclipse.org
The Status
JCRM is not production ready at the moment. The current code base consists of prototypes that serve as a basis for concrete discussions about requirements and solutions.
The Tooling
EMF Class Editor
The class editor is based on the EMF Ecore model. This model is generated from the node types in the repository.
Jackrabbit XML Nodetype Editor
This editor can be generated from a usual EMF model. It can be used to register an EMF model as node types.
Jackrabbit CND Editor
This model is generated from the node types in the repository. It contains validation checks and a minimal code completion. It is based on oAW's XText which provides way more features for such editors than I currently use.
Domain Model Editor
This is the editor that EMF generates but it is backed by a repository. Every change in the model immediately changes the underlaying repository. E.g. if you add a "Book" object in that editor node.addNode("NewNode","Book") is called. As soon as you save the editor session.save() is called.
The Framework
public static void main(String[] args) { // Create an EMF resource set to hold the resources. ResourceSet resourceSet = new ResourceSetImpl(); // Register the appropriate EMF resource factory to handle the file // extension "mydomainmodel" resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put ("mydomainmodel", new demo.MyResourceFactory()); // Register the EMF package to ensure it is available during loading. resourceSet.getPackageRegistry().put (MyDomainModelPackage.eNS_URI, MyDomainModelPackage.eINSTANCE); try { // Create an EMF resource using the registered "mydomainmodel" extension Resource resource = resourceSet.createResource(URI.createURI("http:///My.mydomainmodel")); // Create a domain object. The constructor is initially generated by EMF to be protected // but you can make it public if you want. Library library = MyDomainModelFactory.eINSTANCE.createLibrary(); // In contrast to the JCR specification EMF generally allows to have many root nodes // hence the content of the resource is designed to be a list in EMF even though the // JCRM Framework needs only one element in the content. // JCRM puts the root object containing the corresponding root node of the repository // in the content of the resource where it can get retrieved. "root" is the type // of the rootObject that corresponds to the node type of the root node. root rootObject = (root) resource.getContents().get(0); // As soon as an object is added to it's containing object it also get it's // node injected. In this case the library object is added to the "residual // definition" feature of the rootObject. That calls addNode() on the // node that is contained within the rootObject. The resulting node // is then injected in the library object. rootObject.getResidualDefinition_base().add(library); // Every domain object contains it's corresponding node and every modification // is delegated to the node. In this case setName...("MyLibraryNameByAPI") actually // calls nodeOfTheObject.setProperty("name","MyLibraryNameByAPI") // This way the objects don't need to have own copies of the property content. // At the moment there is not something like a detached mode where you can // modify properties without the object having an injected node. library.setName_1_false("MyLibraryNameByAPI"); library.setNodeName("MyLibraryNodeNameByAPI"); Book aBook = MyDomainModelFactory.eINSTANCE.createBook(); library.getResidualDefinition_Book().add(aBook); Writer aWriter = MyDomainModelFactory.eINSTANCE.createGuideBookWriter(); aBook.setAuthor_Writer(aWriter); aWriter.setName_1_false("aGuidBookWritersNameByAPI"); aBook.setTitle_1_false("Book-TitleByAPI"); aBook.setPages_1_false("200ByAPI"); // that calls session.save() and persists the changes made above. resource.save(System.out, null); } catch (IOException exception) { exception.printStackTrace(); } }
Tasks
- See Bugzilla for an overview of the ToDo's https://bugs.eclipse.org/bugs/buglist.cgi?short_desc_type=allwordssubstr&short_desc=&product=EMFT&component=JCR+Management&long_desc_type=allwordssubstr&long_desc=&order=Importance
Next Milestone
Create a first downloadable presentation of the project to show the potential of Eclipse modeling to the Jackrabbit community.
Ideas
- Using Cedrics Compare editor inside the JCR Manager
Values
- simplicity
- transparency
- no dependency on JCR implementations
FAQ
- What's the relationship between JCR Management and Jackrabbit JCR-OCM?
One part of JCR Management has the same goal as JCR-OCM - exposing node data and operations to domain models - but JCRM uses an MDSD approach based on Eclipse Modeling Framework (EMF). This makes it depending less on reflection and using more generated classes instead. It will delegate as many calls on JCR node data as possible to minimize copying node data to domain model objects. Additionally JCR Management also has many other goals. But find out the details of JCR-OCM and check out the source code and the documentation.
CVS Access
Some important things are now checked in. Third party jars are not yet checked in as the IP for Jackrabbit needs to be reviewed by Eclipse. Please use the plugin id's as project names ("org.eclipse.emf.jcrm.metamodel" and "org.eclipse.emf.jcrm.model")
CVS Repository Connection
- Server: dev.eclipse.org
- Repository Path: /cvsroot/modeling
- User: anonymous
- Password: (leave blank)
- Connection Type: pserver
- Checkout As: Empty EMF Project
Modules
- You can check out the plugins in the org.eclipse.emf/org.eclipse.emf.jcrm/plugins folder as CVS modules