- if (targetLastModified == null
- || targetLastModified.before(sourceLastModified)) {
- ContentHandler contentHandler = targetParentNode
- .getSession()
- .getWorkspace()
- .getImportContentHandler(
- targetParentNode.getPath(),
- ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING);
- sourceNode.getSession().exportSystemView(
- sourceNode.getPath(), contentHandler, false,
- noRecurse);
- if (log.isDebugEnabled())
- log.debug("Updated " + targetNode.getPath());
+ // export
+ // sourceNode.getSession().exportSystemView(sourceNode.getPath(),
+ // contentHandler, false, singleLevel);
+
+ // 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);
+ }
+
+ 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();
+ } else {
+ if (sourceNode.isNodeType(NodeType.NT_FILE))
+ updateMonitor("Checked " + targetNode.getPath(), false);
+ }
+ }
+ }
+
+ 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 {
+
+ if (p.isMultiple()) {
+ if (!targetNode.hasProperty(p.getName())
+ || !Arrays.equals(
+ targetNode.getProperty(p.getName())
+ .getValues(), p.getValues()))
+ targetNode.setProperty(p.getName(), p.getValues());