com.liferay.sync.engine.file.system.SyncWatchEventProcessor.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.sync.engine.file.system.SyncWatchEventProcessor.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.sync.engine.file.system;

import com.liferay.sync.engine.SyncEngine;
import com.liferay.sync.engine.document.library.event.Event;
import com.liferay.sync.engine.document.library.util.BatchEventManager;
import com.liferay.sync.engine.document.library.util.FileEventManager;
import com.liferay.sync.engine.document.library.util.FileEventUtil;
import com.liferay.sync.engine.document.library.util.comparator.SyncWatchEventComparator;
import com.liferay.sync.engine.model.SyncAccount;
import com.liferay.sync.engine.model.SyncFile;
import com.liferay.sync.engine.model.SyncFileModelListener;
import com.liferay.sync.engine.model.SyncSite;
import com.liferay.sync.engine.model.SyncWatchEvent;
import com.liferay.sync.engine.service.SyncAccountService;
import com.liferay.sync.engine.service.SyncFileService;
import com.liferay.sync.engine.service.SyncSiteService;
import com.liferay.sync.engine.service.SyncWatchEventService;
import com.liferay.sync.engine.util.FileKeyUtil;
import com.liferay.sync.engine.util.FileUtil;
import com.liferay.sync.engine.util.OSDetector;
import com.liferay.sync.engine.util.SyncEngineUtil;

import java.nio.file.Files;
import java.nio.file.LinkOption;
import java.nio.file.Path;
import java.nio.file.Paths;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;

import org.apache.commons.io.FilenameUtils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author Michael Young
 */
public class SyncWatchEventProcessor implements Runnable {

    public SyncWatchEventProcessor(long syncAccountId) {
        _syncAccountId = syncAccountId;

        SyncFileModelListener syncFileModelListener = new SyncFileModelListener() {

            @Override
            public void onRemove(SyncFile syncFile) {
                _dependentSyncWatchEventsMaps.remove(syncFile.getFilePathName());

                _pendingTypePKSyncFileIds.remove(syncFile.getTypePK());
            }

            @Override
            public void onUpdate(SyncFile syncFile, Map<String, Object> originalValues) {

                if ((syncFile.getSyncAccountId() != _syncAccountId) || (syncFile.getTypePK() == 0)
                        || (!originalValues.containsKey("state") && !originalValues.containsKey("typePK"))) {

                    return;
                }

                List<SyncWatchEvent> syncWatchEvents = _dependentSyncWatchEventsMaps
                        .remove(syncFile.getFilePathName());

                if (syncWatchEvents == null) {
                    return;
                }

                if (syncFile.getTypePK() > 0) {
                    _pendingTypePKSyncFileIds.remove(syncFile.getSyncFileId());
                }

                for (SyncWatchEvent syncWatchEvent : syncWatchEvents) {
                    try {
                        if (_logger.isDebugEnabled()) {
                            _logger.debug("Processing queued event {} {}", syncWatchEvent.getFilePathName(),
                                    syncWatchEvent.getEventType());
                        }

                        processSyncWatchEvent(syncWatchEvent);
                    } catch (Exception e) {
                        _logger.error(e.getMessage(), e);
                    }
                }
            }

        };

        SyncFileService.registerModelListener(syncFileModelListener);
    }

    public boolean isInProgress() {
        if (SyncWatchEventService.hasSyncWatchEvents(_syncAccountId)
                || SyncFileService.hasSyncFiles(_syncAccountId, SyncFile.UI_EVENT_DOWNLOADING)
                || SyncFileService.hasSyncFiles(_syncAccountId, SyncFile.UI_EVENT_UPLOADING)) {

            return true;
        }

        return false;
    }

    @Override
    public void run() {
        try {
            SyncAccount syncAccount = SyncAccountService.fetchSyncAccount(_syncAccountId);

            if (syncAccount.getState() != SyncAccount.STATE_CONNECTED) {
                return;
            }

            doRun();
        } catch (Exception e) {
            _logger.error(e.getMessage(), e);
        }

        BatchEventManager.fireBatchEvents();
    }

