Index: vault-sync/src/main/java/org/apache/jackrabbit/vault/sync/impl/AbstractTreeSyncListener.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== diff --git a/vault-sync/src/main/java/org/apache/jackrabbit/vault/sync/impl/AbstractTreeSyncListener.java b/vault-sync/src/main/java/org/apache/jackrabbit/vault/sync/impl/AbstractTreeSyncListener.java new file mode 100644 --- /dev/null (date 1649263564191) +++ b/vault-sync/src/main/java/org/apache/jackrabbit/vault/sync/impl/AbstractTreeSyncListener.java (date 1649263564191) @@ -0,0 +1,83 @@ +package org.apache.jackrabbit.vault.sync.impl; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; + +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.observation.Event; +import javax.jcr.observation.EventIterator; +import javax.jcr.observation.EventListener; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class AbstractTreeSyncListener implements EventListener { + + private static final Logger log = LoggerFactory.getLogger(AbstractTreeSyncListener.class); + + protected Repository repository; + protected TreeSync treeSync; + protected File fileDirectory; + + public AbstractTreeSyncListener(Repository repository, TreeSync treeSync, File fileDirectory) { + this.repository = repository; + this.treeSync = treeSync; + validateFileDirectory(fileDirectory); + this.fileDirectory = fileDirectory; + } + + protected void validateFileDirectory(File fileDirectory) { + if (fileDirectory.exists() && fileDirectory.getName().endsWith("-sync")) { + // Validation only for avoid the user set a current folder with information for avoid loose data + throw new RuntimeException("Ensure that the folder end with '-sync' :" + fileDirectory.getName()); + } + } + + @Override + public void onEvent(EventIterator eventIterator) { + Session session = null; + try { + session = repository.login(); + + while (eventIterator.hasNext()) { + Event event = eventIterator.nextEvent(); + String nodePath = getNodePath(event); + treeSync.syncSingle( + session.getRootNode(), + session.getNode(nodePath), + getTargetLocation(event), + true); + } + } catch (RepositoryException | IOException e) { + log.error("Event Sync error: {}", e.getMessage(), e); + } finally { + if (session != null) { + session.logout(); + } + } + } + + protected String getNodePath(Event event) throws RepositoryException { + String path = event.getPath(); + if (isEventThatNeedTheParentRoot(event.getType())) { + path = path.substring(0, path.lastIndexOf("/")); + } + + return path; + } + + private File getTargetLocation(Event event) throws RepositoryException { + return Paths.get(fileDirectory.getAbsolutePath(), event.getPath()).toFile(); + } + + private static boolean isEventThatNeedTheParentRoot(int eventType) { + return Event.NODE_REMOVED == eventType + || Event.PROPERTY_CHANGED == eventType + || Event.PROPERTY_ADDED == eventType + || Event.PROPERTY_REMOVED == eventType; + } + +}