You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2009/09/21 10:31:29 UTC
svn commit: r817192 - in /jackrabbit/trunk/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/ItemManager.java
test/java/org/apache/jackrabbit/core/ReplaceTest.java
test/java/org/apache/jackrabbit/core/TestAll.java
Author: mreutegg
Date: Mon Sep 21 08:31:17 2009
New Revision: 817192
URL: http://svn.apache.org/viewvc?rev=817192&view=rev
Log:
JCR-2170: Remove PropDefId and NodeDefId
- fix regression and add test case
Added:
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ReplaceTest.java (with props)
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/TestAll.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java?rev=817192&r1=817191&r2=817192&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/ItemManager.java Mon Sep 21 08:31:17 2009
@@ -29,6 +29,7 @@
import javax.jcr.PathNotFoundException;
import javax.jcr.PropertyIterator;
import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.ConstraintViolationException;
import org.apache.commons.collections.map.ReferenceMap;
import org.apache.jackrabbit.core.id.ItemId;
@@ -54,6 +55,8 @@
import org.apache.jackrabbit.spi.QPropertyDefinition;
import org.apache.jackrabbit.spi.QNodeDefinition;
import org.apache.jackrabbit.spi.commons.name.NameConstants;
+import org.apache.jackrabbit.spi.commons.nodetype.NodeDefinitionImpl;
+import org.apache.jackrabbit.spi.commons.nodetype.PropertyDefinitionImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -163,7 +166,7 @@
shareableNodesCache.clear();
}
- org.apache.jackrabbit.spi.commons.nodetype.NodeDefinitionImpl getDefinition(NodeState state)
+ NodeDefinitionImpl getDefinition(NodeState state)
throws RepositoryException {
if (state.getId().equals(rootNodeId)) {
// special handling required for root node
@@ -176,18 +179,28 @@
// get from overlayed state
parentId = state.getOverlayedState().getParentId();
}
- NodeState parentState;
+ NodeState parentState = null;
try {
NodeImpl parent = (NodeImpl) getItem(parentId);
parentState = parent.getNodeState();
if (state.getParentId() == null) {
// indicates state has been removed, must use
// overlayed state of parent, otherwise child node entry
- // cannot be found
- parentState = (NodeState) parentState.getOverlayedState();
+ // cannot be found. unless the parentState is new, which
+ // means it was recreated in place of a removed node
+ // that used to be the actual parent
+ if (parentState.getStatus() == ItemState.STATUS_NEW) {
+ // force getting parent from attic
+ parentState = null;
+ } else {
+ parentState = (NodeState) parentState.getOverlayedState();
+ }
}
} catch (ItemNotFoundException e) {
- // parent probably removed, get it from attic
+ // parent probably removed, get it from attic. see below
+ }
+
+ if (parentState == null) {
try {
// use overlayed state if available
parentState = (NodeState) sism.getAttic().getItemState(
@@ -196,21 +209,32 @@
throw new RepositoryException(ex);
}
}
+
// get child node entry
ChildNodeEntry cne = parentState.getChildNodeEntry(state.getNodeId());
NodeTypeRegistry ntReg = session.getNodeTypeManager().getNodeTypeRegistry();
try {
EffectiveNodeType ent = ntReg.getEffectiveNodeType(
parentState.getNodeTypeName(), parentState.getMixinTypeNames());
- QNodeDefinition def = ent.getApplicableChildNodeDef(
+ QNodeDefinition def;
+ try {
+ def = ent.getApplicableChildNodeDef(
cne.getName(), state.getNodeTypeName(), ntReg);
+ } catch (ConstraintViolationException e) {
+ // fallback to child node definition of a nt:unstructured
+ ent = ntReg.getEffectiveNodeType(NameConstants.NT_UNSTRUCTURED);
+ def = ent.getApplicableChildNodeDef(
+ cne.getName(), state.getNodeTypeName(), ntReg);
+ log.warn("Fallback to nt:unstructured due to unknown child " +
+ "node definition for type '" + state.getNodeTypeName() + "'");
+ }
return session.getNodeTypeManager().getNodeDefinition(def);
} catch (NodeTypeConflictException e) {
throw new RepositoryException(e);
}
}
- org.apache.jackrabbit.spi.commons.nodetype.PropertyDefinitionImpl getDefinition(PropertyState state)
+ PropertyDefinitionImpl getDefinition(PropertyState state)
throws RepositoryException {
try {
NodeImpl parent = (NodeImpl) getItem(state.getParentId());
@@ -225,8 +249,17 @@
NodeTypeRegistry ntReg = session.getNodeTypeManager().getNodeTypeRegistry();
EffectiveNodeType ent = ntReg.getEffectiveNodeType(
parent.getNodeTypeName(), parent.getMixinTypeNames());
- QPropertyDefinition def = ent.getApplicablePropertyDef(
+ QPropertyDefinition def;
+ try {
+ def = ent.getApplicablePropertyDef(
state.getName(), state.getType(), state.isMultiValued());
+ } catch (ConstraintViolationException e) {
+ ent = ntReg.getEffectiveNodeType(NameConstants.NT_UNSTRUCTURED);
+ def = ent.getApplicablePropertyDef(state.getName(),
+ state.getType(), state.isMultiValued());
+ log.warn("Fallback to nt:unstructured due to unknown property " +
+ "definition for '" + state.getName() + "'");
+ }
return session.getNodeTypeManager().getPropertyDefinition(def);
} catch (ItemStateException e) {
throw new RepositoryException(e);
Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ReplaceTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ReplaceTest.java?rev=817192&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ReplaceTest.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ReplaceTest.java Mon Sep 21 08:31:17 2009
@@ -0,0 +1,42 @@
+/*
+ * 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.core;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Node;
+
+import org.apache.jackrabbit.test.AbstractJCRTest;
+
+/**
+ * <code>ReplaceTest</code> checks if the node definition for a removed node
+ * is correctly calculated when its parent node had been replaced with a new
+ * node and the uuid is still the same.
+ */
+public class ReplaceTest extends AbstractJCRTest {
+
+ public void testReplace() throws RepositoryException {
+ Node n1 = testRootNode.addNode("node1");
+ n1.addMixin(mixReferenceable);
+ String uuid = n1.getIdentifier();
+ n1.addNode("node2");
+ superuser.save();
+
+ n1.remove();
+ ((NodeImpl) testRootNode).addNodeWithUuid("node1", uuid);
+ superuser.save();
+ }
+}
Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/ReplaceTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/TestAll.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/TestAll.java?rev=817192&r1=817191&r2=817192&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/TestAll.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/TestAll.java Mon Sep 21 08:31:17 2009
@@ -44,6 +44,7 @@
suite.addTestSuite(InvalidDateTest.class);
suite.addTestSuite(SessionGarbageCollectedTest.class);
suite.addTestSuite(ReferencesTest.class);
+ suite.addTestSuite(ReplaceTest.class);
// test related to NodeStateMerger
// temporarily disabled see JCR-2272 and JCR-2295