/*
* ====================================================================
*
* Copyright (c) 2001 Sun Microsystems, Inc. All rights reserved.
*
* The Sun Project JXTA(TM) Software License
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The end-user documentation included with the redistribution, if any, must
* include the following acknowledgment: "This product includes software
* developed by Sun Microsystems, Inc. for JXTA(TM) technology."
* Alternately, this acknowledgment may appear in the software itself, if
* and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA" must
* not be used to endorse or promote products derived from this software
* without prior written permission. For written permission, please contact
* Project JXTA at http://www.jxta.org.
*
* 5. Products derived from this software may not be called "JXTA", nor may
* "JXTA" appear in their name, without prior written permission of Sun.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SUN
* MICROSYSTEMS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* JXTA is a registered trademark of Sun Microsystems, Inc. in the United
* States and other countries.
*
* Please see the license information page at :
* <http://www.jxta.org/project/www/license.html> for instructions on use of
* the license in source files.
*
* ====================================================================
*
* This software consists of voluntary contributions made by many individuals
* on behalf of Project JXTA. For more information on Project JXTA, please see
* http://www.jxta.org.
*
* This license is based on the BSD license adopted by the Apache Foundation.
*/
package net.jxse.OSGi;
import java.io.IOException;
import java.util.logging.Logger;
import net.jxse.JxseInstantiator;
import net.jxta.configuration.JxtaConfiguration;
import org.osgi.framework.launch.Framework;
import org.osgi.util.tracker.ServiceTracker;
/**
* API access to the OSGi Framework.
*
* <p>This object handles the call to the {@code JxseOSGiFramework}
* implementation object using reflexion, as specified in the [@code OSGi.properties}
* file.
* <p>The {@code INSTANCE} public static attribute is initialized with the OSGi framework
* object.
* <p>Typically, the OSGi framework should be accessed as following in a standalone application:
* <pre>
* public static void main(String[] args) {
* ...
* try {
*
* // Starting the framework
* JxseOSGiFramework.INSTANCE.start();
* ...
* // Accessing the framework
* ServiceReference[] Services = JxseOSGiFramework.INSTANCE.getRegisteredServices();
* ...
* // Stopping the framewok
* JxseOSGiFramework.INSTANCE.stop();
*
* // Waiting for the stop (0 = wait indefinitely)
* FrameworkEvent StopEvent = JxseOSGiFramework.INSTANCE.waitForStop(0);
* ...
* System.exit(0);
* ...
*
* }
* </pre>
*/
public class JxseOSGiFramework {
/**
* Logger
*/
private final static Logger LOG = Logger.getLogger(JxseOSGiFramework.class.getName());
/**
* OSGi configuration and properties
*/
private static final JxtaConfiguration Configuration = new JxtaConfiguration();
// Loading OSGi configuration
static {
try {
Configuration.load(JxseOSGiFramework.class.getResourceAsStream("JxseOSGi.properties"));
} catch (IOException ex) {
LOG.severe("Cannot load JxseOSGi.properties :\n" + ex.toString());
}
}
/**
* OSGI Framework instance
*/
public static final Framework INSTANCE;
// Creating the framework instance
static {
String FrameworkClassName = Configuration.getProperty("FRAMEWORK_LAUNCHER");
if (FrameworkClassName==null) {
LOG.severe("Null 'FRAMEWORK_LAUNCHER' property, cannot create OSGi framework");
INSTANCE = null;
} else {
// Retrieving OSGi framework launcher class
Class FrameworkLauncherClass = JxseInstantiator.forName(Configuration.getProperty("FRAMEWORK_LAUNCHER"));
// Creating framework instance launcher
JxseOSGiFrameworkLauncher TheLauncher = (JxseOSGiFrameworkLauncher) JxseInstantiator.instantiateWithNoParameterConstructor(FrameworkLauncherClass);
// Initializing OSGi framework object
INSTANCE = TheLauncher.getOsgiFrameworkInstance();
}
}
/**
* Provides a {@code ServiceTracker} for a corresponding service API class registered within the
* OSGi framework. These are very useful to access registered OSGi services, since these may
* (potentially) come and go at any time. {@code ServiceTracker}s help tracking their
* availability.
*
* <p>A typical use of {@code ServiceTracker}s is the following:
* <pre>
* ...
* // Creating a service tracker for the NetworkManager OSGi service
* ServiceTracker NetworkManagerST = JxseOSGiFramework.getServiceTracker(JxseOSGiNetworkManagerService.class);
*
* // Starting the service tracker
* NetworkManagerST.open();
* ...
*
* // Trying to retrieve the service for 10 seconds
* JxseOSGiNetworkManagerService TheNMS = NetworkManagerST.waitForService(10000);
*
* if (TheNMS!=null) {
* // The service is available...
* } else {
* // The service is not available...
* }
* ...
*
* // Stopping the service tracker
* NetworkManagerST.close();
* ...
*
* </pre>
*
* @param serviceAPIClass The service API Class
* @return An OSGi service tracker
*/
public static ServiceTracker getServiceTracker(Class serviceAPIClass) {
return new ServiceTracker(INSTANCE.getBundleContext(), serviceAPIClass.getName(), null);
}
}