blob: d30c9664dd51533225b1cc08ec20602040d761d1 [file] [log] [blame]
//package org.eclipse.mdm.api.odsadapter.notification.avalon;
//
//import java.util.Arrays;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.Set;
//import java.util.concurrent.Executors;
//import java.util.concurrent.ScheduledExecutorService;
//import java.util.concurrent.ScheduledFuture;
//import java.util.concurrent.TimeUnit;
//import java.util.stream.Collectors;
//
//import org.asam.ods.T_LONGLONG;
//import org.eclipse.mdm.api.base.adapter.EntityType;
//import org.eclipse.mdm.api.base.model.ContextComponent;
//import org.eclipse.mdm.api.base.model.ContextDescribable;
//import org.eclipse.mdm.api.base.model.ContextRoot;
//import org.eclipse.mdm.api.base.model.User;
//import org.eclipse.mdm.api.base.notification.NotificationException;
//import org.eclipse.mdm.api.base.notification.NotificationFilter;
//import org.eclipse.mdm.api.base.notification.NotificationFilter.ModificationType;
//import org.eclipse.mdm.api.base.notification.NotificationListener;
//import org.eclipse.mdm.api.base.notification.NotificationService;
//import org.eclipse.mdm.api.base.query.DataAccessException;
//import org.eclipse.mdm.api.base.query.QueryService;
//import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig.Key;
//import org.eclipse.mdm.api.odsadapter.notification.NotificationEntityLoader;
//import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
//import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
//import org.omg.CORBA.ORB;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import com.highqsoft.avalonCorbaNotification.notification.MODE_DELETE;
//import com.highqsoft.avalonCorbaNotification.notification.MODE_INSERT;
//import com.highqsoft.avalonCorbaNotification.notification.MODE_MODIFYRIGHTS;
//import com.highqsoft.avalonCorbaNotification.notification.MODE_REPLACE;
//
///**
// * Notification manager for handling notifications from the Avalon Notification
// * Service
// *
// * ModificationType.MODEL_MODIFIED is not supported!
// *
// * @since 1.0.0
// * @author Matthias Koller, Peak Solution GmbH
// *
// */
//public class AvalonNotificationManager implements NotificationService {
//
// private static final Logger LOGGER = LoggerFactory.getLogger(AvalonNotificationManager.class);
//
// private final Map<String, EventProcessor> eventProcessors = new HashMap<>();
//
// private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
//
// private final ODSModelManager modelManager;
// private final String serviceName;
// private final String nameServiceURL;
// private long pollingInterval = 500L;
// private final NotificationEntityLoader loader;
//
// private final ORB orb = ORB.init(new String[] {}, System.getProperties());
//
// /**
// * Creates a new AvalonNotificationManager.
// *
// * @param modelManager
// * ODSModelManager used to laod entities.
// * @param serviceName
// * name of the notification service.
// * @param nameServiceURL
// * URL of the name service.
// * @param loadContextDescribable
// * if true, notifications for {@link ContextRoot} and
// * {@link ContextComponent} will load their parent
// * {@link ContextDescribable}.
// * @param pollingInterval
// * polling interval in milleseconds
// */
// public AvalonNotificationManager(ODSModelManager modelManager, QueryService queryService, String serviceName, String nameServiceURL,
// boolean loadContextDescribable, long pollingInterval) {
// this.modelManager = modelManager;
// this.serviceName = serviceName;
// this.nameServiceURL = nameServiceURL;
// this.pollingInterval = pollingInterval;
// loader = new NotificationEntityLoader(modelManager, queryService, loadContextDescribable);
// }
//
// @Override
// public void register(String registration, NotificationFilter filter, final NotificationListener listener)
// throws NotificationException {
// try {
// EventProcessor consumer = new EventProcessor(orb, listener, this, nameServiceURL, serviceName);
//
// List<String> aids = filter.getEntityTypes().stream().map(e -> e.getId()).collect(Collectors.toList());
//
// Set<ModificationType> modes = filter.getTypes().stream()
// .filter(m -> !ModificationType.MODEL_MODIFIED.equals(m)).collect(Collectors.toSet());
//
// consumer.connect();
// consumer.setFilter(aids, modes);
//
// ScheduledFuture<?> future = executor.scheduleAtFixedRate(consumer, 0, pollingInterval,
// TimeUnit.MILLISECONDS);
// consumer.setFuture(future);
//
// eventProcessors.put(registration, consumer);
// } catch (Exception e) {
// throw new NotificationException("Exception creating notification listener registration!", e);
// }
// }
//
// @Override
// public void deregister(String registration) {
// EventProcessor processor = eventProcessors.get(registration);
// if (processor != null) {
// processor.disconnect();
// eventProcessors.remove(registration);
// }
// }
//
// @Override
// public void close(boolean isDeregisterAll) throws NotificationException {
// LOGGER.info("Closing NotificationManager...");
//
// for (String registration : eventProcessors.keySet()) {
// LOGGER.debug("Disconnecting registration '" + registration + "'.");
// deregister(registration);
// }
//
// try {
// executor.shutdown();
// boolean terminated = executor.awaitTermination(10, TimeUnit.SECONDS);
// if (!terminated) {
// throw new NotificationException("Could not close all registrations!");
// }
// } catch (InterruptedException e) {
// throw new NotificationException("Could not close all registrations!", e);
// }
// }
//
// void processException(Exception e) {
// LOGGER.error("Exception during notification processing!", e);
// }
//
// void processNotification(short mode, T_LONGLONG aeId, T_LONGLONG ieId, T_LONGLONG userId, String timestamp,
// NotificationListener notificationListener) {
//
// try {
// User user = loader.load(new Key<>(User.class), Long.toString(ODSConverter.fromODSLong(userId)));
// LOGGER.debug("User loaded");
//
// EntityType entityType = modelManager.getEntityTypeById(Long.toString(ODSConverter.fromODSLong(aeId)));
// List<String> ids = Arrays.asList(Long.toString(ODSConverter.fromODSLong(ieId)));
//
// if (LOGGER.isTraceEnabled()) {
// LOGGER.trace("Notification event with: entityType=" + entityType + ", user=" + user);
// }
//
// switch (mode) {
// case MODE_INSERT.value:
// notificationListener.instanceCreated(loader.loadEntities(entityType, ids), user);
// break;
// case MODE_REPLACE.value:
// notificationListener.instanceModified(loader.loadEntities(entityType, ids), user);
// break;
// case MODE_DELETE.value:
// notificationListener.instanceDeleted(entityType, ids, user);
// break;
// case MODE_MODIFYRIGHTS.value:
// notificationListener.securityModified(entityType, ids, user);
// break;
// default:
// processException(new NotificationException("Invalid notification type!"));
// }
// } catch (DataAccessException e) {
// processException(new NotificationException("Cannot load data for notification!", e));
// }
// }
//}