|
|
(18 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
− | {{Ecl_activities|type=OSGi|type-repo=osgi}} | + | {{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-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-serviceprovider/ Service Provider] |
| # Check out the [https://guest:1673852@zenit.senecac.on.ca/svn/ecl500/Lectures/trunk/w11-osgi-simple-serviceconsumer/ Service Consumer] | | # 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| ]] |
| | | |
− | <h4>1. Study the Interfaces</h4> | + | <h2>Bundels and the Declarative Services</h2> |
− | | + | # Check out the [https://guest:1673852@zenit.senecac.on.ca/svn/ecl500/Lectures/trunk/w11-osgi-simple-declarativeservice-consumer Declarative Service Consumer] |
− | * [http://www.osgi.org/javadoc/r4v42/org/osgi/framework/Bundle.html Bundle]
| + | # Check out the [https://guest:1673852@zenit.senecac.on.ca/svn/ecl500/Lectures/trunk/w11-osgi-simple-declarativeservice-provider Declarative Service Provider] |
− | * [http://www.osgi.org/javadoc/r4v42/org/osgi/framework/BundleContext.html BundleContext]
| + | <h3>[[Steps for Building Declarative Services]]</h3> |
− | * [http://www.osgi.org/javadoc/r4v42/org/osgi/framework/BundleActivator.html BundleActivator]
| |
− | | |
− | <h4>2. Define the Bundle Service Provider</h4>
| |
− | <h5> 2.1 Define the Generic Bundle Service Provider</h5>
| |
− | | |
− | <h5>2.1.1 Define the Java Interface that exposes the services</h5>
| |
− | Let us suppose that you want to define a service that allows the user to find a book from the book isbn. Then the interface should look similare with this one:
| |
− | <source lang="java">
| |
− | package cs.ecl.osgi.simple.bookfinder;
| |
− | | |
− | public interface BookFinder {
| |
− | Book findBook(int isbn) throws BookNotFoundException;
| |
− | }
| |
− | </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 = -6184839510952070091L;
| |
− | | |
− | public BookNotFoundException() {
| |
− | super();
| |
− | }
| |
− | | |
− | public BookNotFoundException(String arg0) {
| |
− | super(arg0);
| |
− | }
| |
− | }
| |
− | </source>
| |
− | | |
− | | |
− | Define in the MANIFEST.MF that cs.ecl.osgi.simple.bookfinder is the '''Exported-Package'''
| |
− | <source lang="xml">
| |
− | Manifest-Version: 1.0
| |
− | Bundle-ManifestVersion: 2
| |
− | Bundle-Name: Bookfinder
| |
− | Bundle-SymbolicName: cs.ecl.osgi.simple.bookfinder
| |
− | Bundle-Version: 1.0.0.qualifier
| |
− | Bundle-RequiredExecutionEnvironment: JavaSE-1.6
| |
− | Bundle-Vendor: Seneca College - Eclipse Course
| |
− | Export-Package: cs.ecl.osgi.simple.bookfinder
| |
− | </source>
| |
− | | |
− | <h5>2.2 Define a Concrete Bundle Provider</h5>
| |
− | <h6>2.2.1 Define the Activator class</h6>
| |
− | <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.out.println(" Bookfinder service registered ");
| |
− | }
| |
− |
| |
− | public void stop(BundleContext bundleContext) throws Exception {
| |
− | Activator.context = null;
| |
− | System.out.println(" Bookfinder service stopped ");
| |
− | }
| |
− | }
| |
− | </source>
| |
− | | |
− | <h6>2.2.1 Define the internal implementation class (the class BookFinderImplementation <u>will not be exposed to the outside world</u>)</h6>
| |
− | | |
− | <source lang="java">
| |
− | package cs.ecl.osgi.simple.bookfinderservice.internals;
| |
− | | |
− | import cs.ecl.osgi.simple.bookfinder.Book;
| |
− | import cs.ecl.osgi.simple.bookfinder.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 (b.getIsbn() == isbn) {
| |
− | found = b;
| |
− | break;
| |
− | }
| |
− | if (found == null)
| |
− | throw new BookNotFoundException("No book with isbn = " + isbn);
| |
− | | |
− | return found;
| |
− | }
| |
− | }
| |
− | //This could be any implementation: database, file system, distributed, etc. | |
− | | |
− | </source>
| |
− | | |
− | Define in the MANIFEST.MF for cs.ecl.osgi.simple.bookfinderservice
| |
− | <source lang="xml">
| |
− | Manifest-Version: 1.0
| |
− | Bundle-ManifestVersion: 2
| |
− | Bundle-Name: Bookfinderservice
| |
− | Bundle-SymbolicName: cs.ecl.osgi.simple.bookfinderservice
| |
− | Bundle-Version: 1.0.0.qualifier
| |
− | Bundle-Activator: cs.ecl.osgi.simple.bookfinderservice.Activator
| |
− | Bundle-ActivationPolicy: lazy
| |
− | Bundle-RequiredExecutionEnvironment: JavaSE-1.6
| |
− | Import-Package: org.osgi.framework;version="1.3.0"
| |
− | Bundle-Vendor: Seneca College - Eclipse Course
| |
− | Export-Package: cs.ecl.osgi.simple.bookfinderservice
| |
− | Require-Bundle: cs.ecl.osgi.simple.bookfinder;bundle-version="1.0.0"
| |
− | </source> | |
− | | |
− | The bundle export the package cs.ecl.osgi.simple.bookfinderservice Meanwhile, the implementation package - cs.ecl.osgi.simple.bookfinderservice.internals - <strong>is hidden to the outside world and can be change dynamically</strong> and can be changed dynamically anytime a better implementation is created.
| |
− | | |
− | | |
− | The bundle requires the generic bundle service definition: cs.ecl.osgi.simple.bookfinder;bundle-version="1.0.0"
| |
− | The bundle requires the osgi framework by asking for the org.osgi.framework;version="1.3.0" package
| |
− | : Require-Bundle: cs.ecl.osgi.simple.bookfinder;bundle-version="1.0.0"
| |
− | : Import-Package: org.osgi.framework;version="1.3.0"
| |