    protected void addFile(SyncWatchEvent syncWatchEvent) throws Exception {
        final Path targetFilePath = Paths.get(syncWatchEvent.getFilePathName());

        if (FileUtil.notExists(targetFilePath) || sanitizeFileName(targetFilePath)
                || isInErrorState(targetFilePath)) {

            return;
        }

        Path parentTargetFilePath = targetFilePath.getParent();

        final SyncFile parentSyncFile = SyncFileService.fetchSyncFile(parentTargetFilePath.toString());

        if ((parentSyncFile == null) || (!parentSyncFile.isSystem() && (parentSyncFile.getTypePK() == 0))) {

            queueSyncWatchEvent(parentTargetFilePath.toString(), syncWatchEvent);

            return;
        }

        SyncFile syncFile = SyncFileService.fetchSyncFile(targetFilePath.toString());

        if (syncFile == null) {
            syncFile = SyncFileService.fetchSyncFile(FileKeyUtil.getFileKey(targetFilePath));

            if (!verifySite(syncFile, parentSyncFile)) {
                syncFile = null;
            }
        }

        if (syncFile == null) {
            Runnable runnable = new Runnable() {

                @Override
                public void run() {
                    try {
                        SyncSite syncSite = SyncSiteService.fetchSyncSite(parentSyncFile.getRepositoryId(),
                                _syncAccountId);

                        if ((syncSite == null) || !syncSite.isActive() || !FileUtil.checkFilePath(targetFilePath)) {

                            return;
                        }

                        SyncFileService.addFileSyncFile(targetFilePath, parentSyncFile.getTypePK(),
                                parentSyncFile.getRepositoryId(), _syncAccountId);
                    } catch (Exception e) {
                        if (SyncFileService.fetchSyncFile(targetFilePath.toString()) == null) {

                            _logger.error(e.getMessage(), e);
                        }
                    }
                }

            };

            _executorService.execute(runnable);

            return;
        }

        Path sourceFilePath = Paths.get(syncFile.getFilePathName());

        if (targetFilePath.equals(sourceFilePath)) {
            if (isPendingTypePK(syncFile) || (syncFile.getState() == SyncFile.STATE_IN_PROGRESS)) {

                queueSyncWatchEvent(syncFile.getFilePathName(), syncWatchEvent);

                return;
            }

            if (FileUtil.isModified(syncFile)) {
                SyncFileService.updateFileSyncFile(targetFilePath, _syncAccountId, syncFile);
            }
        } else if (FileUtil.exists(sourceFilePath)) {
            try {
                if ((Files.size(targetFilePath) == 0) || FileUtil.isModified(syncFile, targetFilePath)
                        || isInErrorState(sourceFilePath)) {

                    SyncFileService.addFileSyncFile(targetFilePath, parentSyncFile.getTypePK(),
                            parentSyncFile.getRepositoryId(), _syncAccountId);
                } else {
                    SyncFileService.copySyncFile(syncFile, targetFilePath, parentSyncFile.getTypePK(),
                            parentSyncFile.getRepositoryId(), _syncAccountId);
                }
            } catch (Exception e) {
                if (SyncFileService.fetchSyncFile(targetFilePath.toString()) == null) {

                    _logger.error(e.getMessage(), e);
                }
            }

            return;
        } else if (parentTargetFilePath.equals(sourceFilePath.getParent())) {
            if (isPendingTypePK(syncFile) || (syncFile.getState() == SyncFile.STATE_IN_PROGRESS)) {

                queueSyncWatchEvent(syncFile.getFilePathName(), syncWatchEvent);

                return;
            }

            SyncFileService.updateFileSyncFile(targetFilePath, _syncAccountId, syncFile);
        } else {
            if (isPendingTypePK(syncFile) || (syncFile.getState() == SyncFile.STATE_IN_PROGRESS)) {

                queueSyncWatchEvent(syncFile.getFilePathName(), syncWatchEvent);

                return;
            }

            SyncFileService.moveFileSyncFile(targetFilePath, parentSyncFile.getTypePK(), _syncAccountId, syncFile);

            Path sourceFileNameFilePath = sourceFilePath.getFileName();

            if (!sourceFileNameFilePath.equals(targetFilePath.getFileName())) {
                SyncFileService.updateFileSyncFile(targetFilePath, _syncAccountId, syncFile);
            }
        }

        SyncAccount syncAccount = SyncAccountService.fetchSyncAccount(_syncAccountId);

        if (syncAccount.getState() == SyncAccount.STATE_CONNECTED) {
            SyncWatchEvent relatedSyncWatchEvent = SyncWatchEventService.fetchSyncWatchEvent(
                    SyncWatchEvent.EVENT_TYPE_DELETE, syncWatchEvent.getFilePathName(),
                    syncWatchEvent.getTimestamp());

            if (relatedSyncWatchEvent != null) {
                _processedSyncWatchEventIds.add(relatedSyncWatchEvent.getSyncWatchEventId());
            }
        }
    }

