You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 13 Next »

Apache Wicket - web site

The tutorial is almost finished. We have to design the web page that we will use to consult the incidents published in the database. The web framework that we will use is Apache Wicket.

Step 1 : Web pages

To display the incidents in a web page, we will create the file HomePage.html in the directory src/main/java/org/apache/camel/example/reportincident. This file contain html tags with some wicket tags. One of the benefit of Apache Wicket compare to other web frameworks is that it try to keep the html page as clean as possible to facilitate the work of the web designer and integration with code made by the developers. It is a component framework like JSF but not based on programmable page like JSP, ...

<html>
<head>
	<title>Report Incident HomePage</title>
	<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
	<strong>Report Incident HomePage</strong>
	<br/>
	<p/>
	<span wicket:id="message">message will be here</span> (1)
	<p/>
	
	<table cellspacing="0" class="dataview">
    	<tr>
        	<th>Id</th>
        	<th>Incident Date</th>
        	<th>Incident Ref</th>
        	<th>First Name</th>
        	<th>Last Name</th>
        	<th>Summary</th>
        	<th>Details</th>
        	<th>Email</th>
        	<th>Phone</th>
        	<th>Origin</th>
        	<th>Creation date</th>
    	</tr>
    	<tr>
        	<td><span wicket:id="incidentId">[incidentId]</span></td>  (2)
        	<td><span wicket:id="incidentDate">[incidentDate]</span></td>
        	<td><span wicket:id="incidentRef">[incidentRef]</span></td>
        	<td><span wicket:id="givenName">[givenName]</span> </td>
       	 	<td><span wicket:id="familyName">[familyName]</span></td>
        	<td><span wicket:id="summary">[summary]</span></td>
        	<td><span wicket:id="details">[details]</span></td>
        	<td><span wicket:id="email">[email]</span></td>
        	<td><span wicket:id="phone">[phone]</span></td>
        	<td><span wicket:id="creationUser">[creationUser]</span></td>
        	<td><span wicket:id="creationDate">[creationDate]</span></td>
    	</tr>
	</table>

</body>
</html>

Remarks :
(1) - The tag wicket:id="message" is used to display top of the screen a message
(2) - The tags <td> are enriched with parameter wicket:id="" to allow to the wicket code page to replace this property with the property field of the Incident class.

Step 2 : Web page code

HomePage.java

package org.apache.camel.example.reportincident;

import java.util.Iterator;
import org.apache.camel.example.reportincident.model.Incident;
import org.apache.camel.example.reportincident.service.IncidentService;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.markup.repeater.data.DataView;
import org.apache.wicket.markup.repeater.data.IDataProvider;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;

/**
 * Homepage
 */
public class HomePage extends WebPage {

	private static final long serialVersionUID = 1L;

	private static final transient Log LOG = LogFactory.getLog(HomePage.class);

	@SpringBean (1)
	private IncidentService incidentService;

	/**
	 * Constructor that is invoked when page is invoked without a session.
	 * 
	 * @param parameters
	 *            Page parameters
	 */
	public HomePage(final PageParameters parameters) {

		LOG.debug("Spring service : " + incidentService.toString());

		// Add the simplest type of label
		add(new Label("message", "List of incidents coming from web services or file : ")); (2)

		DataView dataView = new DataView("pageable", new IncidentProvider()) { (3)

			@Override
			protected void populateItem(final Item item) { (5) 
				Incident incident = (Incident) item.getModelObject();
				item.add(new Label("incidentId", String.valueOf(incident
						.getIncidentId())));
				item.add(new Label("incidentDate", String.valueOf(incident
						.getIncidentDate())));
				item.add(new Label("incidentRef", incident.getIncidentRef()));
				item.add(new Label("givenName", incident.getGivenName()));
				item.add(new Label("familyName", incident.getFamilyName()));
				item.add(new Label("summary", incident.getSummary()));
				item.add(new Label("details", incident.getDetails()));
				item.add(new Label("email", incident.getEmail()));
				item.add(new Label("phone", incident.getPhone()));
				item.add(new Label("creationUser", incident.getCreationUser()));
				item.add(new Label("creationDate", String.valueOf(incident
						.getCreationDate())));

				item.add(new AttributeModifier("class", true,
						new AbstractReadOnlyModel() {
							@Override
							public Object getObject() {
								return (item.getIndex() % 2 == 1) ? "even"
										: "odd";
							}
						}));
			}
		};
		
        add(dataView);


	}

	private class IncidentProvider implements IDataProvider { (4)

		public Iterator iterator(int first, int count) {
			return incidentService.findIncident().iterator();
		}

		public int size() {
			return incidentService.findIncident().size();
		}

		public IModel model(Object object) {
			return new Model((Incident) object);
		}

		public void detach() {
			// TODO Auto-generated method stub

		}
	}

	private class IncidentDetachModel extends LoadableDetachableModel {

		private long id;

		@Override
		protected Object load() {
			return incidentService.findIncident(String.valueOf(id));
		}

		/**
		 * @param c
		 */
		public IncidentDetachModel(Incident i) {
			this(i.getIncidentId());
		}

		public IncidentDetachModel(long id) {

			if (id == 0) {
				throw new IllegalArgumentException();
			}
			this.id = id;
		}

	}

}

Remarks :
(1) - The @SpringBean annotation is used to inject our spring IncidentService service
(2) - To set the message label of the HomePage.html, we call the method add(new Label()) and set the property "message" with the information that we want to display on the screen 'List of incidents coming from web services or file'
(3) - To populate the table of the web page, we will use a DataView object. The DataView class requires as a parameter a IncidentDataProvider which is in fact an inner class implementing the interface IDataProvider.
(4) - The class IncidentDataProvider will call our IncidentSaver service to retrieve from the database the list of Incidents reported.
(5) - The populateItem method of the DataView will map the content of our incident objects with the attributes (= items) of the web page

WicketApplication.java

To tell to the Apache Wicket framework that our application contains the page HomePage.html and class HomePage (1), we will create the class WebApplication in the directory src/main/java/org/apache/camel/example/reportincident) like this.

package org.apache.camel.example.reportincident;

import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.spring.injection.annot.SpringComponentInjector;

/**
 * Application object for your web application. If you want to run this application without deploying, run the Start class.
 * 
 * @see org.apache.wicket.example.Start#main(String[])
 */
public class WicketApplication extends WebApplication
{    
	
	/**
	 * Init
	 */
    public void init() {
        super.init();
        addComponentInstantiationListener(new SpringComponentInjector(this)); (2)
    }

	
    /**
     * Constructor
     */
	public WicketApplication()
	{
	}
	
	/**
	 * @see org.apache.wicket.Application#getHomePage()
	 */
	public Class<HomePage> getHomePage() (1)
	{
		return HomePage.class;
	}

}

To inject Spring into Wicket, we have used the approach described on the following web site of Apache Wicki documentation and added the line addComponentInstantiationListener(new SpringComponentInjector(this)); into the class (2)

Step 3 : web.xml configuration

Now that the code/web pages are ready, we have to create the web.xml file in the directory src/main/webapp/WEB-INF

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
	version="2.4">

	<display-name>reportincident.web</display-name>

	<context-param>
		<param-name>contextClass</param-name>
		<param-value>org.springframework.osgi.web.context.support.OsgiBundleXmlWebApplicationContext</param-value> (2)
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> (1) 
	</listener>

	<filter>
		<filter-name>camel.example.reportincident.web</filter-name>
		<filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class>
		<init-param>
		    <param-name>applicationClassName</param-name>
		    <param-value>org.apache.camel.example.reportincident.WicketApplication</param-value>
		    <param-name>applicationFactoryClassName</param-name>
		    <param-value>org.apache.wicket.spring.SpringWebApplicationFactory</param-value> (1)
    	</init-param>
	</filter>
	<filter-mapping>
		<filter-name>camel.example.reportincident.web</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>


</web-app>

Remarks :

