Package org.eclipse.ecf.internal.examples.remoteservices.hello.host

Source Code of org.eclipse.ecf.internal.examples.remoteservices.hello.host.HelloHostApplication

/****************************************************************************
* Copyright (c) 2009 Composent, Inc. 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:
*    Composent, Inc. - initial API and implementation
*****************************************************************************/
package org.eclipse.ecf.internal.examples.remoteservices.hello.host;

import java.util.Dictionary;
import java.util.Hashtable;
import java.util.Properties;

import org.eclipse.ecf.examples.remoteservices.hello.IHello;
import org.eclipse.ecf.examples.remoteservices.hello.IHelloAsync;
import org.eclipse.ecf.examples.remoteservices.hello.impl.Hello;
import org.eclipse.ecf.osgi.services.distribution.IDistributionConstants;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.osgi.framework.console.CommandProvider;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;

public class HelloHostApplication implements IApplication,
    IDistributionConstants {

  private static final String DEFAULT_CONTAINER_TYPE = "ecf.r_osgi.peer";
  public static final String DEFAULT_CONTAINER_ID = "r-osgi://localhost:9278";

  private BundleContext bundleContext;

  private String containerType = DEFAULT_CONTAINER_TYPE;
  private String containerId = DEFAULT_CONTAINER_ID;

  private final Object appLock = new Object();
  private boolean done = false;

  private ServiceRegistration helloRegistration;
  private ServiceRegistration discoveryListenerRegistration;
  private ServiceRegistration distributionListenerRegistration;
 
  public Object start(IApplicationContext appContext) throws Exception {
    bundleContext = Activator.getContext();
    // Process Arguments
    processArgs(appContext);
    // Finally, register the actual remote service
    registerHelloRemoteService();
    // Register console provider. This adds 'start' and 'stop' commands to
    // the OSGI console
    // so that the hello remote service can be started/stopped
    registerConsoleProvider();
    // wait until stopped
    waitForDone();
    return IApplication.EXIT_OK;
  }

  void registerHelloRemoteService() {
    // Setup properties for remote service distribution, as per OSGi 4.2
    // remote services
    // specification (chap 13 in compendium spec)
    Properties props = new Properties();
    // add OSGi service property indicated export of all interfaces exposed
    // by service (wildcard)
    props.put(IDistributionConstants.SERVICE_EXPORTED_INTERFACES,
        IDistributionConstants.SERVICE_EXPORTED_INTERFACES_WILDCARD);
    // add OSGi service property specifying config
    props.put(IDistributionConstants.SERVICE_EXPORTED_CONFIGS,
        containerType);
    // add ECF service property specifying container factory args
    props.put(
        IDistributionConstants.SERVICE_EXPORTED_CONTAINER_FACTORY_ARGUMENTS,
        containerId);
    props.put("ecf.exported.async.objectClass",new String[] { IHelloAsync.class.getName() });
    // register remote service
    helloRegistration = bundleContext.registerService(
        IHello.class.getName(), new Hello(), props);
    // tell everyone
    System.out.println("Host: Hello Service Registered");
  }

  void unregisterHelloRemoteService() {
    if (helloRegistration != null) {
      helloRegistration.unregister();
      helloRegistration = null;
    }
    // tell everyone
    System.out.println("Host: Hello Remote Service Unregistered");
  }

  public void stop() {
    unregisterHelloRemoteService();
    if (discoveryListenerRegistration != null) {
      discoveryListenerRegistration.unregister();
      discoveryListenerRegistration = null;
    }
    if (distributionListenerRegistration != null) {
      distributionListenerRegistration.unregister();
      distributionListenerRegistration = null;
    }
    bundleContext = null;
    synchronized (appLock) {
      done = true;
      appLock.notifyAll();
    }
  }

  private void registerConsoleProvider() {
    // Register the console hello start/stop command provider
    HelloCommandProvider helloCommandProvider = new HelloCommandProvider(this);
    Dictionary props = new Hashtable();
    props.put(org.osgi.framework.Constants.SERVICE_RANKING, new Integer(
        Integer.MAX_VALUE - 100));
    bundleContext.registerService(CommandProvider.class.getName(),
        helloCommandProvider, props);
  }

  private void processArgs(IApplicationContext appContext) {
    String[] originalArgs = (String[]) appContext.getArguments().get(
        "application.args");
    if (originalArgs == null)
      return;
    for (int i = 0; i < originalArgs.length; i++) {
      if (originalArgs[i].equals("-containerType")) {
        containerType = originalArgs[i + 1];
        i++;
      } else if (originalArgs[i].equals("-containerId")) {
        containerId = originalArgs[i + 1];
        i++;
      }
    }
  }

  private void waitForDone() {
    // then just wait here
    synchronized (appLock) {
      while (!done) {
        try {
          appLock.wait();
        } catch (InterruptedException e) {
          // do nothing
        }
      }
    }
  }

}
TOP

Related Classes of org.eclipse.ecf.internal.examples.remoteservices.hello.host.HelloHostApplication

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.