    protected void addFolder(SyncWatchEvent syncWatchEvent) throws Exception {
        Path targetFilePath = Paths.get(syncWatchEvent.getFilePathName());

        if (sanitizeFileName(targetFilePath) || isInErrorState(targetFilePath)) {

            return;
        }

        Path parentTargetFilePath = targetFilePath.getParent();

        SyncFile parentSyncFile = SyncFileService.fetchSyncFile(parentTargetFilePath.toString());

        if ((parentSyncFile == null) || (!parentSyncFile.isSystem() && (parentSyncFile.getTypePK() == 0))) {

            queueSyncWatchEvent(parentTargetFilePath.toString(), syncWatchEvent);

            return;
        }

        SyncFile syncFile = SyncFileService.fetchSyncFile(targetFilePath.toString());

        if (syncFile == null) {
            syncFile = SyncFileService.fetchSyncFile(FileKeyUtil.getFileKey(targetFilePath));

            if (!verifySite(syncFile, parentSyncFile)) {
                syncFile = null;
            }
        }

        if (syncFile == null) {
            SyncFileService.addFolderSyncFile(targetFilePath, parentSyncFile.getTypePK(),
                    parentSyncFile.getRepositoryId(), _syncAccountId);

            return;
        }

        Path sourceFilePath = Paths.get(syncFile.getFilePathName());

        if (targetFilePath.equals(sourceFilePath)) {
            if (isPendingTypePK(syncFile)) {
                queueSyncWatchEvent(syncFile.getFilePathName(), syncWatchEvent);

                return;
            }

            FileKeyUtil.writeFileKey(targetFilePath, String.valueOf(syncFile.getSyncFileId()), true);
        } else if (FileUtil.exists(sourceFilePath)) {
            SyncFileService.addFolderSyncFile(targetFilePath, parentSyncFile.getTypePK(),
                    parentSyncFile.getRepositoryId(), _syncAccountId);

            return;
        } else if (parentTargetFilePath.equals(sourceFilePath.getParent())) {
            if (isPendingTypePK(syncFile)) {
                queueSyncWatchEvent(syncFile.getFilePathName(), syncWatchEvent);

                return;
            }

            SyncFileService.updateFolderSyncFile(targetFilePath, _syncAccountId, syncFile);
        } else {
            if (isPendingTypePK(syncFile)) {
                queueSyncWatchEvent(syncFile.getFilePathName(), syncWatchEvent);

                return;
            }

            SyncFileService.moveFolderSyncFile(targetFilePath, parentSyncFile.getTypePK(), _syncAccountId,
                    syncFile);

            Path sourceFileNameFilePath = sourceFilePath.getFileName();

            if (!sourceFileNameFilePath.equals(targetFilePath.getFileName())) {
                SyncFileService.updateFolderSyncFile(targetFilePath, _syncAccountId, syncFile);
            }
        }

        SyncAccount syncAccount = SyncAccountService.fetchSyncAccount(_syncAccountId);

        if (syncAccount.getState() == SyncAccount.STATE_CONNECTED) {
            SyncWatchEvent relatedSyncWatchEvent = SyncWatchEventService.fetchSyncWatchEvent(
                    SyncWatchEvent.EVENT_TYPE_DELETE, syncWatchEvent.getFilePathName(),
                    syncWatchEvent.getTimestamp());

            if (relatedSyncWatchEvent != null) {
                _processedSyncWatchEventIds.add(relatedSyncWatchEvent.getSyncWatchEventId());
            }
        }
    }

