/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.parametricstudy.common.internal;
import java.util.List;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.components.parametricstudy.common.Study;
import de.rcenvironment.components.parametricstudy.common.StudyPublisher;
import de.rcenvironment.components.parametricstudy.common.StudyReceiver;
import de.rcenvironment.core.communication.common.ResolvableNodeId;
import de.rcenvironment.core.notification.DistributedNotificationService;
import de.rcenvironment.core.notification.Notification;
import de.rcenvironment.core.notification.NotificationSubscriber;
import de.rcenvironment.core.utils.common.rpc.RemoteOperationException;
/**
* Implementation of {@link StudyReceiver}.
*
* @author Christian Weiss.
*/
public final class StudyReceiverImpl implements StudyReceiver {
private static final long serialVersionUID = -6079120096252508794L;
private static final int MINUS_ONE = -1;
private final Study study;
private final ResolvableNodeId platform;
private NotificationSubscriber notificationSubscriber;
private DistributedNotificationService notificationService;
public StudyReceiverImpl(final Study study, final ResolvableNodeId platform,
DistributedNotificationService notificationService) {
this.study = study;
this.platform = platform;
this.notificationService = notificationService;
}
@Override
public Study getStudy() {
return study;
}
@Override
public void setNotificationSubscriber(final NotificationSubscriber notificationSubscriber) {
this.notificationSubscriber = notificationSubscriber;
}
@Override
public void initialize() {
final String notificationId = ParametricStudyUtils.createDataIdentifier(study);
Long missedNumber;
try {
missedNumber = notificationService.subscribe(
notificationId, notificationSubscriber, platform).get(notificationId);
} catch (RemoteOperationException e) {
LogFactory.getLog(getClass()).error("Failed to subscribe for Parametric Study data source: " + e.getMessage());
return; // preserve the "old" RTE behavior for now
}
// process missed notifications
if (missedNumber > MINUS_ONE) {
if (missedNumber > StudyPublisher.BUFFER_SIZE - 1) {
missedNumber = new Long(StudyPublisher.BUFFER_SIZE - 1);
}
try {
final List<Notification> missedNotifications = notificationService
.getNotifications(notificationId, platform)
.get(notificationId)
.subList(0, missedNumber.intValue() + 1);
notificationSubscriber.receiveBatchedNotifications(missedNotifications);
} catch (RemoteOperationException e) {
LogFactory.getLog(getClass()).warn("Failed to send notifications: " + e.toString());
}
}
}
}