X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=eclipse%2Fplugins%2Forg.argeo.slc.client.ui.dist%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fclient%2Fui%2Fdist%2Fcommands%2FCopyWorkspace.java;h=08286ae3b1fb3c25704767a0d7a5bd313254ad39;hb=99f26f4dd4136b33d0e68687599b9673363319ae;hp=5e011d19949d914dec9788ef87979808a13b97e8;hpb=e255526eb77c85ce773cf64fbf06430e4f936ec2;p=gpl%2Fargeo-slc.git diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CopyWorkspace.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CopyWorkspace.java index 5e011d199..08286ae3b 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CopyWorkspace.java +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/CopyWorkspace.java @@ -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);