/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

Embedding Karaf in a WebContainer
=================================

Purpose
-------
This demo shows how to package Karaf as a webapplication (war) ready to be deployed in a webcontainer like
Apache Tomcat.

It also shows how to override some configuration files to automatically install a HTTP bridge.

Prerequisites for Running the Example
-------------------------------------
You must have the following installed on your machine:

  - JDK 1.7 or higher

  - Maven 3.2.3 or higher


Building and Deploying
----------------------
You can build and deploy this example in two ways:

- A. Using Jetty: Quick and Easy
  This option is useful if you want to see the example up and
  running quickly.
   
- B. Using Your Favorite WebContainer (like Apache Tomcat)
  This option is useful if you want to see Karaf running
  as a web application inside your favorite web container.


A. Using Jetty: Quick and Easy
------------------------------
To build the example and deploy to Jetty, complete the
following steps:

1. In a command prompt/shell, change to the directory
   that contains this README.txt file.

2. Enter the following Maven command:

     mvn package jetty:run

This Maven command builds the example web application, starts
Jetty and deploys the web application to Jetty. Once complete,
you should see the following printed to the console:

[INFO] Started Jetty Server
[INFO] Starting scanner at interval of 10 seconds.

Running a Client
----------------
To test the example, you can use the Apache Karaf client
to connect to the server and issue a Karaf command. For example,
try executing the "features:list" command as follows:

1. In a command prompt/shell, change to your product
   installation directory.

2. Run the following commands:

    Unix:
        ${KARAF_HOME}/bin/client feature:list

    Windows:
        %KARAF_HOME%\bin\client.bat feature:list

    Using JDK:
        java -jar lib/bin/karaf-client.jar features:list

In this case, you should see output similar to the following:

(abbreviated output below)

State         Version           Name              Repository                   Description
[uninstalled] [${version} ] wrapper           standard-${version}      Provide OS integration
[uninstalled] [${version} ] obr               standard-${version}      Provide OSGi Bundle Repository (OBR) support
[uninstalled] [${version} ] config            standard-${version}      Provide OSGi ConfigAdmin support
[uninstalled] [${version} ] region            standard-${version}      Provide Region commands
[uninstalled] [7.5.4.v20111024] jetty             standard-${version}      Provide Jetty engine support
[uninstalled] [${version} ] http              standard-${version}      Implementation of the OSGI HTTP Service
[uninstalled] [${version} ] http-whiteboard   standard-${version}      Provide HTTP Whiteboard pattern support
[uninstalled] [${version} ] war               standard-${version}      Turn Karaf as a full WebContainer
[uninstalled] [${version} ] deployers         standard-${version}      Provide Karaf deployer
[uninstalled] [${version} ] kar               standard-${version}      Provide KAR (KARaf archive) support
[uninstalled] [${version} ] webconsole-base   standard-${version}      Base support of the Karaf WebConsole
[uninstalled] [${version} ] webconsole        standard-${version}      Karaf WebConsole for administration and monitoring
[uninstalled] [${version} ] ssh               standard-${version}      Provide a SSHd server on Karaf


B. Using Your Favorite Web Container
------------------------------------
You can deploy the web application to your favorite web
container, by completing the following steps:

1. In a command prompt/shell, change to the directory
   that contains this README.txt file.
   
2. Enter the following command:

     mvn package
     
Maven builds the web application, web-${version}.war, and
saves it in the target directory of this example. Deploy this
WAR file to your favorite web container. Once the application
is running, you can test it using the Apache Karaf client
as described in the "Running a Client" section above.
