/******************************************************************************* * Copyright (c) 2011, 2015 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 ******************************************************************************/ package org.eclipse.rap.rwt.osgi.internal; import java.util.*; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; class ServiceContainer<S> { private final Set<ServiceHolder<S>> services; private final BundleContext bundleContext; ServiceContainer( BundleContext bundleContext ) { this.bundleContext = bundleContext; this.services = new HashSet<>(); } ServiceHolder<S> add( S service ) { return add( service, null ); } ServiceHolder<S> add( ServiceReference<S> reference ) { return add( bundleContext.getService( reference ), reference ); } void remove( S service ) { services.remove( find( service ) ); } ServiceHolder<S>[] getServices() { Set<ServiceHolder<S>> result = new HashSet<>(); Iterator<ServiceHolder<S>> iterator = services.iterator(); while( iterator.hasNext() ) { result.add( iterator.next() ); } return result.toArray( new ServiceHolder[ result.size() ]); } ServiceHolder<S> find( S service ) { ServiceHolder<S> result = null; for( ServiceHolder<S> serviceHolder : services ) { S found = serviceHolder.getService(); if( service.equals( found ) ) { result = serviceHolder; } } return result; } void clear() { services.clear(); } int size() { return services.size(); } private ServiceHolder<S> add( S service, ServiceReference<S> reference ) { ServiceHolder<S> result = find( service ); if( result == null ) { result = new ServiceHolder<>( service, reference ); services.add( result ); } else if( reference != null && result.serviceReference == null ) { result.setServiceReference( reference ); } return result; } static class ServiceHolder<S> { private ServiceReference<S> serviceReference; private final S service; private ServiceHolder( S service, ServiceReference<S> serviceReference ) { this.service = service; this.serviceReference = serviceReference; } S getService() { return service; } ServiceReference<S> getReference() { return serviceReference; } private void setServiceReference( ServiceReference<S> serviceReference ) { this.serviceReference = serviceReference; } } }