/****************************************************************************** | |
* 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.io.internal; | |
import java.lang.reflect.Field; | |
import java.lang.reflect.Method; | |
import java.security.AccessController; | |
import java.security.PrivilegedAction; | |
import org.osgi.framework.Bundle; | |
import org.osgi.framework.BundleContext; | |
import org.osgi.framework.Constants; | |
import org.springframework.util.ReflectionUtils; | |
import org.springframework.util.ReflectionUtils.FieldCallback; | |
import org.springframework.util.ReflectionUtils.FieldFilter; | |
/** | |
* Simple utils class for the IO package. This method might contain util methods | |
* from other packages since it the IO package needs to be stand-alone. | |
* | |
* @author Costin Leau | |
* | |
*/ | |
public abstract class OsgiUtils { | |
private static final String GET_BUNDLE_CONTEXT_METHOD = "getBundleContext"; | |
private static final String GET_CONTEXT_METHOD = "getContext"; | |
public static String getPlatformName(BundleContext bundleContext) { | |
String vendorProperty = bundleContext.getProperty(Constants.FRAMEWORK_VENDOR); | |
String frameworkVersion = bundleContext.getProperty(Constants.FRAMEWORK_VERSION); | |
// get system bundle | |
Bundle bundle = bundleContext.getBundle(0); | |
String name = (String) bundle.getHeaders().get(Constants.BUNDLE_NAME); | |
String version = (String) bundle.getHeaders().get(Constants.BUNDLE_VERSION); | |
String symName = bundle.getSymbolicName(); | |
StringBuilder buf = new StringBuilder(); | |
buf.append(name); | |
buf.append(" "); | |
buf.append(symName); | |
buf.append("|"); | |
buf.append(version); | |
buf.append("{"); | |
buf.append(frameworkVersion); | |
buf.append(" "); | |
buf.append(vendorProperty); | |
buf.append("}"); | |
return buf.toString(); | |
} | |
private static boolean isPlatformVendorMatch(BundleContext bundleContext, String vendorString) { | |
String vendor = bundleContext.getProperty(Constants.FRAMEWORK_VENDOR); | |
if (vendor != null) | |
return vendor.indexOf(vendorString) >= -1; | |
return false; | |
} | |
private static boolean isEquinox(BundleContext bundleContext) { | |
return isPlatformVendorMatch(bundleContext, "clispe"); | |
} | |
private static boolean isKnopflerfish(BundleContext bundleContext) { | |
return isPlatformVendorMatch(bundleContext, "fish"); | |
} | |
private static boolean isFelix(BundleContext bundleContext) { | |
return isPlatformVendorMatch(bundleContext, "pache"); | |
} | |
/** | |
* Returns the underlying BundleContext for the given Bundle. This uses | |
* reflection and highly dependent of the OSGi implementation. Should not be | |
* used if OSGi 4.1 is being used. | |
* | |
* <b>Note:</b> Identical to the util found in Spring-DM core | |
* | |
* @param bundle OSGi bundle | |
* @return the bundle context for this bundle | |
*/ | |
public static BundleContext getBundleContext(final Bundle bundle) { | |
if (bundle == null) | |
return null; | |
// run into a privileged block | |
if (System.getSecurityManager() != null) { | |
return AccessController.doPrivileged(new PrivilegedAction<BundleContext>() { | |
public BundleContext run() { | |
return getBundleContextWithPrivileges(bundle); | |
} | |
}); | |
} | |
else { | |
return getBundleContextWithPrivileges(bundle); | |
} | |
} | |
private static BundleContext getBundleContextWithPrivileges(final Bundle bundle) { | |
// try Equinox getContext | |
Method meth = ReflectionUtils.findMethod(bundle.getClass(), GET_CONTEXT_METHOD, new Class[0]); | |
// fallback to getBundleContext (OSGi 4.1) | |
if (meth == null) | |
meth = ReflectionUtils.findMethod(bundle.getClass(), GET_BUNDLE_CONTEXT_METHOD, new Class[0]); | |
final Method m = meth; | |
if (meth != null) { | |
ReflectionUtils.makeAccessible(meth); | |
return (BundleContext) ReflectionUtils.invokeMethod(m, bundle); | |
} | |
// fallback to field inspection (KF and Prosyst) | |
final BundleContext[] ctx = new BundleContext[1]; | |
ReflectionUtils.doWithFields(bundle.getClass(), new FieldCallback() { | |
public void doWith(final Field field) throws IllegalArgumentException, IllegalAccessException { | |
ReflectionUtils.makeAccessible(field); | |
ctx[0] = (BundleContext) field.get(bundle); | |
} | |
}, new FieldFilter() { | |
public boolean matches(Field field) { | |
return BundleContext.class.isAssignableFrom(field.getType()); | |
} | |
}); | |
return ctx[0]; | |
} | |
} |