Author: jukka
Date: Wed Jul 24 12:23:41 2013
New Revision: 1506517
URL: http://svn.apache.org/r1506517
Log:
OAK-663: oak-jcr performance optimization
Move protectedness checks to the delegate level
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/PropertyDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java?rev=1506517&r1=1506516&r2=1506517&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/ItemImpl.java
Wed Jul 24 12:23:41 2013
@@ -87,7 +87,9 @@ abstract class ItemImpl<T extends ItemDe
@Override
protected void checkPreconditions() throws RepositoryException {
dlg.checkAlive();
- checkProtected();
+ if (dlg.isProtected()) {
+ throw new ConstraintViolationException("Item is protected.");
+ }
}
}
@@ -271,12 +273,6 @@ abstract class ItemImpl<T extends ItemDe
//-----------------------------------------------------------< internal
>---
- void checkProtected() throws RepositoryException {
- if (dlg.isProtected()) {
- throw new ConstraintViolationException("Item is protected.");
- }
- }
-
void checkProtected(ItemDefinition definition) throws
ConstraintViolationException {
if (definition.isProtected()) {
throw new ConstraintViolationException("Item is protected.");
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java?rev=1506517&r1=1506516&r2=1506517&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/SessionImpl.java
Wed Jul 24 12:23:41 2013
@@ -16,6 +16,8 @@
*/
package org.apache.jackrabbit.oak.jcr;
+import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
+
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -37,6 +39,7 @@ import javax.jcr.UnsupportedRepositoryOp
import javax.jcr.ValueFactory;
import javax.jcr.Workspace;
import javax.jcr.lock.LockManager;
+import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.retention.RetentionManager;
import javax.jcr.security.AccessControlManager;
@@ -57,7 +60,6 @@ import org.apache.jackrabbit.oak.jcr.del
import org.apache.jackrabbit.oak.jcr.xml.ImportHandler;
import
org.apache.jackrabbit.oak.spi.security.authentication.ImpersonationCredentials;
import org.apache.jackrabbit.oak.util.TODO;
-import org.apache.jackrabbit.util.Text;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.ContentHandler;
@@ -77,13 +79,6 @@ public class SessionImpl implements Jack
this.sd = sessionContext.getSessionDelegate();
}
- static void checkProtectedNodes(Session session, String... absJcrPaths)
throws RepositoryException {
- for (String absPath : absJcrPaths) {
- NodeImpl<?> node = (NodeImpl<?>) session.getNode(absPath);
- node.checkProtected();
- }
- }
-
static void checkIndexOnName(SessionContext sessionContext, String path)
throws RepositoryException {
String oakPath = sessionContext.getOakPathKeepIndex(path);
if (oakPath != null) {
@@ -337,22 +332,22 @@ public class SessionImpl implements Jack
}
@Override
- public void move(final String srcAbsPath, final String destAbsPath) throws
RepositoryException {
+ public void move(String srcAbsPath, final String destAbsPath) throws
RepositoryException {
+ final String srcOakPath = getOakPathOrThrowNotFound(srcAbsPath);
+ final String destOakPath = getOakPathOrThrowNotFound(destAbsPath);
sd.perform(new WriteOperation<Void>() {
@Override
protected void checkPreconditions() throws RepositoryException {
super.checkPreconditions();
- // FIXME getRelativeParent doesn't work for fully qualified
names. See OAK-724
- checkProtectedNodes(SessionImpl.this,
- Text.getRelativeParent(srcAbsPath, 1),
Text.getRelativeParent(destAbsPath, 1));
+ sd.checkProtectedNode(getParentPath(srcOakPath));
+ sd.checkProtectedNode(getParentPath(destOakPath));
checkIndexOnName(sessionContext, destAbsPath);
}
@Override
public Void perform() throws RepositoryException {
- sd.move(
- getOakPathOrThrowNotFound(srcAbsPath),
- getOakPathOrThrowNotFound(destAbsPath), true,
sessionContext.getAccessManager());
+ sd.move(srcOakPath, destOakPath, true,
+ sessionContext.getAccessManager());
return null;
}
});
@@ -360,18 +355,22 @@ public class SessionImpl implements Jack
@Override
public void removeItem(final String absPath) throws RepositoryException {
+ final String oakPath = getOakPathOrThrowNotFound(absPath);
perform(new WriteOperation<Void>() {
@Override
protected Void perform() throws RepositoryException {
- String oakPath = getOakPathOrThrowNotFound(absPath);
- ItemImpl<?> item = getItemInternal(oakPath);
+ ItemDelegate item = sd.getItem(oakPath);
if (item == null) {
throw new PathNotFoundException(absPath);
+ } else if (item.isProtected()) {
+ throw new ConstraintViolationException(
+ item.getPath() + " is protected");
+ } else if (item.remove()) {
+ return null;
+ } else {
+ throw new RepositoryException(
+ item.getPath() + " could not be removed");
}
-
- item.checkProtected();
- item.remove();
- return null;
}
});
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java?rev=1506517&r1=1506516&r2=1506517&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/WorkspaceImpl.java
Wed Jul 24 12:23:41 2013
@@ -47,11 +47,11 @@ import org.apache.jackrabbit.oak.jcr.xml
import org.apache.jackrabbit.oak.namepath.NamePathMapper;
import org.apache.jackrabbit.oak.plugins.name.ReadWriteNamespaceRegistry;
import
org.apache.jackrabbit.oak.plugins.nodetype.write.ReadWriteNodeTypeManager;
-import org.apache.jackrabbit.util.Text;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
+import static org.apache.jackrabbit.oak.commons.PathUtils.getParentPath;
import static
org.apache.jackrabbit.oak.plugins.nodetype.NodeTypeConstants.NODE_TYPES_PATH;
/**
@@ -126,31 +126,35 @@ public class WorkspaceImpl implements Ja
@Override
public void copy(String srcWorkspace, String srcAbsPath, String
destAbsPath) throws RepositoryException {
+ final String srcOakPath = getOakPathOrThrowNotFound(srcAbsPath);
+ final String destOakPath = getOakPathOrThrowNotFound(destAbsPath);
+
+ // TODO: use perform()
ensureIsAlive();
if (!getName().equals(srcWorkspace)) {
throw new UnsupportedRepositoryOperationException("Not
implemented.");
}
- // FIXME getRelativeParent doesn't work for fully qualified names. See
OAK-724
- SessionImpl.checkProtectedNodes(
- getSession(), Text.getRelativeParent(srcAbsPath, 1),
Text.getRelativeParent(destAbsPath, 1));
+ sessionDelegate.checkProtectedNode(getParentPath(srcOakPath));
+ sessionDelegate.checkProtectedNode(getParentPath(destOakPath));
SessionImpl.checkIndexOnName(sessionContext, destAbsPath);
sessionDelegate.copy(
- getOakPathOrThrowNotFound(srcAbsPath),
- getOakPathOrThrowNotFound(destAbsPath),
- sessionContext.getAccessManager());
+ srcOakPath, destOakPath, sessionContext.getAccessManager());
}
@Override
public void clone(String srcWorkspace, String srcAbsPath, String
destAbsPath, boolean removeExisting) throws RepositoryException {
+ final String srcOakPath = getOakPathOrThrowNotFound(srcAbsPath);
+ final String destOakPath = getOakPathOrThrowNotFound(destAbsPath);
+
+ // TODO: use perform()
ensureIsAlive();
- // FIXME getRelativeParent doesn't work for fully qualified names. See
OAK-724
- SessionImpl.checkProtectedNodes(
- getSession(), Text.getRelativeParent(srcAbsPath, 1),
Text.getRelativeParent(destAbsPath, 1));
+ sessionDelegate.checkProtectedNode(getParentPath(srcOakPath));
+ sessionDelegate.checkProtectedNode(getParentPath(destOakPath));
// TODO
throw new UnsupportedRepositoryOperationException("Not implemented.");
@@ -158,18 +162,19 @@ public class WorkspaceImpl implements Ja
@Override
public void move(String srcAbsPath, String destAbsPath) throws
RepositoryException {
+ final String srcOakPath = getOakPathOrThrowNotFound(srcAbsPath);
+ final String destOakPath = getOakPathOrThrowNotFound(destAbsPath);
+
+ // TODO: use perform()
ensureIsAlive();
- // FIXME getRelativeParent doesn't work for fully qualified names. See
OAK-724
- SessionImpl.checkProtectedNodes(
- getSession(), Text.getRelativeParent(srcAbsPath, 1),
Text.getRelativeParent(destAbsPath, 1));
+ sessionDelegate.checkProtectedNode(getParentPath(srcOakPath));
+ sessionDelegate.checkProtectedNode(getParentPath(destOakPath));
SessionImpl.checkIndexOnName(sessionContext, destAbsPath);
sessionDelegate.move(
- getOakPathOrThrowNotFound(srcAbsPath),
- getOakPathOrThrowNotFound(destAbsPath),
- false, sessionContext.getAccessManager());
+ srcOakPath, destOakPath, false,
sessionContext.getAccessManager());
}
@Override
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java?rev=1506517&r1=1506516&r2=1506517&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/ItemDelegate.java
Wed Jul 24 12:23:41 2013
@@ -102,4 +102,12 @@ public abstract class ItemDelegate {
*/
public abstract boolean exists();
+ /**
+ * Removes this item.
+ *
+ * @return {@code true} if this item was removed;
+ * or {@code false} if this is the root node that can't be removed
+ */
+ public abstract boolean remove() throws InvalidItemStateException;
+
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java?rev=1506517&r1=1506516&r2=1506517&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/NodeDelegate.java
Wed Jul 24 12:23:41 2013
@@ -642,6 +642,7 @@ public class NodeDelegate extends ItemDe
*
* @return {@code true} if the node was removed; {@code false} otherwise.
*/
+ @Override
public boolean remove() throws InvalidItemStateException {
return getTree().remove();
}
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/PropertyDelegate.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/PropertyDelegate.java?rev=1506517&r1=1506516&r2=1506517&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/PropertyDelegate.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/PropertyDelegate.java
Wed Jul 24 12:23:41 2013
@@ -143,8 +143,15 @@ public class PropertyDelegate extends It
/**
* Remove the property
*/
- public void remove() {
- parent.removeProperty(name);
+ @Override
+ public boolean remove() {
+ boolean exists = parent.hasProperty(name);
+ if (exists) {
+ parent.removeProperty(name);
+ return true;
+ } else {
+ return false;
+ }
}
@Override
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java?rev=1506517&r1=1506516&r2=1506517&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
(original)
+++
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/SessionDelegate.java
Wed Jul 24 12:23:41 2013
@@ -22,6 +22,7 @@ import javax.annotation.Nonnull;
import javax.jcr.ItemExistsException;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.ConstraintViolationException;
import org.apache.jackrabbit.oak.api.AuthInfo;
import org.apache.jackrabbit.oak.api.CommitFailedException;
@@ -160,6 +161,17 @@ public class SessionDelegate {
return updateCount;
}
+ public void checkProtectedNode(String path) throws RepositoryException {
+ NodeDelegate node = getNode(path);
+ if (node == null) {
+ throw new PathNotFoundException(
+ "Node " + path + " does not exist.");
+ } else if (node.isProtected()) {
+ throw new ConstraintViolationException(
+ "Node " + path + " is protected.");
+ }
+ }
+
@Nonnull
public AuthInfo getAuthInfo() {
return contentSession.getAuthInfo();