/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIESOR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.aries.itest; import java.io.File; import java.io.InputStream; import java.util.Collection; import java.util.Dictionary; 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.FrameworkUtil; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceReference; import org.osgi.framework.ServiceRegistration; import org.osgi.util.tracker.ServiceTracker; /** * {@link BundleContext} wrapper that adds a couple of additional utilities * */ public class RichBundleContext implements BundleContext { public static final long DEFAULT_TIMEOUT = 15000; private final BundleContext delegate; public RichBundleContext(BundleContext delegate) { this.delegate = delegate; } public <T> T getService(Class<T> type) { return getService(type, null, DEFAULT_TIMEOUT); } public <T> T getService(Class<T> type, long timeout) { return getService(type, null, timeout); } public <T> T getService(Class<T> type, String filter) { return getService(type, filter, DEFAULT_TIMEOUT); } public <T> T getService(Class<T> type, String filter, long timeout) { ServiceTracker tracker = null; try { String flt; if (filter != null) { if (filter.startsWith("(")) { flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")" + filter + ")"; } else { flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")(" + filter + "))"; } } else { flt = "(" + Constants.OBJECTCLASS + "=" + type.getName() + ")"; } Filter osgiFilter = FrameworkUtil.createFilter(flt); tracker = new ServiceTracker(delegate, osgiFilter, null); tracker.open(); Object svc = type.cast(tracker.waitForService(timeout)); if (svc == null) { System.out.println("Could not obtain a service in time, service-ref="+ tracker.getServiceReference()+ ", time="+System.currentTimeMillis()); throw new RuntimeException("Gave up waiting for service " + flt); } return type.cast(svc); } catch (InvalidSyntaxException e) { throw new IllegalArgumentException("Invalid filter", e); } catch (InterruptedException e) { throw new RuntimeException(e); } } public Bundle getBundleByName(String symbolicName) { for (Bundle b : delegate.getBundles()) { if (b.getSymbolicName().equals(symbolicName)) { return b; } } return null; } public String getProperty(String key) { return delegate.getProperty(key); } public Bundle getBundle() { return delegate.getBundle(); } public Bundle getBundle(String filter) { return delegate.getBundle(filter); } public Bundle installBundle(String location, InputStream input) throws BundleException { return delegate.installBundle(location, input); } public Bundle installBundle(String location) throws BundleException { return delegate.installBundle(location); } public Bundle getBundle(long id) { return delegate.getBundle(id); } public Bundle[] getBundles() { return delegate.getBundles(); } public void addServiceListener(ServiceListener listener, String filter) throws InvalidSyntaxException { delegate.addServiceListener(listener, filter); } public void addServiceListener(ServiceListener listener) { delegate.addServiceListener(listener); } public void removeServiceListener(ServiceListener listener) { delegate.removeServiceListener(listener); } public void addBundleListener(BundleListener listener) { delegate.addBundleListener(listener); } public void removeBundleListener(BundleListener listener) { delegate.removeBundleListener(listener); } public void addFrameworkListener(FrameworkListener listener) { delegate.addFrameworkListener(listener); } public void removeFrameworkListener(FrameworkListener listener) { delegate.removeFrameworkListener(listener); } @SuppressWarnings("rawtypes") public ServiceRegistration registerService(String[] clazzes, Object service, Dictionary properties) { return delegate.registerService(clazzes, service, properties); } @SuppressWarnings("rawtypes") public ServiceRegistration registerService(String clazz, Object service, Dictionary properties) { return delegate.registerService(clazz, service, properties); } public ServiceRegistration registerService(Class clazz, Object service, Dictionary props) { return delegate.registerService(clazz, service, props); } public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException { return delegate.getServiceReferences(clazz, filter); } public Collection getServiceReferences(Class clazz, String filter) throws InvalidSyntaxException { return delegate.getServiceReferences(clazz, filter); } public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException { return delegate.getAllServiceReferences(clazz, filter); } public ServiceReference getServiceReference(String clazz) { return delegate.getServiceReference(clazz); } public ServiceReference getServiceReference(Class clazz) { return delegate.getServiceReference(clazz); } public Object getService(ServiceReference reference) { return delegate.getService(reference); } public boolean ungetService(ServiceReference reference) { return delegate.ungetService(reference); } public File getDataFile(String filename) { return delegate.getDataFile(filename); } public Filter createFilter(String filter) throws InvalidSyntaxException { return delegate.createFilter(filter); } }