/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.parametricstudy.common.internal;
import java.io.Serializable;
import java.util.List;
import org.apache.commons.logging.LogFactory;
import de.rcenvironment.components.parametricstudy.common.ParametricStudyService;
import de.rcenvironment.components.parametricstudy.common.Study;
import de.rcenvironment.components.parametricstudy.common.StudyPublisher;
import de.rcenvironment.components.parametricstudy.common.StudyReceiver;
import de.rcenvironment.components.parametricstudy.common.StudyStructure;
import de.rcenvironment.core.communication.common.ResolvableNodeId;
import de.rcenvironment.core.notification.DistributedNotificationService;
import de.rcenvironment.core.notification.Notification;
import de.rcenvironment.core.notification.NotificationService;
import de.rcenvironment.core.utils.common.StringUtils;
import de.rcenvironment.core.utils.common.rpc.RemoteOperationException;
/**
* Implementation of {@link ParametricStudyService}.
* @author Christian Weiss
*/
public class ParametricStudyServiceImpl implements ParametricStudyService {
private NotificationService notificationService;
private DistributedNotificationService distributedNotificationService;
protected void bindNotificationService(final NotificationService newNotificationService) {
notificationService = newNotificationService;
}
protected void bindDistributedNotificationService(final DistributedNotificationService newDistrNotificationService) {
distributedNotificationService = newDistrNotificationService;
}
@Override
public StudyPublisher createPublisher(final String identifier, final String title, final StudyStructure structure) {
final Study study = new Study(identifier, title, structure);
final StudyPublisher studyPublisher = new StudyPublisherImpl(study, notificationService);
final String notificationId = StringUtils.format(ParametricStudyUtils.STRUCTURE_PATTERN, study.getIdentifier());
notificationService.setBufferSize(notificationId, 1);
notificationService.send(notificationId, new Serializable[] { study.getStructure(), title});
return studyPublisher;
}
@Override
public StudyReceiver createReceiver(final String identifier, final ResolvableNodeId node) {
final String notificationId = StringUtils.format(ParametricStudyUtils.STRUCTURE_PATTERN,
identifier);
List<Notification> notifications;
try {
notifications = distributedNotificationService
.getNotifications(notificationId, node).get(notificationId);
if (notifications.size() > 0) {
final Notification studyNotification = notifications
.get(notifications.size() - 1);
final Serializable[] notificationContent = (Serializable[]) studyNotification.getBody();
final StudyStructure structure = (StudyStructure) notificationContent[0];
final String title = (String) notificationContent[1];
final Study study = new Study(identifier, title, structure);
final StudyReceiver studyReceiver = new StudyReceiverImpl(study,
node, distributedNotificationService);
return studyReceiver;
}
} catch (RemoteOperationException e) {
LogFactory.getLog(getClass()).error("Failed to get remote notifications.");
}
return null;
}
}