/** * 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.ServiceReference; import com.liferay.registry.ServiceTracker; import java.util.Collections; import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; /** * @author Raymond Augé */ public class ServiceTrackerWrapper<S, T> implements ServiceTracker<S, T> { public ServiceTrackerWrapper( org.osgi.util.tracker.ServiceTracker<S, T> serviceTracker) { _serviceTracker = serviceTracker; } @Override public T addingService(ServiceReference<S> serviceReference) { org.osgi.framework.ServiceReference<S> osgiServiceReference = getServiceReference(serviceReference); return _serviceTracker.addingService(osgiServiceReference); } @Override public void close() { _serviceTracker.close(); } @Override public boolean equals(Object object) { if (this == object) { return true; } if (!(object instanceof ServiceTrackerWrapper)) { return false; } ServiceTrackerWrapper<S, T> serviceReferenceWrapper = (ServiceTrackerWrapper<S, T>)object; return _serviceTracker.equals( serviceReferenceWrapper.getServiceTracker()); } @Override public T getService() { return _serviceTracker.getService(); } @Override public T getService(ServiceReference<S> serviceReference) { org.osgi.framework.ServiceReference<S> osgiServiceReference = getServiceReference(serviceReference); return _serviceTracker.getService(osgiServiceReference); } @Override public ServiceReference<S> getServiceReference() { return new ServiceReferenceWrapper<>( _serviceTracker.getServiceReference()); } public org.osgi.framework.ServiceReference<S> getServiceReference( ServiceReference<S> serviceReference) { if (!(serviceReference instanceof ServiceReferenceWrapper)) { throw new IllegalArgumentException(); } ServiceReferenceWrapper<S> serviceReferenceWrapper = (ServiceReferenceWrapper<S>)serviceReference; return serviceReferenceWrapper.getServiceReference(); } @Override public ServiceReference<S>[] getServiceReferences() { org.osgi.framework.ServiceReference<S>[] osgiServiceReferences = _serviceTracker.getServiceReferences(); if (osgiServiceReferences == null) { return null; } ServiceReference<S>[] serviceReferences = new ServiceReference[osgiServiceReferences.length]; for (int i = 0; i < osgiServiceReferences.length; i++) { org.osgi.framework.ServiceReference<S> osgiServiceReference = osgiServiceReferences[i]; serviceReferences[i] = new ServiceReferenceWrapper<>( osgiServiceReference); } return serviceReferences; } @Override public Object[] getServices() { return _serviceTracker.getServices(); } @Override public T[] getServices(T[] services) { return _serviceTracker.getServices(services); } public org.osgi.util.tracker.ServiceTracker<S, T> getServiceTracker() { return _serviceTracker; } @Override public SortedMap<ServiceReference<S>, T> getTrackedServiceReferences() { SortedMap<ServiceReference<S>, T> trackedServiceReferences = new TreeMap<>(Collections.reverseOrder()); SortedMap<org.osgi.framework.ServiceReference<S>, T> trackedOSGiServiceReferences = _serviceTracker.getTracked(); for (Entry<org.osgi.framework.ServiceReference<S>, T> entry : trackedOSGiServiceReferences.entrySet()) { org.osgi.framework.ServiceReference<S> osgiServiceReference = entry.getKey(); T service = entry.getValue(); ServiceReferenceWrapper<S> serviceReferenceWrapper = new ServiceReferenceWrapper<>(osgiServiceReference); trackedServiceReferences.put(serviceReferenceWrapper, service); } return trackedServiceReferences; } @Override public int getUpdateMarker() { return _serviceTracker.getTrackingCount(); } @Override public int hashCode() { return _serviceTracker.hashCode(); } @Override public boolean isEmpty() { return _serviceTracker.isEmpty(); } @Override public void modifiedService( ServiceReference<S> serviceReference, T service) { org.osgi.framework.ServiceReference<S> osgiServiceReference = getServiceReference(serviceReference); _serviceTracker.modifiedService(osgiServiceReference, service); } @Override public void open() { _serviceTracker.open(); } @Override public void open(boolean trackAllServices) { _serviceTracker.open(trackAllServices); } @Override public void remove(ServiceReference<S> serviceReference) { org.osgi.framework.ServiceReference<S> osgiServiceReference = getServiceReference(serviceReference); _serviceTracker.remove(osgiServiceReference); } @Override public void removedService( ServiceReference<S> serviceReference, T service) { org.osgi.framework.ServiceReference<S> osgiServiceReference = getServiceReference(serviceReference); _serviceTracker.removedService(osgiServiceReference, service); } @Override public int size() { return _serviceTracker.size(); } @Override public String toString() { return _serviceTracker.toString(); } @Override public T waitForService(long timeout) throws InterruptedException { return _serviceTracker.waitForService(timeout); } private final org.osgi.util.tracker.ServiceTracker<S, T> _serviceTracker; }