osgi world congress workshop exercise - p kriens
TRANSCRIPT
app2
app3 app1
app4
Browser
app 1 app 2 app 3 app 4
SP 2
SP 3
SP 4
SP 1
multicast
Activator Distributor
Link
HttpTracker Tracks http servers
finds buddies
<<interface>> Http Service
Service Tracker Thread <<interface>>
BundleActivator
Tracks buddies Registers page
Portal Tracks portal entries
Registers /portal page
LogService
Logs messages
Activator
<<interface>> BundleActivator
Activator
<<interface>> BundleActivator LogService
Logs messages
void log( String msg, Throwable exception ) { ServiceReference r = context.getServiceReference( LogService.class.getName() ); LogService log =(LogService)context.getService(r); if ( log != null ) { if ( exception == null ) log.log( LogService.LOG_INFO, msg ); else log.log( LogService.LOG_ERROR, msg, exception ); } else System.out.println( msg + " : " + exception ); context.ungetService( r ); }
Manifest-Version: 1.0 Bundle-Activator: aQute.world.congress.Activator Import-Package: org.osgi.framework, org.osgi.service.log
HttpTracker Tracks http servers
<<interface>> Http Service
Service Tracker
Registers page
Portal
Registers /portal page
Activator
<<interface>> BundleActivator LogService
Logs messages
<html> <head> <title>My Demo HTML page</title> </head> <body> <h1>My Demo</h1> This is aQute's (use your own name!) demo page </body> </html>
Activator activator;
public HttpTracker( Activator activator, BundleContext context ) { super( context, HttpService.class.getName(),null); this.activator = activator; }
public Object addingService( ServiceReference reference ) { HttpService http = (HttpService)super.addingService(reference); try { http.registerResources("/mydemo", "", this ); } catch( NamespaceException e ) { activator.log( "Cannot register because “
+ “name is already in use /mydemo", e ); } return http; }
public URL getResource(String name) { try { URL url = getClass().getResource( name.substring(1) ); return url; } catch( Exception e ) { e.printStackTrace(); } return null; }
public boolean handleSecurity( HttpServletRequest request, HttpServletResponse response) throws IOException { return true; }
http = new HttpTracker( this, context ); http.open();
HttpTracker http;
// Add to stop method http.close();
Manifest-Version: 1.0 Bundle-Activator: aQute.world.congress.Activator Import-Package: org.osgi.framework, org.osgi.service.log,org.osgi.util.tracker, org.osgi.service.http,javax.servlet.http, javax.servlet
HttpTracker Tracks http servers
<<interface>> Http Service
Service Tracker
Registers page
Portal
Registers /portal page
Activator
<<interface>> BundleActivator LogService
Logs messages
Distributor
Link
finds buddies
Thread
Tracks buddies
Tracks portal entries
boolean active = true; DatagramSocket socket; byte outgoing[]; Activator activator;
Distributor( Activator activator, String outgoing ) { super("distributor"); this.activator = activator; this.outgoing = outgoing.getBytes(); }
public void run() { while ( active ) try { socket = new DatagramSocket( 2014 ); socket.setSoTimeout( 5000 ); activator.log("Discovery starts.", null); … inner loop … see next slide socket.close(); socket = null; } catch(Exception e) { activator.log( "Main discover loop exit", e ); if ( active ) try { Thread.currentThread().sleep(1000); } catch( Exception x) {} } activator.log("Discovery quits.", null); }
while ( active ) try { DatagramPacket packet = new DatagramPacket(new byte[256], 256); socket.receive(packet); String incoming = new String( packet.getData(), 0, packet.getLength()); activator.process( new Link(incoming) ); } catch(InterruptedIOException e) { announce();} catch(Exception e) { if ( active ) activator.log( "Receving remote “
+ “service packets, ignoring ", e ); }
void announce() throws IOException { DatagramSocket announce = new DatagramSocket(); DatagramPacket packet = new DatagramPacket( outgoing, outgoing.length, InetAddress.getByName("255.255.255.255"), 2014 ); announce.send(packet); }
void close() { active = false; socket.close(); }
Hashtable properties = new Hashtable(); ServiceRegistration registration;
Link( String msg ) { StringTokenizer tz =
new StringTokenizer( msg, "|" ); properties.put( "title", tz.nextToken() ); properties.put( "description",tz.nextToken()); properties.put( "url", tz.nextToken() ); }
void register( BundleContext context ) { registration = context.registerService( Link.class.getName(), this, properties ); }
void modify( Link link ) { registration.setProperties(link.properties); }
void unregister() { registration.unregister(); }
Object getUrl(){ return properties.get( "url" ); }
Hashtable links = new Hashtable(); void process( Link link ) { Link existing = (Link) links.get( link.getUrl() ); if ( existing != null ) existing.modify( link ); else { link.register( context ); links.put( link.getUrl(), link ); existing = link; } }
// Add to start method String host= InetAddress.getLocalHost().getHostAddress(); if ( System.getProperty(
"org.osgi.service.http.port" ) != null ) host += ":" + System.getProperty( "org.osgi.service.http.port" );
distributor = new Distributor( this, "My Title|My Own Description|http://" + host +
"/mydemo/page.html" ); distributor.start();
// Add to stop method distributor.close();