/*******************************************************************************
* Copyright (c) 2008, 2014 Stuart McCulloch
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Stuart McCulloch - initial API and implementation
*******************************************************************************/
package org.eclipse.sisu.peaberry.osgi;
import org.eclipse.sisu.peaberry.BundleScoped;
import org.eclipse.sisu.peaberry.ServiceRegistry;
import org.eclipse.sisu.peaberry.cache.CachingServiceRegistry;
import org.eclipse.sisu.peaberry.cache.Chain;
import org.eclipse.sisu.peaberry.cache.RegistryChain;
import org.osgi.framework.BundleContext;
import com.google.inject.AbstractModule;
import com.google.inject.Module;
/**
* OSGi specific Guice binding {@link Module}.
*
* @author mcculls@gmail.com (Stuart McCulloch)
*/
public final class OSGiModule
extends AbstractModule {
private final BundleContext bundleContext;
private final ServiceRegistry[] registries;
public OSGiModule(final BundleContext bundleContext, final ServiceRegistry... registries) {
if (null == bundleContext) {
throw new IllegalArgumentException("null bundle context");
}
this.bundleContext = bundleContext;
this.registries = registries;
}
public OSGiModule(final ServiceRegistry... registries) {
this.bundleContext = null;
this.registries = registries;
}
@Override
protected void configure() {
if (bundleContext != null) {
bind(BundleContext.class).toInstance(bundleContext);
}
bindScope(BundleScoped.class, new BundleScopeImpl(getProvider(BundleContext.class)));
if (registries.length == 0) {
bind(ServiceRegistry.class).to(CachingServiceRegistry.class);
} else {
bind(ServiceRegistry.class).annotatedWith(Chain.class).to(CachingServiceRegistry.class);
bind(ServiceRegistry[].class).annotatedWith(Chain.class).toInstance(registries);
bind(ServiceRegistry.class).to(RegistryChain.class);
}
// the binding key class will be used as the bundle-scoped service API
bind(CachingServiceRegistry.class).to(OSGiServiceRegistry.class).in(BundleScoped.class);
}
}