]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CopyWorkspace.java
Fix copy workspace & delete artifacts commands
[gpl/argeo-slc.git] / eclipse / plugins / org.argeo.slc.client.ui.dist / src / main / java / org / argeo / slc / client / ui / dist / commands / CopyWorkspace.java
index 5e011d19949d914dec9788ef87979808a13b97e8..08286ae3b1fb3c25704767a0d7a5bd313254ad39 100644 (file)
@@ -6,6 +6,7 @@ import javax.jcr.Property;
 import javax.jcr.PropertyIterator;
 import javax.jcr.Repository;
 import javax.jcr.RepositoryException;
+import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
 
 import org.apache.commons.logging.Log;
@@ -13,10 +14,13 @@ import org.apache.commons.logging.LogFactory;
 import org.argeo.ArgeoException;
 import org.argeo.jcr.JcrUtils;
 import org.argeo.slc.client.ui.dist.DistPlugin;
+import org.argeo.slc.client.ui.dist.utils.CommandHelpers;
+import org.argeo.slc.jcr.SlcTypes;
 import org.eclipse.core.commands.AbstractHandler;
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.ui.IWorkbenchWindow;
 
 /**
  * Create a copy of the chosen workspace in the current repository.
@@ -39,64 +43,77 @@ public class CopyWorkspace extends AbstractHandler {
                if (log.isTraceEnabled())
                        log.debug("WORKSPACE " + srcWorkspaceName + " About to be copied");
 
-               MessageDialog.openWarning(DistPlugin.getDefault()
-                               .getWorkbench().getDisplay().getActiveShell(),
-                               "WARNING", "Not yet implemented");
-               return null;
-               //
-               //
-               // IWorkbenchWindow iww = DistPlugin.getDefault().getWorkbench()
-               // .getActiveWorkbenchWindow();
-               // InputDialog inputDialog = new InputDialog(iww.getShell(),
-               // "New copy of the current workspace",
-               // "Choose a name for the workspace to create", "", null);
-               // inputDialog.open();
-               // String newWorkspaceName = inputDialog.getValue();
-               // Session srcSession = null;
-               // Session newSession = null;
-               // try {
-               // srcSession = repository.login(srcWorkspaceName);
-               // // FIXME: simple call to Workspace.create(newName, oldName) does not
-               // // work
-               //
-               // srcSession.getWorkspace().createWorkspace(newWorkspaceName,
-               // srcWorkspaceName);
-               //
-               // // // Create the workspace
-               // // srcSession.getWorkspace().createWorkspace(newWorkspaceName);
-               // // Node srcRootNode = srcSession.getRootNode();
-               // // // log in the newly created workspace
-               // // newSession = repository.login(newWorkspaceName);
-               // // newSession.save();
-               // // Node newRootNode = newSession.getRootNode();
-               // // copy(srcRootNode, newRootNode);
-               // // newSession.save();
-               //
-               // CommandHelpers.callCommand(RefreshDistributionsView.ID);
-               // } catch (RepositoryException re) {
-               // throw new ArgeoException(
-               // "Unexpected error while creating the new workspace.", re);
-               // } finally {
-               // if (srcSession != null)
-               // srcSession.logout();
-               // if (newSession != null)
-               // newSession.logout();
-               // }
+               // MessageDialog.openWarning(DistPlugin.getDefault()
+               // .getWorkbench().getDisplay().getActiveShell(),
+               // "WARNING", "Not yet implemented");
                // return null;
+
+               IWorkbenchWindow iww = DistPlugin.getDefault().getWorkbench()
+                               .getActiveWorkbenchWindow();
+               InputDialog inputDialog = new InputDialog(iww.getShell(),
+                               "New copy of the current workspace",
+                               "Choose a name for the workspace to create", "", null);
+               inputDialog.open();
+               String newWorkspaceName = inputDialog.getValue();
+               Session srcSession = null;
+               Session newSession = null;
+               try {
+                       srcSession = repository.login(srcWorkspaceName);
+
+                       // Create the workspace
+                       srcSession.getWorkspace().createWorkspace(newWorkspaceName);
+                       Node srcRootNode = srcSession.getRootNode();
+                       // log in the newly created workspace
+                       newSession = repository.login(newWorkspaceName);
+                       newSession.save();
+                       Node newRootNode = newSession.getRootNode();
+                       copy(srcRootNode, newRootNode);
+                       newSession.save();
+
+                       CommandHelpers.callCommand(RefreshDistributionsView.ID);
+               } catch (RepositoryException re) {
+                       throw new ArgeoException(
+                                       "Unexpected error while creating the new workspace.", re);
+               } finally {
+                       if (srcSession != null)
+                               srcSession.logout();
+                       if (newSession != null)
+                               newSession.logout();
+               }
+               return null;
        }
 
        // FIXME : commons is frozen, cannot fix the problem directly there.
        // test and report corresponding patch
        private void copy(Node fromNode, Node toNode) {
-
                try {
-                       // cannot manipulate security nodes this way:
-                       if (fromNode.isNodeType("rep:ACL"))
+                       if (log.isDebugEnabled())
+                               log.debug("copy node :" + fromNode.getPath());
+       
+                       
+                       // FIXME : small hack to enable specific workspace copy
+                       if (fromNode.isNodeType("rep:ACL") || fromNode.isNodeType("rep:system")){
+                               if (log.isTraceEnabled())
+                                       log.trace("node skipped");
                                return;
+                       }
+                       
+                       // add mixins
+                       for (NodeType mixinType : fromNode.getMixinNodeTypes()) {
+                               toNode.addMixin(mixinType.getName());
+                       }
+                       
+                       // Double check
+                       for (NodeType mixinType : toNode.getMixinNodeTypes()) {
+                               log.debug(mixinType.getName());
+                       }
+                       
                        // process properties
                        PropertyIterator pit = fromNode.getProperties();
                        properties: while (pit.hasNext()) {
                                Property fromProperty = pit.nextProperty();
+                               String propName = fromProperty.getName();
+                               try{
                                String propertyName = fromProperty.getName();
                                if (toNode.hasProperty(propertyName)
                                                && toNode.getProperty(propertyName).getDefinition()
@@ -117,19 +134,12 @@ public class CopyWorkspace extends AbstractHandler {
                                } else {
                                        toNode.setProperty(propertyName, fromProperty.getValue());
                                }
+                               } catch (RepositoryException e) {
+                                       throw new ArgeoException("Cannot property " + propName, e);
+                               }
                        }
 
-                       // update jcr:lastModified and jcr:lastModifiedBy in toNode in case
-                       // they existed, before adding the mixins
-                       if (!toNode.getDefinition().isProtected())
-                               JcrUtils.updateLastModified(toNode);
-
-                       // add mixins
-                       for (NodeType mixinType : fromNode.getMixinNodeTypes()) {
-                               toNode.addMixin(mixinType.getName());
-                       }
-
-                       // process children nodes
+                       // recursively process children nodes
                        NodeIterator nit = fromNode.getNodes();
                        while (nit.hasNext()) {
                                Node fromChild = nit.nextNode();
@@ -144,7 +154,16 @@ public class CopyWorkspace extends AbstractHandler {
                                copy(fromChild, toChild);
                        }
 
-                       toNode.getSession().save();
+                       // update jcr:lastModified and jcr:lastModifiedBy in toNode in case
+                       // they existed
+                       if (!toNode.getDefinition().isProtected()
+                                       && toNode.isNodeType(NodeType.MIX_LAST_MODIFIED))
+                               JcrUtils.updateLastModified(toNode);
+                       
+                       // Workaround to reduce session size: artifact is a saveable unity
+                       if (toNode.isNodeType(SlcTypes.SLC_ARTIFACT))
+                               toNode.getSession().save();
+                       
                } catch (RepositoryException e) {
                        throw new ArgeoException("Cannot copy " + fromNode + " to "
                                        + toNode, e);