X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=inline;f=runtime%2Forg.argeo.slc.repo%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Frepo%2FRepoSync.java;h=d145eb225202a045b701b4777b8e7b470b65de27;hb=b5659b00d83ced604ab8aba88c05defe08680ac0;hp=7c2867754abe9eae0ab2ce2d96016f19349106e3;hpb=db18b11452e63b6290c0b8e33a754c9c5c470639;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoSync.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoSync.java index 7c2867754..d145eb225 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoSync.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoSync.java @@ -129,12 +129,11 @@ public class RepoSync implements Runnable { targetPassword); targetDefaultSession = targetRepository.login(targetCredentials); - // FIXME implement a cleaner way to compute job size. - // Compute job size - Map errors = new HashMap(); for (String sourceWorkspaceName : sourceDefaultSession .getWorkspace().getAccessibleWorkspaceNames()) { + if (monitor != null && monitor.isCanceled()) + break; if (sourceWkspList != null && !sourceWkspList.contains(sourceWorkspaceName)) @@ -249,7 +248,7 @@ public class RepoSync implements Runnable { Node node = it.nextNode(); if (node.getName().equals("jcr:system")) continue; - syncNode(node, targetSession, true); + syncNode(node, targetSession); } } if (log.isDebugEnabled()) @@ -266,9 +265,9 @@ public class RepoSync implements Runnable { updateMonitor(msg, false); } - protected void syncNode(Node sourceNode, Session targetSession, - Boolean doSave) throws RepositoryException, SAXException { - Boolean singleLevel = singleLevel(sourceNode); + protected void syncNode(Node sourceNode, Session targetSession) + throws RepositoryException, SAXException { + // Boolean singleLevel = singleLevel(sourceNode); if (monitor != null && monitor.isCanceled()) { updateMonitor("Fetched has been canceled, " @@ -279,60 +278,64 @@ public class RepoSync implements Runnable { Node targetParentNode = targetSession.getNode(sourceNode.getParent() .getPath()); Node targetNode; - final Boolean isNew; - if (monitor != null && sourceNode.isNodeType(NodeType.NT_FILE)) + if (monitor != null + && sourceNode.isNodeType(NodeType.NT_HIERARCHY_NODE)) monitor.subTask("Process " + sourceNode.getPath()); + + final Boolean isNew; if (!targetSession.itemExists(sourceNode.getPath())) { isNew = true; - // updateMonitor("Adding " + sourceNode.getPath()); targetNode = targetParentNode.addNode(sourceNode.getName(), sourceNode.getPrimaryNodeType().getName()); } else { isNew = false; - // updateMonitor("Updating " + sourceNode.getPath()); targetNode = targetSession.getNode(sourceNode.getPath()); if (!targetNode.getPrimaryNodeType().getName() .equals(sourceNode.getPrimaryNodeType().getName())) targetNode.setPrimaryType(sourceNode.getPrimaryNodeType() .getName()); } - for (NodeType nt : sourceNode.getMixinNodeTypes()) { - if (!targetNode.isNodeType(nt.getName()) - && targetNode.canAddMixin(nt.getName())) - targetNode.addMixin(nt.getName()); - } // export // sourceNode.getSession().exportSystemView(sourceNode.getPath(), // contentHandler, false, singleLevel); - copyProperties(sourceNode, targetSession, singleLevel); - if (singleLevel) { - if (targetSession.hasPendingChanges()) { - // updateMonitor( - // (isNew ? "Added " : "Updated ") + targetNode.getPath(), - // true); - if (doSave) - targetSession.save(); - } else { - // updateMonitor("Checked " + targetNode.getPath(), false); - } + // if (singleLevel) { + // if (targetSession.hasPendingChanges()) { + // // updateMonitor( + // // (isNew ? "Added " : "Updated ") + targetNode.getPath(), + // // true); + // if (doSave) + // targetSession.save(); + // } else { + // // updateMonitor("Checked " + targetNode.getPath(), false); + // } + // } + + // mixin and properties + for (NodeType nt : sourceNode.getMixinNodeTypes()) { + if (!targetNode.isNodeType(nt.getName()) + && targetNode.canAddMixin(nt.getName())) + targetNode.addMixin(nt.getName()); } + copyProperties(sourceNode, targetNode); // next level for (NodeIterator ni = sourceNode.getNodes(); ni.hasNext();) { Node sourceChild = ni.nextNode(); - syncNode(sourceChild, targetSession, doSave && singleLevel); + syncNode(sourceChild, targetSession); } - if (!singleLevel) { + copyTimestamps(sourceNode, targetNode); + + if (sourceNode.isNodeType(NodeType.NT_HIERARCHY_NODE)) { if (targetSession.hasPendingChanges()) { if (sourceNode.isNodeType(NodeType.NT_FILE)) updateMonitor( (isNew ? "Added " : "Updated ") + targetNode.getPath(), true); - if (doSave) - targetSession.save(); + // if (doSave) + targetSession.save(); } else { if (sourceNode.isNodeType(NodeType.NT_FILE)) updateMonitor("Checked " + targetNode.getPath(), false); @@ -340,14 +343,48 @@ public class RepoSync implements Runnable { } } - private void copyProperties(Node sourceNode, Session targetSession, - boolean singleLevel) throws RepositoryException { - Node targetNode = targetSession.getNode(sourceNode.getPath()); + private void copyTimestamps(Node sourceNode, Node targetNode) + throws RepositoryException { + if (sourceNode.getDefinition().isProtected()) + return; + if (targetNode.getDefinition().isProtected()) + return; + copyTimestamp(sourceNode, targetNode, Property.JCR_CREATED); + copyTimestamp(sourceNode, targetNode, Property.JCR_CREATED_BY); + copyTimestamp(sourceNode, targetNode, Property.JCR_LAST_MODIFIED); + copyTimestamp(sourceNode, targetNode, Property.JCR_LAST_MODIFIED_BY); + } + + private void copyTimestamp(Node sourceNode, Node targetNode, String property) + throws RepositoryException { + if (sourceNode.hasProperty(property)) { + Property p = sourceNode.getProperty(property); + if (p.getDefinition().isProtected()) + return; + if (targetNode.hasProperty(property) + && targetNode + .getProperty(property) + .getValue() + .equals(sourceNode.getProperty(property).getValue())) + return; + targetNode.setProperty(property, sourceNode.getProperty(property) + .getValue()); + } + } + + private void copyProperties(Node sourceNode, Node targetNode) + throws RepositoryException { properties: for (PropertyIterator pi = sourceNode.getProperties(); pi .hasNext();) { Property p = pi.nextProperty(); if (p.getDefinition().isProtected()) continue properties; + if (p.getName().equals(Property.JCR_CREATED) + || p.getName().equals(Property.JCR_CREATED_BY) + || p.getName().equals(Property.JCR_LAST_MODIFIED) + || p.getName().equals(Property.JCR_LAST_MODIFIED_BY)) + continue properties; + if (p.getType() == PropertyType.BINARY) { copyBinary(p, targetNode); } else {