/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.component.execution.internal; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.LogFactory; import org.osgi.framework.BundleContext; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; import de.rcenvironment.core.component.execution.api.ExecutionConstants; import de.rcenvironment.core.component.execution.api.ExecutionController; import de.rcenvironment.core.component.execution.api.ExecutionControllerException; import de.rcenvironment.core.component.execution.api.LocalExecutionControllerUtilsService; import de.rcenvironment.core.utils.common.StringUtils; /** * Implementation of {@link LocalExecutionControllerUtilsService}. * * @author Doreen Seider */ public class LocalExecutionControllerUtilsServiceImpl implements LocalExecutionControllerUtilsService { @Override public <T extends ExecutionController> T getExecutionController(Class<T> controllerInterface, String executionId, BundleContext bundleContext) throws ExecutionControllerException { String filter = createPropertyFilter(executionId); try { ServiceReference<?>[] serviceReferences = bundleContext.getServiceReferences(controllerInterface.getName(), filter); if (serviceReferences != null) { for (ServiceReference<?> ref : serviceReferences) { ExecutionController exeCtrl = (ExecutionController) bundleContext.getService(ref); if (exeCtrl != null) { return (T) exeCtrl; } } } } catch (InvalidSyntaxException e) { // should not happen LogFactory.getLog(LocalExecutionControllerUtilsServiceImpl.class).error(StringUtils.format("Filter '%s' is not valid", filter)); } catch (IllegalStateException e) { // TODO change this once "graceful shutdown" is implemented; then it is an error at any time LogFactory.getLog(LocalExecutionControllerUtilsServiceImpl.class).warn( "The software bundle providing this workflow component is unavailable; " + "if this happens at any other time than shutdown, it is an error", e); } throw new ExecutionControllerException(StringUtils.format("Component or workflow (%s) " + "(more precisely its execution controller) does not exist (anymore)", executionId)); } private static String createPropertyFilter(String executionId) { return StringUtils.format("(%s=%s)", ExecutionConstants.EXECUTION_ID_OSGI_PROP_KEY, executionId); } @Override public <T extends ExecutionController> Map<String, T> getExecutionControllers(Class<T> controllerInterface, BundleContext bundleContext) { Map<String, T> exeControllers = new HashMap<>(); String filter = null; try { ServiceReference<?>[] serviceReferences = bundleContext.getServiceReferences(controllerInterface.getName(), filter); if (serviceReferences != null) { for (ServiceReference<?> serviceRef : serviceReferences) { exeControllers.put((String) serviceRef.getProperty(ExecutionConstants.EXECUTION_ID_OSGI_PROP_KEY), (T) bundleContext.getService(serviceRef)); } } } catch (InvalidSyntaxException e) { // should not happen as filter is null LogFactory.getLog(LocalExecutionControllerUtilsServiceImpl.class).error(StringUtils.format("Unexpected error"), e); } return exeControllers; } }