    protected void deleteFile(SyncWatchEvent syncWatchEvent) throws Exception {
        Path filePath = Paths.get(syncWatchEvent.getFilePathName());

        SyncFile syncFile = SyncFileService.fetchSyncFile(filePath.toString());

        if ((syncFile == null) || !FileUtil.notExists(Paths.get(syncFile.getFilePathName()))) {

            return;
        } else if ((syncFile.getState() == SyncFile.STATE_ERROR)
                || (syncFile.getState() == SyncFile.STATE_UNSYNCED)) {

            SyncFileService.deleteSyncFile(syncFile, false);

            return;
        } else if (syncFile.getState() == SyncFile.STATE_IN_PROGRESS) {
            Set<Event> events = FileEventManager.getEvents(syncFile.getSyncFileId());

            for (Event event : events) {
                event.cancel();
            }

            if (isPendingTypePK(syncFile)) {
                SyncFileService.deleteSyncFile(syncFile);

                return;
            }
        } else if (isPendingTypePK(syncFile)) {
            queueSyncWatchEvent(syncFile.getFilePathName(), syncWatchEvent);

            return;
        }

        String type = syncFile.getType();

        if (type.equals(SyncFile.TYPE_FILE)) {
            FileEventUtil.deleteFile(_syncAccountId, syncFile);
        } else {
            FileEventUtil.deleteFolder(_syncAccountId, syncFile);
        }
    }

    protected void doRun() throws Exception {
        SyncWatchEvent lastSyncWatchEvent = SyncWatchEventService.getLastSyncWatchEvent(_syncAccountId);

        if (lastSyncWatchEvent == null) {
            return;
        }

        long delta = System.currentTimeMillis() - lastSyncWatchEvent.getTimestamp();

        if (delta <= 500) {
            SyncEngineUtil.fireSyncEngineStateChanged(_syncAccountId, SyncEngineUtil.SYNC_ENGINE_STATE_PROCESSING);

            return;
        }

        if (_logger.isTraceEnabled()) {
            _logger.trace("Processing Sync watch events");
        }

        _pendingTypePKSyncFileIds.clear();

        List<SyncWatchEvent> syncWatchEvents = SyncWatchEventService.findBySyncAccountId(_syncAccountId);

        if (OSDetector.isWindows()) {
            Collections.sort(syncWatchEvents, _syncWatchEventComparator);
        }

        for (SyncWatchEvent syncWatchEvent : syncWatchEvents) {
            processSyncWatchEvent(syncWatchEvent);
        }

        for (Map.Entry<String, List<SyncWatchEvent>> entry : _dependentSyncWatchEventsMaps.entrySet()) {

            SyncFile syncFile = SyncFileService.fetchSyncFile(entry.getKey());

            if ((syncFile != null) && (syncFile.getTypePK() > 0)) {
                for (SyncWatchEvent syncWatchEvent : entry.getValue()) {
                    processSyncWatchEvent(syncWatchEvent);
                }
            }
        }

        SyncEngineUtil.fireSyncEngineStateChanged(_syncAccountId, SyncEngineUtil.SYNC_ENGINE_STATE_PROCESSED);

        _processedSyncWatchEventIds.clear();
    }

