/*******************************************************************************
* Copyright (c) 2015 IBH SYSTEMS GmbH.
* 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:
* IBH SYSTEMS GmbH - initial API and implementation
*******************************************************************************/
package org.eclipse.packagedrone.web.extender;
import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
public class WebExtenderProcessor
{
private final BundleContext context;
private final ServiceTracker<WebExtender, WebExtender> tracker;
@FunctionalInterface
public interface Consumer
{
public void process ( WebExtender extender ) throws IOException;
}
private final ServiceTrackerCustomizer<WebExtender, WebExtender> customizer = new ServiceTrackerCustomizer<WebExtender, WebExtender> () {
@Override
public void removedService ( final ServiceReference<WebExtender> reference, final WebExtender service )
{
removeService ( service );
WebExtenderProcessor.this.context.ungetService ( reference );
}
@Override
public void modifiedService ( final ServiceReference<WebExtender> reference, final WebExtender service )
{
}
@Override
public WebExtender addingService ( final ServiceReference<WebExtender> reference )
{
final WebExtender service = WebExtenderProcessor.this.context.getService ( reference );
addService ( service );
return service;
}
};
private final Set<WebExtender> extenders = new CopyOnWriteArraySet<> ();
public WebExtenderProcessor ( final BundleContext context )
{
this.context = context;
this.tracker = new ServiceTracker<> ( context, WebExtender.class, this.customizer );
this.tracker.open ();
}
protected void addService ( final WebExtender service )
{
this.extenders.add ( service );
}
protected void removeService ( final WebExtender service )
{
this.extenders.remove ( service );
}
public void process ( final Consumer consumer ) throws IOException
{
for ( final WebExtender extender : this.extenders )
{
consumer.process ( extender );
}
}
public void dispose ()
{
this.tracker.close ();
}
}