package net.mms_projects.copy_it; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Executor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import net.mms_projects.copy_it.sync_services.PullServiceInterface; import net.mms_projects.copy_it.sync_services.PushServiceInterface; public class SyncManager implements PushServiceInterface, PullServiceInterface, PollingServiceInterface, SyncListener { private Map<String, PushServiceInterface> pushServices = new HashMap<String, PushServiceInterface>(); private Map<String, PullServiceInterface> pullServices = new HashMap<String, PullServiceInterface>(); private Map<String, PollingServiceInterface> pullingServices = new HashMap<String, PollingServiceInterface>(); private String pushService; private String pullService; private String pullingService; private List<SyncListener> listeners = new ArrayList<SyncListener>(); private Executor executor; private final Logger log = LoggerFactory.getLogger(this.getClass()); public void addPushService(PushServiceInterface service) { if (this.executor == null) { log.error("Before adding a service please define a executor"); return; } service.setExecutor(executor); this.pushServices.put(service.getServiceName(), service); if (this.pushService == null) { this.pushService = service.getServiceName(); this.pushServices.get(this.pushService).activatePush(); } } public void addPullService(PullServiceInterface service) { if (this.executor == null) { log.error("Before adding a service please define a executor"); return; } service.setExecutor(executor); this.pullServices.put(service.getServiceName(), service); if (this.pullService == null) { this.pullService = service.getServiceName(); this.pullServices.get(this.pullService).activatePull(); } } public void addPullingService(PollingServiceInterface service) { if (this.executor == null) { log.error("Before adding a service please define a executor"); return; } service.setExecutor(executor); this.pullingServices.put(service.getServiceName(), service); if (this.pullingService == null) { this.pullingService = service.getServiceName(); this.pullingServices.get(this.pullingService).activatePolling(); } } public void addListener(SyncListener listener) { this.listeners.add(listener); } public void setPushService(String service) { if (!this.pushServices.containsKey(service)) { return; } this.deactivatePush(); this.pushService = service; this.activatePush(); } public void setPullService(String service) { if (!this.pullServices.containsKey(service)) { return; } this.deactivatePull(); this.pullService = service; this.activatePull(); } public void setPullingService(String service) { if (!this.pullingServices.containsKey(service)) { return; } this.deactivatePolling(); this.pullingService = service; this.activatePolling(); } @Deprecated @Override public void updateRemoteContentAsync(String content, Date date) { if (this.pushServices.isEmpty()) { return; } if (!this.pushServices.containsKey(this.pushService)) { return; } this.pushServices.get(this.pushService).updateRemoteContentAsync(content, date); } @Override public void setRemoteContent(String content, Date date) { if (this.pushServices.isEmpty()) { return; } if (!this.pushServices.containsKey(this.pushService)) { return; } this.pushServices.get(this.pushService).setRemoteContent(content, date); } @Deprecated @Override public void requestRemoteContentAsync() { if (this.pullServices.isEmpty()) { return; } if (!this.pullServices.containsKey(this.pullService)) { return; } this.pullServices.get(this.pullService).requestRemoteContentAsync(); } @Override public String getRemoteContent() { if (this.pullServices.isEmpty()) { return null; } if (!this.pullServices.containsKey(this.pullService)) { return null; } return this.pullServices.get(this.pullService).getRemoteContent(); } @Override public void onRemoteContentChange(String content, Date date) { for (SyncListener listener : this.listeners) { listener.onRemoteContentChange(content, date); } } @Override public String getServiceName() { return "manager"; } @Override public void setExecutor(Executor executor) { this.executor = executor; for (ServiceInterface service : this.pushServices.values()) { service.setExecutor(executor); } for (ServiceInterface service : this.pullServices.values()) { service.setExecutor(executor); } for (ServiceInterface service : this.pullingServices.values()) { service.setExecutor(executor); } } @Override public Executor getExecutor() { return this.executor; } @Override public void activatePush() { if (!this.isPushActivated()) { this.pushServices.get(this.pushService).activatePush(); } } @Override public void deactivatePush() { if (this.isPushActivated()) { this.pushServices.get(this.pushService).deactivatePush(); } } @Override public boolean isPushActivated() { return this.pushServices.get(this.pushService).isPushActivated(); } @Override public void activatePull() { if (!isPullActivated()) { this.pullServices.get(this.pullService).activatePull(); } } @Override public void deactivatePull() { if (isPullActivated()) { this.pullServices.get(this.pullService).deactivatePull(); } } @Override public boolean isPullActivated() { return this.pullServices.get(this.pullService).isPullActivated(); } @Override public void activatePolling() { if (!isPollingActivated()) { this.pullingServices.get(this.pullingService).activatePolling(); } } @Override public void deactivatePolling() { if (isPollingActivated()) { this.pullingServices.get(this.pullingService).deactivatePolling(); } } @Override public boolean isPollingActivated() { return this.pullingServices.get(this.pullingService) .isPollingActivated(); } }