    protected boolean isInErrorState(Path filePath) {
        while (true) {
            if (filePath == null) {
                return false;
            }

            SyncFile syncFile = SyncFileService.fetchSyncFile(filePath.toString());

            if (syncFile != null) {
                if (syncFile.isSystem()) {
                    break;
                }

                if (syncFile.getState() == SyncFile.STATE_ERROR) {
                    return true;
                }
            }

            filePath = filePath.getParent();
        }

        return false;
    }

    protected boolean isPendingTypePK(SyncFile syncFile) {
        if (_pendingTypePKSyncFileIds.contains(syncFile.getSyncFileId())) {
            return true;
        } else if (syncFile.getTypePK() == 0) {
            _pendingTypePKSyncFileIds.add(syncFile.getSyncFileId());

            return true;
        }

        return false;
    }

    protected void modifyFile(SyncWatchEvent syncWatchEvent) throws Exception {
        Path filePath = Paths.get(syncWatchEvent.getFilePathName());

        SyncFile syncFile = SyncFileService.fetchSyncFile(filePath.toString());

        if (syncFile == null) {
            return;
        } else if (isPendingTypePK(syncFile) || (syncFile.getState() == SyncFile.STATE_IN_PROGRESS)) {

            queueSyncWatchEvent(syncFile.getFilePathName(), syncWatchEvent);

            return;
        } else if (!FileUtil.isModified(syncFile)) {
            return;
        }

        SyncFileService.updateFileSyncFile(filePath, _syncAccountId, syncFile);
    }

    protected void moveFile(SyncWatchEvent syncWatchEvent) throws Exception {
        Path targetFilePath = Paths.get(syncWatchEvent.getFilePathName());

        if (FileUtil.notExists(targetFilePath) || sanitizeFileName(targetFilePath)
                || isInErrorState(targetFilePath)) {

            return;
        }

        Path parentTargetFilePath = targetFilePath.getParent();

        SyncFile parentSyncFile = SyncFileService.fetchSyncFile(parentTargetFilePath.toString());

        if ((parentSyncFile == null) || (!parentSyncFile.isSystem() && (parentSyncFile.getTypePK() == 0))) {

            queueSyncWatchEvent(parentTargetFilePath.toString(), syncWatchEvent);

            return;
        }

        Path sourceFilePath = Paths.get(syncWatchEvent.getPreviousFilePathName());

        SyncFile sourceSyncFile = SyncFileService.fetchSyncFile(sourceFilePath.toString());

        SyncFile targetSyncFile = SyncFileService.fetchSyncFile(targetFilePath.toString());

        if ((sourceSyncFile == null) || (targetSyncFile != null)) {
            if (Files.isDirectory(targetFilePath)) {
                addFolder(syncWatchEvent);
            } else {
                addFile(syncWatchEvent);
            }

            return;
        } else if (isPendingTypePK(sourceSyncFile)) {
            queueSyncWatchEvent(sourceSyncFile.getFilePathName(), syncWatchEvent);

            return;
        }

        String fileType = sourceSyncFile.getType();

        if (fileType.equals(SyncFile.TYPE_FILE)) {
            SyncFileService.moveFileSyncFile(targetFilePath, parentSyncFile.getTypePK(), _syncAccountId,
                    sourceSyncFile);
        } else {
            SyncFileService.moveFolderSyncFile(targetFilePath, parentSyncFile.getTypePK(), _syncAccountId,
                    sourceSyncFile);
        }

        renameFile(syncWatchEvent);
    }

