You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by md...@apache.org on 2011/10/12 20:45:14 UTC

svn commit: r1182520 [1/2] - in /chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src: main/java/org/apache/chemistry/opencmis/jcr/ main/java/org/apache/chemistry/opencmis/jcr/impl/ main/java/org/apache/chemistry/opencmi...

Author: mduerig
Date: Wed Oct 12 18:45:13 2011
New Revision: 1182520

URL: http://svn.apache.org/viewvc?rev=1182520&view=rev
Log:
CMIS-440: Introduce type handlers to allow different content structures

Added:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/AbstractJcrTypeHandler.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultDocumentIdentifierMap.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultDocumentTypeHandler.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultFolderTypeHandler.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultIdentifierMapBase.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultUnversionedDocumentTypeHandler.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/IdentifierMapBase.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrDocumentTypeHandler.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrFolderTypeHandler.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrTypeHandler.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrTypeHandlerManager.java
Removed:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/DefaultJcrTypeManager.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrNodeFactory.java
Modified:
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrConverter.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrDocument.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrFolder.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrNode.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrPrivateWorkingCopy.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrRepository.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrServiceFactory.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrUnversionedDocument.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrVersion.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrVersionBase.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/ParseTreeWalker.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/QueryTranslator.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/util/Predicate.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/test/java/org/apache/chemistry/opencmis/jcr/query/QueryTranslatorTest.java
    chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/test/java/org/apache/chemistry/opencmis/jcr/query/XPathBuilderTest.java

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrConverter.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrConverter.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrConverter.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrConverter.java Wed Oct 12 18:45:13 2011
@@ -81,7 +81,7 @@ public final class JcrConverter {
      * @return the escaped name
      */    
     public static String toJcrName(String cmisName) {
-        StringBuffer buffer = new StringBuffer(cmisName.length() * 2);
+        StringBuilder buffer = new StringBuilder(cmisName.length() * 2);
         for (int i = 0; i < cmisName.length(); i++) {
             char ch = cmisName.charAt(i);
             if (ch == '%' || ch == '/' || ch == ':' || ch == '[' || ch == ']' || ch == '*' || ch == '|'

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrDocument.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrDocument.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrDocument.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrDocument.java Wed Oct 12 18:45:13 2011
@@ -30,6 +30,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertiesImpl;
 import org.apache.chemistry.opencmis.commons.impl.server.ObjectInfoImpl;
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -51,8 +52,8 @@ public abstract class JcrDocument extend
 
     public static final String MIME_UNKNOWN = "application/octet-stream";
 
-    protected JcrDocument(Node node, JcrTypeManager typeManager, PathManager pathManager, JcrNodeFactory nodeFactory) {
-        super(node, typeManager, pathManager, nodeFactory);
+    protected JcrDocument(Node node, JcrTypeManager typeManager, PathManager pathManager, JcrTypeHandlerManager typeHandlerManager) {
+        super(node, typeManager, pathManager, typeHandlerManager);
     }
 
     /**

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrFolder.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrFolder.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrFolder.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrFolder.java Wed Oct 12 18:45:13 2011
@@ -20,7 +20,6 @@
 package org.apache.chemistry.opencmis.jcr;
 
 import org.apache.chemistry.opencmis.commons.PropertyIds;
-import org.apache.chemistry.opencmis.commons.data.ContentStream;
 import org.apache.chemistry.opencmis.commons.data.Properties;
 import org.apache.chemistry.opencmis.commons.data.PropertyData;
 import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
@@ -28,33 +27,26 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.enums.Action;
 import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
 import org.apache.chemistry.opencmis.commons.enums.Updatability;
-import org.apache.chemistry.opencmis.commons.enums.VersioningState;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException;
-import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisStorageException;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.FailedToDeleteDataImpl;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertiesImpl;
 import org.apache.chemistry.opencmis.commons.impl.server.ObjectInfoImpl;
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
 import org.apache.chemistry.opencmis.jcr.util.FilterIterator;
 import org.apache.chemistry.opencmis.jcr.util.Predicate;
 import org.apache.chemistry.opencmis.jcr.util.Util;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-import javax.jcr.Binary;
 import javax.jcr.Node;
-import javax.jcr.NodeIterator;
-import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryManager;
 import javax.jcr.query.QueryResult;
 import javax.jcr.version.Version;
-import java.io.BufferedInputStream;
-import java.io.IOException;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -67,8 +59,8 @@ import java.util.Set;
 public class JcrFolder extends JcrNode {
     private static final Log log = LogFactory.getLog(JcrFolder.class);
 
-    public JcrFolder(Node node, JcrTypeManager typeManager, PathManager pathManager, JcrNodeFactory nodeFactory) {
-        super(node, typeManager, pathManager, nodeFactory);
+    public JcrFolder(Node node, JcrTypeManager typeManager, PathManager pathManager, JcrTypeHandlerManager typeHandlerManager) {
+        super(node, typeManager, pathManager, typeHandlerManager);
     }
 
     /**
@@ -80,7 +72,7 @@ public class JcrFolder extends JcrNode {
      */
     public Iterator<JcrNode> getNodes() {
         try {
-            final NodeIterator nodes = getNode().getNodes();
+            final FilterIterator<Node> nodes = new FilterIterator<Node>(getNode().getNodes(), typeHandlerManager.getNodePredicate());
 
             Iterator<JcrNode> jcrNodes = new Iterator<JcrNode>() {
                 public boolean hasNext() {
@@ -88,7 +80,7 @@ public class JcrFolder extends JcrNode {
                 }
 
                 public JcrNode next() {
-                    return create(nodes.nextNode());
+                    return create(nodes.next());
                 }
 
                 public void remove() {
@@ -124,64 +116,6 @@ public class JcrFolder extends JcrNode {
     }
 
     /**
-     * See CMIS 1.0 section 2.2.4.1 createDocument
-     *
-     * @throws CmisStorageException
-     */
-    public JcrNode addNode(String name, String typeId, Properties properties, ContentStream contentStream,
-            VersioningState versioningState) {
-        
-        try {
-            Node fileNode = getNode().addNode(name, NodeType.NT_FILE);
-            if (versioningState != VersioningState.NONE) {
-                fileNode.addMixin(NodeType.MIX_SIMPLE_VERSIONABLE);
-            }
-
-            Node contentNode = fileNode.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE);
-            contentNode.addMixin(NodeType.MIX_CREATED);
-
-            // compile the properties
-            setProperties(contentNode, typeId, properties);
-
-            // write content, if available
-            Binary binary = contentStream == null || contentStream.getStream() == null
-                    ? JcrBinary.EMPTY
-                    : new JcrBinary(new BufferedInputStream(contentStream.getStream()));
-            try {
-                contentNode.setProperty(Property.JCR_DATA, binary);
-                if (contentStream != null && contentStream.getMimeType() != null) {
-                    contentNode.setProperty(Property.JCR_MIMETYPE, contentStream.getMimeType());
-                }
-            }
-            finally {
-                binary.dispose();
-            }
-
-            fileNode.getSession().save();
-            JcrNode jcrFileNode = create(fileNode);
-            if (versioningState == VersioningState.NONE) {
-                return jcrFileNode;
-            }
-
-            JcrVersionBase jcrVersion = jcrFileNode.asVersion();
-            if (versioningState == VersioningState.MINOR || versioningState == VersioningState.MAJOR) {
-                return jcrVersion.checkin(null, null, "auto checkin");
-            }
-            else {
-                return jcrVersion.getPwc();
-            }
-        }
-        catch (RepositoryException e) {
-            log.debug(e.getMessage(), e);
-            throw new CmisStorageException(e.getMessage(), e);
-        }
-        catch (IOException e) {
-            log.debug(e.getMessage(), e);
-            throw new CmisStorageException(e.getMessage(), e);
-        }
-    }
-
-    /**
      * See CMIS 1.0 section 2.2.4.2 createDocumentFromSource
      *
      * @throws CmisStorageException
@@ -209,29 +143,6 @@ public class JcrFolder extends JcrNode {
     }
 
     /**
-     * See CMIS 1.0 section 2.2.4.3 createFolder
-     *
-     * @throws CmisStorageException
-     */
-    public JcrNode addFolder(String name, String typeId, Properties properties) {
-        try {
-            Node node = getNode().addNode(name, NodeType.NT_FOLDER);
-            node.addMixin(NodeType.MIX_CREATED);
-            node.addMixin(NodeType.MIX_LAST_MODIFIED);
-
-            // compile the properties
-            setProperties(node, typeId, properties);
-
-            node.getSession().save();
-            return create(node);
-        }
-        catch (RepositoryException e) {
-            log.debug(e.getMessage(), e);
-            throw new CmisStorageException(e.getMessage(), e);
-        }
-    }
-
-    /**
      * See CMIS 1.0 section 2.2.4.14 deleteObject
      *
      * @throws CmisRuntimeException
@@ -340,21 +251,13 @@ public class JcrFolder extends JcrNode {
         return JcrTypeManager.FOLDER_TYPE_ID;
     }
 
-    //------------------------------------------< private >---
-
-    private void setProperties(Node node, String typeId, Properties properties) {
+    public static void setProperties(Node node, TypeDefinition type, Properties properties) {
         if (properties == null || properties.getProperties() == null) {
             throw new CmisConstraintException("No properties!");
         }
 
         Set<String> addedProps = new HashSet<String>();
 
-        // get the property definitions
-        TypeDefinition type = typeManager.getType(typeId);
-        if (type == null) {
-            throw new CmisObjectNotFoundException("Type '" + typeId + "' is unknown!");
-        }
-
         try {
             // check if all required properties are there
             for (PropertyData<?> prop : properties.getProperties().values()) {
@@ -413,6 +316,8 @@ public class JcrFolder extends JcrNode {
         }
     }
 
+    //------------------------------------------< private >---
+
     private static boolean hasCheckOuts(Node node) throws RepositoryException {
         // Build xpath query of the form
         // '//path/to/node//*[jcr:isCheckedOut='true']'

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrNode.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrNode.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrNode.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrNode.java Wed Oct 12 18:45:13 2011
@@ -47,6 +47,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertyStringImpl;
 import org.apache.chemistry.opencmis.commons.impl.server.ObjectInfoImpl;
 import org.apache.chemistry.opencmis.commons.server.ObjectInfoHandler;
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
 import org.apache.chemistry.opencmis.jcr.util.Util;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -95,7 +96,7 @@ public abstract class JcrNode {
     private final Node node;
     protected final JcrTypeManager typeManager;
     protected final PathManager pathManager;
-    private final JcrNodeFactory nodeFactory;
+    protected final JcrTypeHandlerManager typeHandlerManager;
 
     /**
      * Create a new instance wrapping a JCR <code>node</code>.
@@ -103,13 +104,13 @@ public abstract class JcrNode {
      * @param node  the JCR <code>node</code> to represent
      * @param typeManager
      * @param pathManager
-     * @param nodeFactory
+     * @param typeHandlerManager
      */
-    protected JcrNode(Node node, JcrTypeManager typeManager, PathManager pathManager, JcrNodeFactory nodeFactory) {
+    protected JcrNode(Node node, JcrTypeManager typeManager, PathManager pathManager, JcrTypeHandlerManager typeHandlerManager) {
         this.node = node;
         this.typeManager = typeManager;
         this.pathManager = pathManager;
-        this.nodeFactory = nodeFactory;
+        this.typeHandlerManager = typeHandlerManager;
     }
 
     /**
@@ -615,7 +616,7 @@ public abstract class JcrNode {
      * @return  a new <code>JcrNode</code>
      */
     protected final JcrNode create(Node node) {
-        return nodeFactory.create(node);
+        return typeHandlerManager.create(node);
     }
 
     /**

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrPrivateWorkingCopy.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrPrivateWorkingCopy.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrPrivateWorkingCopy.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrPrivateWorkingCopy.java Wed Oct 12 18:45:13 2011
@@ -20,6 +20,7 @@
 package org.apache.chemistry.opencmis.jcr;
 
 import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -39,9 +40,9 @@ public class JcrPrivateWorkingCopy exten
     public static final String PWC_NAME = "pwc";
 
     public JcrPrivateWorkingCopy(Node node, JcrTypeManager typeManager, PathManager pathManager,
-            JcrNodeFactory nodeFactory) {
+            JcrTypeHandlerManager typeHandlerManager) {
         
-        super(node, typeManager, pathManager, nodeFactory);
+        super(node, typeManager, pathManager, typeHandlerManager);
     }
 
     /**

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrRepository.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrRepository.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrRepository.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrRepository.java Wed Oct 12 18:45:13 2011
@@ -58,6 +58,9 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.server.ObjectInfoHandler;
 import org.apache.chemistry.opencmis.commons.spi.Holder;
 import org.apache.chemistry.opencmis.jcr.query.QueryTranslator;
+import org.apache.chemistry.opencmis.jcr.type.JcrDocumentTypeHandler;
+import org.apache.chemistry.opencmis.jcr.type.JcrFolderTypeHandler;
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
 import org.apache.chemistry.opencmis.jcr.util.Util;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -92,22 +95,21 @@ public class JcrRepository {
     private final Repository repository;
     private final JcrTypeManager typeManager;
     private final PathManager pathManager;
-    private final JcrNodeFactory nodeFactory;
+    private final JcrTypeHandlerManager typeHandlerManager;
 
     /**
      * Create a new <code>JcrRepository</code> instance backed by a JCR repository.
      *
      * @param repository  the JCR repository
-     * @param rootPath  path in the JCR repository which is exposed as root folder in CMIS
+     * @param pathManager
      * @param typeManager  
-     * @param nodeFactory
+     * @param typeHandlerManager
      */
-    public JcrRepository(Repository repository, String rootPath, JcrTypeManager typeManager, JcrNodeFactory nodeFactory) {
+    public JcrRepository(Repository repository, PathManager pathManager, JcrTypeManager typeManager, JcrTypeHandlerManager typeHandlerManager) {
         this.repository = repository;
         this.typeManager = typeManager;
-        this.nodeFactory = nodeFactory;
-        pathManager = new PathManager(rootPath);
-        nodeFactory.initialize(typeManager, pathManager);
+        this.typeHandlerManager = typeHandlerManager;
+        this.pathManager = pathManager;
     }
 
     /**
@@ -236,7 +238,8 @@ public class JcrRepository {
 
         // get parent Node and create child
         JcrFolder parent = getJcrNode(session, folderId).asFolder();
-        JcrNode jcrNode = parent.addNode(name, typeId, properties, contentStream, versioningState);
+        JcrDocumentTypeHandler typeHandler = typeHandlerManager.getDocumentTypeHandler(typeId);
+        JcrNode jcrNode = typeHandler.createDocument(parent, name, properties, contentStream, versioningState);
         return jcrNode.getId();
     }
 
@@ -294,7 +297,8 @@ public class JcrRepository {
 
         // get parent Node
         JcrFolder parent = getJcrNode(session, folderId).asFolder();
-        JcrNode jcrNode = parent.addFolder(name, typeId, properties);
+        JcrFolderTypeHandler typeHandler = typeHandlerManager.getFolderTypeHandler(typeId);
+        JcrNode jcrNode = typeHandler.createFolder(parent, name, properties);
         return jcrNode.getId();
     }
 
@@ -663,7 +667,7 @@ public class JcrRepository {
             NodeIterator nodes = queryResult.getNodes();
             while (nodes.hasNext()) {
                 Node node = nodes.nextNode();
-                JcrNode jcrNode = nodeFactory.create(node); 
+                JcrNode jcrNode = typeHandlerManager.create(node);
                 if (!jcrNode.isVersionable()) {
                     continue;
                 }
@@ -869,17 +873,17 @@ public class JcrRepository {
 
             @Override
             protected String jcrPathFromCol(TypeDefinition fromType, String name) {
-                return nodeFactory.getIdentifierMap(fromType).jcrPathFromCol(name);
+                return typeHandlerManager.getIdentifierMap(fromType.getId()).jcrPathFromCol(name);
             }
 
             @Override
             protected String jcrTypeName(TypeDefinition fromType) {
-                return nodeFactory.getIdentifierMap(fromType).jcrTypeName();
+                return typeHandlerManager.getIdentifierMap(fromType.getId()).jcrTypeName();
             }
 
             @Override
             protected String jcrTypeCondition(TypeDefinition fromType) {
-                return nodeFactory.getIdentifierMap(fromType).jcrTypeCondition();
+                return typeHandlerManager.getIdentifierMap(fromType.getId()).jcrTypeCondition();
             }
         };
 
@@ -908,7 +912,7 @@ public class JcrRepository {
             NodeIterator nodes = queryResult.getNodes();
             while (nodes.hasNext() && result.getObjects().size() < max) {
                 Node node = nodes.nextNode();
-                JcrNode jcrNode = nodeFactory.create(node);
+                JcrNode jcrNode = typeHandlerManager.create(node);
                 count++;
 
                 // Get pwc if this node is versionable and checked out
@@ -994,7 +998,7 @@ public class JcrRepository {
             }
 
             if (id.equals(PathManager.CMIS_ROOT_ID)) {
-                return nodeFactory.create(getRootNode(session));
+                return typeHandlerManager.create(getRootNode(session));
             }
 
             int k = id.indexOf('/');
@@ -1004,7 +1008,7 @@ public class JcrRepository {
 
                 Node node = session.getNodeByIdentifier(nodeId);
 
-                JcrNode jcrNode = nodeFactory.create(node);
+                JcrNode jcrNode = typeHandlerManager.create(node);
                 if (JcrPrivateWorkingCopy.denotesPwc(versionName)) {
                     return jcrNode.asVersion().getPwc();
                 }
@@ -1014,7 +1018,7 @@ public class JcrRepository {
             }
             else {
                 Node node = session.getNodeByIdentifier(id);
-                return nodeFactory.create(node);
+                return typeHandlerManager.create(node);
             }
 
         }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrServiceFactory.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrServiceFactory.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrServiceFactory.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrServiceFactory.java Wed Oct 12 18:45:13 2011
@@ -24,6 +24,10 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.server.CallContext;
 import org.apache.chemistry.opencmis.commons.server.CmisService;
 import org.apache.chemistry.opencmis.commons.server.CmisServiceFactory;
+import org.apache.chemistry.opencmis.jcr.impl.DefaultDocumentTypeHandler;
+import org.apache.chemistry.opencmis.jcr.impl.DefaultFolderTypeHandler;
+import org.apache.chemistry.opencmis.jcr.impl.DefaultUnversionedDocumentTypeHandler;
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
 import org.apache.chemistry.opencmis.server.support.CmisServiceWrapper;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -63,7 +67,9 @@ public class JcrServiceFactory extends A
     public void init(Map<String, String> parameters) {
         typeManager = createTypeManager();
         readConfiguration(parameters);
-        jcrRepository = new JcrRepository(acquireJcrRepository(jcrConfig), mountPath, typeManager, new JcrNodeFactory());
+        PathManager pathManger = new PathManager(mountPath);
+        JcrTypeHandlerManager typeHandlerManager = createTypeHandlerManager(pathManger, typeManager);
+        jcrRepository = new JcrRepository(acquireJcrRepository(jcrConfig), pathManger, typeManager, typeHandlerManager);
     }
 
     @Override
@@ -131,7 +137,15 @@ public class JcrServiceFactory extends A
     }
 
     protected JcrTypeManager createTypeManager() {
-        return new DefaultJcrTypeManager();
+        return new JcrTypeManager();
+    }
+
+    protected JcrTypeHandlerManager createTypeHandlerManager(PathManager pathManager, JcrTypeManager typeManager) {
+        JcrTypeHandlerManager typeHandlerManager = new JcrTypeHandlerManager(pathManager, typeManager);
+        typeHandlerManager.addHandler(new DefaultFolderTypeHandler());
+        typeHandlerManager.addHandler(new DefaultDocumentTypeHandler());
+        typeHandlerManager.addHandler(new DefaultUnversionedDocumentTypeHandler());
+        return typeHandlerManager;
     }
 
     //------------------------------------------< private >---

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrUnversionedDocument.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrUnversionedDocument.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrUnversionedDocument.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrUnversionedDocument.java Wed Oct 12 18:45:13 2011
@@ -20,6 +20,8 @@
 package org.apache.chemistry.opencmis.jcr;
 
 import org.apache.chemistry.opencmis.commons.enums.Action;
+import org.apache.chemistry.opencmis.jcr.impl.DefaultUnversionedDocumentTypeHandler;
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
@@ -30,8 +32,8 @@ import java.util.Set;
  */
 public class JcrUnversionedDocument extends JcrDocument {
     
-    public JcrUnversionedDocument(Node node, JcrTypeManager typeManager, PathManager pathManager, JcrNodeFactory nodeFactory) {
-        super(node, typeManager, pathManager, nodeFactory);
+    public JcrUnversionedDocument(Node node, JcrTypeManager typeManager, PathManager pathManager, JcrTypeHandlerManager typeHandlerManager) {
+        super(node, typeManager, pathManager, typeHandlerManager);
     }
 
     //------------------------------------------< protected >--- 
@@ -53,7 +55,7 @@ public class JcrUnversionedDocument exte
 
     @Override
     protected String getTypeIdInternal() {
-        return DefaultJcrTypeManager.DOCUMENT_UNVERSIONED_TYPE_ID;
+        return DefaultUnversionedDocumentTypeHandler.DOCUMENT_UNVERSIONED_TYPE_ID;
     }
 
     @Override

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrVersion.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrVersion.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrVersion.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrVersion.java Wed Oct 12 18:45:13 2011
@@ -19,6 +19,8 @@
 
 package org.apache.chemistry.opencmis.jcr;
 
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
+
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 import javax.jcr.version.Version;
@@ -37,9 +39,9 @@ public class JcrVersion extends JcrVersi
     private final Version version;
 
     public JcrVersion(Node node, Version version, JcrTypeManager typeManager, PathManager pathManager,
-            JcrNodeFactory nodeFactory) {
+            JcrTypeHandlerManager typeHandlerManager) {
 
-        super(node, typeManager, pathManager, nodeFactory);
+        super(node, typeManager, pathManager, typeHandlerManager);
         this.version = version;
     }
 

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrVersionBase.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrVersionBase.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrVersionBase.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/JcrVersionBase.java Wed Oct 12 18:45:13 2011
@@ -28,6 +28,7 @@ import org.apache.chemistry.opencmis.com
 import org.apache.chemistry.opencmis.commons.exceptions.CmisStorageException;
 import org.apache.chemistry.opencmis.commons.impl.dataobjects.PropertiesImpl;
 import org.apache.chemistry.opencmis.commons.impl.server.ObjectInfoImpl;
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
@@ -48,11 +49,8 @@ import java.util.Set;
 public abstract class JcrVersionBase extends JcrDocument {
     private static final Log log = LogFactory.getLog(JcrVersionBase.class);
 
-    private final JcrNodeFactory nodeFactory;
-
-    public JcrVersionBase(Node node, JcrTypeManager typeManager, PathManager pathManager, JcrNodeFactory nodeFactory) {
-        super(node, typeManager, pathManager, nodeFactory);
-        this.nodeFactory = nodeFactory;
+    protected JcrVersionBase(Node node, JcrTypeManager typeManager, PathManager pathManager, JcrTypeHandlerManager typeHandlerManager) {
+        super(node, typeManager, pathManager, typeHandlerManager);
     }
 
     /**
@@ -69,7 +67,7 @@ public abstract class JcrVersionBase ext
                 }
 
                 public JcrVersion next() {
-                    return new JcrVersion(getNode(), versions.nextVersion(), typeManager, pathManager, nodeFactory);
+                    return new JcrVersion(getNode(), versions.nextVersion(), typeManager, pathManager, typeHandlerManager);
                 }
 
                 public void remove() {
@@ -189,7 +187,7 @@ public abstract class JcrVersionBase ext
         try {
             Node node = getNode();
             if (node.isCheckedOut()) {
-                return new JcrPrivateWorkingCopy(getNode(), typeManager, pathManager, nodeFactory);
+                return new JcrPrivateWorkingCopy(getNode(), typeManager, pathManager, typeHandlerManager);
             }
             else {
                 throw new CmisObjectNotFoundException("Not checked out document has no private working copy");
@@ -213,7 +211,7 @@ public abstract class JcrVersionBase ext
             Node node = getNode();
             VersionHistory versionHistory = getVersionHistory(node);
             Version version = versionHistory.getVersion(name);
-            return new JcrVersion(node, version, typeManager, pathManager, nodeFactory);
+            return new JcrVersion(node, version, typeManager, pathManager, typeHandlerManager);
         }
         catch (UnsupportedRepositoryOperationException e) {
             log.debug(e.getMessage(), e);
@@ -232,12 +230,12 @@ public abstract class JcrVersionBase ext
     //------------------------------------------< protected >---
 
     /**
-     * @return  Id of the version representing the base of this verions series
+     * @return  Id of the version representing the base of this versions series
      * @throws RepositoryException
      */
     protected String getBaseNodeId() throws RepositoryException {
         Version baseVersion = getBaseVersion(getNode());
-        JcrNode baseNode = new JcrVersion(getNode(), baseVersion, typeManager, pathManager, nodeFactory);
+        JcrNode baseNode = new JcrVersion(getNode(), baseVersion, typeManager, pathManager, typeHandlerManager);
         return baseNode.getId();
     }
 

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/AbstractJcrTypeHandler.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/AbstractJcrTypeHandler.java?rev=1182520&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/AbstractJcrTypeHandler.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/AbstractJcrTypeHandler.java Wed Oct 12 18:45:13 2011
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.jcr.impl;
+
+import org.apache.chemistry.opencmis.jcr.JcrTypeManager;
+import org.apache.chemistry.opencmis.jcr.PathManager;
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandler;
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
+
+/**
+ * This abstract class takes care of collecting references set when the handler is added to
+ * {@link JcrTypeHandlerManager}.
+ */
+public abstract class AbstractJcrTypeHandler implements JcrTypeHandler {
+
+    protected JcrTypeManager typeManager;
+    protected PathManager pathManager;
+    protected JcrTypeHandlerManager typeHandlerManager;
+
+    public void initialize(PathManager pathManager, JcrTypeManager typeManager, JcrTypeHandlerManager typeHandlerManager) {
+        this.typeManager = typeManager;
+        this.pathManager = pathManager;
+        this.typeHandlerManager = typeHandlerManager;
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultDocumentIdentifierMap.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultDocumentIdentifierMap.java?rev=1182520&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultDocumentIdentifierMap.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultDocumentIdentifierMap.java Wed Oct 12 18:45:13 2011
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.jcr.impl;
+
+import org.apache.chemistry.opencmis.commons.PropertyIds;
+
+/**
+ * Provides mappings to standard jcr properties for documents.
+ */
+public class DefaultDocumentIdentifierMap extends DefaultIdentifierMapBase {
+
+    private final boolean isVersionable;
+
+    public DefaultDocumentIdentifierMap(boolean isVersionable) {
+        super("nt:file");
+        this.isVersionable = isVersionable;
+        cmis2Jcr.put(PropertyIds.CREATED_BY, "jcr:content/@jcr:createdBy");
+        cmis2Jcr.put(PropertyIds.CREATION_DATE, "jcr:content/@jcr:created");
+        cmis2Jcr.put(PropertyIds.LAST_MODIFIED_BY, "jcr:content/@jcr:lastModifiedBy");
+        cmis2Jcr.put(PropertyIds.LAST_MODIFICATION_DATE, "jcr:content/@jcr:lastModified");
+        cmis2Jcr.put(PropertyIds.CONTENT_STREAM_MIME_TYPE, "jcr:content/@jcr:mimeType");
+        cmis2Jcr.put(PropertyIds.CONTENT_STREAM_FILE_NAME, "fn:name()");
+        // xxx not supported: IS_IMMUTABLE, IS_LATEST_VERSION, IS_MAJOR_VERSION, IS_LATEST_MAJOR_VERSION,
+        // VERSION_LABEL, VERSION_SERIES_ID, IS_VERSION_SERIES_CHECKED_OUT, VERSION_SERIES_CHECKED_OUT_ID
+        // VERSION_SERIES_CHECKED_OUT_BY, CHECKIN_COMMENT, CONTENT_STREAM_ID, CONTENT_STREAM_LENGTH
+    }
+
+    @Override
+    public String jcrTypeCondition() {
+        return (isVersionable ? "" : "not") +
+                "(@jcr:mixinTypes = 'mix:simpleVersionable')";
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultDocumentTypeHandler.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultDocumentTypeHandler.java?rev=1182520&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultDocumentTypeHandler.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultDocumentTypeHandler.java Wed Oct 12 18:45:13 2011
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.jcr.impl;
+
+import org.apache.chemistry.opencmis.commons.data.ContentStream;
+import org.apache.chemistry.opencmis.commons.data.Properties;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
+import org.apache.chemistry.opencmis.commons.enums.ContentStreamAllowed;
+import org.apache.chemistry.opencmis.commons.enums.VersioningState;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisStorageException;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.DocumentTypeDefinitionImpl;
+import org.apache.chemistry.opencmis.jcr.JcrBinary;
+import org.apache.chemistry.opencmis.jcr.JcrDocument;
+import org.apache.chemistry.opencmis.jcr.JcrFolder;
+import org.apache.chemistry.opencmis.jcr.JcrNode;
+import org.apache.chemistry.opencmis.jcr.JcrTypeManager;
+import org.apache.chemistry.opencmis.jcr.JcrVersion;
+import org.apache.chemistry.opencmis.jcr.JcrVersionBase;
+import org.apache.chemistry.opencmis.jcr.query.IdentifierMap;
+import org.apache.chemistry.opencmis.jcr.type.JcrDocumentTypeHandler;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.jcr.Binary;
+import javax.jcr.Node;
+import javax.jcr.Property;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
+import java.io.BufferedInputStream;
+import java.io.IOException;
+
+/**
+ * Type handler that provides cmis:document.
+ */
+public class DefaultDocumentTypeHandler extends AbstractJcrTypeHandler implements JcrDocumentTypeHandler {
+
+    private static final Log log = LogFactory.getLog(JcrFolder.class);
+
+    public String getTypeId() {
+        return BaseTypeId.CMIS_DOCUMENT.value();
+    }
+
+    public TypeDefinition getTypeDefinition() {
+        DocumentTypeDefinitionImpl documentType = new DocumentTypeDefinitionImpl();
+        documentType.setBaseTypeId(BaseTypeId.CMIS_DOCUMENT);
+        documentType.setIsControllableAcl(false);
+        documentType.setIsControllablePolicy(false);
+        documentType.setIsCreatable(true);
+        documentType.setDescription("Document");
+        documentType.setDisplayName("Document");
+        documentType.setIsFileable(true);
+        documentType.setIsFulltextIndexed(false);
+        documentType.setIsIncludedInSupertypeQuery(true);
+        documentType.setLocalName("Document");
+        documentType.setLocalNamespace(JcrTypeManager.NAMESPACE);
+        documentType.setIsQueryable(true);
+        documentType.setQueryName(JcrTypeManager.DOCUMENT_TYPE_ID);
+        documentType.setId(JcrTypeManager.DOCUMENT_TYPE_ID);
+        documentType.setIsVersionable(true);
+        documentType.setContentStreamAllowed(ContentStreamAllowed.ALLOWED);
+
+        JcrTypeManager.addBasePropertyDefinitions(documentType);
+        JcrTypeManager.addDocumentPropertyDefinitions(documentType);
+
+        return documentType;
+    }
+
+    public IdentifierMap getIdentifierMap() {
+        return new DefaultDocumentIdentifierMap(true);
+    }
+
+    public JcrDocument getJcrNode(Node node) throws RepositoryException {
+        VersionManager versionManager = node.getSession().getWorkspace().getVersionManager();
+        Version version = versionManager.getBaseVersion(node.getPath());
+        return new JcrVersion(node, version, typeManager, pathManager, typeHandlerManager);
+    }
+
+    public boolean canHandle(Node node) throws RepositoryException {
+        return node.isNodeType(NodeType.NT_FILE) && node.isNodeType(NodeType.MIX_SIMPLE_VERSIONABLE);
+    }
+
+    public JcrNode createDocument(JcrFolder parentFolder, String name, Properties properties, ContentStream contentStream, VersioningState versioningState) {
+        try {
+            Node fileNode = parentFolder.getNode().addNode(name, NodeType.NT_FILE);
+            if (versioningState != VersioningState.NONE) {
+                fileNode.addMixin(NodeType.MIX_SIMPLE_VERSIONABLE);
+            }
+
+            Node contentNode = fileNode.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE);
+            contentNode.addMixin(NodeType.MIX_CREATED);
+
+            // compile the properties
+            JcrFolder.setProperties(contentNode, getTypeDefinition(), properties);
+
+            // write content, if available
+            Binary binary = contentStream == null || contentStream.getStream() == null
+                    ? JcrBinary.EMPTY
+                    : new JcrBinary(new BufferedInputStream(contentStream.getStream()));
+            try {
+                contentNode.setProperty(Property.JCR_DATA, binary);
+                if (contentStream != null && contentStream.getMimeType() != null) {
+                    contentNode.setProperty(Property.JCR_MIMETYPE, contentStream.getMimeType());
+                }
+            }
+            finally {
+                binary.dispose();
+            }
+
+            fileNode.getSession().save();
+            JcrNode jcrFileNode = getJcrNode(fileNode);
+            if (versioningState == VersioningState.NONE) {
+                return jcrFileNode;
+            }
+
+            JcrVersionBase jcrVersion = jcrFileNode.asVersion();
+            if (versioningState == VersioningState.MINOR || versioningState == VersioningState.MAJOR) {
+                return jcrVersion.checkin(null, null, "auto checkin");
+            } else {
+                return jcrVersion.getPwc();
+            }
+        }
+        catch (RepositoryException e) {
+            log.debug(e.getMessage(), e);
+            throw new CmisStorageException(e.getMessage(), e);
+        }
+        catch (IOException e) {
+            log.debug(e.getMessage(), e);
+            throw new CmisStorageException(e.getMessage(), e);
+        }
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultFolderTypeHandler.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultFolderTypeHandler.java?rev=1182520&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultFolderTypeHandler.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultFolderTypeHandler.java Wed Oct 12 18:45:13 2011
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.jcr.impl;
+
+import org.apache.chemistry.opencmis.commons.data.Properties;
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisStorageException;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.FolderTypeDefinitionImpl;
+import org.apache.chemistry.opencmis.jcr.JcrFolder;
+import org.apache.chemistry.opencmis.jcr.JcrTypeManager;
+import org.apache.chemistry.opencmis.jcr.query.IdentifierMap;
+import org.apache.chemistry.opencmis.jcr.type.JcrFolderTypeHandler;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+
+/**
+ * Type handler that provides cmis:folder.
+ */
+public class DefaultFolderTypeHandler extends AbstractJcrTypeHandler implements JcrFolderTypeHandler {
+
+    private static final Log log = LogFactory.getLog(DefaultFolderTypeHandler.class);
+
+    private static class FolderIdentifierMap extends DefaultIdentifierMapBase {
+
+        public FolderIdentifierMap() {
+            super("nt:folder");
+            // xxx not supported: PARENT_ID, ALLOWED_CHILD_OBJECT_TYPE_IDS, PATH
+        }
+    }
+
+    public String getTypeId() {
+        return BaseTypeId.CMIS_FOLDER.value();
+    }
+
+    public TypeDefinition getTypeDefinition() {
+        FolderTypeDefinitionImpl folderType = new FolderTypeDefinitionImpl();
+        folderType.setBaseTypeId(BaseTypeId.CMIS_FOLDER);
+        folderType.setIsControllableAcl(false);
+        folderType.setIsControllablePolicy(false);
+        folderType.setIsCreatable(true);
+        folderType.setDescription("Folder");
+        folderType.setDisplayName("Folder");
+        folderType.setIsFileable(true);
+        folderType.setIsFulltextIndexed(false);
+        folderType.setIsIncludedInSupertypeQuery(true);
+        folderType.setLocalName("Folder");
+        folderType.setLocalNamespace(JcrTypeManager.NAMESPACE);
+        folderType.setIsQueryable(true);
+        folderType.setQueryName(JcrTypeManager.FOLDER_TYPE_ID);
+        folderType.setId(JcrTypeManager.FOLDER_TYPE_ID);
+
+        JcrTypeManager.addBasePropertyDefinitions(folderType);
+        JcrTypeManager.addFolderPropertyDefinitions(folderType);
+
+        return folderType;
+    }
+
+    public IdentifierMap getIdentifierMap() {
+        return new FolderIdentifierMap();
+    }
+
+    public JcrFolder getJcrNode(Node node) {
+        return new JcrFolder(node, typeManager, pathManager, typeHandlerManager);
+    }
+
+    public boolean canHandle(Node node) throws RepositoryException {
+        return node.isNodeType(NodeType.NT_FOLDER) || node.getDepth() == 0;
+    }
+
+    public JcrFolder createFolder(JcrFolder parentFolder, String name, Properties properties) {
+        try {
+            Node node = parentFolder.getNode().addNode(name, NodeType.NT_FOLDER);
+            node.addMixin(NodeType.MIX_CREATED);
+            node.addMixin(NodeType.MIX_LAST_MODIFIED);
+
+            // compile the properties
+            JcrFolder.setProperties(node, getTypeDefinition(), properties);
+
+            node.getSession().save();
+            return getJcrNode(node);
+        }
+        catch (RepositoryException e) {
+            log.debug(e.getMessage(), e);
+            throw new CmisStorageException(e.getMessage(), e);
+        }
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultIdentifierMapBase.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultIdentifierMapBase.java?rev=1182520&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultIdentifierMapBase.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultIdentifierMapBase.java Wed Oct 12 18:45:13 2011
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.jcr.impl;
+
+import org.apache.chemistry.opencmis.commons.PropertyIds;
+import org.apache.chemistry.opencmis.jcr.query.IdentifierMapBase;
+
+/**
+ * Provides mappings to standard jcr properties.
+ */
+public class DefaultIdentifierMapBase extends IdentifierMapBase {
+
+    public DefaultIdentifierMapBase(String jcrTypeName) {
+        super(jcrTypeName);
+        cmis2Jcr.put(PropertyIds.OBJECT_ID, "@jcr:uuid");
+        cmis2Jcr.put(PropertyIds.NAME, "fn:name()");
+        cmis2Jcr.put(PropertyIds.CREATED_BY, "@jcr:createdBy");
+        cmis2Jcr.put(PropertyIds.CREATION_DATE, "@jcr:created");
+        cmis2Jcr.put(PropertyIds.LAST_MODIFIED_BY, "@jcr:lastModifiedBy");
+        cmis2Jcr.put(PropertyIds.LAST_MODIFICATION_DATE, "@jcr:lastModified");
+        // xxx not supported: BASE_TYPE_ID, CHANGE_TOKEN
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultUnversionedDocumentTypeHandler.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultUnversionedDocumentTypeHandler.java?rev=1182520&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultUnversionedDocumentTypeHandler.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/impl/DefaultUnversionedDocumentTypeHandler.java Wed Oct 12 18:45:13 2011
@@ -0,0 +1,82 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.jcr.impl;
+
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.commons.enums.ContentStreamAllowed;
+import org.apache.chemistry.opencmis.commons.impl.dataobjects.DocumentTypeDefinitionImpl;
+import org.apache.chemistry.opencmis.jcr.JcrDocument;
+import org.apache.chemistry.opencmis.jcr.JcrTypeManager;
+import org.apache.chemistry.opencmis.jcr.JcrUnversionedDocument;
+import org.apache.chemistry.opencmis.jcr.query.IdentifierMap;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NodeType;
+
+/**
+ * Type handler that provides cmis:unversioned-document.
+ */
+public class DefaultUnversionedDocumentTypeHandler extends DefaultDocumentTypeHandler {
+
+    public static final String DOCUMENT_UNVERSIONED_TYPE_ID = "cmis:unversioned-document";
+
+    @Override
+    public String getTypeId() {
+        return DOCUMENT_UNVERSIONED_TYPE_ID;
+    }
+
+    @Override
+    public TypeDefinition getTypeDefinition() {
+
+        DocumentTypeDefinitionImpl unversionedDocument = new DocumentTypeDefinitionImpl();
+        unversionedDocument.initialize(super.getTypeDefinition());
+
+        unversionedDocument.setDescription("Unversioned document");
+        unversionedDocument.setDisplayName("Unversioned document");
+        unversionedDocument.setLocalName("Unversioned document");
+        unversionedDocument.setIsQueryable(true);
+        unversionedDocument.setQueryName(DOCUMENT_UNVERSIONED_TYPE_ID);
+        unversionedDocument.setId(DOCUMENT_UNVERSIONED_TYPE_ID);
+        unversionedDocument.setParentTypeId(JcrTypeManager.DOCUMENT_TYPE_ID);
+
+        unversionedDocument.setIsVersionable(false);
+        unversionedDocument.setContentStreamAllowed(ContentStreamAllowed.ALLOWED);
+
+        JcrTypeManager.addBasePropertyDefinitions(unversionedDocument);
+        JcrTypeManager.addDocumentPropertyDefinitions(unversionedDocument);
+
+        return unversionedDocument;
+    }
+
+    @Override
+    public IdentifierMap getIdentifierMap() {
+        return new DefaultDocumentIdentifierMap(false);
+    }
+
+    @Override
+    public boolean canHandle(Node node) throws RepositoryException {
+        return node.isNodeType(NodeType.NT_FILE) && !node.isNodeType(NodeType.MIX_SIMPLE_VERSIONABLE);
+    }
+
+    @Override
+    public JcrDocument getJcrNode(Node node) {
+        return new JcrUnversionedDocument(node, typeManager, pathManager, typeHandlerManager);
+    }
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/IdentifierMapBase.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/IdentifierMapBase.java?rev=1182520&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/IdentifierMapBase.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/IdentifierMapBase.java Wed Oct 12 18:45:13 2011
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.jcr.query;
+
+import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * This abstract base class provides support for implementing {@link IdentifierMap}.
+ */
+public abstract class IdentifierMapBase implements IdentifierMap {
+
+    private final String jcrTypeName;
+    protected final Map<String, String> cmis2Jcr = new HashMap<String, String>();
+
+    protected IdentifierMapBase(String jcrTypeName) {
+        this.jcrTypeName = jcrTypeName;
+    }
+
+    public String jcrPathFromCol(String name) {
+        String jcrPath = cmis2Jcr.get(name);
+        if (jcrPath == null) {
+            throw new CmisRuntimeException("Not supported: query on column " + name);
+        } else {
+            return jcrPath;
+        }
+    }
+
+    public String jcrTypeName() {
+        return jcrTypeName;
+    }
+
+    public String jcrTypeCondition() {
+        return null;
+    }
+}

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/ParseTreeWalker.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/ParseTreeWalker.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/ParseTreeWalker.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/ParseTreeWalker.java Wed Oct 12 18:45:13 2011
@@ -77,12 +77,12 @@ public class ParseTreeWalker<T> implemen
     //------------------------------------------< protected >---
 
     /** For extensibility. */
-    protected T walkOtherExpr(Evaluator evaluator, Tree node) {
+    protected T walkOtherExpr(Evaluator<?> evaluator, Tree node) {
         throw new CmisRuntimeException("Unknown node type: " + node.getType() + " (" + node.getText() + ")");
     }
 
     /** For extensibility. */
-    protected T walkOtherPredicate(Evaluator evaluator, Tree node) {
+    protected T walkOtherPredicate(Evaluator<?> evaluator, Tree node) {
         throw new CmisRuntimeException("Unknown node type: " + node.getType() + " (" + node.getText() + ")");
     }
 

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/QueryTranslator.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/QueryTranslator.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/QueryTranslator.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/query/QueryTranslator.java Wed Oct 12 18:45:13 2011
@@ -48,7 +48,7 @@ public abstract class QueryTranslator {
      * 
      * @param typeManager
      */
-    public QueryTranslator(JcrTypeManager typeManager) {
+    protected QueryTranslator(JcrTypeManager typeManager) {
         this.typeManager = typeManager;
         evaluator = new EvaluatorXPath() {
 

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrDocumentTypeHandler.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrDocumentTypeHandler.java?rev=1182520&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrDocumentTypeHandler.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrDocumentTypeHandler.java Wed Oct 12 18:45:13 2011
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.jcr.type;
+
+import org.apache.chemistry.opencmis.commons.data.ContentStream;
+import org.apache.chemistry.opencmis.commons.data.Properties;
+import org.apache.chemistry.opencmis.commons.enums.VersioningState;
+import org.apache.chemistry.opencmis.jcr.JcrDocument;
+import org.apache.chemistry.opencmis.jcr.JcrFolder;
+import org.apache.chemistry.opencmis.jcr.JcrNode;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+/**
+ * Implemented by type handlers that provides a type that is or inherits from cmis:document.
+ */
+public interface JcrDocumentTypeHandler extends JcrTypeHandler {
+
+    JcrDocument getJcrNode(Node node) throws RepositoryException;
+
+    /**
+     * See CMIS 1.0 section 2.2.4.1 createDocument
+     *
+     * @throws org.apache.chemistry.opencmis.commons.exceptions.CmisStorageException
+     *
+     */
+    JcrNode createDocument(JcrFolder parentFolder, String name, Properties properties, ContentStream contentStream, VersioningState versioningState);
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrFolderTypeHandler.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrFolderTypeHandler.java?rev=1182520&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrFolderTypeHandler.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrFolderTypeHandler.java Wed Oct 12 18:45:13 2011
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.jcr.type;
+
+import org.apache.chemistry.opencmis.commons.data.Properties;
+import org.apache.chemistry.opencmis.jcr.JcrFolder;
+
+import javax.jcr.Node;
+
+/**
+ * Implemented by type handlers that provides a type that is or inherits from cmis:folder.
+ */
+public interface JcrFolderTypeHandler extends JcrTypeHandler {
+
+    JcrFolder getJcrNode(Node node);
+
+    /**
+     * See CMIS 1.0 section 2.2.4.3 createFolder
+     *
+     * @throws org.apache.chemistry.opencmis.commons.exceptions.CmisStorageException
+     *
+     */
+    JcrFolder createFolder(JcrFolder parentFolder, String name, Properties properties);
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrTypeHandler.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrTypeHandler.java?rev=1182520&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrTypeHandler.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrTypeHandler.java Wed Oct 12 18:45:13 2011
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.jcr.type;
+
+import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
+import org.apache.chemistry.opencmis.jcr.JcrNode;
+import org.apache.chemistry.opencmis.jcr.JcrTypeManager;
+import org.apache.chemistry.opencmis.jcr.PathManager;
+import org.apache.chemistry.opencmis.jcr.query.IdentifierMap;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+/**
+ * Provides operations for a specific CMIS object type.
+ *
+ * @see JcrTypeHandlerManager
+ */
+public interface JcrTypeHandler {
+
+    /**
+     * Called by {@link JcrTypeHandlerManager} when the handler is added.
+     */
+    void initialize(PathManager pathManager, JcrTypeManager typeManager, JcrTypeHandlerManager typeHandlerManager);
+
+    String getTypeId();
+
+    TypeDefinition getTypeDefinition();
+
+    boolean canHandle(Node node) throws RepositoryException;
+
+    JcrNode getJcrNode(Node node) throws RepositoryException;
+
+    /**
+     * Used by QueryTranslator to translate CMIS queries to JCR queries.
+     *
+     * @see org.apache.chemistry.opencmis.jcr.query.QueryTranslator
+     * @see org.apache.chemistry.opencmis.jcr.JcrRepository#query(javax.jcr.Session, java.lang.String, java.lang.Boolean, java.lang.Boolean, java.math.BigInteger, java.math.BigInteger)
+     */
+    IdentifierMap getIdentifierMap();
+}

Added: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrTypeHandlerManager.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrTypeHandlerManager.java?rev=1182520&view=auto
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrTypeHandlerManager.java (added)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/type/JcrTypeHandlerManager.java Wed Oct 12 18:45:13 2011
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.chemistry.opencmis.jcr.type;
+
+import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
+import org.apache.chemistry.opencmis.commons.exceptions.CmisRuntimeException;
+import org.apache.chemistry.opencmis.jcr.JcrNode;
+import org.apache.chemistry.opencmis.jcr.JcrTypeManager;
+import org.apache.chemistry.opencmis.jcr.PathManager;
+import org.apache.chemistry.opencmis.jcr.query.IdentifierMap;
+import org.apache.chemistry.opencmis.jcr.util.Predicate;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Manages a set of registered type handlers.
+ */
+public class JcrTypeHandlerManager {
+
+    private static final Log log = LogFactory.getLog(JcrTypeHandlerManager.class);
+
+    private final PathManager pathManager;
+    private final JcrTypeManager typeManager;
+    private final Map<String, JcrTypeHandler> typeHandlers = new HashMap<String, JcrTypeHandler>();
+
+    public JcrTypeHandlerManager(PathManager pathManager, JcrTypeManager typeManager) {
+        this.pathManager = pathManager;
+        this.typeManager = typeManager;
+    }
+
+    public void addHandler(JcrTypeHandler typeHandler) {
+        if (typeManager.addType(typeHandler.getTypeDefinition())) {
+            typeHandlers.put(typeHandler.getTypeId(), typeHandler);
+            typeHandler.initialize(pathManager, typeManager, this);
+        }
+    }
+
+    public JcrTypeHandler getTypeHandler(String typeId) {
+        JcrTypeHandler typeHandler = typeHandlers.get(typeId);
+        if (typeHandler == null) {
+            throw new CmisObjectNotFoundException("Type '" + typeId + "' is unknown!");
+        }
+        return typeHandler;
+    }
+
+    public JcrFolderTypeHandler getFolderTypeHandler(String typeId) {
+        JcrTypeHandler typeHandler = getTypeHandler(typeId);
+        if (!(typeHandler instanceof JcrFolderTypeHandler)) {
+            throw new CmisObjectNotFoundException("Type '" + typeId + "' is not a folder!");
+        }
+        return (JcrFolderTypeHandler) typeHandler;
+    }
+
+    public JcrDocumentTypeHandler getDocumentTypeHandler(String typeId) {
+        JcrTypeHandler typeHandler = getTypeHandler(typeId);
+        if (!(typeHandler instanceof JcrDocumentTypeHandler)) {
+            throw new CmisObjectNotFoundException("Type '" + typeId + "' is not a document!");
+        }
+        return (JcrDocumentTypeHandler) typeHandler;
+    }
+
+    public Predicate<Node> getNodePredicate() {
+        return new Predicate<Node>() {
+            public boolean evaluate(Node node) {
+                try {
+                    for (JcrTypeHandler typeHandler : typeHandlers.values()) {
+                        if (typeHandler.canHandle(node)) {
+                            return true;
+                        }
+                    }
+                    return false;
+                }
+                catch (RepositoryException e) {
+                    log.debug(e.getMessage(), e);
+                    throw new CmisRuntimeException(e.getMessage(), e);
+                }
+            }
+        };
+    }
+
+    public IdentifierMap getIdentifierMap(String typeId) {
+        JcrTypeHandler typeHandler = getTypeHandler(typeId);
+        IdentifierMap identifierMap = typeHandler.getIdentifierMap();
+        if (identifierMap == null) {
+            throw new CmisRuntimeException("Not supported: query for type " + typeId);
+        }
+        return identifierMap;
+    }
+
+    public JcrNode create(Node node) {
+        try {
+            for (JcrTypeHandler typeHandler : typeHandlers.values()) {
+                if (typeHandler.canHandle(node)) {
+                    return typeHandler.getJcrNode(node);
+                }
+            }
+            throw new CmisObjectNotFoundException("No object type for object '" + node.getIdentifier() + "'");
+        }
+        catch (RepositoryException e) {
+            log.debug(e.getMessage(), e);
+            throw new CmisObjectNotFoundException(e.getMessage(), e);
+        }
+    }
+}

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/util/Predicate.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/util/Predicate.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/util/Predicate.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/main/java/org/apache/chemistry/opencmis/jcr/util/Predicate.java Wed Oct 12 18:45:13 2011
@@ -36,7 +36,7 @@ public interface Predicate<T> {
     /**
      * Constant predicate that returns <code>true</code> for all objects.
      */
-    Predicate TRUE = new Predicate<Object>() {
+    Predicate<?> TRUE = new Predicate<Object>() {
         public boolean evaluate(Object object) {
             return true;
         }
@@ -45,7 +45,7 @@ public interface Predicate<T> {
     /**
      * Constant predicate that returns <code>false</code> for all objects.
      */
-    Predicate FALSE = new Predicate<Object>() {
+    Predicate<?> FALSE = new Predicate<Object>() {
         public boolean evaluate(Object object) {
             return false;
         }

Modified: chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/test/java/org/apache/chemistry/opencmis/jcr/query/QueryTranslatorTest.java
URL: http://svn.apache.org/viewvc/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/test/java/org/apache/chemistry/opencmis/jcr/query/QueryTranslatorTest.java?rev=1182520&r1=1182519&r2=1182520&view=diff
==============================================================================
--- chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/test/java/org/apache/chemistry/opencmis/jcr/query/QueryTranslatorTest.java (original)
+++ chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-jcr/src/test/java/org/apache/chemistry/opencmis/jcr/query/QueryTranslatorTest.java Wed Oct 12 18:45:13 2011
@@ -22,9 +22,15 @@ package org.apache.chemistry.opencmis.jc
 import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
 import org.apache.chemistry.opencmis.commons.exceptions.CmisNotSupportedException;
-import org.apache.chemistry.opencmis.jcr.DefaultJcrTypeManager;
+import org.apache.chemistry.opencmis.jcr.JcrTypeManager;
+import org.apache.chemistry.opencmis.jcr.PathManager;
+import org.apache.chemistry.opencmis.jcr.impl.DefaultDocumentTypeHandler;
+import org.apache.chemistry.opencmis.jcr.impl.DefaultFolderTypeHandler;
+import org.apache.chemistry.opencmis.jcr.impl.DefaultUnversionedDocumentTypeHandler;
+import org.apache.chemistry.opencmis.jcr.type.JcrTypeHandlerManager;
 import org.apache.chemistry.opencmis.jcr.util.ISO8601;
 import org.apache.chemistry.opencmis.server.support.query.CalendarHelper;
+import org.junit.Before;
 import org.junit.Test;
 
 import java.util.GregorianCalendar;
@@ -34,32 +40,45 @@ import static org.junit.Assert.*;
 public class QueryTranslatorTest {
     private String jcrTypeCondition;
 
-    final QueryTranslator queryTranslator = new QueryTranslator(new DefaultJcrTypeManager()) {
-        @Override
-        protected String jcrPathFromId(String id) {
-            assertNotNull(id);
-            return "/jcr:" + id;
-        }
-
-        @Override
-        protected String jcrPathFromCol(TypeDefinition fromType, String name) {
-            assertNotNull(fromType);
-            assertNotNull(name);
-            return name.replace("cmis:", "@jcr:");
-        }
+    private QueryTranslator queryTranslator;
 
-        @Override
-        protected String jcrTypeName(TypeDefinition fromType) {
-            assertNotNull(fromType);
-            return fromType.getQueryName().replace("cmis:", "jcr:");
-        }
-
-        @Override
-        protected String jcrTypeCondition(TypeDefinition fromType) {
-            assertNotNull(fromType);
-            return jcrTypeCondition;
-        }
-    };
+    @Before
+    public void setUp() throws Exception {
+        JcrTypeManager typeManager = new JcrTypeManager();
+        PathManager pathManager = new PathManager(PathManager.CMIS_ROOT_PATH);
+        JcrTypeHandlerManager typeHandlerManager = new JcrTypeHandlerManager(pathManager, typeManager);
+        typeHandlerManager.addHandler(new DefaultFolderTypeHandler());
+        typeHandlerManager.addHandler(new DefaultDocumentTypeHandler());
+        typeHandlerManager.addHandler(new DefaultUnversionedDocumentTypeHandler());
+
+        queryTranslator = new QueryTranslator(typeManager) {
+
+            @Override
+            protected String jcrPathFromId(String id) {
+                assertNotNull(id);
+                return "/jcr:" + id;
+            }
+
+            @Override
+            protected String jcrPathFromCol(TypeDefinition fromType, String name) {
+                assertNotNull(fromType);
+                assertNotNull(name);
+                return name.replace("cmis:", "@jcr:");
+            }
+
+            @Override
+            protected String jcrTypeName(TypeDefinition fromType) {
+                assertNotNull(fromType);
+                return fromType.getQueryName().replace("cmis:", "jcr:");
+            }
+
+            @Override
+            protected String jcrTypeCondition(TypeDefinition fromType) {
+                assertNotNull(fromType);
+                return jcrTypeCondition;
+            }
+        };
+    }
 
     @Test
     public void testQueryTranslator() {