/******************************************************************************* * Copyright (c) 2011,2012 Frank Appel and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Frank Appel - initial API and implementation * Holger Staudacher - ongoing development * ProSyst Software GmbH. - compatibility with OSGi specification 4.2 APIs ******************************************************************************/ package com.eclipsesource.jaxrs.publisher.internal; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; public class ServiceContainer { private final Set<ServiceHolder> services; private final BundleContext bundleContext; ServiceContainer( BundleContext bundleContext ) { this.bundleContext = bundleContext; this.services = new HashSet<ServiceHolder>(); } ServiceHolder add( ServiceReference reference ) { return add( bundleContext.getService( reference ), reference ); } void remove( Object service ) { services.remove( find( service ) ); } ServiceHolder[] getServices() { Set<ServiceHolder> result = new HashSet<ServiceHolder>(); Iterator<ServiceHolder> iterator = services.iterator(); while( iterator.hasNext() ) { result.add( iterator.next() ); } return result.toArray( new ServiceHolder[ result.size() ]); } ServiceHolder find( Object service ) { Finder finder = new Finder(); return finder.findServiceHolder( service, services ); } void clear() { services.clear(); } int size() { return services.size(); } private ServiceHolder add( Object service, ServiceReference reference ) { ServiceHolder result = find( service ); if( notFound( result ) ) { result = new ServiceHolder( service, reference ); services.add( result ); } else if( referenceIsMissing( reference, result ) ) { result.setServiceReference( reference ); } return result; } private boolean notFound( ServiceHolder result ) { return result == null; } private boolean referenceIsMissing( ServiceReference reference, ServiceHolder result ) { return reference != null && result.getReference() == null; } static class ServiceHolder { private ServiceReference serviceReference; private final Object service; ServiceHolder( Object service, ServiceReference serviceReference ) { this.service = service; this.serviceReference = serviceReference; } Object getService() { return service; } ServiceReference getReference() { return serviceReference; } void setServiceReference( ServiceReference serviceReference ) { this.serviceReference = serviceReference; } } static class Finder { ServiceHolder findServiceHolder( Object service, Set<ServiceHolder> collection ) { Iterator<ServiceHolder> iterator = collection.iterator(); ServiceHolder result = null; while( iterator.hasNext() ) { ServiceHolder serviceHolder = iterator.next(); Object found = serviceHolder.getService(); if( service.equals( found ) ) { result = serviceHolder; } } return result; } } }