/*******************************************************************************
* Copyright (c)2010 REMAIN B.V. The Netherlands. (http://www.remainsoftware.com).
* 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:
* Wim Jongman - initial API and implementation
* Ahmed Aadel - initial API and implementation
*******************************************************************************/
package org.eclipse.ecf.provider.zookeeper.core.internal;
import java.util.concurrent.Executors;
import org.eclipse.ecf.discovery.IServiceListener;
import org.eclipse.ecf.discovery.IServiceTypeListener;
import org.eclipse.ecf.provider.zookeeper.DiscoveryActivator;
import org.eclipse.ecf.provider.zookeeper.core.ZooDiscoveryContainer;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
public class Localizer {
// IServiceListener tracker
private ServiceTracker serviceListenerTracker;
// IServiceTypeListener tracker
private ServiceTracker serviceTypeListenerTracker;
private static Localizer singleton;
private Localizer() {
// Singleton
}
public static Localizer getSingleton() {
if (singleton == null) {
singleton = new Localizer();
}
return singleton;
}
public void init() {
Executors.newSingleThreadExecutor().execute(new Runnable() {
public void run() {
BundleContext context = DiscoveryActivator.getContext();
final ZooDiscoveryContainer discovery = ZooDiscoveryContainer
.getSingleton();
serviceListenerTracker = new ServiceTracker(context,
IServiceListener.class.getName(), null) {
public Object addingService(ServiceReference reference) {
discovery.addServiceListener((IServiceListener) context
.getService(reference));
return super.addingService(reference);
}
public void modifiedService(ServiceReference reference,
Object service) {
discovery
.removeServiceListener((IServiceListener) context
.getService(reference));
discovery.addServiceListener((IServiceListener) context
.getService(reference));
super.modifiedService(reference, service);
}
public void removedService(ServiceReference reference,
Object service) {
discovery
.removeServiceListener((IServiceListener) context
.getService(reference));
super.removedService(reference, service);
}
};
serviceListenerTracker.open(true);
serviceTypeListenerTracker = new ServiceTracker(context,
IServiceTypeListener.class.getName(), null) {
public Object addingService(ServiceReference reference) {
discovery
.addServiceTypeListener((IServiceTypeListener) context
.getService(reference));
return super.addingService(reference);
}
public void modifiedService(ServiceReference reference,
Object service) {
discovery
.removeServiceTypeListener((IServiceTypeListener) context
.getService(reference));
discovery
.addServiceTypeListener((IServiceTypeListener) context
.getService(reference));
super.modifiedService(reference, service);
}
public void removedService(ServiceReference reference,
Object service) {
discovery
.removeServiceTypeListener((IServiceTypeListener) context
.getService(reference));
super.removedService(reference, service);
}
};
serviceTypeListenerTracker.open(true);
}
});
}
public void close() {
if (this.serviceListenerTracker != null) {
this.serviceListenerTracker.close();
}
if (this.serviceTypeListenerTracker != null) {
this.serviceTypeListenerTracker.close();
}
}
public void localize(Notification notification) {
if (notification.getType() == Notification.AVAILABLE) {
// inform listeners interested in this service type
for (IServiceListener srl : ZooDiscoveryContainer
.getSingleton()
.getServiceListenersForType(notification.getServiceTypeID())) {
srl.serviceDiscovered(notification);
}
// inform service type listeners
for (IServiceTypeListener stl : ZooDiscoveryContainer
.getSingleton().getServiceTypeListeners()) {
stl.serviceTypeDiscovered(notification);
}
} else if (notification.getType() == Notification.UNAVAILABLE) {
// inform all service listeners about this lost service
for (IServiceListener l : ZooDiscoveryContainer.getSingleton()
.getAllServiceListeners()) {
l.serviceUndiscovered(notification);
}
}
}
}