/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.datamanagement.internal;
import java.util.Collection;
import org.osgi.framework.BundleContext;
import de.rcenvironment.core.communication.api.CommunicationService;
import de.rcenvironment.core.communication.api.PlatformService;
import de.rcenvironment.core.communication.common.CommunicationException;
import de.rcenvironment.core.communication.common.InstanceNodeSessionId;
import de.rcenvironment.core.communication.common.ResolvableNodeId;
import de.rcenvironment.core.communication.management.WorkflowHostService;
import de.rcenvironment.core.datamanagement.DataReferenceService;
import de.rcenvironment.core.datamanagement.RemotableMetaDataService;
import de.rcenvironment.core.datamanagement.commons.DataReference;
import de.rcenvironment.core.utils.common.StringUtils;
import de.rcenvironment.core.utils.common.rpc.RemoteOperationException;
/**
* Implementation of {@link DataReferenceServiceImpl}.
*
* @author Doreen Seider
* @author Robert Mischke (parallelized distributed query)
* @author Jan Flink
*/
public class DataReferenceServiceImpl implements DataReferenceService {
private WorkflowHostService workflowHostService;
private CommunicationService communicationService;
private PlatformService platformService;
protected void activate(BundleContext bundleContext) {}
protected void bindWorkflowHostService(WorkflowHostService newWorkflowHostService) {
workflowHostService = newWorkflowHostService;
}
protected void bindCommunicationService(CommunicationService newCommunicationService) {
communicationService = newCommunicationService;
}
protected void bindPlatformService(PlatformService newPlatformService) {
platformService = newPlatformService;
}
@Override
public DataReference getReference(String dataReferenceKey, ResolvableNodeId platform)
throws CommunicationException {
if (platform == null) {
platform = platformService.getLocalInstanceNodeSessionId();
}
try {
return getRemoteMetaDataBackendService(platform).getDataReference(dataReferenceKey);
} catch (RemoteOperationException e) {
throw new CommunicationException(StringUtils.format("Failed to get data reference from remote node @%s: ",
platform)
+ e.getMessage());
}
}
@Override
public DataReference getReference(String dataReferenceKey) throws CommunicationException {
return getReference(dataReferenceKey, workflowHostService.getWorkflowHostNodesAndSelf());
}
@Override
public DataReference getReference(String dataReferenceKey, Collection<? extends ResolvableNodeId> platforms)
throws CommunicationException {
DataReference reference = null;
for (InstanceNodeSessionId pi : workflowHostService.getWorkflowHostNodesAndSelf()) {
try {
reference = getRemoteMetaDataBackendService(pi).getDataReference(dataReferenceKey);
if (reference != null) {
break;
}
} catch (RemoteOperationException e) {
throw new CommunicationException(StringUtils.format("Failed to get data reference from remote node @%s: ",
pi)
+ e.getMessage());
}
}
return reference;
}
private RemotableMetaDataService getRemoteMetaDataBackendService(ResolvableNodeId nodeId) throws RemoteOperationException {
return (RemotableMetaDataService) communicationService.getRemotableService(RemotableMetaDataService.class, nodeId);
}
}