You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/08/05 17:33:44 UTC

svn commit: r982664 - /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java

Author: jukka
Date: Thu Aug  5 15:33:44 2010
New Revision: 982664

URL: http://svn.apache.org/viewvc?rev=982664&view=rev
Log:
JCR-890: concurrent read-only access to a session

Use SessionOperations in more NodeImpl methods

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java?rev=982664&r1=982663&r2=982664&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/NodeImpl.java Thu Aug  5 15:33:44 2010
@@ -2042,140 +2042,136 @@ public class NodeImpl extends ItemImpl i
      *                                      validation immediately.
      * @throws RepositoryException          if another error occurs.
      */
-    protected PropertyImpl setProperty(Name name,
-                                       Value[] values,
-                                       int type,
-                                       boolean enforceType) throws
-            ValueFormatException, VersionException, LockException,
-            ConstraintViolationException, RepositoryException {
-        // check state of this instance
-        sanityCheck();
-
-        // check pre-conditions for setting property
-        checkSetProperty();
-
-        BitSet status = new BitSet();
-        PropertyImpl prop = getOrCreateProperty(name, type, true, enforceType, status);
-        try {
-            prop.setValue(values, type);
-        } catch (RepositoryException re) {
-            if (status.get(CREATED)) {
-                // setting value failed, get rid of newly created property
-                removeChildProperty(name);
+    protected PropertyImpl setProperty(
+            final Name name, final Value[] values, final int type,
+            final boolean enforceType) throws RepositoryException {
+        return perform(new SessionOperation<PropertyImpl>() {
+            public PropertyImpl perform(SessionContext context)
+                    throws RepositoryException {
+                // check pre-conditions for setting property
+                checkSetProperty();
+
+                BitSet status = new BitSet();
+                PropertyImpl prop = getOrCreateProperty(
+                        name, type, true, enforceType, status);
+                try {
+                    prop.setValue(values, type);
+                } catch (RepositoryException re) {
+                    if (status.get(CREATED)) {
+                        // setting value failed, get rid of newly created property
+                        removeChildProperty(name);
+                    }
+                    // rethrow
+                    throw re;
+                }
+                return prop;
             }
-            // rethrow
-            throw re;
-        }
-        return prop;
+        });
     }
 
     /**
      * {@inheritDoc}
      */
-    public Node getNode(String relPath)
-            throws PathNotFoundException, RepositoryException {
-
-        // check state of this instance
-        sanityCheck();
-
-        Path p = resolveRelativePath(relPath);
-        NodeId id = getNodeId(p);
-        if (id == null) {
-            throw new PathNotFoundException(relPath);
-        }
+    public Node getNode(final String relPath) throws RepositoryException {
+        return perform(new SessionOperation<Node>() {
+            public Node perform(SessionContext context)
+                    throws RepositoryException {
+                Path p = resolveRelativePath(relPath);
+                NodeId id = getNodeId(p);
+                if (id == null) {
+                    throw new PathNotFoundException(relPath);
+                }
 
-        // determine parent as mandated by path
-        NodeId parentId = null;
-        if (!p.denotesRoot()) {
-            parentId = getNodeId(p.getAncestor(1));
-        }
-        try {
-            if (parentId == null) {
-                return (NodeImpl) itemMgr.getItem(id);
+                // determine parent as mandated by path
+                NodeId parentId = null;
+                if (!p.denotesRoot()) {
+                    parentId = getNodeId(p.getAncestor(1));
+                }
+                try {
+                    // if the node is shareable, it now returns the node
+                    // with the right parent
+                    if (parentId != null) {
+                        return itemMgr.getNode(id, parentId);
+                    } else {
+                        return (NodeImpl) itemMgr.getItem(id);
+                    }
+                } catch (AccessDeniedException e) {
+                    throw new PathNotFoundException(relPath);
+                } catch (ItemNotFoundException e) {
+                    throw new PathNotFoundException(relPath);
+                }
             }
-            // if the node is shareable, it now returns the node with the right
-            // parent
-            return itemMgr.getNode(id, parentId);
-        } catch (AccessDeniedException ade) {
-            throw new PathNotFoundException(relPath);
-        } catch (ItemNotFoundException infe) {
-            throw new PathNotFoundException(relPath);
-        }
+        });
     }
 
     /**
      * {@inheritDoc}
      */
     public NodeIterator getNodes() throws RepositoryException {
-        // check state of this instance
-        sanityCheck();
-
-        /**
-         * IMPORTANT:
-         * an implementation of Node.getNodes()
-         * must not use a class derived from TraversingElementVisitor
-         * to traverse the hierarchy because this would lead to an infinite
-         * recursion!
-         */
-        try {
-            return itemMgr.getChildNodes((NodeId) id);
-        } catch (ItemNotFoundException infe) {
-            String msg = "failed to list the child nodes of " + this;
-            log.debug(msg);
-            throw new RepositoryException(msg, infe);
-        } catch (AccessDeniedException ade) {
-            String msg = "failed to list the child nodes of " + this;
-            log.debug(msg);
-            throw new RepositoryException(msg, ade);
-        }
+        // IMPORTANT: an implementation of Node.getNodes() must not use
+        // a class derived from TraversingElementVisitor to traverse the
+        // hierarchy because this would lead to an infinite recursion!
+        return perform(new SessionOperation<NodeIterator>() {
+            public NodeIterator perform(SessionContext context)
+                    throws RepositoryException {
+                try {
+                    return itemMgr.getChildNodes((NodeId) id);
+                } catch (ItemNotFoundException e) {
+                    throw new RepositoryException(
+                            "Failed to list child nodes of " + NodeImpl.this, e);
+                } catch (AccessDeniedException e) {
+                    throw new RepositoryException(
+                            "Failed to list child nodes of " + NodeImpl.this, e);
+                }
+            }
+        });
     }
 
     /**
      * {@inheritDoc}
      */
     public PropertyIterator getProperties() throws RepositoryException {
-        // check state of this instance
-        sanityCheck();
-
-        /**
-         * IMPORTANT:
-         * an implementation of Node.getProperties()
-         * must not use a class derived from TraversingElementVisitor
-         * to traverse the hierarchy because this would lead to an infinite
-         * recursion!
-         */
-        try {
-            return itemMgr.getChildProperties((NodeId) id);
-        } catch (ItemNotFoundException infe) {
-            String msg = "failed to list the child properties of " + this;
-            log.debug(msg);
-            throw new RepositoryException(msg, infe);
-        } catch (AccessDeniedException ade) {
-            String msg = "failed to list the child properties of " + this;
-            log.debug(msg);
-            throw new RepositoryException(msg, ade);
-        }
+        // IMPORTANT: an implementation of Node.getProperties() must not use
+        // a class derived from TraversingElementVisitor to traverse the
+        // hierarchy because this would lead to an infinite recursion!
+        return perform(new SessionOperation<PropertyIterator>() {
+            public PropertyIterator perform(SessionContext context)
+                    throws RepositoryException {
+                try {
+                    return itemMgr.getChildProperties((NodeId) id);
+                } catch (ItemNotFoundException e) {
+                    throw new RepositoryException(
+                            "Failed to list properties of " + NodeImpl.this, e);
+                } catch (AccessDeniedException e) {
+                    throw new RepositoryException(
+                            "Failed to list properties of " + NodeImpl.this, e);
+                }
+            }
+        });
     }
 
     /**
      * {@inheritDoc}
      */
-    public Property getProperty(String relPath)
+    public Property getProperty(final String relPath)
             throws PathNotFoundException, RepositoryException {
-        // check state of this instance
-        sanityCheck();
-
-        PropertyId id = resolveRelativePropertyPath(relPath);
-        if (id == null) {
-            throw new PathNotFoundException(relPath);
-        }
-        try {
-            return (Property) itemMgr.getItem(id);
-        } catch (ItemNotFoundException infe) {
-            throw new PathNotFoundException(relPath);
-        } catch (AccessDeniedException ade) {
-            throw new PathNotFoundException(relPath);
-        }
+        return perform(new SessionOperation<Property>() {
+            public Property perform(SessionContext context)
+                    throws RepositoryException {
+                PropertyId id = resolveRelativePropertyPath(relPath);
+                if (id != null) {
+                    try {
+                        return (Property) itemMgr.getItem(id);
+                    } catch (ItemNotFoundException e) {
+                        throw new PathNotFoundException(relPath);
+                    } catch (AccessDeniedException e) {
+                        throw new PathNotFoundException(relPath);
+                    }
+                } else {
+                    throw new PathNotFoundException(relPath);
+                }
+            }
+        });
     }
 
     /**