/****************************************************************************** * Copyright (c) 2006, 2010 VMware Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0 * is available at http://www.opensource.org/licenses/apache2.0.php. * You may elect to redistribute this code under either of these licenses. * * Contributors: * VMware Inc. *****************************************************************************/ package org.eclipse.gemini.blueprint.util; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.Constants; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; /** * Utility class that detects the running platform. Useful when certain quirks or tweaks have to made for a specific * implementations. * * Currently we can detect Equinox, Knopflerfish and Felix platforms. * * @author Adrian Colyer * @author Costin Leau */ public abstract class OsgiPlatformDetector { private static final String[] EQUINOX_LABELS = new String[] { "Eclipse", "eclipse", "Equinox", "equinox", }; private static final String[] KF_LABELS = new String[] { "Knopflerfish", "knopflerfish" }; private static final String[] FELIX_LABELS = new String[] { "Apache Software Foundation", "Felix", "felix" }; private static final boolean isR41, isR42; static { boolean methodAvailable = false; ClassLoader loader = Bundle.class.getClassLoader(); try { methodAvailable = (Bundle.class.getMethod("start", new Class[] { int.class }) != null); } catch (Exception ex) { } isR41 = methodAvailable; isR42 = ClassUtils.isPresent("org.osgi.framework.BundleReference", loader); } /** * Returns true if the given bundle context belongs to the Equinox platform. * * @param bundleContext OSGi bundle context * @return true if the context indicates Equinox platform, false otherwise */ public static boolean isEquinox(BundleContext bundleContext) { return determinePlatform(bundleContext, EQUINOX_LABELS); } /** * Returns true if the given bundle context belongs to the Knopflerfish platform. * * @param bundleContext OSGi bundle context * @return true if the context indicates Knopflerfish platform, false otherwise */ public static boolean isKnopflerfish(BundleContext bundleContext) { return determinePlatform(bundleContext, KF_LABELS); } /** * Returns true if the given bundle context belongs to the Felix platform. * * @param bundleContext OSGi bundle context * @return true if the context indicates Felix platform, false otherwise */ public static boolean isFelix(BundleContext bundleContext) { return determinePlatform(bundleContext, FELIX_LABELS); } private static boolean determinePlatform(BundleContext context, String[] labels) { Assert.notNull(context); Assert.notNull(labels); String vendorProperty = context.getProperty(Constants.FRAMEWORK_VENDOR); if (vendorProperty == null) { return false; // might be running outside of container } else { // code defensively here to allow for variation in vendor name over // time if (containsAnyOf(vendorProperty, labels)) { return true; } } return false; } private static boolean containsAnyOf(String source, String[] searchTerms) { for (int i = 0; i < searchTerms.length; i++) { if (source.indexOf(searchTerms[i]) != -1) { return true; } } return false; } /** * Returns the OSGi platform version (using the manifest entries from the system bundle). The version can be empty. * * @param bundleContext bundle context to inspect * @return not-null system bundle version */ public static String getVersion(BundleContext bundleContext) { if (bundleContext == null) return ""; // get system bundle Bundle sysBundle = bundleContext.getBundle(0); // force string conversion instead of casting just to be safe return "" + sysBundle.getHeaders().get(Constants.BUNDLE_VERSION); } /** * Determines if the current running platform implements OSGi Release 4.1 API or not. * * @return if the running platform implements OSGi 4.1 API */ public static boolean isR41() { return isR41; } /** * Determines if the current running platform implements OSGi Release 4.2 API or not. * * @return if the running platform implements OSGi 4.2 API */ public static boolean isR42() { return isR42; } }