# HelloWorld OSGi Example

This example demonstrates how to develop a simple OSGi WAR bundle containing a RESTful hello world web service

## Contents

The example WAR (see the `war-bundle` module) consists of two Jersey resources:

`com.sun.jersey.samples.helloworld.HelloWorldResource`
  that produces a textual response to an HTTP GET

`com.sun.jersey.samples.helloworld.AnotherResource`
  that produces a different textual response to an HTTP GET. The purpose of this resource is to show how to define multiple web resources within a web application.

The mapping of the URI path space is presented in the following table:

URI path | Resource class | HTTP methods
--- | --- | ---
/helloworld | HelloWorldResource | GET
/another | AnotherResource | GET

## Running the Example

To run the example, you would need to build the WAR file and install it to an OSGi runtime (e.g. Apache Felix) together with other OSGi modules. Look at the attached `functional-test` module for details on the programatical runtime configuration. To build the war archive and run the tests, you can just launch

    %mvn clean install

After downloading and installing Felix, you can also deploy the WAR manually as shown below. The following steps are known to work with the Felix version 4.2.1. You will need to replace <version> with the current Jersey version, and <repository> with either `snapshots` or `releases` based on whether you depend on a snapshot or stable release version of Jersey respectively, in the install commands below. The war archive built by the mvn command above should be located under the `war-bundle/target` subdirectory:

    %unzip ~/Downloads/org.apache.felix.main.distribution-4.2.1.zip
    %cp war-bundle/target/war-bundle*war felix-framework-4.2.1
    %cd felix-framework-4.2.1
    %java -jar bin/felix.jar
    ____________________________
    Welcome to Apache Felix Gogo

    g! lb
    START LEVEL 1
       ID|State      |Level|Name
        0|Active     |    0|System Bundle (4.2.1)
        1|Active     |    1|Apache Felix Bundle Repository (1.6.6)
        2|Active     |    1|Apache Felix Gogo Command (0.12.0)
        3|Active     |    1|Apache Felix Gogo Runtime (0.10.0)
        4|Active     |    1|Apache Felix Gogo Shell (0.10.0)
    g! install http://repo2.maven.org/maven2/org/apache/felix/org.apache.felix.configadmin/1.2.8/org.apache.felix.configadmin-1.2.8.jar
    Bundle ID: 5
    g! install http://repo1.maven.org/maven2/org/apache/felix/org.apache.felix.eventadmin/1.2.10/org.apache.felix.eventadmin-1.2.10.jar
    Bundle ID: 6
    g! install http://repo2.maven.org/maven2/org/ops4j/pax/web/pax-web-jetty-bundle/0.7.1/pax-web-jetty-bundle-0.7.1.jar
    Bundle ID: 7
    g! install http://repo2.maven.org/maven2/org/ops4j/pax/web/pax-web-extender-war/0.7.1/pax-web-extender-war-0.7.1.jar
    Bundle ID: 8
    g! install http://repo1.maven.org/maven2/asm/asm-all/3.1/asm-all-3.1.jar
    Bundle ID: 9
    g! install https://maven.java.net/service/local/artifact/maven/redirect?r=<repository>&g=com.sun.jersey&a=jersey-core&v=<version>&e=jar
    Bundle ID: 10
    g! install https://maven.java.net/service/local/artifact/maven/redirect?r=<repository>&g=com.sun.jersey&a=jersey-server&v=<version>&e=jar
    Bundle ID: 11
    g! install https://maven.java.net/service/local/artifact/maven/redirect?r=<repository>&g=com.sun.jersey&a=jersey-servlet&v=<version>&e=jar
    Bundle ID: 12
    g! install file:war-bundle-1.18.war
    Bundle ID: 13
    g! lb
    START LEVEL 1
       ID|State      |Level|Name
        0|Active     |    0|System Bundle (4.2.1)
        1|Active     |    1|Apache Felix Bundle Repository (1.6.6)
        2|Active     |    1|Apache Felix Gogo Command (0.12.0)
        3|Active     |    1|Apache Felix Gogo Runtime (0.10.0)
        4|Active     |    1|Apache Felix Gogo Shell (0.10.0)
        5|Installed  |    1|Apache Felix Configuration Admin Service (1.2.8)
        6|Installed  |    1|Apache Felix EventAdmin (1.2.10)
        7|Installed  |    1|OPS4J Pax Web - Jetty Bundle (0.7.1)
        8|Installed  |    1|OPS4J Pax Web - Extender - WAR (0.7.1)
        9|Installed  |    1|ASM all classes (3.1.0)
       10|Installed  |    1|jersey-core (1.18.0)
       11|Installed  |    1|jersey-server (1.18.0)
       12|Installed  |    1|jersey-servlet (1.18.0)
       13|Installed  |    1|Helloworld OSGi WebApp - Jersey Sample WAR (1.18.0)
    g! start 5 6 7 8 9 10 11 12 13
    Nov 15, 2013 5:05:46 PM com.sun.jersey.api.core.PackagesResourceConfig init
    INFO: Scanning for root resource and provider classes in the packages:
      com.sun.jersey.samples.helloworld
    Nov 15, 2013 5:05:46 PM com.sun.jersey.api.core.ScanningResourceConfig logClasses
    INFO: Root resource classes found:
      class com.sun.jersey.samples.helloworld.AnotherResource
      class com.sun.jersey.samples.helloworld.HelloWorldResource
    Nov 15, 2013 5:05:46 PM com.sun.jersey.api.core.ScanningResourceConfig init
    INFO: No provider classes found.
    Nov 15, 2013 5:05:46 PM com.sun.jersey.server.impl.application.WebApplicationImpl _initiate
    INFO: Initiating Jersey application, version 'Jersey: 1.18 11/15/2013 09:28 AM'

Note: The version string can be updated to install another Jersey version runtime.
Now both Jersey resources should become available at:

- http://localhost:8080/helloworld/webresources/helloworld
- http://localhost:8080/helloworld/webresources/another

## Troubleshooting

### HTTP Proxy

Behind a HTTP proxy, Apache Felix returns `java.net.ConnectException: Connection timed out` when installing bundles from the Internet. You will need to setup the following system properties:

- http.proxyHost - the name of the proxy host.
- http.proxyPort - the port of the proxy host.
- http.proxyAuth - the user name and password to use when connecting to the proxy; this string should be the user name and password separated by a colon (e.g., rickhall:mypassword).

These system properties can be set directly on the command line when starting the JVM using the standard "-D<prop>=<value>" syntax or you can put them in the lib/system.properties file of your Felix installation; see documentation on configuring Felix for more information.