(1) - Wicket applications have a global application object which is a subclass of Application. This global application object is only created once per application and is never serialized (since it contains no user-specific data and thus remains the same across all nodes in the cluster). These qualities make it a good candidate to act as a service locator for the rest of the application. Wicket allows you to provide a custom factory for creating this object, the wicket-contrib-spring project provides such a factory (SpringWebApplicationFactory) that, instead of creating an instance, pulls it out of the spring application context. Wicket keeps the instance of the application object in a threadlocal variable and provides various helper methods in components to get to it, so it is easy to retrieve dependencies in wicket components.
(2) - Spring DM provides a dedicated, OSGi-aware, web application context (called OsgiBundleXmlWebApplicationContext) that offers the same functionality and behaviour to its Spring-MVC brethren, XmlWebApplicationContext. The application context is aware of the web application BundleContext and thus is able to load resources from the OSGi space, import and export OSGi services and support the BundleContextAware and component scanning across the bundles included in the classpath.

Step 4 : Add spring stuffs

To allow our web bundle to have access to the osgi (1) service org.apache.camel.example.reportincident.service.IncidentService, we have to add the following line in the file called applicationContext that we create in the directory src/main/webapp/WEB-INF.

<?xml version="1.0"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:osgi="http://www.springframework.org/schema/osgi"
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
                    http://www.springframework.org/schema/osgi
                    http://www.springframework.org/schema/osgi/spring-osgi.xsd">
                    
 <osgi:reference id="incidentService" interface="org.apache.camel.example.reportincident.service.IncidentService"/> (1)
 
</beans>

Step 4 : Adapt the pom.xml file

