Package org.eclipse.ecf.provider.zookeeper

Source Code of org.eclipse.ecf.provider.zookeeper.DiscoveryActivator

/*******************************************************************************
*  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;

import java.util.Dictionary;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;

import org.eclipse.core.runtime.SafeRunner;
import org.eclipse.ecf.core.ContainerTypeDescription;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.core.util.ExtensionRegistryRunnable;
import org.eclipse.ecf.discovery.IDiscoveryAdvertiser;
import org.eclipse.ecf.discovery.IDiscoveryLocator;
import org.eclipse.ecf.provider.zookeeper.core.ZooDiscoveryContainer;
import org.eclipse.ecf.provider.zookeeper.core.ZooDiscoveryContainerInstantiator;
import org.eclipse.ecf.provider.zookeeper.core.ZooDiscoveryNamespace;
import org.eclipse.ecf.provider.zookeeper.core.internal.BundleStoppingListener;
import org.eclipse.ecf.provider.zookeeper.util.Logger;
import org.eclipse.ecf.provider.zookeeper.util.PrettyPrinter;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
import org.osgi.service.log.LogService;
import org.osgi.util.tracker.ServiceTracker;

public class DiscoveryActivator implements BundleActivator {

  private static BundleContext context;
  private ServiceRegistration discoveryRegistration;
  private static Set<BundleStoppingListener> stopListeners = new HashSet<BundleStoppingListener>();
  private ServiceTracker confTracker, logServiceTracker;

  public void start(final BundleContext ctxt) {
    context = ctxt;
   
    SafeRunner.run(new ExtensionRegistryRunnable(ctxt) {
      protected void runWithoutRegistry() throws Exception {
        ctxt.registerService(Namespace.class,new ZooDiscoveryNamespace(), null);
        ctxt.registerService(ContainerTypeDescription.class,new ContainerTypeDescription(ZooDiscoveryContainerInstantiator.NAME,new ZooDiscoveryContainerInstantiator(),"Zookeeper Discovery Container"), null);
        ctxt.registerService(ContainerTypeDescription.class,new ContainerTypeDescription(ZooDiscoveryContainerInstantiator.NAME+".advertiser",new ZooDiscoveryContainerInstantiator(),"Zookeeper Discovery Advertiser Container"), null);
        ctxt.registerService(ContainerTypeDescription.class,new ContainerTypeDescription(ZooDiscoveryContainerInstantiator.NAME+".locator",new ZooDiscoveryContainerInstantiator(),"Zookeeper Discovery Locator Container"), null);       
      }
    });
   
    final Properties props = new Properties();
    props.put(IDiscoveryLocator.CONTAINER_NAME, ZooDiscoveryContainerInstantiator.NAME);
    props.put(IDiscoveryAdvertiser.CONTAINER_NAME, ZooDiscoveryContainerInstantiator.NAME);
    // register ourselves using a service factory
    discoveryRegistration = ctxt.registerService(
        new String[] { IDiscoveryLocator.class.getName(), IDiscoveryAdvertiser.class.getName() }, new ServiceFactory() {
          private volatile ZooDiscoveryContainer zdc;

          public Object getService(Bundle bundle, ServiceRegistration registration) {
            if (zdc == null) {
              zdc = ZooDiscoveryContainer.getSingleton();
              zdc.setDiscoveryProperties(props);
            }
            return zdc;
          }

          public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {

          }
        }, (Dictionary) props);

    // setup and open log service tracker
    logServiceTracker = new ServiceTracker(ctxt, org.osgi.service.log.LogService.class.getName(), null) {
      public Object addingService(ServiceReference reference) {
        Logger.bindLogService((LogService) context.getService(reference));
        return super.addingService(reference);
      }

      public void removedService(ServiceReference reference, Object service) {
        Logger.unbindLogService((LogService) service);
        super.removedService(reference, service);
      }
    };

    logServiceTracker.open(true);

    // Autostart by consuming our own service
    if (ZooDiscoveryContainer.autoStart()) {
      ctxt.getService(discoveryRegistration.getReference());
    }

  }

  public void stop(BundleContext c) throws Exception {
    dispose();
    Logger.log(LogService.LOG_INFO, PrettyPrinter.prompt(PrettyPrinter.DEACTIVATED, null), null);
  }

  private void dispose() {
    for (BundleStoppingListener l : stopListeners) {
      l.bundleStopping();
    }
    stopListeners.clear();
    ZooDiscoveryContainer.getSingleton().shutdown();
    if (this.discoveryRegistration != null) {
      this.discoveryRegistration.unregister();
    }
    if (this.confTracker != null) {
      this.confTracker.close();
    }
    // Initiates an orderly shutdown of all our cached threads
    ZooDiscoveryContainer.CACHED_THREAD_POOL.shutdown();

  }

  public static BundleContext getContext() {
    return context;
  }

  public static void registerBundleStoppingListner(BundleStoppingListener l) {
    stopListeners.add(l);
  }

}
TOP

Related Classes of org.eclipse.ecf.provider.zookeeper.DiscoveryActivator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.