    protected synchronized void processSyncWatchEvent(SyncWatchEvent syncWatchEvent) throws Exception {

        SyncAccount syncAccount = SyncAccountService.fetchSyncAccount(_syncAccountId);

        if (syncAccount.getState() != SyncAccount.STATE_CONNECTED) {
            return;
        }

        if (_processedSyncWatchEventIds.contains(syncWatchEvent.getSyncWatchEventId())) {

            SyncWatchEventService.deleteSyncWatchEvent(syncWatchEvent.getSyncWatchEventId());

            return;
        }

        String eventType = syncWatchEvent.getEventType();

        if (eventType.equals(SyncWatchEvent.EVENT_TYPE_RENAME_FROM)) {
            eventType = SyncWatchEvent.EVENT_TYPE_DELETE;

            syncWatchEvent.setEventType(eventType);

            SyncWatchEventService.update(syncWatchEvent);
        }

        if (_logger.isDebugEnabled()) {
            _logger.debug("Processing Sync watch event {}", syncWatchEvent.toString());
        }

        String fileType = syncWatchEvent.getFileType();

        if (eventType.equals(SyncWatchEvent.EVENT_TYPE_CREATE)) {
            if (fileType.equals(SyncFile.TYPE_FILE)) {
                SyncWatchEvent duplicateSyncWatchEvent = null;

                if (OSDetector.isApple()) {
                    duplicateSyncWatchEvent = SyncWatchEventService.fetchDuplicateSyncWatchEvent(syncWatchEvent);
                }

                if (duplicateSyncWatchEvent != null) {
                    if (_logger.isDebugEnabled()) {
                        _logger.debug("Skipping outdated Sync watch event");
                    }
                } else {
                    addFile(syncWatchEvent);
                }
            } else {
                addFolder(syncWatchEvent);
            }
        } else if (eventType.equals(SyncWatchEvent.EVENT_TYPE_DELETE)) {
            deleteFile(syncWatchEvent);
        } else if (eventType.equals(SyncWatchEvent.EVENT_TYPE_MODIFY)) {
            SyncWatchEvent duplicateSyncWatchEvent = SyncWatchEventService
                    .fetchDuplicateSyncWatchEvent(syncWatchEvent);

            if (duplicateSyncWatchEvent != null) {
                if (_logger.isDebugEnabled()) {
                    _logger.debug("Skipping outdated Sync watch event");
                }
            } else {
                if (OSDetector.isWindows()) {

                    // SYNC-1713

                    String filePathName = syncWatchEvent.getFilePathName();

                    Path filePath = Paths.get(filePathName);

                    if (FileUtil.exists(filePath)) {
                        Path realFilePath = filePath.toRealPath(LinkOption.NOFOLLOW_LINKS);

                        if (!filePathName.equals(realFilePath.toString())) {
                            syncWatchEvent.setEventType(SyncWatchEvent.EVENT_TYPE_RENAME);
                            syncWatchEvent.setFilePathName(realFilePath.toString());
                            syncWatchEvent.setPreviousFilePathName(filePathName);

                            renameFile(syncWatchEvent);
                        }

                        if (fileType.equals(SyncFile.TYPE_FILE)) {
                            modifyFile(syncWatchEvent);
                        }
                    } else {
                        modifyFile(syncWatchEvent);
                    }
                } else {
                    modifyFile(syncWatchEvent);
                }
            }
        } else if (eventType.equals(SyncWatchEvent.EVENT_TYPE_MOVE)) {
            moveFile(syncWatchEvent);
        } else if (eventType.equals(SyncWatchEvent.EVENT_TYPE_RENAME)) {
            renameFile(syncWatchEvent);
        }

        syncAccount = SyncAccountService.fetchSyncAccount(_syncAccountId);

        if (syncAccount.getState() == SyncAccount.STATE_CONNECTED) {
            SyncWatchEventService.deleteSyncWatchEvent(syncWatchEvent.getSyncWatchEventId());
        }
    }

