Showing posts with label OSGi. Show all posts
Showing posts with label OSGi. Show all posts

Monday, March 5, 2012

Embedding an HTTP server in Equinox

I want to create a test server for my application. Using embedding Http server in equinox is my first option.

I had experience using simple http service implementation of equinox, however I want to play with Jetty this time.

Following the guide of Equinox server, I can't running a Jetty server with my servlet in Eclipse Indigo. Obviously the guide is out of date.

After tuning it, I found below bundles are minimum collection to run Jetty inside OSGi runtime.


You only need create a run configuration of OSGi framework, add your bundles with servlets and above bundles.

Thursday, October 22, 2009

Eclipse/OSGi preference

The IPreferenceStore API of Eclipse is based on OSGi's preferences service. Equinox implements several scope context for different preferences, such DefaultScope, InstanceScope and ConfigurationScope. The IPreferenceStore is the wrapper of instance scope for back-compatibility. It stored the data in workspace(osgi.data.area).
The workspace folder would be created when launching RCP application if it doesn't exist. But we can use argument '-data @none' to suppress the creation of workspace. If that, the instance scope/IPreferenceStore can't store any value any more.
There is a workaround to resolve such issue. Use ConfigurationScope instead of InstanceScope. Both of them are implemented the same interface, so it's easy to migrate to use ConfigurationScope. The data of configuration scope would be stored in @config.dir/.setting folder.

Sunday, September 28, 2008

[OSGi][Eclipse]Add custom jar or path into Equinox Framework

Set vm arguments 'osgi.framework.extensions' and 'osgi.frameworkClassPath' when vm starts. If those value are set, those jar or path would be added into the classloader when starting EclipseStarter.

See org.eclipse.equinox.launcher.Main for more details in the source code of Eclipse 3.4.
Best Regards
Kane

Friday, August 1, 2008

[OSGi]How to acquire the fragments of specified bundle

The answer is very simple, using the service 'org.eclipse.service.PackageAdmin'.

Thursday, July 17, 2008

[Eclipse]Equinox's classloader and its URL schema

Equinox uses the adaptor hooks to implement the class loader.
See http://wiki.eclipse.org/Adaptor_Hooks for more detail

BaseClassLoadingHook would search the native code on itself. If it find the file in that jar file, it would extract the native library into its storage folder.

EclipseClassLoadingHook defines some variables to search the native library. Belows are built-in variables:

result.add("ws/" + info.getWS() + "/"); //$NON-NLS-1$ //$NON-NLS-2$
result.add("os/" + info.getOS() + "/" + info.getOSArch() + "/"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
result.add("os/" + info.getOS() + "/"); //$NON-NLS-1$ //$NON-NLS-2$

So the classloader can find your native library that under those path. If your bundle is jar file, equinox would extract your native library into its storage folder.

I prefer to use OSGi header(Bundle-NativeCode) defining the path of native code, which still works on other OSGi implementations.

Equinox defines its url schema, one of them is named as 'BundleURLConnection'. From its name, we know it's used for describing the files of bundle. You can obtain the url of file that is located on bundle by Bundle.getResource()/Bundle.getEntry()/Bundle.findEntries()/Bundle.getResources(). The return value of those functions are an object of BundleURLConnection. Once it's used as the argument of FileLocator.toFileURL(URL), the jar bundle would be unpacked into its storage folder recursively.

Wednesday, April 16, 2008

[OSGi][Equinox]URL Handlers Service

OSGi provides a mechanism to let user contribute custom schemes automatically. It avoid some restriction with Java facilities for extending the handlers. The more detail could be found from OSGi specification R4, which has description how OSGi implements URL Handler Service.

Use a sample to illustrate how to contribute your scheme(protocol):

1. register your URLStreamHandlerService implementation, which must contain a property named "url.handler.protocol". below register my scheme 'smb'
public void start(BundleContext context) throws Exception {
Hashtable properties = new Hashtable();
properties.put( URLConstants.URL_HANDLER_PROTOCOL, new String[] { "smb" } );
context.registerService(URLStreamHandlerService.class.getName(), new SmbURLHandler(), properties );
}
2. your URL Handler extends AbstractURLStreamHandlerService, and implements abstract function 'openConnection(URL)'
public class SmbURLHandler extends AbstractURLStreamHandlerService {

public URLConnection openConnection(URL url) throws IOException {
return new SmbURLConnection(url);
}

}
3. your URL Connection extends java.net.URLConnection
public class SmbURLConnection extends URLConnection {

protected SmbURLConnection(URL url) {
super(url);
}

public void connect() throws IOException {
}
}

Monday, March 31, 2008

[OSGi][Equinox]the Bundle-NativeCode implementation in Equinox

OSGi Spec defines Bundle-NativeCode header to contain a specification of native code libraries contained in that bundle. All magic things are initialized by org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLibrary(String) and org.eclipse.osgi.framework.internal.core.BundleLoader.findLibrary(String). Then BundleLoader uses the org.eclipse.osgi.baseadaptor.BaseData(an implementation of BundleData) to find the library path, if the bundle is NOT a jar file, it would directly get the absolute path of library. Otherwise, the BaseData would extract the library file if it could NOT find it in OSGi bundle storage(located in ${data}/org.eclipse.osgi/bundles/[bundle_id]/.cp/). Refer to org.eclipse.osgi.baseadaptor.BaseData.findLibrary(String) for more detail.