Update of 
/var/cvs/contributions/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms
In directory 
james.mmbase.org:/tmp/cvs-serv6953/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms

Modified Files:
      Tag: b1_5
        ChannelDelete.java 
Log Message:
CMSC-1068  If you delete a contentchannel, contentchannels below get lost in 
the void


See also: 
http://cvs.mmbase.org/viewcvs/contributions/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms
See also: http://www.mmbase.org/jira/browse/CMSC-1068


Index: ChannelDelete.java
===================================================================
RCS file: 
/var/cvs/contributions/CMSContainer/cmsc/contentrepository/src/java/com/finalist/cmsc/repository/forms/ChannelDelete.java,v
retrieving revision 1.9
retrieving revision 1.9.2.1
diff -u -b -r1.9 -r1.9.2.1
--- ChannelDelete.java  10 May 2008 16:31:23 -0000      1.9
+++ ChannelDelete.java  1 Oct 2008 11:05:04 -0000       1.9.2.1
@@ -50,22 +50,23 @@
             if ("cancel".equals(action)) {
                 return mapping.findForward(SUCCESS);
             }            
-            else if ("delete".equals(action)) {
-                NodeList createdElements = 
RepositoryUtil.getCreatedElements(channelNode);
-                for (Iterator<Node> iter = createdElements.iterator(); 
iter.hasNext();) {
-                    Node objectNode = iter.next();
-                    RepositoryUtil.removeContentFromChannel(objectNode, 
channelNode);
-                    RepositoryUtil.removeCreationRelForContent(objectNode);
-                    
-                    RepositoryUtil.removeContentFromAllChannels(objectNode);
-                    RepositoryUtil.addContentToChannel(objectNode, 
RepositoryUtil.getTrashNode(cloud));
-                    
-                    Publish.remove(objectNode);
-                    Publish.unpublish(objectNode);
-                    Workflow.remove(objectNode);
+         if ("delete".equals(action)) {
+            deleteAction(cloud, channelNode);
+         }
+         if ("move".equals(action)) {
+            moveAction(cloud, channelNode);
+         }
+         return mapping.findForward(SUCCESS);
                 }
             }
-            else if ("move".equals(action)) {
+
+   private void moveAction(Cloud cloud, Node channelNode) {
+      NodeList childChannels = RepositoryUtil.getChildren(channelNode);
+      for (Iterator<Node> childIter = childChannels.iterator(); 
childIter.hasNext();) {
+         Node childChannel = childIter.next();
+         moveAction(cloud, childChannel);
+      }
+      
                 // get relations of content elements to channels other then 
the creationchannel
                 NodeList createdElements = 
RepositoryUtil.getCreatedElements(channelNode);
                 
@@ -73,8 +74,9 @@
                     Node elementNode = iter.next();
                     // get relations
                     RelationManager contentRelationManager = 
cloud.getRelationManager("contentrel");
-                    NodeList relatedChannelsList = 
-                        contentRelationManager.getList("(snumber != " + 
channelNode.getNumber() + " and dnumber = " + elementNode.getNumber() + ")", 
"number", "UP");
+         NodeList relatedChannelsList = 
contentRelationManager.getList("(snumber != "
+               + channelNode.getNumber() + " and dnumber = " + 
elementNode.getNumber()
+               + ")", "number", "UP");
                
                     // loop through channel relations
                     Iterator<Node> iter2 = relatedChannelsList.iterator();
@@ -83,37 +85,67 @@
                         Node relationNode = iter2.next();
                         Node newChannelNode = 
cloud.getNode(relationNode.getStringValue("snumber"));
                         
+            if (RepositoryUtil.isParent(channelNode, newChannelNode)) {
+               moveElementToTrash(cloud, channelNode, elementNode);
+            }
+            else {
+               moveElementToAnotherChannel(channelNode, elementNode, 
newChannelNode);
+            }
+         }
+         else {
+            moveElementToTrash(cloud, channelNode, elementNode);
+         }
+      }
+      deleteChannel(channelNode);
+   }
+
+   private void deleteAction(Cloud cloud, Node channelNode) {
+      NodeList childChannels = RepositoryUtil.getChildren(channelNode);
+      for (Iterator<Node> childIter = childChannels.iterator(); 
childIter.hasNext();) {
+         Node childChannel = childIter.next();
+         deleteAction(cloud, childChannel);
+      }
+      
+      NodeList createdElements = 
RepositoryUtil.getCreatedElements(channelNode);
+      for (Iterator<Node> iter = createdElements.iterator(); iter.hasNext();) {
+         Node objectNode = iter.next();
+         moveElementToTrash(cloud, channelNode, objectNode);
+      }
+      deleteChannel(channelNode);
+   }
+
+   private void deleteChannel(Node channelNode) {
+      Publish.remove(channelNode);
+      Publish.unpublish(channelNode);
+      Workflow.remove(channelNode);
+      
+      channelNode.delete(true);
+   }
+
+   private void moveElementToAnotherChannel(Node channelNode, Node 
elementNode, Node newChannelNode) {
                         // move content element to the channel
                         RepositoryUtil.removeContentFromChannel(elementNode, 
channelNode);
                         
RepositoryUtil.removeCreationRelForContent(elementNode);
                         RepositoryUtil.addCreationChannel(elementNode, 
newChannelNode);
+
+      // unpublish and remove from workflow
+      Publish.remove(elementNode);
+      Publish.unpublish(elementNode);
+      Workflow.remove(elementNode);
                     }
-                    else {
+
+   private void moveElementToTrash(Cloud cloud, Node channelNode, Node 
elementNode) {
                        // remove the element
                         RepositoryUtil.removeContentFromChannel(elementNode, 
channelNode);
                         
RepositoryUtil.removeCreationRelForContent(elementNode);
                         
                         
RepositoryUtil.removeContentFromAllChannels(elementNode);
                         RepositoryUtil.addContentToChannel(elementNode, 
RepositoryUtil.getTrashNode(cloud));
-                    }
+
                     // unpublish and remove from workflow
                     Publish.remove(elementNode);
                     Publish.unpublish(elementNode);
                     Workflow.remove(elementNode);                        
                 }
-            }
-
-
-            if (Workflow.hasWorkflow(channelNode)) {
-                Workflow.remove(channelNode);
-            }
-            Publish.remove(channelNode);
-            Publish.unpublish(channelNode);
-            Workflow.remove(channelNode);
-            
-            channelNode.delete(true);
-            return mapping.findForward(SUCCESS);
-        }
-    }
     
 }
_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to