package org.jvalue.ods.notifications; import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.inject.Inject; import org.jvalue.commons.utils.Cache; import org.jvalue.commons.utils.Log; import org.jvalue.ods.api.notifications.Client; import org.jvalue.ods.api.sources.DataSource; import org.jvalue.ods.data.AbstractDataSourcePropertyManager; import org.jvalue.ods.db.DataRepository; import org.jvalue.ods.db.NotificationClientRepository; import org.jvalue.ods.db.RepositoryFactory; import org.jvalue.ods.notifications.sender.Sender; import org.jvalue.ods.notifications.sender.SenderCache; import org.jvalue.ods.notifications.sender.SenderResult; public final class NotificationManager extends AbstractDataSourcePropertyManager<Client, NotificationClientRepository> implements DataSink { private final SenderCache senderCache; @Inject NotificationManager( Cache<NotificationClientRepository> repositoryCache, RepositoryFactory repositoryFactory, SenderCache senderCache) { super(repositoryCache, repositoryFactory); this.senderCache = senderCache; } @Override public void onNewDataStart(DataSource source) { for (Client client : getAll(source)) { senderCache.get(source, client).onNewDataStart(); } } @Override public void onNewDataItem(DataSource source, ObjectNode data) { for (Client client : getAll(source)) { senderCache.get(source, client).onNewDataItem(data); } } @Override public void onNewDataComplete(DataSource source) { for (Client client : getAll(source)) { Sender<?> sender = senderCache.get(source, client); senderCache.release(source, client); sender.onNewDataComplete(); SenderResult result = sender.getSenderResult(); switch(result.getStatus()) { case SUCCESS: break; case ERROR: String errorMsg = "Failed to send notification to client " + client.getId(); if (result.getErrorCause() != null) errorMsg = errorMsg + " (" + result.getErrorCause().getMessage() + ")"; if (result.getErrorMsg() != null) errorMsg = errorMsg + " (" + result.getErrorMsg() + ")"; Log.error(errorMsg); break; case REMOVE_CLIENT: Log.info("Unregistering client " + result.getOldClient().getId()); remove(source, null, result.getOldClient()); break; case UPDATE_CLIENT: Log.info("Updating client id to " + result.getNewClient().getId()); remove(source, null, result.getOldClient()); add(source, null, result.getNewClient()); break; } } } @Override protected void doAdd(DataSource source, DataRepository dataRepository, Client client) { } @Override protected void doRemove(DataSource source, DataRepository dataRepository, Client client) { } @Override protected void doRemoveAll(DataSource source) { } @Override protected NotificationClientRepository createNewRepository(String sourceId, RepositoryFactory repositoryFactory) { return repositoryFactory.createNotificationClientRepository(sourceId); } }