// Path: src/main/java/com/yet/dsync/exception/DSyncClientException.java
// public class DSyncClientException extends RuntimeException {
// 
//     private static final long serialVersionUID = 1L;
// 
//     public DSyncClientException(final String message) {
//         super(message);
//     }
// 
//     public DSyncClientException(final Throwable cause) {
//         super(cause);
//     }
// 
//     public DSyncClientException(final String message, final Throwable cause) {
//         super(message, cause);
//     }
// 
//     public DSyncClientException(final String message, final Throwable cause,
//                                 final boolean enableSuppression, final boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// 
// }


import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.yet.dsync.exception.DSyncClientException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import lombok.RequiredArgsConstructor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Comparator;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.ThreadFactory;
        return globalOperationsTracker;
    }

    /**
     * If the changeData is file, then scheduling it either in quick or slow
     * processing queue based on size.
     *
     * Otherwise, scheduling it to quick processing queue.
     *
     * @param changeData
     *            Change data object that needs to be scheduled for processing
     */
    public void scheduleProcessing(final T changeData) {
        final String pathLower = extractPathLower(changeData);

        if (globalOperationsTracker.isTracked(pathLower)) {
            LOG.debug("Path is already tracked. Skip: {}", () -> pathLower);
        } else {
            try {
                if (isFile(changeData)) {
                    final long size = getFileSize(changeData);
                    if (size > SLOW_THRESHOLD) {
                        slowProcessingQueue.put(changeData);
                    } else {
                        quickProcessingQueue.put(changeData);
                    }
                } else {
                    quickProcessingQueue.put(changeData);
                }
            } catch (final Exception ex) {
// Path: src/main/java/com/yet/dsync/exception/DSyncClientException.java
// public class DSyncClientException extends RuntimeException {
// 
//     private static final long serialVersionUID = 1L;
// 
//     public DSyncClientException(final String message) {
//         super(message);
//     }
// 
//     public DSyncClientException(final Throwable cause) {
//         super(cause);
//     }
// 
//     public DSyncClientException(final String message, final Throwable cause) {
//         super(message, cause);
//     }
// 
//     public DSyncClientException(final String message, final Throwable cause,
//                                 final boolean enableSuppression, final boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// 
// }


// Path: src/main/java/com/yet/dsync/service/AbstractChangeProcessingService.java
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.yet.dsync.exception.DSyncClientException;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import lombok.RequiredArgsConstructor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Comparator;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.ThreadFactory;

        return globalOperationsTracker;
    }

    /**
     * If the changeData is file, then scheduling it either in quick or slow
     * processing queue based on size.
     *
     * Otherwise, scheduling it to quick processing queue.
     *
     * @param changeData
     *            Change data object that needs to be scheduled for processing
     */
    public void scheduleProcessing(final T changeData) {
        final String pathLower = extractPathLower(changeData);

        if (globalOperationsTracker.isTracked(pathLower)) {
            LOG.debug("Path is already tracked. Skip: {}", () -> pathLower);
        } else {
            try {
                if (isFile(changeData)) {
                    final long size = getFileSize(changeData);
                    if (size > SLOW_THRESHOLD) {
                        slowProcessingQueue.put(changeData);
                    } else {
                        quickProcessingQueue.put(changeData);
                    }
                } else {
                    quickProcessingQueue.put(changeData);
                }
            } catch (final Exception ex) {
                throw new DSyncClientException(ex);