    protected void queueSyncWatchEvent(String parentFilePathName, SyncWatchEvent syncWatchEvent) {

        List<SyncWatchEvent> syncWatchEvents = _dependentSyncWatchEventsMaps.get(parentFilePathName);

        if (syncWatchEvents == null) {
            syncWatchEvents = new ArrayList<>();

            _dependentSyncWatchEventsMaps.put(parentFilePathName, syncWatchEvents);
        } else {
            String eventType = syncWatchEvent.getEventType();
            String filePathName = syncWatchEvent.getFilePathName();

            SyncWatchEvent lastSyncWatchEvent = syncWatchEvents.get(syncWatchEvents.size() - 1);

            if (filePathName.equals(lastSyncWatchEvent.getFilePathName())
                    && eventType.equals(lastSyncWatchEvent.getEventType())) {

                return;
            }
        }

        if (_logger.isDebugEnabled()) {
            _logger.debug("Queueing event {} {}", syncWatchEvent.getEventType(), syncWatchEvent.getFilePathName());
        }

        if (!syncWatchEvents.contains(syncWatchEvent)) {
            syncWatchEvents.add(syncWatchEvent);
        }
    }

    protected void renameFile(SyncWatchEvent syncWatchEvent) throws Exception {
        Path sourceFilePath = Paths.get(syncWatchEvent.getPreviousFilePathName());

        SyncFile syncFile = SyncFileService.fetchSyncFile(sourceFilePath.toString());

        Path targetFilePath = Paths.get(syncWatchEvent.getFilePathName());

        if (sanitizeFileName(targetFilePath)) {
            return;
        }

        if (syncFile == null) {
            if (Files.isDirectory(targetFilePath)) {
                addFolder(syncWatchEvent);
            } else {
                addFile(syncWatchEvent);
            }

            return;
        } else if (isPendingTypePK(syncFile)) {
            queueSyncWatchEvent(syncFile.getFilePathName(), syncWatchEvent);

            return;
        }

        String fileType = syncFile.getType();

        if (fileType.equals(SyncFile.TYPE_FILE)) {
            SyncFileService.renameFileSyncFile(targetFilePath, _syncAccountId, syncFile);
        } else {
            SyncFileService.renameFolderSyncFile(targetFilePath, _syncAccountId, syncFile);
        }
    }

    protected boolean sanitizeFileName(Path filePath) {
        if (OSDetector.isWindows()) {
            return false;
        }

        String fileName = String.valueOf(filePath.getFileName());

        String sanitizedFileName = FileUtil.getSanitizedFileName(fileName, FilenameUtils.getExtension(fileName));

        if (!sanitizedFileName.equals(fileName)) {
            String sanitizedFilePathName = FileUtil.getFilePathName(String.valueOf(filePath.getParent()),
                    sanitizedFileName);

            sanitizedFilePathName = FileUtil.getNextFilePathName(sanitizedFilePathName);

            FileUtil.checkFilePath(filePath);

            FileUtil.moveFile(filePath, Paths.get(sanitizedFilePathName));

            return true;
        }

        return false;
    }

    protected boolean verifySite(SyncFile syncFile, SyncFile parentSyncFile) {
        if ((syncFile != null) && ((syncFile.getRepositoryId() != parentSyncFile.getRepositoryId())
                || (syncFile.getSyncAccountId() != parentSyncFile.getSyncAccountId()))) {

            return false;
        }

        return true;
    }

    private static final Logger _logger = LoggerFactory.getLogger(SyncWatchEventProcessor.class);

    private static final ExecutorService _executorService = SyncEngine.getExecutorService();
    private static final Comparator<SyncWatchEvent> _syncWatchEventComparator = new SyncWatchEventComparator();

    private final Map<String, List<SyncWatchEvent>> _dependentSyncWatchEventsMaps = new ConcurrentHashMap<>();
    private final Set<Long> _pendingTypePKSyncFileIds = new HashSet<>();
    private final Set<Long> _processedSyncWatchEventIds = new HashSet<>();
    private final long _syncAccountId;

}