/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.mock;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Dictionary;
import java.util.LinkedHashSet;
import java.util.Properties;
import java.util.Set;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
import org.osgi.framework.BundleListener;
import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
import org.osgi.framework.FrameworkListener;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
/**
* BundleContext mock.
*
* <p/>
* Can be configured to use a predefined Bundle or/and configuration. By
* default, will create an internal MockBundle. Most of the operations are no-op
* (as anonymous classes with specific functionality can be created per use
* basis).
*
* @author Costin Leau
*
*/
public class MockBundleContext implements BundleContext {
public static final Properties DEFAULT_PROPERTIES = new DefaultBundleContextProperties();
private Bundle bundle;
private Properties properties;
protected Set serviceListeners, bundleListeners;
/**
* Constructs a new <code>MockBundleContext</code> instance. The associated
* bundle will be created automatically.
*/
public MockBundleContext() {
this(null, null);
}
/**
* Constructs a new <code>MockBundleContext</code> instance.
*
* @param bundle associated bundle
*/
public MockBundleContext(Bundle bundle) {
this(bundle, null);
}
/**
* Constructs a new <code>MockBundleContext</code> instance allowing both
* the bundle and the context properties to be specified.
*
* @param bundle associated bundle
* @param props context properties
*/
public MockBundleContext(Bundle bundle, Properties props) {
this.bundle = (bundle == null ? new MockBundle(this) : bundle);
properties = new Properties(DEFAULT_PROPERTIES);
if (props != null)
properties.putAll(props);
// make sure the order is preserved
this.serviceListeners = new LinkedHashSet(2);
this.bundleListeners = new LinkedHashSet(2);
}
public void addBundleListener(BundleListener listener) {
bundleListeners.add(listener);
}
public void addFrameworkListener(FrameworkListener listener) {
}
public void addServiceListener(ServiceListener listener) {
try {
addServiceListener(listener, null);
}
catch (InvalidSyntaxException ex) {
throw new IllegalStateException("exception should not occur");
}
}
public void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException {
if (listener == null)
throw new IllegalArgumentException("non-null listener required");
this.serviceListeners.add(listener);
}
public Filter createFilter(String filter) throws InvalidSyntaxException {
return new MockFilter(filter);
}
public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
return new ServiceReference[] {};
}
public Bundle getBundle() {
return bundle;
}
public Bundle getBundle(long id) {
return bundle;
}
public Bundle[] getBundles() {
return new Bundle[] { bundle };
}
public File getDataFile(String filename) {
return null;
}
public String getProperty(String key) {
return properties.getProperty(key);
}
public Object getService(ServiceReference reference) {
return new Object();
}
public ServiceReference getServiceReference(String clazz) {
return new MockServiceReference(getBundle(), new String[] { clazz });
}
public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
// Some jiggery-pokery to get round the fact that we don't ever use the
// clazz
if (clazz == null)
if (filter != null) {
// flatten filter since the constants might be case insensitive
String flattenFilter = filter.toLowerCase();
int i = flattenFilter.indexOf(Constants.OBJECTCLASS.toLowerCase() + "=");
if (i > 0) {
clazz = filter.substring(i + Constants.OBJECTCLASS.length() + 1);
clazz = clazz.substring(0, clazz.indexOf(")"));
}
}
else
clazz = Object.class.getName();
return new ServiceReference[] { new MockServiceReference(getBundle(), new String[] { clazz }) };
}
public Bundle installBundle(String location) throws BundleException {
MockBundle bundle = new MockBundle();
bundle.setLocation(location);
return bundle;
}
public Bundle installBundle(String location, InputStream input) throws BundleException {
try {
input.close();
}
catch (IOException ex) {
throw new BundleException("cannot close stream", ex);
}
return installBundle(location);
}
public ServiceRegistration registerService(String[] clazzes, Object service, Dictionary properties) {
MockServiceRegistration reg = new MockServiceRegistration(properties);
// disabled for now
// MockServiceReference ref = new MockServiceReference(this.bundle,
// properties, reg, clazzes);
// ServiceEvent event = new ServiceEvent(ServiceEvent.REGISTERED, ref);
//
// for (Iterator iter = serviceListeners.iterator(); iter.hasNext();) {
// ServiceListener listener = (ServiceListener) iter.next();
// listener.serviceChanged(event);
// }
return reg;
}
public ServiceRegistration registerService(String clazz, Object service, Dictionary properties) {
return registerService(new String[] { clazz }, service, properties);
}
public void removeBundleListener(BundleListener listener) {
bundleListeners.remove(listener);
}
public void removeFrameworkListener(FrameworkListener listener) {
}
public void removeServiceListener(ServiceListener listener) {
serviceListeners.remove(listener);
}
public boolean ungetService(ServiceReference reference) {
return false;
}
/**
* Sets the bundle associated with this context.
*
* @param bundle associated bundle
*/
public void setBundle(Bundle bundle) {
this.bundle = bundle;
}
// hooks
/**
* Returns a set of registered service listeners. Handy method when mocking
* with listeners is required.
*
* @return set of registered service listeners
*/
public Set getServiceListeners() {
return serviceListeners;
}
/**
* Returns a set of registered bundle listeners.
*
* @return set of registered bundle listeners
*/
public Set getBundleListeners() {
return bundleListeners;
}
}