The pom of this project is different from the bundles projects because :
(1) - the packaging here is war and not bundle,
(2) - The MANIFEST.MF file generated must be copied in the WAR
(3) - we must tell to maven that the plugin in charge to generate the MANIFEST.MF file must be called during the goal/phase : process-classes
(4) - we want to define the web application context <Webapp-Context> who will be published by PAX Web

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.apache.camel.example</groupId>
	<artifactId>reportincident.web</artifactId>
	<packaging>war</packaging> (1)
	<version>1.0-SNAPSHOT</version>
	<name>Report Incident Web Bundle</name>

	<properties>
		<wicket.version>1.3.5</wicket.version>
		<jetty.version>6.1.4</jetty.version>
		<felix-version>1.4.3</felix-version>
		<spring-version>2.5.6</spring-version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.apache.camel.example</groupId>
			<artifactId>reportincident.service</artifactId>
			<version>1.0-SNAPSHOT</version>
			<scope>provided</scope>
		</dependency>
		
		<!-- SPRING DEPENDENCIES -->
	    <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring-version}</version>
			<scope>provided</scope>
		</dependency>
	    <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>${spring-version}</version>
			<scope>provided</scope>
		</dependency>
		<!-- 
	    <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring-version}</version>
			<scope>provided</scope>
		</dependency>
		 -->
		<!--  WICKET DEPENDENCIES -->
		<dependency>
			<groupId>org.apache.wicket</groupId>
			<artifactId>wicket</artifactId>
			<version>${wicket.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.wicket</groupId>
			<artifactId>wicket-spring-annot</artifactId>
			<version>${wicket.version}</version>
			<scope>provided</scope>
		</dependency>
        <dependency>
            <groupId>org.apache.wicket</groupId>
			<artifactId>wicket-extensions</artifactId>
			<version>${wicket.version}</version>
			<scope>provided</scope>
		</dependency>

		<!-- LOGGING DEPENDENCIES - LOG4J -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.4.2</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.14</version>
			<scope>test</scope>
		</dependency>

		<!--  JUNIT DEPENDENCY FOR TESTING -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.2</version>
			<scope>test</scope>
		</dependency>

		<!--  JETTY DEPENDENCIES FOR TESTING  -->
		<dependency>
			<groupId>org.mortbay.jetty</groupId>
			<artifactId>jetty</artifactId>
			<version>${jetty.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.mortbay.jetty</groupId>
			<artifactId>jetty-util</artifactId>
			<version>${jetty.version}</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.mortbay.jetty</groupId>
			<artifactId>jetty-management</artifactId>
			<version>${jetty.version}</version>
			<scope>provided</scope>
		</dependency>
	</dependencies>
	<build>
		<resources>
			<resource>
				<filtering>false</filtering>
				<directory>src/main/resources</directory>
			</resource>
			<resource>
				<filtering>false</filtering>
				<directory>src/main/java</directory>
				<includes>
					<include>**</include>
				</includes>
				<excludes>
					<exclude>**/*.java</exclude>
				</excludes>
			</resource>
		</resources>
		<testResources>
			<testResource>
				<filtering>false</filtering>
				<directory>src/test/java</directory>
				<includes>
					<include>**</include>
				</includes>
				<excludes>
					<exclude>**/*.java</exclude>
				</excludes>
			</testResource>
		</testResources>
		<plugins>

			<plugin>
				<inherited>true</inherited>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.5</source>
					<target>1.5</target>
					<optimise>true</optimise>
					<debug>true</debug>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.mortbay.jetty</groupId>
				<artifactId>maven-jetty-plugin</artifactId>
			</plugin>


			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.1-alpha-2</version>
				<configuration>
					<archive>
						<!-- add the generated manifest to the war --> (2)
						<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
					</archive>
					<!-- 
					<webResources>
						<resource>
							<directory>src/main/resources/META-INF/spring</directory>
							<targetPath>META-INF/spring</targetPath>
						</resource>
					</webResources>
					 -->
				</configuration>

			</plugin>


			<!-- to generate the MANIFEST-FILE required by the bundle -->
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<version>${felix-version}</version>
				<extensions>true</extensions>
				<executions> (3)
					<execution>
						<id>bundle-manifest</id>
						<phase>process-classes</phase>
						<goals>
							<goal>manifest</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<supportedProjectTypes>
						<supportedProjectType>bundle</supportedProjectType> (3)
						<supportedProjectType>war</supportedProjectType>
					</supportedProjectTypes>
					<instructions>
						<Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
						<Bundle-ClassPath>
							.,
							WEB-INF/classes,
						</Bundle-ClassPath>
						<Import-Package>
							javax.servlet;version="[2.5.0, 3.0.0)",
							javax.servlet.http;version="[2.5.0, 3.0.0)",
							javax.servlet.resources;version="[2.5.0, 3.0.0)",
							org.apache.camel.example.reportincident.service,
							org.springframework.web.context;version="[2.5.6, 3.0.0)",
							org.springframework.web.context.support;version="[2.5.6, 3.0.0)",
							org.springframework.osgi.web.context.support,
							org.xml.sax;resolution:=optional,
							org.w3c.dom;resolution:=optional,
							*
						</Import-Package>
						<Private-Package>org.apache.camel.example.reportincident</Private-Package>
						<Export-Package></Export-Package>
						<Webapp-Context>reportincidentweb</Webapp-Context> (4)
						<_failok>true</_failok>
					</instructions>
				</configuration>

			</plugin>
		</plugins>
	</build>
</project>

Remark : To deploy the war in your maven repository, execute the following maven command

mvn clean install

Build and Package the application

Build

To build the project, you must execute for each project the following maven commands :

Project name

maven command

reportincident.activemq

clean install org.ops4j:maven-pax-plugin:eclipse

reportincident.camelqueueservice

clean install org.ops4j:maven-pax-plugin:eclipse

reportincident.db

mvn clean install

reportincident.features

mvn clean install

reportincident.model

mvn clean install org.ops4j:maven-pax-plugin:eclipse

reportincident.persistence

mvn clean install org.ops4j:maven-pax-plugin:eclipse

reportincident.routing

mvn clean install org.ops4j:maven-pax-plugin:eclipse

reportincident.service

mvn clean install org.ops4j:maven-pax-plugin:eclipse

reportincident.web

mvn clean install

reportincident.webservice

mvn clean install org.ops4j:maven-pax-plugin:eclipse

We will try to provide for the next version of this tutorial a parent pom.xml containing the modules to be build (wink)

Package

To simplify our deployment procedure, we will use the provisioning mechanism of Apache Servicemix called 'Feature'. In a feature xml file, we will define the bundles that we will package and their dependencies. The bundles can be linked to a feature and features can be linked together. This file will be packaged in a jar.

The advantage of the feature is that you avoid to deploy manually your bundles in your OSGI server and they can be versioned as you will see in the file. Moreover, the feature can be seen as a contract between your development and the deployment team. Different versions can be created according to the environment where the code will be deployed (development, acceptance and production).

If you prefer to generate automatically the file based on the dependencies of yours pom, then you can use the maven plugin maven-features-plugin

Create the file reportincident.features-1.0-SNAPSHOT-features.xml in the directory src/main of the project reportincident.features

Remarks :
(1) - The reportincident feature has the number version 1.0
(2) - Each feature is a collection of bundles or bundles/features. The bundle tag contains the URI syntax used by PAX URI to install the JAR or the resource on the OSGI server. We us the mvn protocol to download the jar from Maven repository but other protocols exist (see OPS4J for more info)
(3) - The camel feature include a list of camel-xx features.

<?xml version="1.0" encoding="UTF-8"?>
<features>
	<feature name="reportincident" version="1.0"> (1)
		<bundle>mvn:org.apache.camel.example/reportincident.activemq/1.0-SNAPSHOT</bundle> (2)
		<bundle>mvn:org.apache.camel.example/reportincident.queueservice/1.0-SNAPSHOT</bundle>
		<bundle>mvn:org.apache.camel.example/reportincident.model/1.0-SNAPSHOT</bundle>
		<bundle>mvn:org.apache.camel.example/reportincident.persistence/1.0-SNAPSHOT</bundle>
		<bundle>mvn:org.apache.camel.example/reportincident.service/1.0-SNAPSHOT</bundle>
		<bundle>mvn:org.apache.camel.example/reportincident.webservice/1.0-SNAPSHOT</bundle>
		<bundle>mvn:org.apache.camel.example/reportincident.routing/1.0-SNAPSHOT</bundle>
                <bundle>mvn:org.apache.camel.example/reportincident.web/1.0-SNAPSHOT/war</bundle>
	</feature>
	
	<feature name="camel" version="2.0-M1">
		<feature>camel-core</feature> (3)
		<feature>camel-spring</feature>
		<feature>camel-osgi</feature>
		<feature>camel-bindy</feature>
		<feature>camel-jms</feature>
		<feature>camel-cxf</feature>
		<feature>camel-activemq</feature>
	</feature>

	<feature name="camel-core">
		<bundle>mvn:org.apache.camel/camel-core/2.0-M1</bundle>
	</feature>

	<feature name="camel-spring">
		<bundle>mvn:org.apache.camel/camel-spring/2.0-M1</bundle>
	</feature>

	<feature name="camel-osgi">
		<bundle>mvn:org.apache.camel/camel-osgi/2.0-M1</bundle>
	</feature>

	<feature name="camel-bindy">
		<bundle>mvn:org.apache.camel/camel-bindy/2.0-M1</bundle>
	</feature>
	
	<feature name="camel-mail">
	   <bundle>mvn:org.springframework/spring-context-support/2.5.5</bundle> 
       <bundle>mvn:org.apache.camel/camel-mail/2.0-M1</bundle>
	</feature>
	
    <feature name="camel-velocity">
       <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.velocity/1.5_1</bundle> 
       <bundle>mvn:org.apache.camel/camel-velocity/2.0-M1</bundle>
	</feature>

	<feature name="camel-jms">
        <bundle>mvn:org.springframework/spring-jms/2.5.6</bundle>	    
		<bundle>mvn:org.apache.camel/camel-jms/2.0-M1</bundle>
	</feature>

	<feature name="camel-activemq">
		<feature>activemq</feature>
		<bundle>mvn:org.apache.activemq/activemq-camel/5.2.0</bundle>
	</feature>

	<feature name="camel-cxf">
		<feature>cxf</feature>
		<bundle>mvn:org.apache.camel/camel-cxf/2.0-M1</bundle>
	</feature>
	
	<feature name="cxf-osgi">
		<bundle>mvn:org.apache.servicemix.cxf/org.apache.servicemix.cxf.transport.osgi/4.0.0</bundle>
	</feature>

	<feature name="cxf" version="2.2">
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.fastinfoset/1.2.2_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xmlsec/1.3.0_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.wss4j/1.5.4_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jetty-bundle/6.1.14_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xmlbeans/2.4.0_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xmlresolver/1.2_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.xmlschema/1.4.2_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.ant/1.7.0_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jdom/1.1_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.werken-xpath/0.9.4_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.neethi/2.0.4_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.abdera/0.4.0-incubating_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.junit/4.4_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.antlr/3.0.1_1</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.commons-io/1.3.2_1</bundle>
		<bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.javamail-api-1.4/1.2.0</bundle>
		<bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.jaxws-api-2.1/1.2.0</bundle>
		<bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.saaj-api-1.3/1.2.0</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.wsdl4j/1.6.1_1</bundle>
		<bundle>mvn:org.apache.geronimo.specs/geronimo-ws-metadata_2.0_spec/1.1.2</bundle>
		<bundle>mvn:org.apache.cxf/cxf-bundle/2.2</bundle>
	</feature>

	<feature name="web-core">
		<bundle>mvn:org.apache.geronimo.specs/geronimo-servlet_2.5_spec/1.1.2</bundle>
		<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jetty-bundle/6.1.14_1</bundle>
	</feature>

	<feature name="web">
		<feature>web-core</feature>
		<bundle>mvn:org.ops4j.pax.web/pax-web-bundle/0.6.0</bundle>
		<bundle>mvn:org.ops4j.pax.web/pax-web-jsp/0.6.0</bundle>
		<bundle>mvn:org.ops4j.pax.web-extender/pax-web-ex-war/0.5.1</bundle>
		<bundle>mvn:org.ops4j.pax.web-extender/pax-web-ex-whiteboard/0.5.1</bundle>
		<bundle>mvn:org.ops4j.pax.url/pax-url-war/0.4.0</bundle>
		<bundle>mvn:org.apache.servicemix.war/org.apache.servicemix.war.deployer/4.0.0</bundle>
	</feature>
	
	<feature name="spring-web">
	    <bundle>mvn:org.springframework/spring-web/2.5.6</bundle>
        <bundle>mvn:org.springframework.osgi/spring-osgi-web/1.2.0-rc1</bundle> 
	</feature>
	
    <feature name="transaction">
        <bundle>mvn:org.apache.geronimo.specs/geronimo-jta_1.1_spec/1.1.1</bundle>
        <bundle>mvn:org.apache.geronimo.specs/geronimo-j2ee-connector_1.5_spec/2.0.0</bundle>
        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.howl/1.0.1-1_1</bundle>
        <bundle>mvn:org.apache.geronimo.components/geronimo-transaction/2.2-r634076</bundle>
        <bundle>mvn:org.springframework/spring-tx/2.5.6</bundle>
        <bundle>mvn:org.apache.servicemix.transaction/org.apache.servicemix.transaction/1.0.0</bundle>
    </feature>
    
    <feature name="connector">
        <feature>transaction</feature>
        <bundle>mvn:org.apache.geronimo.components/geronimo-connector/2.2-r634076</bundle>
        <bundle>mvn:org.apache.geronimo.specs/geronimo-jms_1.1_spec/1.1.1</bundle>
        <bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jencks/2.1_1</bundle>
    </feature>
    
    <feature name="common">
    	<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.jaxb-impl/2.1.6_1</bundle>
	<bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.activation-api-1.1/1.2.0</bundle>
	<bundle>mvn:org.apache.servicemix.specs/org.apache.servicemix.specs.jaxb-api-2.1/1.2.0</bundle>
	<bundle>mvn:commons-collections/commons-collections/3.2.1</bundle>
	<bundle>mvn:commons-lang/commons-lang/2.4</bundle>
	<bundle>mvn:commons-pool/commons-pool/1.4</bundle>
	<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.asm/2.2.3_1</bundle>
    </feature>
    
    <feature name="activemq" version="5.2.0">
    	<feature>connector</feature>
    	<bundle>mvn:org.apache.geronimo.specs/geronimo-j2ee-management_1.1_spec/1.0.1</bundle>
    	<bundle>mvn:org.apache.xbean/xbean-spring/3.4.3</bundle>
	<bundle>mvn:org.apache.activemq/activemq-core/5.2.0</bundle>
	<bundle>mvn:org.apache.activemq/activemq-ra/5.2.0</bundle>
	<bundle>mvn:org.apache.activemq/activemq-console/5.2.0</bundle>
	<bundle>mvn:org.apache.activemq/activemq-pool/5.2.0</bundle>
	<bundle>mvn:org.apache.servicemix.activemq/org.apache.servicemix.activemq.commands/4.0.0</bundle>
    </feature>
    
    <feature name="hibernate">
        <bundle>mvn:org.springframework/spring-orm/2.5.6</bundle>
        <bundle>mvn:org.springframework/spring-jdbc/2.5.6</bundle>
    	<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.dom4j/1.6_2-SNAPSHOT</bundle>
    	<bundle>mvn:org.antlr/com.springsource.antlr/2.7.7</bundle>
    	<bundle>mvn:org.jgroups/com.springsource.org.jgroups/2.5.1</bundle>
    	<bundle>mvn:org.jboss.javassist/com.springsource.javassist/3.3.0.ga</bundle>
    	<bundle>mvn:org.hibernate/com.springsource.org.hibernate/3.3.1.GA</bundle>
    </feature>
    
    <feature name="jdbc-driver">
	<bundle>mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.commons-dbcp/1.2.2_3</bundle>
    	<bundle>mvn:com.mysql.jdbc/com.springsource.com.mysql.jdbc/5.1.6</bundle>
    </feature>
    
    <feature name="wicket">
    	<bundle>mvn:org.apache.wicket/wicket/1.3.5</bundle>
    	<bundle>mvn:org.apache.wicket/wicket-ioc/1.3.5</bundle>
    	<bundle>mvn:org.apache.wicket/wicket-spring/1.3.5</bundle>
    	<bundle>mvn:org.apache.wicket/wicket-spring-annot/1.3.5</bundle>
    	<bundle>mvn:org.apache.wicket/wicket-extensions/1.3.5</bundle>
    </feature>
     
</features>

To generate the jar file containing the feature xml file, adapt the pom.xml like this :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.apache.camel.example</groupId>
	<artifactId>reportincident.features</artifactId>
	<packaging>jar</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>Report Incident Project Features</name>

	<build>
		<resources>
			<!-- standard Maven folder -->
			<resource>
				<directory>src/main/resources</directory>
			</resource>
		</resources>

		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<version>2.3</version>
				<executions>
					<execution>
						<phase>copy-resources</phase>
						<goals>
							<goal>resources</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>

</project>

During the execution of the maven command :

mvn clean install

maven will put the file reportincident.features-1.0-SNAPSHOT-features.xml in the jar and the jar will be installed in your Maven local repository under the directory {{localMavenRepository/org/apache/camel/example/reportincident.features/1.0-SNAPSHOT

Deploy

The deployment process is very simple and two steps will be necessary :

Step 1 : Copy properties files in etc directory

Copy the files containing your properties file org.apache.camel.example.reportincident.datasource.cfg, ... in the etc directory of ServiceMix and cujstomize them if required

Step 2 : Edit the file org.apache.servicemix.features.cfg

To use the feature file created in the previous section, we must adapt the file org.apache.servicemix.features.cfg that you find in the etc directory

Replace the current featureRepositories line with the following :

featuresRepositories=jar:mvn:org.apache.camel.example/reportincident.features/1.0-SNAPSHOT!/reportincident.features-1.0-SNAPSHOT-features.xml

This line will be processed by PAX Url who will pickup the reportincident.features-1.0-SNAPSHOT-features.xml file from the jar located in the maven repository localMavenRepo/org.apache.camel.example/reportincident.features/1.0-SNAPSHOT

and

replace the existing line containing the featuresBoot parameter

by

featuresBoot=common,transaction,connector,activemq,web-core,web,spring-web,wicket,cxf,cxf-osgi,camel,jdbc-driver,hibernate,reportincident

By adding these two lines, we will configure our ServiceMix OSGI server to install bundles from features defined in the order appearing at the line of featuresBoot

The deployment order of the bundle is critical in an OSGI environement. This is why for the purposes of this project/tutorial we have organised in consequence. If you plan to change something in the application, be aware of that

Test it

Step 1 : launch application

It is time to launch the servicemix server and to test if our application works well. If this is not yet done, download ServiceMix Kernel 1.1.0 server and install it. Launch the server by executing the command in the bin folder:

c:\apache-servicemix-kernel-1.1.0\bin>servicemix

If this is the first time that Servicemix is started, then you will see that a new data folder is created. This directory will contain subfolders :

  • cache : containing the bundlles deployed
  • log : where the servicemix.log is updated by the application

Step 2 : Check osgi list

When the following prompt appears on the screen :

D:\Dvlpt\Java\workspace-ganymede\esb\apache-servicemix-kernel-1.2.0-SNAPSHOT\bin>servicemix
 ____                  _          __  __ _
/ ___|  ___ _ ____   _(_) ___ ___|  \/  (_)_  __
\___ \ / _ \ '__\ \ / / |/ __/ _ \ |\/| | \ \/ /
 ___) |  __/ |   \ V /| | (_|  __/ |  | | |>  <
|____/ \___|_|    \_/ |_|\___\___|_|  |_|_/_/\_\

 ServiceMix Kernel (1.2.0-SNAPSHOT)

Type 'help' for more information.
--------------------------------------------------------------------------------------------
smx@root:/> 

execute the following commands :

smx@root:/> osgi
smx@root:osgi> list

During the first launch of SMX, it will install the bundles. Around 110 bundles have to be installed/deployed, so be patient because it can take time depending of your internet connection, cpu, processor of your machine.

but after a few minutes, you must see the following list

smx@root:osgi> list
START LEVEL 100
   ID   State         Spring     Level  Name
[   0] [Active     ] [       ] [    0] System Bundle (1.5.0.r752991)
[   1] [Active     ] [       ] [   10] Apache Felix Prefrences Service (1.0.2)
[   2] [Active     ] [       ] [   10] Apache ServiceMix Specs :: JAXP API 1.4 (1.4.0.SNAPSHOT)
[   3] [Active     ] [       ] [   10] geronimo-annotation_1.0_spec (1.1.1)
[   4] [Active     ] [       ] [   10] OSGi R4 Compendium Bundle (4.1.0)
[   5] [Active     ] [       ] [   10] Apache ServiceMix Bundles: jaxp-ri-1.4.2 (1.4.2.1)
[   6] [Active     ] [       ] [   10] Apache Felix Configuration Admin Service (1.0.4)
[   7] [Active     ] [       ] [   10] geronimo-servlet_2.5_spec (1.1.2)
[   8] [Active     ] [Started] [   40] Apache ServiceMix Kernel :: GShell Core (1.2.0.SNAPSHOT)
[   9] [Active     ] [       ] [    8] OPS4J Pax Logging - API (1.3.0)
[  10] [Active     ] [       ] [    8] OPS4J Pax Logging - Service (1.3.0)
[  11] [Active     ] [       ] [    5] OPS4J Pax Url - wrap: (0.3.3)
[  12] [Active     ] [       ] [    5] OPS4J Pax Url - mvn: (0.3.3)
[  13] [Active     ] [       ] [   30] Apache ServiceMix Kernel :: GShell Features (1.2.0.SNAPSHOT)
[  14] [Active     ] [Started] [   30] Apache ServiceMix Kernel :: GShell OSGi Commands (1.2.0.SNAPSHOT)
[  15] [Active     ] [       ] [   30] Apache ServiceMix Bundles: mina-1.1.7 (1.1.7.1)
[  16] [Active     ] [       ] [   30] spring-osgi-extender (1.2.0.rc1)
[  17] [Active     ] [       ] [   30] Spring Context (2.5.6)
[  18] [Active     ] [Started] [   30] Apache ServiceMix Kernel :: GShell PackageAdmin Commands (1.2.0.SNAPSHOT)
[  19] [Active     ] [Started] [   30] Apache ServiceMix Kernel :: GShell ConfigAdmin Commands (1.2.0.SNAPSHOT)
[  20] [Active     ] [Started] [   30] Apache ServiceMix Kernel :: JAAS Config (1.2.0.SNAPSHOT)
[  21] [Active     ] [       ] [   30] Apache ServiceMix Bundles: commons-jexl-1.1 (1.1.0.1)
[  22] [Active     ] [       ] [   30] Apache ServiceMix Bundles: commons-httpclient-3.1 (3.1.0.1)
[  23] [Active     ] [       ] [   30] Spring Core (2.5.6)
[  24] [Active     ] [       ] [   30] jmx-impl (1.0.0.r6125-patched)
[  25] [Active     ] [       ] [   30] spring-osgi-io (1.2.0.rc1)
[  26] [Active     ] [       ] [   30] jmx (1.0.0.r6125-patched)
[  27] [Active     ] [       ] [   30] spring-osgi-core (1.2.0.rc1)
[  28] [Active     ] [Started] [   30] Apache ServiceMix Kernel :: JAAS Modules (1.2.0.SNAPSHOT)
[  29] [Active     ] [       ] [   30] Apache ServiceMix Bundles: commons-vfs-1.0 (1.0.0.1)
[  30] [Active     ] [       ] [   30] Spring Beans (2.5.6)
[  31] [Active     ] [Started] [   30] Apache ServiceMix Kernel :: GShell Admin (1.2.0.SNAPSHOT)
[  32] [Active     ] [       ] [   30] Unnamed - com.google.code.sshd:sshd:bundle:0.1 (0.1)
[  33] [Active     ] [       ] [   30] Apache ServiceMix Bundles: commons-codec-1.2 (1.2.0.1)
[  34] [Active     ] [Started] [   30] Apache ServiceMix Kernel :: GShell Log Commands (1.2.0.SNAPSHOT)
[  35] [Active     ] [       ] [   30] Apache ServiceMix Bundles: jline-0.9.94 (0.9.94.1)
[  36] [Active     ] [       ] [   30] Apache ServiceMix Bundles: aopalliance-1.0 (1.0.0.1)
[  37] [Active     ] [       ] [   30] Spring AOP (2.5.6)
[  38] [Active     ] [       ] [   30] Apache ServiceMix Bundles: cglib-2.1_3 (2.1.0.3_2-SNAPSHOT)
[  39] [Active     ] [       ] [   30] Apache ServiceMix Bundles: oro-2.0.8 (2.0.8.1)
[  40] [Active     ] [Started] [   30] Apache ServiceMix Kernel :: Spring Deployer (1.2.0.SNAPSHOT)
[  41] [Active     ] [Started] [   30] Apache ServiceMix Kernel :: Management (1.2.0.SNAPSHOT)
[  42] [Active     ] [       ] [   15] Apache ServiceMix Kernel :: File Monitor (1.2.0.SNAPSHOT)
[  43] [Active     ] [       ] [   60] Apache ServiceMix Bundles: jaxb-impl-2.1.6 (2.1.6.1)
[  44] [Active     ] [       ] [   60] Apache ServiceMix Specs :: ACTIVATION API 1.4 (1.2.0)
[  45] [Active     ] [       ] [   60] Apache ServiceMix Specs :: JAXB API 2.1 (1.2.0)
[  46] [Active     ] [       ] [   60] Commons Collections (3.2.1)
[  47] [Active     ] [       ] [   60] Commons Lang (2.4)
[  48] [Active     ] [       ] [   60] Apache Commons Pool Bundle (1.4)
[  49] [Active     ] [       ] [   60] Apache ServiceMix Bundles: asm-2.2.3 (2.2.3.1)
[  50] [Active     ] [       ] [   60] geronimo-jta_1.1_spec (1.1.1)
[  51] [Active     ] [       ] [   60] geronimo-j2ee-connector_1.5_spec (2.0.0)
[  52] [Active     ] [       ] [   60] Apache ServiceMix Bundles: howl-1.0.1-1 (1.0.1.1_1)
[  53] [Active     ] [       ] [   60] Geronimo TxManager :: Transaction (2.2.0.r634076)
[  54] [Active     ] [       ] [   60] Spring Transaction (2.5.6)
[  55] [Active     ] [Started] [   60] Apache ServiceMix Transaction (1.0.0)
[  56] [Active     ] [       ] [   60] Geronimo TxManager :: Connector (2.2.0.r634076)
[  57] [Active     ] [       ] [   60] geronimo-jms_1.1_spec (1.1.1)
[  58] [Active     ] [       ] [   60] Apache ServiceMix Bundles: jencks-2.1 (2.1.0.1)
[  59] [Active     ] [       ] [   60] geronimo-j2ee-management_1.1_spec (1.0.1)
[  60] [Active     ] [       ] [   60] xbean-spring (3.4.3)
[  61] [Active     ] [       ] [   60] activemq-core (5.2.0)
[  62] [Active     ] [       ] [   60] activemq-ra (5.2.0)
[  63] [Active     ] [       ] [   60] activemq-console (5.2.0)
[  64] [Active     ] [       ] [   60] activemq-pool (5.2.0)
[  65] [Active     ] [Started] [   60] Apache ServiceMix Features :: ActiveMQ Commands (4.0.0)
[  66] [Active     ] [       ] [   60] Apache ServiceMix Bundles: jetty-6.1.14 (6.1.14.1)
[  67] [Active     ] [       ] [   60] OPS4J Pax Web - Web Container (0.6.0)
[  68] [Active     ] [       ] [   60] OPS4J Pax Web - Jsp Support (0.6.0)
[  69] [Active     ] [       ] [   60] OPS4J Pax Web Extender - WAR (0.5.1)
[  70] [Active     ] [       ] [   60] OPS4J Pax Web Extender - Whiteboard (0.5.1)
[  71] [Active     ] [       ] [   60] OPS4J Pax Url - war:, war-i: (0.4.0)
[  72] [Active     ] [Started] [   60] Apache ServiceMix WAR Deployer (4.0.0)
[  73] [Active     ] [       ] [   60] Spring Web (2.5.6)
[  74] [Active     ] [       ] [   60] spring-osgi-web (1.2.0.rc1)
[  75] [Active     ] [       ] [   60] Wicket (1.3.5)
[  76] [Active     ] [       ] [   60] Wicket IoC common code (1.3.5)
[  77] [Active     ] [       ] [   60] Wicket Spring Integration (1.3.5)
[  78] [Active     ] [       ] [   60] Wicket Spring Integration through Annotations (1.3.5)
[  79] [Active     ] [       ] [   60] Wicket Extensions (1.3.5)
[  80] [Active     ] [       ] [   60] Apache ServiceMix Bundles: FastInfoset-1.2.2 (1.2.2.1)
[  81] [Active     ] [       ] [   60] Apache ServiceMix Bundles: xmlsec-1.3.0 (1.3.0.1)
[  82] [Active     ] [       ] [   60] Apache ServiceMix Bundles: wss4j-1.5.4 (1.5.4.1)
[  83] [Active     ] [       ] [   60] Apache ServiceMix Bundles: xmlbeans-2.4.0 (2.4.0.1)
[  84] [Active     ] [       ] [   60] Apache ServiceMix Bundles: xmlresolver-1.2 (1.2.0.1)
[  85] [Active     ] [       ] [   60] Apache ServiceMix Bundles: xmlschema-1.4.2 (1.4.2.1)
[  86] [Active     ] [       ] [   60] Apache ServiceMix Bundles: ant-1.7.0 (1.7.0.1)
[  87] [Active     ] [       ] [   60] Apache ServiceMix Bundles: jdom-1.1 (1.1.0.1)
[  88] [Active     ] [       ] [   60] Apache ServiceMix Bundles: werken-xpath-0.9.4 (0.9.4.1)
[  89] [Active     ] [       ] [   60] Apache ServiceMix Bundles: neethi-2.0.4 (2.0.4.1)
[  90] [Active     ] [       ] [   60] Apache ServiceMix Bundles: abdera-0.4.0-incubating (0.4.0.incubating_1)
[  91] [Active     ] [       ] [   60] Apache ServiceMix Bundles: junit-4.4 (4.4.0.1)
[  92] [Active     ] [       ] [   60] Apache ServiceMix Bundles: antlr-3.0.1 (3.0.1.1)
[  93] [Active     ] [       ] [   60] Apache ServiceMix Bundles: commons-io-1.3.2 (1.3.2.1)
[  94] [Active     ] [       ] [   60] Apache ServiceMix Specs :: JAVAMAIL API 1.4 (1.2.0)
[  95] [Active     ] [       ] [   60] Apache ServiceMix Specs :: JAXWS API 2.1 (1.2.0)
[  96] [Active     ] [       ] [   60] Apache ServiceMix Specs :: SAAJ API 1.3 (1.2.0)
[  97] [Active     ] [       ] [   60] Apache ServiceMix Bundles: wsdl4j-1.6.1 (1.6.1.1)
[  98] [Active     ] [       ] [   60] geronimo-ws-metadata_2.0_spec (1.1.2)
[  99] [Active     ] [       ] [   60] Apache CXF Bundle Jar (2.2)
[ 100] [Active     ] [Started] [   60] Apache ServiceMix CXF Transport for OSGi (4.0.0)
[ 101] [Active     ] [       ] [   60] camel-core (2.0.0.M1)
[ 102] [Active     ] [       ] [   60] camel-spring (2.0.0.M1)
[ 103] [Active     ] [       ] [   60] camel-osgi (2.0.0.M1)
[ 104] [Active     ] [       ] [   60] camel-bindy (2.0.0.M1)
[ 105] [Active     ] [       ] [   60] Spring JMS (2.5.6)
[ 106] [Active     ] [       ] [   60] camel-jms (2.0.0.M1)
[ 107] [Active     ] [       ] [   60] camel-cxf (2.0.0.M1)
[ 108] [Active     ] [       ] [   60] activemq-camel (5.2.0)
[ 109] [Active     ] [       ] [   60] Apache ServiceMix Bundles: commons-dbcp-1.2.2 (1.2.2.3)
[ 110] [Active     ] [       ] [   60] MySQL AB's JDBC Driver for MySQL (5.1.6)
[ 111] [Active     ] [       ] [   60] Spring ORM (2.5.6)
[ 112] [Active     ] [       ] [   60] Spring JDBC (2.5.6)
[ 113] [Active     ] [       ] [   60] Apache ServiceMix Bundles: dom4j-1.6.1 (1.6.0.SNAPSHOT)
[ 114] [Active     ] [       ] [   60] ANTLR (2.7.7)
[ 115] [Active     ] [       ] [   60] JGroups Toolkit (2.5.1)
[ 116] [Active     ] [       ] [   60] Javassist Java Programming Assistant (3.3.0.ga)
[ 117] [Active     ] [       ] [   60] JBoss Hibernate Object-Relational Mapper (3.3.1.GA)
[ 134] [Active     ] [Started] [   60] ActiveMQ Queuing engine (1.0.0.SNAPSHOT)
[ 135] [Active     ] [Started] [   60] Camel Queuing Service (1.0.0.SNAPSHOT)
[ 136] [Active     ] [       ] [   60] Report Incident Model Bundle (1.0.0.SNAPSHOT)
[ 137] [Active     ] [Started] [   60] Report Incident Persistence Bundle (1.0.0.SNAPSHOT)
[ 138] [Active     ] [Started] [   60] reportincident.service (1.0.0.SNAPSHOT)
[ 139] [Active     ] [       ] [   60] Report Incident Webservice Bundle (1.0.0.SNAPSHOT)
[ 140] [Active     ] [Started] [   60] Report Incident Routing Bundle (1.0.0.SNAPSHOT)
[ 141] [Active     ] [       ] [   60] Report Incident Web Bundle (1.0.0.SNAPSHOT)

If errors happen during installation of the bundles, the list could be not completed. In this case, the feature provisioning system has stopped the installation. You have to check the log file of servicemix and depending of the error reported, correction made, the installation can be relaunched in the menu 'feature' using the command :

smx@root:osgi> features
smx@root:features> list
  State          Version       Name
[uninstalled]  [      0.0.0] hibernate

smx@root:features> install hibernate

If a problem occurs with a bundle, you can by example recompile the code, regenerate the jar and update the bundle using the command

smx@root:osgi>update xxx

where xxx corresponds to the bundle to be updated

The features list can also be very helpfull to see which features has been installed

smx@root:features> list
  State          Version       Name
[installed  ]  [      0.0.0] hibernate
[installed  ]  [      0.0.0] web-core
[installed  ]  [               2.2] cxf
[installed  ]  [      0.0.0] common
[installed  ]  [      0.0.0] transaction
[installed  ]  [      0.0.0] camel-activemq
[installed  ]  [      0.0.0] web
[installed  ]  [               1.0] reportincident
[installed  ]  [      0.0.0] cxf-osgi
[installed  ]  [      0.0.0] spring-web
[installed  ]  [      0.0.0] camel-spring
[installed  ]  [   2.0-M1] camel
[installed  ]  [      0.0.0] camel-core
[installed  ]  [      0.0.0] camel-bindy
[installed  ]  [      5.2.0] activemq
[installed  ]  [      0.0.0] connector
[installed  ]  [      0.0.0] camel-osgi
[installed  ]  [      0.0.0] wicket
[installed  ]  [      0.0.0] jdbc-driver
[installed  ]  [      0.0.0] camel-jms
[installed  ]  [      0.0.0] camel-cxf

Step 3 : Incident file

To test the Camel routing, we have to produce an incident file report and put it in the file defined in the from uri of your inittial route. Create a file containing csv lines :

001,29-04-2009,Claus,Ibsen,incident camel-001,this is a report incident for camel-001,cibsen@gmail.com,+111 10 20 300
002,29-04-2009,Charles,Moulliard,incident smx-002,this is a report incident for smx-002,cmoulliard@gmail.com,+222 10 20 300
003,28-04-2009,Guillaume,Nodet,incident camel-123,this is a report incident for camel-123,gnodet@gmail.com,+333 10 20 300
004,25-04-2009,Gert,Vanthienen,incident camel-454,this is a report incident for camel-454,gvanthienen@gmail.com,+444 10 20 300
005,24-04-2009,James,Anstey,incident smx-023,this is a report incident for smx-023,janstey@gmail.com,+555 10 20 300
007,01-04-2009,Willem,Jiang,incident smx-456,this is a report incident for smx-456,wjiang@gmail.com,+666 10 20 300
008,27-04-2009,Matt,Raibble,incident appfuse-123,this is a report incident for appfuse-123,mraibble@gmail.com,+777 10 20 300
009,12-04-2009,Jean-Baptiste,Onofré,incident smx3-088,this is a report incident for smx3-088,cjbonofre@gmail.com,+888 10 20 300
010,17-04-2009,Hadrian,Zbarcea,incident camel-005,this is a report incident for camel-005,hzbarcea@gmail.com,+999 10 20 300

Save your file and copy it in the folder

Check the log of SMX and you must see something like this

17:45:18,041 | INFO  | Component@c4d1a7 | TraceInterceptor                 | rg.apache.camel.processor.Logger   88 | ID-dell-charles-2274-1241105486478-2-12 >>>  --> setHeader(file), Pattern:InOnly, Properties:{CamelFileLockName=d:\temp\data\csv_tutorial.txt.camelLock, CamelFileLock=sun.nio.ch.FileLockImpl[0:9223372036854775807 exclusive valid]}, Headers:{CamelFileBatchSize=1, CamelFileNameOnly=csv_tutorial.txt, CamelFileBatchIndex=0, CamelFileLastModified=Thu Apr 30 16:56:48 CEST 2009, CamelFileRelativePath=d:\temp\data\csv_tutorial.txt, CamelFileAbsolutePath=d:\temp\data\csv_tutorial.txt, CamelFileLength=1106, CamelFileName=csv_tutorial.txt, CamelFilePath=d:\temp\data\csv_tutorial.txt, CamelFileParent=d:\temp\data, CamelFileAbsolute=true}, BodyType:org.apache.camel.component.file.GenericFile, Body:001,29-04-2009,Claus,Ibsen,incident camel-001,this is a report incident for camel-001,cibsen@gmail.com,+111 10 20 300
002,29-04-2009,Charles,Moulliard,incident smx-002,this is a report incident for smx-002,cmoulliard@gmail.com,+222 10 20 300
003,28-04-2009,Guillaume,Nodet,incident camel-123,this is a report incident for camel-123,gnodet@gmail.com,+333 10 20 300
004,25-04-2009,Gert,Vanthienen,incident camel-454,this is a report incident for camel-454,gvanthienen@gmail.com,+444 10 20 300
005,24-04-2009,James,Anstey,incident smx-023,this is a report incident for smx-023,janstey@gmail.com,+555 10 20 300
007,01-04-2009,Willem,Jiang,incident smx-456,this is a report incident for smx-456,wjiang@gmail.com,+666 10 20 300
008,27-04-2009,Matt,Raibble,incident appfuse-123,this is a report incident for appfuse-123,mraibble@gmail.com,+777 10 20 300
009,12-04-2009,Jean-Baptiste,Onofré,incident smx3-088,this is a report incident for smx3-088,cjbonofre@gmail.com,+888 10 20 300
010,17-04-2009,Hadrian,Zbarcea,incident camel-005,this is a report incident for camel-005,hzbarcea@gmail.com,+999 10 20 300
17:45:18,041 | INFO  | Component@c4d1a7 | TraceInterceptor                 | rg.apache.camel.processor.Logger   88 | ID-dell-charles-2274-1241105486478-2-12 >>> setHeader(file) --> unmarshal(), Pattern:InOnly, Properties:{CamelFileLockName=d:\temp\data\csv_tutorial.txt.camelLock, CamelFileLock=sun.nio.ch.FileLockImpl[0:9223372036854775807 exclusive valid]}, Headers:{CamelFileBatchSize=1, CamelFileNameOnly=csv_tutorial.txt, CamelFileBatchIndex=0, CamelFileLastModified=Thu Apr 30 16:56:48 CEST 2009, CamelFileRelativePath=d:\temp\data\csv_tutorial.txt, CamelFileAbsolutePath=d:\temp\data\csv_tutorial.txt, CamelFileLength=1106, CamelFileName=csv_tutorial.txt, CamelFilePath=d:\temp\data\csv_tutorial.txt, CamelFileParent=d:\temp\data, origin=file, CamelFileAbsolute=true}, BodyType:org.apache.camel.component.file.GenericFile, Body:001,29-04-2009,Claus,Ibsen,incident camel-001,this is a report incident for camel-001,cibsen@gmail.com,+111 10 20 300
002,29-04-2009,Charles,Moulliard,incident smx-002,this is a report incident for smx-002,cmoulliard@gmail.com,+222 10 20 300
003,28-04-2009,Guillaume,Nodet,incident camel-123,this is a report incident for camel-123,gnodet@gmail.com,+333 10 20 300
004,25-04-2009,Gert,Vanthienen,incident camel-454,this is a report incident for camel-454,gvanthienen@gmail.com,+444 10 20 300
005,24-04-2009,James,Anstey,incident smx-023,this is a report incident for smx-023,janstey@gmail.com,+555 10 20 300
007,01-04-2009,Willem,Jiang,incident smx-456,this is a report incident for smx-456,wjiang@gmail.com,+666 10 20 300
008,27-04-2009,Matt,Raibble,incident appfuse-123,this is a report incident for appfuse-123,mraibble@gmail.com,+777 10 20 300
009,12-04-2009,Jean-Baptiste,Onofré,incident smx3-088,this is a report incident for smx3-088,cjbonofre@gmail.com,+888 10 20 300
010,17-04-2009,Hadrian,Zbarcea,incident camel-005,this is a report incident for camel-005,hzbarcea@gmail.com,+999 10 20 300
17:45:18,135 | INFO  | Component@c4d1a7 | TraceInterceptor                 | rg.apache.camel.processor.Logger   88 | ID-dell-charles-2274-1241105486478-2-12 >>> unmarshal() --> to(queuingservice:queue:in), Pattern:InOnly, Properties:{CamelFileLockName=d:\temp\data\csv_tutorial.txt.camelLock, CamelFileLock=sun.nio.ch.FileLockImpl[0:9223372036854775807 exclusive valid]}, Headers:{CamelFileBatchSize=1, CamelFileNameOnly=csv_tutorial.txt, CamelFileBatchIndex=0, CamelFileLastModified=Thu Apr 30 16:56:48 CEST 2009, CamelFileRelativePath=d:\temp\data\csv_tutorial.txt, CamelFileAbsolutePath=d:\temp\data\csv_tutorial.txt, CamelFileLength=1106, CamelFileName=csv_tutorial.txt, CamelFilePath=d:\temp\data\csv_tutorial.txt, CamelFileParent=d:\temp\data, origin=file, CamelFileAbsolute=true}, BodyType:java.util.ArrayList, Body:[{org.apache.camel.example.reportincident.model.Incident=org.apache.camel.example.reportincident.model.Incident@158e458[
...
17:45:18,322 | INFO  | ActiveMQ Task    | FailoverTransport                | sport.failover.FailoverTransport  714 | Successfully connected to tcp://localhost:61616
17:45:18,385 | INFO  | nerContainer-814 | TraceInterceptor                 | rg.apache.camel.processor.Logger   88 | ID-dell-charles-2274-1241105486478-2-13 >>> queuingservice:queue:in --> to(bean:incidentSaver?method=process), Pattern:InOnly, Headers:{CamelFileBatchSize=1, CamelFileNameOnly=csv_tutorial.txt, JMSCorrelationID=null, JMSMessageID=ID:dell-charles-3593-1241089972416-2:7:1:1:1, JMSExpiration=0, CamelFileRelativePath=d:\temp\data\csv_tutorial.txt, CamelFileLastModified=Thu Apr 30 16:56:48 CEST 2009, CamelFileBatchIndex=0, CamelFileAbsolutePath=d:\temp\data\csv_tutorial.txt, JMSDeliveryMode=2, origin=file, JMSPriority=4, JMSTimestamp=1241106318369, JMSReplyTo=null, JMSDestination=queue://in, JMSXGroupID=null, JMSType=null, JMSRedelivered=false, CamelFileName=csv_tutorial.txt, CamelFileLength=1106, CamelFilePath=d:\temp\data\csv_tutorial.txt, CamelFileParent=d:\temp\data, CamelFileAbsolute=true}, BodyType:java.util.ArrayList, Body:[{org.apache.camel.example.reportincident.model.Incident=org.apache.ca
...
17:45:18,322 | INFO  | ActiveMQ Task    | FailoverTransport                | sport.failover.FailoverTransport  714 | Successfully connected to tcp://localhost:61616
17:45:18,385 | INFO  | nerContainer-814 | TraceInterceptor                 | rg.apache.camel.processor.Logger   88 | ID-dell-charles-2274-1241105486478-2-13 >>> queuingservice:queue:in --> to(bean:incidentSaver?method=process), Pattern:InOnly, Headers:{CamelFileBatchSize=1, CamelFileNameOnly=csv_tutorial.txt, JMSCorrelationID=null, JMSMessageID=ID:dell-charles-3593-1241089972416-2:7:1:1:1, JMSExpiration=0, CamelFileRelativePath=d:\temp\data\csv_tutorial.txt, CamelFileLastModified=Thu Apr 30 16:56:48 CEST 2009, CamelFileBatchIndex=0, CamelFileAbsolutePath=d:\temp\data\csv_tutorial.txt, JMSDeliveryMode=2, origin=file, JMSPriority=4, JMSTimestamp=1241106318369, JMSReplyTo=null, JMSDestination=queue://in, JMSXGroupID=null, JMSType=null, JMSRedelivered=false, CamelFileName=csv_tutorial.txt, CamelFileLength=1106, CamelFilePath=d:\temp\data\csv_tutorial.txt, CamelFileParent=d:\temp\data, CamelFileAbsolute=true}, BodyType:java.util.ArrayList, Body:[{org.apache.camel.example.reportincident.model.Incident=org.apache.ca
...

Next, open the web page of your application : http://localhost:8080/reportincidentweb/

Step 4 : Call a webservice

You can use the tool Soapui to call the web service of the application.

Use the following url from Soapui, to generate the client interface to communicate with the web service : http://localhost:8080/cxf/camel-example/incident?wsdl.

Call the web service with the request : http://localhost:8080/cxf/camel-example/incident
and the following SOAP message request by example :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rep="http://reportincident.example.camel.apache.org">
   <soapenv:Header/>
   <soapenv:Body>
      <rep:inputReportIncident>
         <incidentId>000</incidentId>
         <incidentDate>29-04-2009</incidentDate>
         <givenName>Charles</givenName>
         <familyName>Moulliard</familyName>
         <summary>This is an web service report incident</summary>
         <details>This is an web service report incident,This is an web service report incident.</details>
         <email>cmoulliard@gmail.com</email>
         <phone>+222 10 20 30 40</phone>
      </rep:inputReportIncident>
   </soapenv:Body>
</soapenv:Envelope>

Check the Servicemix log :

17:41:33,463 | INFO  | 14752391@qtp1-0  | TraceInterceptor                 | rg.apache.camel.processor.Logger   88 | ID-dell-charles-2274-1241105486478-2-8 >>> /camel-example/incident --> setHeader(webservice), Pattern:InOut, Properties:{org.apache.camel.component.cxf.DataFormat=POJO, org.apache.cxf.service.model.BindingOperationInfo=[BindingOperationInfo: {http://reportincident.example.camel.apache.org}ReportIncident]}, Headers:{content-type=text/xml;charset=UTF-8, content.type=text/xml;charset=UTF-8, operationName=ReportIncident, Host=localhost:8080, Content-Length=701, SOAPAction="http://reportincident.example.camel.apache.org/ReportIncident", User-Agent=Jakarta Commons-HttpClient/3.1, operationNameSpace=http://reportincident.example.camel.apache.org}, BodyType:org.apache.cxf.message.MessageContentsList, Body:[org.apache.camel.example.reportincident.InputReportIncident@15099a1]
17:41:33,478 | INFO  | 14752391@qtp1-0  | TraceInterceptor                 | rg.apache.camel.processor.Logger   88 | ID-dell-charles-2274-1241105486478-2-8 >>> setHeader(webservice) --> convertBodyTo(), Pattern:InOut, Properties:{org.apache.camel.component.cxf.DataFormat=POJO, org.apache.cxf.service.model.BindingOperationInfo=[BindingOperationInfo: {http://reportincident.example.camel.apache.org}ReportIncident]}, Headers:{content-type=text/xml;charset=UTF-8, operationName=ReportIncident, content.type=text/xml;charset=UTF-8, Host=localhost:8080, Content-Length=701, SOAPAction="http://reportincident.example.camel.apache.org/ReportIncident", origin=webservice, User-Agent=Jakarta Commons-HttpClient/3.1, operationNameSpace=http://reportincident.example.camel.apache.org}, BodyType:org.apache.cxf.message.MessageContentsList, Body:[org.apache.camel.example.reportincident.InputReportIncident@15099a1]
17:41:33,494 | INFO  | 14752391@qtp1-0  | TraceInterceptor                 | rg.apache.camel.processor.Logger   88 | ID-dell-charles-2274-1241105486478-2-8 >>> convertBodyTo() --> to(bean:webservice), Pattern:InOut, Properties:{org.apache.camel.component.cxf.DataFormat=POJO, org.apache.cxf.service.model.BindingOperationInfo=[BindingOperationInfo: {http://reportincident.example.camel.apache.org}ReportIncident]}, Headers:{content-type=text/xml;charset=UTF-8, operationName=ReportIncident, content.type=text/xml;charset=UTF-8, Host=localhost:8080, Content-Length=701, SOAPAction="http://reportincident.example.camel.apache.org/ReportIncident", origin=webservice, User-Agent=Jakarta Commons-HttpClient/3.1, operationNameSpace=http://reportincident.example.camel.apache.org}, BodyType:org.apache.camel.example.reportincident.InputReportIncident, Body:org.apache.camel.example.reportincident.InputReportIncident@15099a1
17:41:33,510 | INFO  | 14752391@qtp1-0  | TraceInterceptor                 | rg.apache.camel.processor.Logger   88 | ID-dell-charles-2274-1241105486478-2-8 >>> to(bean:webservice) --> inOnly(queuingservice:queue:in), Pattern:InOut, Properties:{CamelBeanHolder=bean: webservice, org.apache.camel.component.cxf.DataFormat=POJO, org.apache.cxf.service.model.BindingOperationInfo=[BindingOperationInfo: {http://reportincident.example.camel.apache.org}ReportIncident]}, Headers:{origin=webservice}, BodyType:java.util.ArrayList, Body:[{org.apache.camel.example.reportincident.model.Incident=org.apache.camel.example.reportincident.model.Incident@1a6895c[
  incidentId=0
  incidentRef=666
  incidentDate=Thu Jan 29 00:04:00 CET 2009
  givenName=Charles
  familyName=Moulliard
  summary=This is a web service incident
  details=This is an web service report incident,This is an web service report incident.
  email=cmoulliard@gmail.com
  phone=+222 10 20 30 40
  creationUser=webservice
  creationDate=Thu Apr 30 17:41:33 CEST 2009
]}]
17:41:33,619 | INFO  | ActiveMQ Task    | FailoverTransport                | sport.failover.FailoverTransport  714 | Successfully connected to tcp://localhost:61616
17:41:33,650 | INFO  | 14752391@qtp1-0  | TraceInterceptor                 | rg.apache.camel.processor.Logger   88 | ID-dell-charles-2274-1241105486478-2-8 >>> inOnly(queuingservice:queue:in) --> transform(), Pattern:InOnly, Properties:{CamelBeanHolder=bean: webservice, org.apache.camel.component.cxf.DataFormat=POJO, org.apache.cxf.service.model.BindingOperationInfo=[BindingOperationInfo: {http://reportincident.example.camel.apache.org}ReportIncident]}, Headers:{origin=webservice}, BodyType:java.util.ArrayList, Body:[{org.apache.camel.example.reportincident.model.Incident=org.apache.camel.example.reportincident.model.Incident@1a6895c[
  incidentId=0
  incidentRef=666
  incidentDate=Thu Jan 29 00:04:00 CET 2009
  givenName=Charles
  familyName=Moulliard
  summary=This is a web service incident
  details=This is an web service report incident,This is an web service report incident.
  email=cmoulliard@gmail.com
  phone=+222 10 20 30 40
  creationUser=webservice
  creationDate=Thu Apr 30 17:41:33 CEST 2009
]}]
17:41:33,681 | INFO  | nerContainer-589 | TraceInterceptor                 | rg.apache.camel.processor.Logger   88 | ID-dell-charles-2274-1241105486478-2-9 >>> queuingservice:queue:in --> to(bean:incidentSaver?method=process), Pattern:InOnly, Headers:{JMSXGroupID=null, JMSCorrelationID=null, JMSType=null, JMSExpiration=0, JMSMessageID=ID:dell-charles-3593-1241089972416-2:5:1:1:1, JMSRedelivered=false, JMSDeliveryMode=2, origin=webservice, JMSPriority=4, JMSReplyTo=null, JMSTimestamp=1241106093635, JMSDestination=queue://in}, BodyType:java.util.ArrayList, Body:[{org.apache.camel.example.reportincident.model.Incident=org.apache.camel.example.reportincident.model.Incident@37a96[
  incidentId=0
  incidentRef=666
  incidentDate=Thu Jan 29 00:04:00 CET 2009
  givenName=Charles
  familyName=Moulliard
  summary=This is a web service incident
  details=This is an web service report incident,This is an web service report incident.
  email=cmoulliard@gmail.com
  phone=+222 10 20 30 40
  creationUser=webservice
  creationDate=Thu Apr 30 17:41:33 CEST 2009
]}]

and web screen result : http://localhost:8080/reportincidentweb/

Conclusion

TODO

#Resources

  • No labels