Difference between revisions of "OSGi : Develop Simple Apps"

From CDOT Wiki
Jump to: navigation, search
 
(8 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 Interface</h4>
 
 
 
<h5>2.1 Define the Java Interface that exposes the services</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;
 
}
 
</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>
 
 
 
<h5>2.2 Define the MANIFEST.MF  for the bundle ''cs.ecl.osgi.simple.bookfinder'' </h5>
 
<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>
 
----------
 
 
 
<h4>3. Define the Bundle 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>
 
<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>
 
 
 
<h5>3.2 Define the implementation class for the service </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.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 is a simple and trivial implementation.
 
//There real implementation should use database,  distributed system, etc.
 
</source>
 
 
 
<h5>3.3 Define  the MANIFEST.MF for the ''cs.ecl.osgi.simple.bookfinderservice'' bundle</h5>
 
<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 only 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 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 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'.
 
 
 
<h5>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 service
 
2. 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);</b>
 
 
 
3. If the service reference is valid, invoke its services and <b>release the service object</b> referenced by the specified ''ServiceReference'' object.
 
    if (finderService != null) {
 
// invoke the services
 
<b>context.ungetService(reference);</b>
 
    }
 

Latest revision as of 23:56, 24 January 2011


OSGi Activities



Start the lab activities in the order defined below:

Bundels and Java Applications

  1. Check out the Service Interface
  2. Check out the Service Provider
  3. Check out the Service Consumer

Steps for Building Applications from Bundels

OSGi-DS.png

Bundels and the Declarative Services

  1. Check out the Declarative Service Consumer
  2. Check out the Declarative Service Provider

Steps for Building Declarative Services