/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.osgi.service.tracker.collections.internal.map; import java.io.File; import java.io.InputStream; import java.util.Collection; import java.util.Dictionary; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; import org.osgi.framework.BundleListener; 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; /** * @author Carlos Sierra Andrés */ public class BundleContextWrapper implements BundleContext { public BundleContextWrapper(BundleContext bundleContext) { if (bundleContext == null) { throw new IllegalArgumentException(); } _bundleContext = bundleContext; } @Override public void addBundleListener(BundleListener bundleListener) { _bundleContext.addBundleListener(bundleListener); } @Override public void addFrameworkListener(FrameworkListener frameworkListener) { _bundleContext.addFrameworkListener(frameworkListener); } @Override public void addServiceListener(ServiceListener serviceListener) { _bundleContext.addServiceListener(serviceListener); } @Override public void addServiceListener( ServiceListener serviceListener, String filterString) throws InvalidSyntaxException { _bundleContext.addServiceListener(serviceListener, filterString); } @Override public Filter createFilter(String s) throws InvalidSyntaxException { return _bundleContext.createFilter(s); } @Override public ServiceReference<?>[] getAllServiceReferences( String clazz, String filterString) throws InvalidSyntaxException { return _bundleContext.getAllServiceReferences(clazz, filterString); } @Override public Bundle getBundle() { return _bundleContext.getBundle(); } @Override public Bundle getBundle(long id) { return _bundleContext.getBundle(id); } @Override public Bundle getBundle(String location) { return _bundleContext.getBundle(location); } @Override public Bundle[] getBundles() { return _bundleContext.getBundles(); } @Override public File getDataFile(String fileName) { return _bundleContext.getDataFile(fileName); } @Override public String getProperty(String key) { return _bundleContext.getProperty(key); } @Override public <S> S getService(ServiceReference<S> serviceReference) { AtomicInteger serviceReferenceCount = _serviceReferenceCountsMap.get( serviceReference); if (serviceReferenceCount == null) { serviceReferenceCount = new AtomicInteger(0); AtomicInteger previousServiceReferenceCount = _serviceReferenceCountsMap.putIfAbsent( serviceReference, serviceReferenceCount); if (previousServiceReferenceCount != null) { serviceReferenceCount = previousServiceReferenceCount; } } serviceReferenceCount.incrementAndGet(); return _bundleContext.getService(serviceReference); } @Override public <S> ServiceReference<S> getServiceReference(Class<S> clazz) { return _bundleContext.getServiceReference(clazz); } @Override public ServiceReference<?> getServiceReference(String clazz) { return _bundleContext.getServiceReference(clazz); } public Map<ServiceReference<?>, AtomicInteger> getServiceReferenceCountsMap() { return _serviceReferenceCountsMap; } @Override public <S> Collection<ServiceReference<S>> getServiceReferences( Class<S> clazz, String filterString) throws InvalidSyntaxException { return _bundleContext.getServiceReferences(clazz, filterString); } @Override public ServiceReference<?>[] getServiceReferences( String clazz, String filterString) throws InvalidSyntaxException { return _bundleContext.getServiceReferences(clazz, filterString); } @Override public Bundle installBundle(String location) throws BundleException { return _bundleContext.installBundle(location); } @Override public Bundle installBundle(String location, InputStream inputStream) throws BundleException { return _bundleContext.installBundle(location, inputStream); } @Override public <S> ServiceRegistration<S> registerService( Class<S> clazz, S service, Dictionary<String, ?> properties) { return _bundleContext.registerService(clazz, service, properties); } @Override public ServiceRegistration<?> registerService( String clazz, Object service, Dictionary<String, ?> properties) { return _bundleContext.registerService(clazz, service, properties); } @Override public ServiceRegistration<?> registerService( String[] classes, Object service, Dictionary<String, ?> properties) { return _bundleContext.registerService(classes, service, properties); } @Override public void removeBundleListener(BundleListener bundleListener) { _bundleContext.removeBundleListener(bundleListener); } @Override public void removeFrameworkListener(FrameworkListener frameworkListener) { _bundleContext.removeFrameworkListener(frameworkListener); } @Override public void removeServiceListener(ServiceListener serviceListener) { _bundleContext.removeServiceListener(serviceListener); } @Override public boolean ungetService(ServiceReference<?> serviceReference) { AtomicInteger serviceReferenceCount = _serviceReferenceCountsMap.get( serviceReference); if (serviceReferenceCount != null) { serviceReferenceCount.decrementAndGet(); } return _bundleContext.ungetService(serviceReference); } private final BundleContext _bundleContext; private final ConcurrentMap<ServiceReference<?>, AtomicInteger> _serviceReferenceCountsMap = new ConcurrentHashMap<>(); }