camel cxf https server endpoint

I wanted to configure in camel a cxf https endpoint. Normally I do it the forceful way to update the jdk certificates but it can be done in another way.
Define the jax-ws contract first endpoint, although that can be done also in a code first manner.

This is the defined endpoint, it is directly taken from a camel sample named ‘camel-cxf-contract-first-blueprint’.

 
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
	xmlns:camel="http://camel.apache.org/schema/blueprint" xmlns:sec="http://cxf.apache.org/configuration/security"
	xmlns:http="http://cxf.apache.org/transports/http/configuration"
	xmlns:httpj="http://cxf.apache.org/transports/http-jetty/configuration"
	xsi:schemaLocation="
             http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
             http://camel.apache.org/schema/blueprint/cxf http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd
             http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd
             http://cxf.apache.org/transports/http-jetty/configuration http://cxf.apache.org/schemas/configuration/http-jetty.xsd">
 
	<cxf:cxfEndpoint id="reportEndpoint"
		address="https://localhost:9080/part-five/webservices/incident"
		serviceClass="org.apache.camel.example.reportincident.ReportIncidentEndpoint"
		wsdlURL="wsdl/report_incident.wsdl">
		<cxf:properties>
			<entry key="loggingFeatureEnabled" value="true"/>
		</cxf:properties>
	</cxf:cxfEndpoint>
 
	<httpj:engine-factory bus="cxf">
		<httpj:engine port="9080">
			<httpj:tlsServerParameters>
				<sec:keyManagers keyPassword="changeit">
					<sec:keyStore type="JKS" password="changeit" resource="certs/keystore.jks" />
				</sec:keyManagers>
			</httpj:tlsServerParameters>
		</httpj:engine>
	</httpj:engine-factory>
 
	<camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route>
        <from uri="cxf:bean:reportEndpoint"/>
        <convertBodyTo type="org.apache.camel.example.reportincident.InputReportIncident"/>
        <log message="Received report incident ${body.incidentId}"/>
        <setHeader headerName="Exchange.FILE_NAME">
            <simple>report-incident-${body.incidentId}.xml</simple>
        </setHeader>
        <to uri="file:work/incident"/>
        <log message="Stored a copy of the incident as ${header.CamelFileNameProduced}"/>
        <choice>
            <when>
                <simple>${body.phone.isEmpty}</simple>
                <to uri="seda:emailMe"/>
            </when>
            <otherwise>
                <to uri="seda:callMe"/>
            </otherwise>
        </choice>
        <to uri="language:constant:classpath:ok.xml"/>
        <convertBodyTo type="org.apache.camel.example.reportincident.OutputReportIncident"/>
    </route>
    <route>
        <from uri="seda:callMe"/>
        <log message="We are going to call ${body.phone}"/>
    </route>
    <route>
        <from uri="seda:emailMe"/>
        <log message="We are going to email ${body.email}"/>
    </route>
</camelContext>
 
</blueprint>

Update the xml code snippet to make it readable again. (2015/01/25)

JAAS authorization with JBoss Fuse

The customer I was working with had a need for JAAS Authorization for the ActiveMQ broker in his JBoss Fuse install. I thought I did it by the book. But it was at the end not enough. I had done this configuration for a FuseSource installation version 7.1.x but it didn’t work for a 7.2.x (JBoss Fuse 6.0.0.redhat-024). For the current, at this writing, version of JBoss Fuse you have to do it like this:

Add or change the plugins settings of etc/activemq.xml into:

<plugins>
<jaasAuthenticationPlugin configuration=”karaf”/>
<authorizationPlugin>
<map>
<authorizationMap groupClass=”org.apache.karaf.jaas.boot.principal.RolePrincipal”><authorizationEntries><authorizationEntry queue=”>” read=”admin,broker” write=”admin,broker” admin=”admin,broker”/>

<authorizationEntry topic=”>” read=”admin,broker” write=”admin,broker” admin=”admin,broker”/>
<authorizationEntry topic=”ActiveMQ.Advisory.>” read=”admin,broker” write=”admin,broker” admin=”admin,broker”/>
</authorizationEntries>
</authorizationMap>
</map>
</authorizationPlugin>
</plugins>
It is all about the ‘groupClass’ attribute inside the ‘authorizationMap’ element.
You can read more about this at https://community.jboss.org/thread/233546.

Creating a osgi jdbc driver

For work I have to work with different datasource connections. Not only in a JEE environment but also in a OSGI environment. A datasource needs also a jdbc connection. And a jdbc driver jar bundled in osgi format is not always available. I normally try to find a osgi jdbc jar in the servicemix repository but that will work only for OSS drivers.

For a closed source jdbc driver to be converted to a bundle version of the jar you could use a maven plugin. But that is more work then the following:

Fire up a Fusesource or JBoss Fuse instance and have the jdbc driver available on the disk. Inside the fuse console execute the command ‘osgi:install wrap:file:///tmp/ojdbc6.jar’.  When the command finished it will return a number.

Use this number to go to the cache directory with this number (data/cache/bundlexxx/version0.0). Inside the directory you will find the ojdbc6.jar named as bundle.jar. Take the bundle.jar and rename it (back) to ojdbc6-osgi.jar. The -osgi addition is just a naming convention I adopted. Place ojdbc6-osgi.jar in your package manager.