/** * 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.registry.internal; import com.liferay.registry.Filter; import com.liferay.registry.Registry; import com.liferay.registry.ServiceReference; import com.liferay.registry.ServiceRegistrar; import com.liferay.registry.ServiceTracker; import com.liferay.registry.ServiceTrackerCustomizer; import com.liferay.registry.dependency.ServiceDependencyManager; import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; /** * @author Carlos Sierra Andrés */ public class RegistryWrapper implements Registry { public RegistryWrapper(Registry registry) { _registry = registry; } @Override public Filter getFilter(String filterString) throws RuntimeException { return _registry.getFilter(filterString); } @Override public Registry getRegistry() throws SecurityException { return this; } @Override public <T> T getService(Class<T> clazz) { ServiceReference<T> serviceReference = _registry.getServiceReference( clazz); return _registry.getService(serviceReference); } @Override public <T> T getService(ServiceReference<T> 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 _registry.getService(serviceReference); } @Override public <T> T getService(String className) { ServiceReference<Object> serviceReference = _registry.getServiceReference(className); return (T)_registry.getService(serviceReference); } @Override public Collection<ServiceDependencyManager> getServiceDependencyManagers() { return _registry.getServiceDependencyManagers(); } @Override public <T> ServiceReference<T> getServiceReference(Class<T> clazz) { return _registry.getServiceReference(clazz); } @Override public <T> ServiceReference<T> getServiceReference(String className) { return _registry.getServiceReference(className); } public Map<ServiceReference<?>, AtomicInteger> getServiceReferenceCountsMap() { return _serviceReferenceCountsMap; } @Override public <T> Collection<ServiceReference<T>> getServiceReferences( Class<T> clazz, String filterString) throws Exception { return _registry.getServiceReferences(clazz, filterString); } @Override public <T> ServiceReference<T>[] getServiceReferences( String className, String filterString) throws Exception { return _registry.getServiceReferences(className, filterString); } @Override public <T> ServiceRegistrar<T> getServiceRegistrar(Class<T> clazz) { return _registry.getServiceRegistrar(clazz); } @Override public <T> Collection<T> getServices(Class<T> clazz, String filterString) throws Exception { return _registry.getServices(clazz, filterString); } @Override public <T> T[] getServices(String className, String filterString) throws Exception { return _registry.getServices(className, filterString); } public Registry getWrappedRegistry() { return _registry; } @Override public <T> com.liferay.registry.ServiceRegistration<T> registerService( Class<T> clazz, T service) { return _registry.registerService(clazz, service); } @Override public <T> com.liferay.registry.ServiceRegistration<T> registerService( Class<T> clazz, T service, Map<String, Object> properties) { return _registry.registerService(clazz, service, properties); } @Override public <T> com.liferay.registry.ServiceRegistration<T> registerService( String className, T service) { return _registry.registerService(className, service); } @Override public <T> com.liferay.registry.ServiceRegistration<T> registerService( String className, T service, Map<String, Object> properties) { return _registry.registerService(className, service, properties); } @Override public <T> com.liferay.registry.ServiceRegistration<T> registerService( String[] classNames, T service) { return _registry.registerService(classNames, service); } @Override public <T> com.liferay.registry.ServiceRegistration<T> registerService( String[] classNames, T service, Map<String, Object> properties) { return _registry.registerService(classNames, service, properties); } @Override public void registerServiceDependencyManager( ServiceDependencyManager serviceDependencyManager) { _registry.registerServiceDependencyManager(serviceDependencyManager); } @Override public Registry setRegistry(Registry registry) throws SecurityException { return _registry.setRegistry(registry); } @Override public <S, T> ServiceTracker<S, T> trackServices(Class<S> clazz) { return _registry.trackServices(clazz); } @Override public <S, T> ServiceTracker<S, T> trackServices( Class<S> clazz, ServiceTrackerCustomizer<S, T> serviceTrackerCustomizer) { return _registry.trackServices(clazz, serviceTrackerCustomizer); } @Override public <S, T> ServiceTracker<S, T> trackServices(Filter filter) { return _registry.trackServices(filter); } @Override public <S, T> ServiceTracker<S, T> trackServices( Filter filter, ServiceTrackerCustomizer<S, T> serviceTrackerCustomizer) { return _registry.trackServices(filter, serviceTrackerCustomizer); } @Override public <S, T> ServiceTracker<S, T> trackServices(String className) { return _registry.trackServices(className); } @Override public <S, T> ServiceTracker<S, T> trackServices( String className, ServiceTrackerCustomizer<S, T> serviceTrackerCustomizer) { return _registry.trackServices(className, serviceTrackerCustomizer); } @Override public <T> boolean ungetService(ServiceReference<T> serviceReference) { AtomicInteger serviceReferenceCount = _serviceReferenceCountsMap.get( serviceReference); if (serviceReferenceCount != null) { serviceReferenceCount.decrementAndGet(); } return _registry.ungetService(serviceReference); } @Override public void unregisterServiceDependencyManager( ServiceDependencyManager serviceDependencyManager) { _registry.unregisterServiceDependencyManager(serviceDependencyManager); } private final Registry _registry; private final ConcurrentMap<ServiceReference<?>, AtomicInteger> _serviceReferenceCountsMap = new ConcurrentHashMap<>(); }