1.04k likes | 1.32k Views
OSGi Bootcamp Workshop Exercise. By Peter Kriens CEO aQute OSGi Technology Officer and OSGi Fellow. Setting Up The Environment. The CD contains all the tools you need: Java 1.4.1 Eclipse 2.0.2 Exercise projects with source (ex dir) Framework fwx.exe
E N D
OSGi BootcampWorkshop Exercise By Peter Kriens CEO aQute OSGi Technology Officer and OSGi Fellow
Setting Up The Environment • The CD contains all the tools you need: • Java 1.4.1 • Eclipse 2.0.2 • Exercise projects with source (ex dir) • Framework fwx.exe • Also available on the network \\ziggy\fwx • Install Java 1.4.1, Install Eclipse • Copy the workshop dir to c:\fwx
What Will We Do? • These exercises take a step by step approach to make a larger program • This program is a “See your buddies” Web page viewer • Each participant will make a Web page • This web page is automatically registered with all participants portal's • With Zero Administration …
Overview Browser app 1 app 2 app 3 app 4 SP 2 app2 SP 3 app3 multicast app1 SP 1 app4 SP 4
Architecture: Classes Thread <<interface>> BundleActivator LogService ServiceTracker Logs messages Distributor Activator HttpTracker HttpContext finds buddies Tracks http servers Tracks buddies Registers page Portal Link <<interface>> Http Service Tracks portal entries Registers /portal page
What Will We Learn? • Using Eclipse • Constructing an OSGi bundle • Class path management • Using the Log service • Tracking of the Http Services • Registering a servlet • Using the demo portal • Networking code
Create a simple bundle printing "Hello World" and "Goodbye World" at start and stop What will you learn? Construct a BundleActivator class Add a correct Manifest Place it all in a JAR file Starting the Framework Install/Uninstall a bundle 1.1 Hello World Bundle
1.1 Back to Basics: Hello World <<interface>> BundleActivator Activator The Activator class will print “Hello World” when the bundle is started and “Goodbye World” when it stops.
1.1 Getting Started • Assumptions • Eclipse 2.0.2 (check in Help:About, 2.0.0 does not work!) installed • Started Eclipse
1.1 Getting Started • Create new Java Project • File:New:Project • Java Project, Next • Name is “ws” • Default location, Next • Libraries, Add external jars, • servlet.jar, osgi.jar (from where you copied the files. c:\fwx\osgi.jar) • Attach source (select osgi.jar), Finish
1.1 Setup Activator class • Add Package • File:New:Package • Name, aQute.world.congress
1.1 Setup Activator • Add new class • File:New:Class • Package, aQute.world.congress • Name, Activator • Interfaces • Add BundleActivator • Finish • Eclipse will open a generated source file
1.1 Write Hello/Goodbye World • Fill in the System.out.println(“...”) in the appropriate places • Save the file (File:Save or control-S) • This automatically compiles, so correct any errors
1.1 Create The Manifest • We only define what class to start: Activator • File:New:File, name it Manifest.mf • Store in aQute.world.congress package/folder • Manifest MUST end with 2 empty lines!! • Fill in (and save):Manifest-Version: 1.0Bundle-Activator: aQute.world.congress.Activator
1.1 Create Bundle JAR file! • Select “ws” in left pane • Press right mouse button • Select Export • Select JAR File • Next
1.1 Create JAR File • Export Destination • Name it ws.jar • Save the JAR in the load directorywhere you copied fwx,e.g. c:\fwx\load • Next
1.1 Create JAR file • Deselect “with compile errors” • Save the description in the “ws” workspace, under the name bundle.jardesc • Next
1.1 Create JAR file • Set to use existing Manifest • Select Manifest.mf • Finish • (It is OK to create theload directory)
1.1 Starting A Framework • The fwx.jar is the OSGi Reference Framework with all the R3 services reference implementations • This Framework is not optimized, nor industrialized • It expires in 60 days • Contact a vendor for a real framework • To start it, open a window on its directory and double click it • It will automatically start all bundles in the load directory • This is not standard but implemented in a bundle
1.1 Restarting • You can restart the bundle by • select the bundle.jardesc • Right mouse: Create Jar • This works because the fileinstall bundle on the Framework will detect that the JAR file is modified in the load directory • This will automatically update the bundle in the Framework (look at the console)
1.1 What Did We Learn? • We learned how to create a real bundle • This bundle needed • An Activator class • A Manifest • These components were packed in a JAR file • This JAR file was installed and started on an OSGi Framework with the fileinstaller bundle • The console was used to see the start and stop methods
1.2 Using the Log Service • Instead of using the console, change the code to use the Log Service from the registry • What will you learn in this exercise? • Use a service from another bundle • Import packages from another bundle • Get a service from the registry • Use the log service • Find out the methods of a service
1.2 Using The Log Service <<interface>> BundleActivator LogService Logs messages Activator We will now use a service: The Log Service
Simple and small Log service for operator 4 Levels INFO, DEBUG, WARNING, ERROR Automatically logs framework events in a defined way Other bundles can access log history Management bundle Length implementation dependent Used also for accounting, notifications org.osgi.service.log v1.1Log Service
org.osgi.service.log v1.1Log Service a log user a log reader A log user bundle A log reader using bundle Log a message Retrieve log LogService LogEntry LogListener LogReader Service Send new log entry A log entry impl. Message log a log service impl. A log reader impl. Store a message for retrieval and broadcast Log Service Impl. bundle
1.2 Prepare for the Log Service • Save the BundleContext parameter in a context instance variableBundleContextcontext;publicvoid start(BundleContext context) {this.context = context; ...}
1.2 The log() method • Add a log() method to the Activator class: voidlog(Stringmsg,Throwableexception){ ServiceReferenceref=context.getServiceReference( LogService.class.getName()); LogServicelog=null; if(ref!=null){ log=(LogService)context.getService(ref); if(log!=null){ if(exception==null) log.log(LogService.LOG_INFO,msg); else log.log(LogService.LOG_ERROR,msg,exception); } context.ungetService(ref); return; } System.out.println(msg+" : "+exception); }
1.2 Use the log method • Replace the calls to System.out with calls to the log() methodpublicvoid start(BundleContext context) {this.context = context; log( "Hello world", null );}publicvoid stop(BundleContext context){ log( "Goodbye world", null );}
1.2 Organize Imports • Source:Organize Imports • This will automatically add the necessary import statements
1.2 Contents of LogService • How can you find out what the LogService can do for you? • Use the Javadoc (on the CD) • Click on the type, open context menu (right mouse button) and select "Open Declaration" • Use the Ctrl-Space function in Eclipse
1.2 Finding The Methods Type Ctrl-Space
1.2 Importing • We use the Log Service, this requires the import of the org.osgi.service.log package • This is indicated in the Manifest file with the Import-Package manifest header • This header may contain any number of packages, separated with a comma, and optionally with a specification-version modifier
1.2 Modify The Manifest • Edit Manifest.mf • Add Import-Package for • org.osgi.service.log Manifest-Version: 1.0 Bundle-Activator: aQute.world.congress.Activator Import-Package: org.osgi.framework, org.osgi.service.log;specification-version=1.0
1.2 Using the Log Service • Save the source file (correct compile errors) • Select bundle.jardesc, right menu, Create JAR • Check the console of fwx: • Goodbye world • But no Hello world … This is now in the log • Where is the log????
1.2 Viewing the Log Service • Open a telnet session • Start:Run:telnet localhost 2011 • This opens a simple OSGi console/debugger • Type • log
1.2 The console • The console bundle has many functions • exports - shows package export/import • lsb - list bundles • lss - list services (can use filter) • install <uri> - install • uninstall <id> • update bundle <id> • help • Can be extended by other bundles, see org.osgi.tools.command.CommandProvider
1.2 Changing the version • Verify what happens when the specfication version is modified • Set the version to 1.8 and create the JAR file
1.2 What Did We Learn? • Using the Log Service • Importing a package, with version specification • Getting a service from the registry • Using the OSGi console bundle
1.2a Using the Service Tracker • Track the OSGi Log Service with a Service Tracker • What will we learn? • How to efficiently track a service • Assure that a temporary absence of a service does not disrupt our program • The org.osgi.util.tracker.ServiceTracker utility
1.2a Use the ServiceTracker • Create a ServiceTracker for the logServiceTrackertracker;publicvoid start(BundleContext context) {this.context = context; tracker = new ServiceTracker( context, LogService.class.getName(), null ); tracker.open();}
1.2a Use The ServiceTracker • Change the log() method to use the trackervoid log( String msg, Throwable exception ) {try { LogService log =(LogService) tracker.waitForService(15000);if ( exception == null ) log.log( LogService.LOG_INFO, msg ); else log.log( LogService.LOG_ERROR, msg, exception );return; } catch ( InterruptedException ie ) {} System.out.println( msg + " : " + exception );}
1.2a What Did We Learn? • We now correctly handling the coming and going of services • Using a ServiceTracker simplifies the coding of services that are obtained from the registry • The use of the log is now robust
1.3 Using the Http Service • Register a static HTML page with the local Http Service • What will we learn? • Use the ServiceTracker more extensively • How to register a static HTML page with the Http Service • How to implement the HttpContext
1.3 Publishing a page <<interface>> BundleActivator LogService ServiceTracker Logs messages Activator HttpTracker HttpContext Tracks http servers Registers page <<interface>> Http Service Registers /portal page
Provides web access to bundles A powerful servlet runner Supports Servlets Version 2.1 Very simple to export static pages and files (like images) Automatically unregisters servlets when bundle is stopped org.osgi.service.http v1.1Http Service