/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.datamanagement.internal;
import java.net.URI;
import org.apache.commons.logging.Log;
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.configuration.ConfigurationService;
import de.rcenvironment.core.datamanagement.backend.DataBackend;
import de.rcenvironment.core.datamanagement.backend.MetaDataBackendService;
import de.rcenvironment.core.utils.common.ServiceUtils;
/**
* Utility class returning backend services.
*
* @author Doreen Seider
* @author Juergen Klein
*/
public final class BackendSupport {
private static final String CLOSE_BRACKET = ")";
private static final String OPEN_BRACKET = "(";
private static final String EQUALS_SIGN = "=";
private static final Log LOGGER = LogFactory.getLog(BackendSupport.class);
private static DataManagementConfiguration dmConfig;
private static BundleContext bundleContext;
private static ConfigurationService configurationService;
private static DataBackend dataBackendService;
protected void activate(BundleContext context) {
bundleContext = context;
// note: disabled for 6.0.0 because at this point, there are no alternative providers anyway
// dmConfig = configurationService.getConfiguration(context.getBundle().getSymbolicName(), DataManagementConfiguration.class);
// TODO using default values until reworked or removed
dmConfig = new DataManagementConfiguration();
}
protected void bindConfigurationService(ConfigurationService newConfigurationService) {
configurationService = newConfigurationService;
}
protected void unbindConfigurationService(ConfigurationService oldConfigurationService) {
configurationService = ServiceUtils.createFailingServiceProxy(ConfigurationService.class);
}
protected void bindDataBackendService(DataBackend newDataBackendService) {
dataBackendService = newDataBackendService;
}
/**
* @return the configured {@link MetaDataBackendService} to use.
*/
public static MetaDataBackendService getMetaDataBackend() {
String metadataProvider = dmConfig.getMetaDataBackend();
MetaDataBackendService metaDataBackend = null;
String filterString = OPEN_BRACKET + MetaDataBackendService.PROVIDER + EQUALS_SIGN + metadataProvider + CLOSE_BRACKET;
ServiceReference<?>[] serviceReferences = null;
try {
serviceReferences = bundleContext.getServiceReferences(MetaDataBackendService.class.getName(), filterString);
} catch (InvalidSyntaxException e) {
LOGGER.error("Failed to get a metadata backend. Invalid protocol filter syntax.");
}
if (serviceReferences != null && serviceReferences.length > 0) {
metaDataBackend = (MetaDataBackendService) bundleContext.getService(serviceReferences[0]);
if (metaDataBackend == null) {
throw new IllegalStateException("The configured metadata backend is not available: " + metadataProvider);
}
} else {
throw new IllegalStateException("The configured metadata backend is not available: " + metadataProvider);
}
return metaDataBackend;
}
/**
* @param dataURI The {@link URI} of the data the {@link DataBackend} should handle.
* @return the configured {@link DataBackend} responsible handling the given {@link URI}.
*/
public static DataBackend getDataBackend(URI dataURI) {
String scheme = dataURI.getScheme();
DataBackend dataBackend = null;
String filterString = OPEN_BRACKET + DataBackend.SCHEME + EQUALS_SIGN + scheme + CLOSE_BRACKET;
ServiceReference<?>[] serviceReferences = null;
try {
serviceReferences = bundleContext.getServiceReferences(DataBackend.class.getName(), filterString);
} catch (InvalidSyntaxException e) {
LOGGER.error("Failed to get a cdata backend. Invalid protocol filter syntax.");
}
if (serviceReferences != null && serviceReferences.length > 0) {
dataBackend = (DataBackend) bundleContext.getService(serviceReferences[0]);
if (dataBackend == null) {
throw new IllegalStateException("A data backend for this scheme is not available: " + scheme);
}
} else {
throw new IllegalStateException("A data backend for this scheme is not available: " + scheme);
}
return dataBackend;
}
/**
* @return the configured {@link DataBackend} responsible handling the given {@link DataReferenceType}.
*/
public static DataBackend getDataBackend() {
// NOTE:
// dynamic handling of file data back end removed due to issues on shutting down the data management backend
// while asynchronously deleting workflow runs. Injected data backend service instead to let osgi handle the stop order.
//
// String dataBackendProvider = null;
//
// dataBackendProvider = dmConfig.getFileDataBackend();
//
// DataBackend dataBackend = null;
// String filterString = OPEN_BRACKET + DataBackend.PROVIDER + EQUALS_SIGN + dataBackendProvider + CLOSE_BRACKET;
// ServiceReference<?>[] serviceReferences = null;
// try {
// serviceReferences = bundleContext.getServiceReferences(DataBackend.class.getName(), filterString);
// } catch (InvalidSyntaxException e) {
// LOGGER.error("Failed to get a data backend. Invalid protocol filter syntax.");
// }
// if (serviceReferences != null && serviceReferences.length > 0) {
// dataBackend = (DataBackend) bundleContext.getService(serviceReferences[0]);
// if (dataBackend == null) {
// throw new IllegalStateException("The configured data backend is not available: " + dataBackendProvider);
// }
// } else {
// throw new IllegalStateException("The configured data backend is not available: " + dataBackendProvider);
// }
return dataBackendService;
}
}