Changes

Jump to: navigation, search

OSGi : Develop Simple Apps

7,686 bytes removed, 23:56, 24 January 2011
no edit summary
{{Ecl_activities|type=OSGi|type-repo=osgi}}__NOTOC____NOTOC__<h2>Bundels and Java Applications</h2>
# Check out the [https://guest:1673852@zenit.senecac.on.ca/svn/ecl500/Lectures/trunk/w11-osgi-simple-interface/ Service Interface]
# Check out the [https://guest:1673852@zenit.senecac.on.ca/svn/ecl500/Lectures/trunk/w11-osgi-simple-serviceprovider/ Service Provider]
# Check out the [https://guest:1673852@zenit.senecac.on.ca/svn/ecl500/Lectures/trunk/w11-osgi-simple-serviceconsumer/ Service Consumer]
<h3>[[Steps for Building Applications from Bundels]]</h3>
<strong>Steps for Building Bundels</strong>[[File:OSGi-DS.png|border|SOA in JVM|400px| ]]
<h4h2>1. Study Bundels and the InterfacesDeclarative Services</h4h2* # Check out the [httphttps://www.osgi.org/javadoc/r4v42/org/osgi/framework/Bundle.html Bundle]* [httpguest://www1673852@zenit.osgisenecac.org/javadoc/r4v42/org/osgi/framework/BundleContexton.html BundleContext]* [http://www.osgi.org/javadoc/r4v42/org/osgica/frameworksvn/BundleActivator.html BundleActivator]----------<h4>2. Define the Bundle Service Interface<ecl500/h4> <h5>2.1 Define the Java Interface that exposes the services<Lectures/h5>Let us suppose that one wants to define a service that allows the user to find a book using its isbn. <source lang="java">package cs.ecl.osgi.simple.bookfinder; public interface BookFinder { Book findBook(int isbn) throws BookNotFoundException;}<trunk/source>Define in the same bundle the classes that you need such as: Book and BookNotFoundException<source lang="java">package cs.ecl.osgi.simple.bookfinder; public class Book { private int isbn; private String title; public Book(int isbn, String title) { super(); this.isbn = isbn; this.title = title; }  public String getTitle() { return title; }  public void setTitle(String title) { this.title = title; }  public int getIsbn() { return isbn; }  public void setIsbn(int isbn) { this.isbn = isbn; }} package cs.ecl.osgi.simple.bookfinder; public class BookNotFoundException extends Exception { private static final long serialVersionUID = w11-6184839510952070091L;  public BookNotFoundException() { super(); }  public BookNotFoundException(String arg0) { super(arg0); }}</source> <h5>2.2 Define the MANIFEST.MF for the bundle ''cs.ecl.osgi.simple.bookfinder'' </h5><source lang="xml">Manifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: BookfinderBundle-SymbolicName: cs.ecl.osgi.simple.bookfinderBundle-Version: 1.0.0.qualifierBundledeclarativeservice-RequiredExecutionEnvironment: JavaSE-1.6Bundle-Vendor: Seneca College - Eclipse CourseExport-Package: cs.ecl.osgi.simple.bookfinder</source>---------- <h4>3. Define the Bundle consumer Declarative Service Provider</h4>The service ''bookfinder'' could be used only if there is a bundle that implements the service. The bundle ''cs.ecl.osgi.simple.bookfinderservice'' implements ''BundleActivator'' interface in the ''Activator'' class. This bundle will be called 'service provider'. <h5>3.1 Define the Activator class for the service provider</h5>Consumer]<source lang="java">package cs.ecl.osgi.simple.bookfinderservice; import org.osgi.framework.BundleActivator;import org.osgi.framework.BundleContext; import cs.ecl.osgi.simple.bookfinder.BookFinder;import cs.ecl.osgi.simple.bookfinderservice.internals.BookFinderImplementation; public class Activator implements BundleActivator {  private static BundleContext context;  static BundleContext getContext() { return context; } public void start(BundleContext bundleContext) throws Exception { Activator.context = bundleContext; BookFinder bookService = new BookFinderImplementation(); context.registerService(BookFinder.class.getName(), bookService, null); System.# Check out.println(" Bookfinder service registered "); } public void stop(BundleContext bundleContext) throws Exception { Activator.context = null; System.out.println(" Bookfinder service stopped "); }}</source> <h5>3.2 Define the implementation class for the service <[https:/h5>The class must be defined in an internal package ''cs.ecl.osgi.simple.bookfinderservice.internals'' <u>The package will not be exposed to the outside world</u> <source lang="java">package cs.ecl.osgi.simple.bookfinderservice.internals; import cs.ecl.osgi.simple.bookfinder.Book;import cs.ecl.osgi.simpleguest:1673852@zenit.bookfindersenecac.BookFinder;import cs.ecl.osgi.simple.bookfinder.BookNotFoundException; public class BookFinderImplementation implements BookFinder { private static final Book[] BOOKS = new Book[] { new Book(1234, "Java Programming Language"), new Book(5678, "OSGi") };  public Book findBook(int isbn) throws BookNotFoundException { Book found = null;  for (Book b : BOOKS) if (bon.getIsbn() == isbn) { found = b; break; } if (found == null) throw new BookNotFoundException("No book with isbn = " + isbn);  return found; }}ca/svn/This is a simple and trivial implementation. ecl500/Lectures/There real implementation should use database, distributed system, etc.<trunk/source> <h5>3.3 Define the MANIFEST.MF for the ''cs.ecl.osgi.simple.bookfinderservice'' bundle</h5><source lang="xml">Manifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: BookfinderserviceBundle-SymbolicName: cs.ecl.osgi.simple.bookfinderserviceBundle-Version: 1.0.0.qualifierBundle-Activator: cs.ecl.osgi.simple.bookfinderservice.ActivatorBundle-ActivationPolicy: lazyBundle-RequiredExecutionEnvironment: JavaSE-1.6Import-Package: org.osgi.framework;version="1.3.0"Bundle-Vendor: Seneca College - Eclipse CourseExport-Package: cs.ecl.osgi.simple.bookfinderserviceRequirew11-Bundle: cs.ecl.osgi.simple.bookfinder;bundle-version="1.0.0"</source> The bundle export only the package ''cs.ecl.osgi.simple.bookfinderservice'' Meanwhile, the implementation package - ''cs.ecl.osgi.simple.bookfinderservice.internals'' declarativeservice- <strong>is hidden to the outside world and can be changed dynamically any time a better implementation is created</strong>. The bundle provider requires the osgi framework and the interface bundle (e.g. ''cs.ecl.osgi.simple.bookfinder'' bundle) : ''Require-Bundle'': cs.ecl.osgi.simple.bookfinder;bundle-version="1.0.0": ''Import-Package'': org.osgi.framework;version="1.3.0" The bundle'' cs.ecl.osgi.simple.bookfinderservice'' export its service, namely the bood finder service: : ''Export-Package'': cs.ecl.osgi.simple.bookfinderservice ---------- <h4>3. Define the Bundle Declarative Service Consumer</h4>The service ''bookfinder'' could be used only if there is a bundle that requests its service. The bundle ''cs.ecl.osgi.simple.bookfindconsumer'' by the time is activated ''BundleActivator'' looks for the service in the registry. This bundle will be called 'service consumer'.Provider]<h5h3>3.1 Define the Activator class for the service consumer</h5><source lang="java">package cs.ecl.osgi.simple.bookfinderconsumer.bookfinderconsumer; import org.osgi.framework.BundleActivator;import org.osgi.framework.BundleContext;import org.osgi.framework.ServiceReference; import cs.ecl.osgi.simple.bookfinder.BookFinder;import cs.ecl.osgi.simple.bookfinder.BookNotFoundException; public class Activator implements BundleActivator {  private static BundleContext context; private BookFinder finderService;  static BundleContext getContext() { return context; }  public void start(BundleContext bundleContext) throws Exception { Activator.context = bundleContext;  ServiceReference reference = context .getServiceReference(BookFinder.class.getName()); if (reference != null) { finderService = (BookFinder) context.getService(reference);  if (finderService != null) { printBook(finderService); context.ungetService(reference); } else System.err.println("the service cannot be used !!!"); } else System.err.println("the service cannot be found !!!");  }  public void stop(BundleContext bundleContext) throws Exception { Activator.context = null; System.err.println("consumer bundle stopped"); }  public void printBook(BookFinder finderService) { try { String s = finderService.findBook(1234).getTitle();  System.out.print("Book found: " + s + " !!!"); } catch (BookNotFoundException ex) { System.err.println(ex.getMessage()); } }}</source> [[Steps to find and use the service: 1. Look for the service reference in the bundle context: The Framework returns ''ServiceReference'' objects from the ''BundleContext.getServiceReference'' method. A ''ServiceReference'' object may be shared between bundles and can be used:1. to examine the properties of the service2. to get the service object.   <b>ServiceReference reference = context.getServiceReference(BookFinder.class.getName());</b>   2. Look for the service object referenced by the specified ''ServiceReference'' object, namely the ''reference'' variable obtained at the first step. if (reference != null) <b> finderService = (BookFinder) context.getService(reference);Building Declarative Services]]</bh3>

Navigation menu