- // FIXME : commons is frozen, cannot fix the problem directly there.
- // test and report corresponding patch
- private void copy(Node fromNode, Node toNode) {
- try {
- 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()) {
- if (log.isDebugEnabled())
- 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()
- .isProtected())
- continue properties;
-
- if (fromProperty.getDefinition().isProtected())
- continue properties;
-
- if (propertyName.equals("jcr:created")
- || propertyName.equals("jcr:createdBy")
- || propertyName.equals("jcr:lastModified")
- || propertyName.equals("jcr:lastModifiedBy"))
- continue properties;
-
- if (fromProperty.isMultiple()) {
- toNode.setProperty(propertyName,
- fromProperty.getValues());
- } else {
- toNode.setProperty(propertyName,
- fromProperty.getValue());
+ private static class CopyWkspJob extends PrivilegedJob {
+
+ private RepositoryFactory repositoryFactory;
+ private Keyring keyring;
+ private Repository localRepository;
+ private String targetRepoPath;
+ private String srcWkspName;
+ private String targetWkspName;
+ private Display display;
+
+ public CopyWkspJob(RepositoryFactory repositoryFactory,
+ Keyring keyring, Repository localRepository,
+ String targetRepoPath, String srcWkspName,
+ String targetWkspName, Display display) {
+ super("Duplicate workspace");
+ this.repositoryFactory = repositoryFactory;
+ this.keyring = keyring;
+ this.localRepository = localRepository;
+ this.targetRepoPath = targetRepoPath;
+ this.srcWkspName = srcWkspName;
+ this.targetWkspName = targetWkspName;
+ this.display = display;
+ }
+
+ @Override
+ protected IStatus doRun(IProgressMonitor progressMonitor) {
+ long begin = System.currentTimeMillis();
+
+ ArgeoMonitor monitor = new EclipseArgeoMonitor(progressMonitor);
+ monitor.beginTask("Copy workspace", -1);
+ monitor.subTask("Copying nodes");
+
+ Session nodeSession = null;
+ Session srcSession = null;
+ Session newSession = null;
+ try {
+ nodeSession = localRepository.login();
+ Node repoNode = nodeSession.getNode(targetRepoPath);
+ Repository repository = RepoUtils.getRepository(
+ repositoryFactory, keyring, repoNode);
+ Credentials credentials = RepoUtils.getRepositoryCredentials(
+ keyring, repoNode);
+
+ srcSession = repository.login(credentials, srcWkspName);
+
+ // Create the workspace
+ srcSession.getWorkspace().createWorkspace(targetWkspName);
+ Node srcRootNode = srcSession.getRootNode();
+ // log in the newly created workspace
+ newSession = repository.login(credentials, targetWkspName);
+ Node newRootNode = newSession.getRootNode();
+ RepoUtils.copy(srcRootNode, newRootNode);
+ newSession.save();
+ JcrUtils.addPrivilege(newSession, "/", SlcConstants.ROLE_SLC,
+ Privilege.JCR_ALL);
+
+ display.asyncExec(new Runnable() {
+ public void run() {
+ CommandHelpers.callCommand(RefreshDistributionsView.ID);