package ru.hflabs.rcd.task.performer.synchronization; import com.google.common.base.Function; import ru.hflabs.rcd.service.IMergeService; import ru.hflabs.rcd.service.ISingleClassObserver; import ru.hflabs.rcd.service.MergeServices; import java.util.Collection; import java.util.Collections; /** * Интерфейс <class>SynchronizeCallback</class> декларирует методы для построения истории изменения коллекции сущностей * * @param <T> класс сущности * @author Nazin Alexander */ public interface SynchronizeCallback<T> extends ISingleClassObserver<T> { /** Возвращает целевые значения */ Collection<T> getTarget(); /** Возвращает функцию для построение карты уникальных объектов */ Function<T, String> getUniqueFunction(); /** Возвращает функцию слияния старого и нового объекта */ IMergeService.Single<T> getMergeFunction(); /** * Реализует адартер для синхронизации динамических значений * * @param <T> целевой класс */ class Adapter<T> implements SynchronizeCallback<T> { /** Целевой класс */ private final Class<T> targetClass; /** Целевые значения */ private final Collection<T> target; /** Функция уникальных значений */ private final Function<T, String> uniqueFunction; /** Функция слияния */ private final IMergeService.Single<T> mergeFunction; public Adapter(Class<T> targetClass, Collection<T> target, Function<T, String> uniqueFunction, IMergeService.Single<T> mergeFunction) { this.targetClass = targetClass; this.target = target; this.uniqueFunction = uniqueFunction; this.mergeFunction = mergeFunction; } @Override public Class<T> retrieveTargetClass() { return targetClass; } @Override public Collection<T> getTarget() { return target; } @Override public Function<T, String> getUniqueFunction() { return uniqueFunction; } @Override public IMergeService.Single<T> getMergeFunction() { return mergeFunction; } } /** * Реализует адаптер для синхронизации с пустыми значениями * * @param <T> целевой класс */ final class Empty<T> extends Adapter<T> { public Empty(Class<T> targetClass, Function<T, String> uniqueFunction) { super(targetClass, Collections.<T>emptyList(), uniqueFunction, MergeServices.<T>dummy()); } } }