/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.configuration.internal; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import de.rcenvironment.core.utils.incubator.ServiceRegistryAccess; import de.rcenvironment.core.utils.incubator.ServiceRegistryAccessFactory; import de.rcenvironment.core.utils.incubator.ServiceRegistryPublisherAccess; /** * {@link ServiceRegistryAccessFactory} implementation that produces {@link OsgiServiceRegistryAccess} instances. * * If possible, services are acquired and registered using the {@link BundleContext} of the OSGi {@link Bundle} of the caller. If this * bundle cannot be determined, the {@link BundleContext} provided at creation is used as fallback. * * @author Robert Mischke */ public class OsgiServiceRegistryAccessFactory implements ServiceRegistryAccessFactory { private final BundleContext fallbackBundleContext; private final Log log = LogFactory.getLog(getClass()); public OsgiServiceRegistryAccessFactory(BundleContext fallbackBundleContext) { this.fallbackBundleContext = fallbackBundleContext; } @Override public ServiceRegistryAccess createAccessFor(Object caller) { // return common implementation under the restricted interface for now // TODO improve? return createPublisherAccessFor(caller); } @Override public ServiceRegistryPublisherAccess createPublisherAccessFor(Object caller) { // explicit check for a common error when using this API - misc_ro if (caller.getClass() == Class.class) { throw new IllegalArgumentException( "This argument for this method should not be the *class* of the caller (e.g. \"this.getClass()\")," + " but an arbitrary class *instance* from the caller's bundle (e.g. \"this\")"); } // TODO add caller tracking to find service leaks Bundle callerBundle = FrameworkUtil.getBundle(caller.getClass()); if (callerBundle != null) { BundleContext bundleContext = callerBundle.getBundleContext(); if (bundleContext != null) { return new OsgiServiceRegistryAccess(bundleContext); } else { log.warn("Unexpected state: Bundle " + callerBundle.getSymbolicName() + " returned a null BundleContext (using fallback); bundle state: " + callerBundle.getState()); } } else { log.warn( "Using fallback BundleContext as the containing bundle could not be identified for " + caller.getClass()); } return new OsgiServiceRegistryAccess(fallbackBundleContext); } }