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
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
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, 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 :
and web screen result : http://localhost:8080/reportincidentweb/
Conclusion
TODO
Links
- Part 1 : simple example
- Part 2a : real example, architecture, project setup, database creation
- Part 2b : transform projects in bundles
- Part 2c : add infrastructure and routing
- Part 2d : web and deployment