[ 
https://issues.apache.org/jira/browse/JCR-2474?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12803727#action_12803727
 ] 

Thomas Draier commented on JCR-2474:
------------------------------------

Hi,

Here's a more complete patch about this bug - i rather changed 
NodeStateEx.removeNode() in order to check for shareable node - then also 
changed the case where we merge a shareable node somewhere else in the tree - 
instead of removing the node from its original location, it just adds a new 
share .

Regards


Index: 
src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplMerge.java
===================================================================
--- 
src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplMerge.java   
    (revision 812569)
+++ 
src/main/java/org/apache/jackrabbit/core/version/VersionManagerImplMerge.java   
    (working copy)
@@ -37,10 +37,7 @@
 import org.apache.jackrabbit.core.id.ItemId;
 import org.apache.jackrabbit.core.id.NodeId;
 import org.apache.jackrabbit.core.security.authorization.Permission;
-import org.apache.jackrabbit.core.state.ChildNodeEntry;
-import org.apache.jackrabbit.core.state.ItemStateException;
-import org.apache.jackrabbit.core.state.PropertyState;
-import org.apache.jackrabbit.core.state.UpdatableItemStateManager;
+import org.apache.jackrabbit.core.state.*;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.commons.name.NameConstants;
@@ -183,16 +180,26 @@
         for (ChildNodeEntry entry: srcNode.getState().getChildNodeEntries()) {
             NodeStateEx child = state.getNode(entry.getName(), 
entry.getIndex());
             if (child == null) {
+                // create new child
+                NodeStateEx srcChild = srcNode.getNode(entry.getId());
                 // if destination workspace already has such an node, remove it
                 if (state.hasNode(entry.getId())) {
                     child = state.getNode(entry.getId());
-                    NodeStateEx parent = child.getParent();
-                    parent.removeNode(child);
-                    parent.store();
+                    if (!srcChild.getState().isShareable()) {
+                        NodeStateEx parent = child.getParent();
+                        parent.removeNode(child);
+                        parent.store();
+                        child = null;
+                    } else {
+                        child.getState().addShare(state.getNodeId());
+                        
child.getState().setStatus(ItemState.STATUS_EXISTING_MODIFIED);
+                        child.store();
+                        state.getState().addChildNodeEntry(entry.getName(), 
child.getNodeId());
+                    }
                 }
-                // create new child
-                NodeStateEx srcChild = srcNode.getNode(entry.getId());
-                child = state.addNode(entry.getName(), 
srcChild.getState().getNodeTypeName(), srcChild.getNodeId());
+                if (child == null) {
+                    child = state.addNode(entry.getName(), 
srcChild.getState().getNodeTypeName(), srcChild.getNodeId());
+                }
                 child.setMixins(srcChild.getState().getMixinTypeNames());
                 // copy src child
                 state.store();
Index: src/main/java/org/apache/jackrabbit/core/version/NodeStateEx.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/version/NodeStateEx.java   
(revision 812569)
+++ src/main/java/org/apache/jackrabbit/core/version/NodeStateEx.java   
(working copy)
@@ -373,7 +373,14 @@
             if (entry == null) {
                 return false;
             } else {
-                removeNode(entry.getId());
+                NodeState child = (NodeState) 
stateMgr.getItemState(entry.getId());
+                if (child.getSharedSet().size() <= 1) {
+                    removeNode(entry.getId());
+                } else {
+                    child.removeShare(getNodeId());
+                    child.setStatus(ItemState.STATUS_EXISTING_MODIFIED);
+                    store(child);
+                }
                 nodeState.removeChildNodeEntry(entry.getId());
                 nodeState.setStatus(ItemState.STATUS_EXISTING_MODIFIED);
                 return true;


> Removing shareable node from a workspace and merging to another one removes 
> the nodestate even if it's still shared
> -------------------------------------------------------------------------------------------------------------------
>
>                 Key: JCR-2474
>                 URL: https://issues.apache.org/jira/browse/JCR-2474
>             Project: Jackrabbit Content Repository
>          Issue Type: Sub-task
>    Affects Versions: 2.0-beta6
>            Reporter: Thomas Draier
>
> Hi again,
> Following the previous problem, when trying to remove one share of node D 
> under B into ws1 , then merging A to ws2 completely removed the NodeState, 
> even if it is still used under C.
> After that, the system is an inconsistent state - as node C still have a D 
> child, but the D node does have any NodeState anymore.
> The issue can be located in VersionManagerImplMerge line 178 : calling :
> state.getState().removeChildNodeEntry(entry.getId())
> instead of :
> state.removeNode(entry.getName(), entry.getIndex())
> Regards

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to