You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by mr...@apache.org on 2013/05/14 11:20:46 UTC
svn commit: r1482261 - in /jackrabbit/oak/trunk:
oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/
oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/
oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/
oak-jcr/src/main/java/...
Author: mreutegg
Date: Tue May 14 09:20:45 2013
New Revision: 1482261
URL: http://svn.apache.org/r1482261
Log:
OAK-168: Basic JCR VersionManager support
- Return VersionImpl for nt:version and VersionHistoryImpl for nt:versionHistory nodes
Added:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionExceptionType.java (with props)
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java (with props)
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditor.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.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/delegate/VersionManagerDelegate.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionImpl.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionHistoryTest.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditor.java?rev=1482261&r1=1482260&r2=1482261&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionEditor.java Tue May 14 09:20:45 2013
@@ -19,14 +19,10 @@
package org.apache.jackrabbit.oak.plugins.version;
import static com.google.common.base.Preconditions.checkNotNull;
-import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE;
import static org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.MISSING_NODE;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
-import javax.jcr.RepositoryException;
-import javax.jcr.nodetype.ConstraintViolationException;
-import javax.jcr.version.VersionException;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.api.CommitFailedException;
@@ -88,7 +84,8 @@ class VersionEditor implements Editor {
}
@Override
- public void propertyAdded(PropertyState after) {
+ public void propertyAdded(PropertyState after)
+ throws CommitFailedException {
if (!wasReadOnly) {
return;
}
@@ -129,7 +126,8 @@ class VersionEditor implements Editor {
}
@Override
- public void propertyDeleted(PropertyState before) {
+ public void propertyDeleted(PropertyState before)
+ throws CommitFailedException {
if (wasReadOnly) {
if (!isVersionProperty(before)) {
throwProtected("Cannot delete property on checked in node");
@@ -191,32 +189,14 @@ class VersionEditor implements Editor {
}
private static void throwCheckedIn(String msg)
- throws UncheckedRepositoryException {
- throwUnchecked(new VersionException(msg));
+ throws CommitFailedException {
+ throw new CommitFailedException(CommitFailedException.VERSION,
+ VersionExceptionType.NODE_CHECKED_IN.ordinal(), msg);
}
private static void throwProtected(String name)
- throws UncheckedRepositoryException {
- throwUnchecked(new ConstraintViolationException(
- "Property is protected: " + name));
- }
-
- private static void throwUnchecked(RepositoryException e)
- throws UncheckedRepositoryException {
- // TODO: still necessary?
- throw new UncheckedRepositoryException(e);
- }
-
- private static class UncheckedRepositoryException extends RuntimeException {
-
- private static final long serialVersionUID = 5220620245610340169L;
-
- public UncheckedRepositoryException(RepositoryException cause) {
- super(cause);
- }
-
- public RepositoryException getCause() {
- return (RepositoryException) super.getCause();
- }
+ throws CommitFailedException {
+ throw new CommitFailedException(CommitFailedException.CONSTRAINT, 100,
+ "Property is protected: " + name);
}
}
Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionExceptionType.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionExceptionType.java?rev=1482261&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionExceptionType.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionExceptionType.java Tue May 14 09:20:45 2013
@@ -0,0 +1,38 @@
+/*
+ * 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.jackrabbit.oak.plugins.version;
+
+/**
+ * <code>VersionExceptionType</code> contains the states for version related
+ * commit failures.
+ */
+public enum VersionExceptionType {
+
+ NODE_CHECKED_IN("Node is checked in");
+
+ private final String desc;
+
+ private VersionExceptionType(String desc) {
+ this.desc = desc;
+ }
+
+ public String getDescription() {
+ return desc;
+ }
+}
\ No newline at end of file
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionExceptionType.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/version/VersionExceptionType.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java?rev=1482261&r1=1482260&r2=1482261&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/NodeImpl.java Tue May 14 09:20:45 2013
@@ -884,6 +884,7 @@ public class NodeImpl<T extends NodeDele
return sessionContext.getAccessManager().hasPermissions(
dlg.getTree(), prop, Permissions.NODE_TYPE_MANAGEMENT)
&& !dlg.isProtected()
+ && sessionContext.getVersionManager().isCheckedOut(toJcrPath(dlg.getPath()))
&& dlg.canAddMixin(oakTypeName);
}
});
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=1482261&r1=1482260&r2=1482261&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 Tue May 14 09:20:45 2013
@@ -40,6 +40,7 @@ import javax.jcr.retention.RetentionMana
import javax.jcr.security.AccessControlException;
import javax.jcr.security.AccessControlManager;
+import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.api.JackrabbitSession;
import org.apache.jackrabbit.api.security.principal.PrincipalManager;
import org.apache.jackrabbit.api.security.user.UserManager;
@@ -53,6 +54,9 @@ import org.apache.jackrabbit.oak.jcr.del
import org.apache.jackrabbit.oak.jcr.delegate.PropertyDelegate;
import org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate;
import org.apache.jackrabbit.oak.jcr.delegate.SessionOperation;
+import org.apache.jackrabbit.oak.jcr.delegate.VersionManagerDelegate;
+import org.apache.jackrabbit.oak.jcr.version.VersionHistoryImpl;
+import org.apache.jackrabbit.oak.jcr.version.VersionImpl;
import org.apache.jackrabbit.oak.jcr.xml.ImportHandler;
import org.apache.jackrabbit.oak.spi.security.authentication.ImpersonationCredentials;
import org.apache.jackrabbit.oak.util.TODO;
@@ -114,8 +118,21 @@ public class SessionImpl implements Jack
return sessionContext.getOakPathOrThrowNotFound(absPath);
}
- private NodeImpl<?> createNodeOrNull(NodeDelegate nd) {
- return nd == null ? null : new NodeImpl<NodeDelegate>(nd, sessionContext);
+ private NodeImpl<?> createNodeOrNull(NodeDelegate nd) throws RepositoryException {
+ if (nd == null) {
+ return null;
+ }
+ PropertyDelegate pd = nd.getPropertyOrNull(JcrConstants.JCR_PRIMARYTYPE);
+ String type = pd != null ? pd.getString() : null;
+ if (JcrConstants.NT_VERSION.equals(type)) {
+ VersionManagerDelegate delegate = VersionManagerDelegate.create(sd);
+ return new VersionImpl(delegate.createVersion(nd), sessionContext);
+ } else if (JcrConstants.NT_VERSIONHISTORY.equals(type)) {
+ VersionManagerDelegate delegate = VersionManagerDelegate.create(sd);
+ return new VersionHistoryImpl(delegate.createVersionHistory(nd), sessionContext);
+ } else {
+ return new NodeImpl<NodeDelegate>(nd, sessionContext);
+ }
}
private PropertyImpl createPropertyOrNull(PropertyDelegate pd) {
@@ -123,7 +140,8 @@ public class SessionImpl implements Jack
}
@CheckForNull
- private ItemImpl<?> getItemInternal(@Nonnull String oakPath) {
+ private ItemImpl<?> getItemInternal(@Nonnull String oakPath)
+ throws RepositoryException {
NodeDelegate nd = sd.getNode(oakPath);
if (nd != null) {
return createNodeOrNull(nd);
@@ -244,7 +262,7 @@ public class SessionImpl implements Jack
public Node getRootNode() throws RepositoryException {
return perform(new CheckedSessionOperation<Node>() {
@Override
- protected Node perform() throws AccessDeniedException {
+ protected Node perform() throws AccessDeniedException, RepositoryException {
NodeDelegate nd = sd.getRootNode();
if (nd == null) {
throw new AccessDeniedException("Root node is not accessible.");
@@ -272,7 +290,7 @@ public class SessionImpl implements Jack
private Node getNodeById(final String id) throws RepositoryException {
return perform(new CheckedSessionOperation<Node>() {
@Override
- public Node perform() throws ItemNotFoundException {
+ public Node perform() throws ItemNotFoundException, RepositoryException {
NodeDelegate nd = sd.getNodeByIdentifier(id);
if (nd == null) {
throw new ItemNotFoundException("Node with id " + id + " does not exist.");
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java?rev=1482261&r1=1482260&r2=1482261&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/delegate/VersionManagerDelegate.java Tue May 14 09:20:45 2013
@@ -84,6 +84,12 @@ public class VersionManagerDelegate {
}
@Nonnull
+ public VersionDelegate createVersion(@Nonnull NodeDelegate version)
+ throws RepositoryException {
+ return VersionDelegate.create(sessionDelegate, getTree(version));
+ }
+
+ @Nonnull
public VersionHistoryDelegate getVersionHistory(@Nonnull NodeDelegate versionable)
throws RepositoryException {
Tree vh = versionManager.getVersionHistory(getTree(versionable));
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionImpl.java?rev=1482261&r1=1482260&r2=1482261&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/version/VersionImpl.java Tue May 14 09:20:45 2013
@@ -42,7 +42,7 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.plugins.version.VersionConstants;
import org.apache.jackrabbit.oak.util.TODO;
-class VersionImpl extends NodeImpl<VersionDelegate> implements Version {
+public class VersionImpl extends NodeImpl<VersionDelegate> implements Version {
public VersionImpl(VersionDelegate dlg, SessionContext sessionContext) {
super(dlg, sessionContext);
Modified: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionHistoryTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionHistoryTest.java?rev=1482261&r1=1482260&r2=1482261&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionHistoryTest.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionHistoryTest.java Tue May 14 09:20:45 2013
@@ -17,6 +17,7 @@
package org.apache.jackrabbit.oak.jcr.version;
import javax.jcr.Node;
+import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionManager;
@@ -101,4 +102,25 @@ public class VersionHistoryTest extends
assertTrue(superuser.nodeExists(destPath));
VersionHistory vh = versionManager.getVersionHistory(destPath);
}
+
+ public void testGetNodeByIdentifier() throws RepositoryException {
+ Node n = testRootNode.addNode(nodeName1, testNodeType);
+ n.addMixin(mixVersionable);
+ superuser.save();
+ VersionManager vMgr = superuser.getWorkspace().getVersionManager();
+ String id = vMgr.getVersionHistory(n.getPath()).getIdentifier();
+ assertTrue("Session.getNodeByIdentifier() did not return VersionHistory object for a nt:versionHistory node.",
+ superuser.getNodeByIdentifier(id) instanceof VersionHistory);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testGetNodeByUUID() throws RepositoryException {
+ Node n = testRootNode.addNode(nodeName1, testNodeType);
+ n.addMixin(mixVersionable);
+ superuser.save();
+ VersionManager vMgr = superuser.getWorkspace().getVersionManager();
+ String uuid = vMgr.getVersionHistory(n.getPath()).getUUID();
+ assertTrue("Session.getNodeByUUID() did not return VersionHistory object for a nt:versionHistory node.",
+ superuser.getNodeByUUID(uuid) instanceof VersionHistory);
+ }
}
\ No newline at end of file
Added: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java?rev=1482261&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java (added)
+++ jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java Tue May 14 09:20:45 2013
@@ -0,0 +1,51 @@
+/*
+ * 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.jackrabbit.oak.jcr.version;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionManager;
+
+import org.apache.jackrabbit.test.AbstractJCRTest;
+
+/**
+ * <code>VersionTest</code> performs tests on JCR Version nodes.
+ */
+public class VersionTest extends AbstractJCRTest {
+
+ public void testGetNodeByIdentifier() throws RepositoryException {
+ Node n = testRootNode.addNode(nodeName1, testNodeType);
+ n.addMixin(mixVersionable);
+ superuser.save();
+ VersionManager vMgr = superuser.getWorkspace().getVersionManager();
+ String id = vMgr.getBaseVersion(n.getPath()).getIdentifier();
+ assertTrue("Session.getNodeByIdentifier() did not return Version object for a nt:version node.",
+ superuser.getNodeByIdentifier(id) instanceof Version);
+ }
+
+ @SuppressWarnings("deprecation")
+ public void testGetNodeByUUID() throws RepositoryException {
+ Node n = testRootNode.addNode(nodeName1, testNodeType);
+ n.addMixin(mixVersionable);
+ superuser.save();
+ VersionManager vMgr = superuser.getWorkspace().getVersionManager();
+ String uuid = vMgr.getBaseVersion(n.getPath()).getUUID();
+ assertTrue("Session.getNodeByUUID() did not return Version object for a nt:version node.",
+ superuser.getNodeByUUID(uuid) instanceof Version);
+ }
+}
Propchange: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/version/VersionTest.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision Rev URL