<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Olaf&#039;s blog</title>
	<atom:link href="http://olafsblog.sysbsb.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://olafsblog.sysbsb.de</link>
	<description>Olaf&#039;s blog on software development and life</description>
	<lastBuildDate>Thu, 18 Nov 2010 07:57:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Testing SSL (HTTPS) clients with Junit and Jetty</title>
		<link>http://olafsblog.sysbsb.de/testing-ssl-https-clients-with-junit-and-jetty/</link>
		<comments>http://olafsblog.sysbsb.de/testing-ssl-https-clients-with-junit-and-jetty/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 07:54:17 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven 2]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[https]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[ssl]]></category>
		<category><![CDATA[unit test]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=124</guid>
		<description><![CDATA[I recently ran into a situation where a web service client had issues when invoking a webservice via HTTPS. To reproduce, I needed a lightweight, JUnit-based test to reproduce the problem and write a regression test. Here is how I got it to work:
First, I used the basic HTTP test setup. Now however, I needed [...]]]></description>
			<content:encoded><![CDATA[<p>I recently ran into a situation where a web service client had issues when invoking a webservice via HTTPS. To reproduce, I needed a lightweight, JUnit-based test to reproduce the problem and write a regression test. Here is how I got it to work:</p>
<p>First, I used the <a href="/lightweight-testing-of-webservice-http-clients-with-junit-and-jetty/">basic HTTP test setup</a>. Now however, I needed Jetty to provide a HTTPS connector. For this to work, Jetty &#8211; just like any other webserver, such as <a href="http://httpd.apache.org/docs/2.2/ssl/">apache</a> &#8211; needs a server certificate and a private key in a keystore. To create the keystore, I simply followed the excellent <a href="http://docs.codehaus.org/display/JETTY/How+to+configure+SSL">Jetty SSL guide</a>. Namingly, I did this (using Ubuntu, see the above link for alternatives):</p>
<pre class="brush: plain;">
openssl genrsa -des3 -out jetty.key
openssl req -new -x509 -key jetty.key -out jetty.crt
openssl pkcs12 -inkey jetty.key -in jetty.crt -export -out jetty.pkcs12
$JAVA_HOME/bin/keytool -importkeystore -srckeystore jetty.pkcs12 -srcstoretype PKCS12 -destkeystore keystore
</pre>
<p>Once I had the keystore set up, I placed it in the src/main/resources folder (the root of the classpath, in case you&#8217;re not a maven user) and extended the HttpTestServer like so:</p>
<pre class="brush: java;">
import java.net.URL;

import org.junit.Ignore;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.security.SslSocketConnector;

/**
 * A test server for testing SSL requests.
 *
 * @author Olaf Otto
 */
@Ignore
public class SslTestServer extends HttpTestServer {
	private static final int HTTPS_PORT = 50443;

	public SslTestServer() {
	}

	public SslTestServer(String mockData) {
		super(mockData);
	}

	@Override
	protected void configureServer() {
		super.configureServer();
		Connector secureConnector = createSecureConnector();
		getServer().addConnector(secureConnector);
	}

	private Connector createSecureConnector() {
		SslSocketConnector connector = new SslSocketConnector();
		connector.setPort(HTTPS_PORT);
		URL keystoreUrl = getClass().getClassLoader().getResource(&quot;keystore&quot;);
		connector.setKeystore(keystoreUrl.getFile());
		connector.setKeyPassword(&quot;test&quot;);
		return connector;
	}

	public static void main(String[] args) {
		SslTestServer server = new SslTestServer();
		try {
			server.start();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}
</pre>
<p>(I added the @Ignore annotation as I placed the class in the test sources folder, though it&#8217;s not a test&#8230;)<br />
You might use it in your JUnit-based test like so:</p>
<pre class="brush: java;">
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * @author Olaf Otto
 */
public class MySslTest {
	private SslTestServer _server;

	@Before
	public void startServer() throws Exception {
		_server = new SslTestServer();
		_server.start();
	}

	@After
	public void stopServer() throws Exception {
		_server.stop();
	}

	@Test
	public void mySsltest() {
		_server.setMockResponseData(&quot;&lt;xml&gt;My client expects this response&lt;/xml&gt;&quot;);
		// Perform tests on port 50443...
	}
}
</pre>
<p>Here is <a href="http://olafsblog.sysbsb.de/wp-content/uploads/2010/07/https-testserver.zip">the whole package as a maven 2 project</a> (including the keystore with a self-signed certificate). Download, unzip, and give it a try (<code>mvn test</code>).</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/testing-ssl-https-clients-with-junit-and-jetty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lightweight testing of (webservice) HTTP clients with JUnit and Jetty</title>
		<link>http://olafsblog.sysbsb.de/lightweight-testing-of-webservice-http-clients-with-junit-and-jetty/</link>
		<comments>http://olafsblog.sysbsb.de/lightweight-testing-of-webservice-http-clients-with-junit-and-jetty/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 07:48:01 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven 2]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[http clients]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=133</guid>
		<description><![CDATA[If you&#8217;re working with webservice clients you will certainly have noticed the complexity of integration-testing your webservice clients. Building webservice clients can already be quite a complex task, but providing a mock-up webservice backend delivering useful test responses is quite often just to much work, if not impossible, since many web service backends are very [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;re working with webservice clients you will certainly have noticed the complexity of integration-testing your webservice clients. Building webservice clients can already be quite a complex task, but providing a mock-up webservice backend delivering useful test responses is quite often just to much work, if not impossible, since many web service backends are very complex constructs. Furthermore, setting up a backend for each integration test consumes valuable build time.</p>
<p>As an alternative, one may simply replace the backend with a mock HTTP server that does one thing: deliver the <em>expected webserver response</em> &#8211; i.e. XML data  &#8211; when called by the client. All you need to set this up is a HTTP server and a pre-recorded service response (quite often this comes with WS client specifications). If you don&#8217;t have this data, you can record it, for example using a proxy server in between your WS client and a real WS backend, or a tool such as <a href="http://www.wireshark.org/">wireshark</a>.</p>
<p>The recorded XML response thus represents your assumptions against which you test the client. This makes your tests fast, lightweight and a lot better to understand. </p>
<p>Here is my Jetty-based test HTTP server:</p>
<pre class="brush: java;">
package de.sysbsb.test;

import static javax.servlet.http.HttpServletResponse.SC_OK;
import static org.apache.commons.io.IOUtils.write;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.junit.Ignore;
import org.mortbay.jetty.Handler;
import org.mortbay.jetty.HttpConnection;
import org.mortbay.jetty.Request;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.handler.AbstractHandler;

/**
 * A server for answering HTTP requests with test response data.
 *
 * @author Olaf Otto
 */
@Ignore
public class HttpTestServer {
	public static final int HTTP_PORT = 50036;

	private Server _server;
	private String _responseBody;
	private String _requestBody;
	private String _mockResponseData;

	public HttpTestServer() {
	}

	public HttpTestServer(String mockData) {
		setMockResponseData(mockData);
	}

	public void start() throws Exception {
		configureServer();
		startServer();
	}

	private void startServer() throws Exception {
		_server.start();
	}

	protected void configureServer() {
		_server = new Server(HTTP_PORT);
		_server.setHandler(getMockHandler());
	}

	/**
	 * Creates an {@link AbstractHandler handler} returning an arbitrary String as a response.
	 *
	 * @return never &lt;code&gt;null&lt;/code&gt;.
	 */
	public Handler getMockHandler() {
		Handler handler = new AbstractHandler() {

			public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, ServletException {
				Request baseRequest = request instanceof Request ? (Request) request : HttpConnection.getCurrentConnection().getRequest();
				setResponseBody(getMockResponseData());
				setRequestBody(IOUtils.toString(baseRequest.getInputStream()));
				response.setStatus(SC_OK);
				response.setContentType(&quot;text/xml;charset=utf-8&quot;);
				write(getResponseBody(), response.getOutputStream());
				baseRequest.setHandled(true);
			}
		};
		return handler;
	}

	public void stop() throws Exception {
		_server.stop();
	}

	public void setResponseBody(String responseBody) {
		_responseBody = responseBody;
	}

	public String getResponseBody() {
		return _responseBody;
	}

	public void setRequestBody(String requestBody) {
		_requestBody = requestBody;
	}

	public String getRequestBody() {
		return _requestBody;
	}

	public static void main(String[] args) {
		HttpTestServer server = new HttpTestServer();
		try {
			server.start();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	public void setMockResponseData(String mockResponseData) {
		_mockResponseData = mockResponseData;
	}

	public String getMockResponseData() {
		return _mockResponseData;
	}

	protected Server getServer() {
		return _server;
	}
}
</pre>
<p>You can use it in a JUnit test like so:</p>
<pre class="brush: java;">
package de.sysbsb.test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * @author Olaf Otto
 */
public class MyClientTest {
	private HttpTestServer _server;

	@Before
	public void startTestServer() throws Exception {
		_server = new HttpTestServer();
		_server.start();
	}

	@After
	public void stopTestServer() throws Exception {
		_server.stop();
	}

	@Test
	public void someClientTest() throws IOException {
		_server.setMockResponseData(&quot;&lt;xml&gt;&lt;testdata&gt;hello, world&lt;/testdata&gt;&lt;/xml&gt;&quot;);
		// or as a much more elegant alternative:
		_server.setMockResponseData(getRecordedResponse(&quot;testdata.xml&quot;));
		// run your client tests, using the HttpTestServer.HTTP_PORT
	}

	private String getRecordedResponse(String recordedResponseFile) throws IOException {
		InputStream testDataStream = getClass().getClassLoader().getResourceAsStream(recordedResponseFile);
		return IOUtils.toString(testDataStream);
	}
}
</pre>
<p><a href="http://olafsblog.sysbsb.de/wp-content/uploads/2010/07/http-testserver.zip">Here are is the HTTP test server and a JUnit test example as a maven 2 project</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/lightweight-testing-of-webservice-http-clients-with-junit-and-jetty/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Solved: Xserver lock-ups in Ubuntu 10.04 with intel GFX</title>
		<link>http://olafsblog.sysbsb.de/solved-xserver-lock-ups-in-ubuntu-10-04-with-intel-gfx/</link>
		<comments>http://olafsblog.sysbsb.de/solved-xserver-lock-ups-in-ubuntu-10-04-with-intel-gfx/#comments</comments>
		<pubDate>Wed, 23 Jun 2010 07:17:57 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[System engineering]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[intel]]></category>
		<category><![CDATA[lucid]]></category>
		<category><![CDATA[Xserver]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=116</guid>
		<description><![CDATA[After installing 10.04 I experienced a GDM lockup a couple of times a day &#8211; the symptoms varied from the window management not reacting to left mouse clicks to a complete freeze of the Xserver. This bug has caused a lot of noise across distributions, for instance in 590109 and 538563. The symptoms are log [...]]]></description>
			<content:encoded><![CDATA[<p>After installing 10.04 I experienced a GDM lockup a couple of times a day &#8211; the symptoms varied from the window management not reacting to left mouse clicks to a complete freeze of the Xserver. This bug has caused a lot of noise across distributions, for instance in <a href="https://bugs.launchpad.net/ubuntu/+bug/590109">590109</a> and <a href=" https://bugzilla.redhat.com/show_bug.cgi?id=538563">538563</a>. The symptoms are log messages such as</p>
<p><code><br />
[mi] EQ overflowing. The server is probably stuck in an infinite loop.<br />
...<br />
Backtrace:<br />
...<br />
... /usr/lib/xorg/modules/drivers/intel_drv.so<br />
...<br />
</code></p>
<p>in the :0&#8230; logfiles in /var/log/gdm when the problem occurs.</p>
<p>This is, however, <em>not</em> a kernel, XServer or GDM issue, but caused by a problem with the intel-linux driver.  The problem is apparently fixed as of version 2:2.11.0-1ubuntu1 of the xserver-xorg-video-intel driver. Since this is not (yet) an update in the official distribution repo, I did the following to solve the issue:</p>
<h2>1: Optional: Update to the latest stable kernel</h2>
<p>Reason: IMO, upstream Intel drivers are usually build against the latest stable kernel<br/><br />
Goto <a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/v2.6.34-lucid/">http://kernel.ubuntu.com/~kernel-ppa/mainline/v2.6.34-lucid/</a> and download the headers&#8230; _all.deb, headers-generic &#8230;..deb and linux-image&#8230; .deb for your platform (in most cases, i368). install the generic headers package, then the all headers package, then the image.</p>
<p><em>A word of warning: If you install this custom kernel you will not receive security updates for it from the automatic distribution updates.</em></p>
<h2>2: Add the X Updates PPA to your sources.list</h2>
<p>In a terminal, type:</p>
<p><code><br />
sudo gedit /etc/apt/sources.list<br />
</code></p>
<p>And add at the bottom of the file (if not already present):</p>
<p><code><br />
deb http://ppa.launchpad.net/ubuntu-x-swat/x-updates/ubuntu lucid main #X-Updates PPA<br />
deb-src http://ppa.launchpad.net/ubuntu-x-swat/x-updates/ubuntu lucid main #X-Updates PPA<br />
</code></p>
<h3>2.1: Trust the software packages from the x-updates PPA</h3>
<p>sudo apt-key adv &#8211;recv-keys &#8211;keyserver keyserver.ubuntu.com AF1CDFA9</p>
<h3>3: Update the driver</h3>
<p><code><br />
sudo apt-get update<br />
sudo apt-get dist-upgrade<br />
</code></p>
<p>Reboot &#8211; the problem should be solved.</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/solved-xserver-lock-ups-in-ubuntu-10-04-with-intel-gfx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating HDR images in Ubuntu with Luminance (QTPFSGUI)</title>
		<link>http://olafsblog.sysbsb.de/creating-hdr-images-in-ubuntu-with-luminance-qtpfsgui/</link>
		<comments>http://olafsblog.sysbsb.de/creating-hdr-images-in-ubuntu-with-luminance-qtpfsgui/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 15:50:00 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[open source]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[HDR]]></category>
		<category><![CDATA[luminance]]></category>
		<category><![CDATA[qtpfsgui]]></category>

		<guid isPermaLink="false">https://olafsblog.sysbsb.de/?p=79</guid>
		<description><![CDATA[For those who are not (yet) in possession one of the latest digital cameras with build-in HDR capabilities or the more experimental folks, there is a fantastic free tool to create HDR images by combining multiple shots of the same scene: Its called qtpfsgui. 
That is, it used to be called that and is still [...]]]></description>
			<content:encoded><![CDATA[<p>For those who are not (yet) in possession one of the latest digital cameras with build-in HDR capabilities or the more experimental folks, there is a fantastic free tool to create HDR images by combining multiple shots of the same scene: Its called <a href="http://qtpfsgui.sourceforge.net/">qtpfsgui</a>. </p>
<p>That is, it <em>used</em> to be called that and is still available in Ubuntu under this name (<code>sudo apt-get install qtpfsgui</code>). However, qtpfsgui is discontinued since mid 2009 and has been replaced by the <a href="http://qtpfsgui.sourceforge.net/">Luminance HDR project</a>.
</p>
<p>Since qtpfsgui crashes under ubuntu 9.10 when attempting to save any HDR image, I downloaded the latest luminance version, compiled and installed it like so:</p>
<ol>
<li>Download the luminance source and unpack the folder.</li>
<li>
   Install the dependencies required to compile luminance:<br />
  <code>sudo apt-get install qt4-qmake libexiv2-dev libopenexr-dev fftw3-dev libtiff4-dev libqt4-dev g++ libgsl0-dev</code>
</li>
<li>
  Compile luminance (takes a few minues) and install it. Change to the unpacked luminance folder and do:<br />
  <code>qmake<br />make<br />sudo make install</code>
</li>
</ol>
<p>That´s it! you now have luminance installed and it should be in your main menu under applications>graphics.</p>
<p>It works perfectly with Karmic.<br />
One of the best things about luminance is that you can play a lot with the algorithms and parameters used to tonemap the HDR into a LDR image. In contrast to many other (commercial) tools, you actually get to know which algorithms are used, who created them and can read a little more on how they work (if you are not to opposed to mathematics) by googling up the corresponding papers.</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/creating-hdr-images-in-ubuntu-with-luminance-qtpfsgui/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Per-assembly filtering with the maven-assembly-plugin</title>
		<link>http://olafsblog.sysbsb.de/per-assembly-filtering-with-the-maven-assembly-plugin/</link>
		<comments>http://olafsblog.sysbsb.de/per-assembly-filtering-with-the-maven-assembly-plugin/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 10:50:00 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[maven 2]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">https://olafsblog.sysbsb.de/?p=82</guid>
		<description><![CDATA[The maven assembly plugin is an extremely powerful tool when it comes to creating custom distributions (aka assemblies) of your artifacts for individual platforms etc. However, the ability to create multiple variants of an artifact within a single build conflicts with the standard maven approach of using multiple build profiles and executing a single build [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://maven.apache.org/plugins/maven-assembly-plugin/">maven assembly plugin</a> is an extremely powerful tool when it comes to creating custom distributions (aka assemblies) of your artifacts for individual platforms etc. However, the ability to create multiple variants of an artifact within a single build conflicts with the <a href="http://maven.apache.org/guides/mini/guide-building-for-different-environments.html">standard maven approach of using multiple build profiles and executing a single build for each profile to generate artifact variants</a>.</p>
<p>This also means that <a href="http://www.sonatype.com/books/mvnref-book/reference/resource-filtering.html">mavens resource filtering</a> is not very useful for individual assemblies, since you can only replace placeholders such as ${someValue} with the same value for all assemblies (since resources are only filtered once, using the active profile(s), for all assemblies).</p>
<p>You can, however, configure the maven assembly plugin to use individual filter property files for each assembly using the <code>&lt;execution&gt;</code> section of the plugin configuration, like so:</p>
<pre class="brush: xml">
&lt;plugin&gt;
  &lt;artifactId&gt;maven-assembly-plugin&lt;/artifactId&gt;

  &lt;version&gt;2.2-beta-5&lt;/version&gt;
  &lt;executions&gt;
    &lt;execution&gt;
      &lt;id&gt;production&lt;/id&gt;
      &lt;goals&gt;

        &lt;goal&gt;single&lt;/goal&gt;
      &lt;/goals&gt;
      &lt;configuration&gt;
        &lt;filters&gt;
          &lt;filter&gt;${project.basedir}/src/main/assembly/production.properties&lt;/filter&gt;

        &lt;/filters&gt;
        &lt;finalName&gt;${artifactId}-production-${version}&lt;/finalName&gt;
        &lt;ignoreDirFormatExtensions&gt;true&lt;/ignoreDirFormatExtensions&gt;
        &lt;descriptors&gt;
          &lt;descriptor&gt;src/main/assembly/assembly.xml&lt;/descriptor&gt;

        &lt;/descriptors&gt;
      &lt;/configuration&gt;
      &lt;phase&gt;package&lt;/phase&gt;
    &lt;/execution&gt;
    &lt;execution&gt;

      &lt;id&gt;integration&lt;/id&gt;
      &lt;goals&gt;
        &lt;goal&gt;single&lt;/goal&gt;
      &lt;/goals&gt;
      &lt;configuration&gt;

        &lt;filters&gt;
          &lt;filter&gt;${project.basedir}/src/main/assembly/integration.properties&lt;/filter&gt;
        &lt;/filters&gt;
        &lt;finalName&gt;${artifactId}-integration-${version}&lt;/finalName&gt;
        &lt;ignoreDirFormatExtensions&gt;true&lt;/ignoreDirFormatExtensions&gt;

        &lt;descriptors&gt;
          &lt;descriptor&gt;src/main/assembly/assembly.xml&lt;/descriptor&gt;
        &lt;/descriptors&gt;
      &lt;/configuration&gt;
      &lt;phase&gt;package&lt;/phase&gt;

    &lt;/execution&gt;
  &lt;/executions&gt;
&lt;/plugin&gt;
</pre>
<p>This snippet uses the same assembly descriptor (you can use any assembly descriptor, actually) to build individual artifacts for production and integration. Note that the <code>${project.basedir}/</code> prefix is a workaround for <a href="http://jira.codehaus.org/browse/MASSEMBLY-150">MASSEMBLY-150</a> and is nedded to avoid a nasty <code>Failed to create assembly: Error filtering file ... Error loading property file 'src/main/...'</code> error when executing the mojo from outside the module directory (say, for instance, in a mvn release:prepare&#8230;).</p>
<p>Filtering must be enabled in the assembly descriptor, like so:</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;assembly xmlns=&quot;http://maven.apache.org/xsd/assembly&quot;
  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;

  xsi:schemaLocation=&quot;http://maven.apache.org/xsd/assembly http://maven.apache.org/xsd/assembly-1.1.1.xsd&quot;&gt;
  ...
  &lt;fileSets&gt;
    &lt;fileSet&gt;
      &lt;filtered&gt;true&lt;/filtered&gt;
      ...
    &lt;/fileSet&gt;

  &lt;/fileSets&gt;
&lt;/assembly&gt;
</pre>
<p>Thanks to John Casey for suggesting this in <a href="http://jira.codehaus.org/browse/MASSEMBLY-430">MASSEMBLY-430</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/per-assembly-filtering-with-the-maven-assembly-plugin/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Obtaining the default charset (aka platform encoding) in JAVA</title>
		<link>http://olafsblog.sysbsb.de/obtaining-the-default-charset-aka-platform-encoding-in-java/</link>
		<comments>http://olafsblog.sysbsb.de/obtaining-the-default-charset-aka-platform-encoding-in-java/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 10:57:09 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Charset]]></category>
		<category><![CDATA[Platform encoding]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/obtaining-the-default-charset-aka-platform-encoding-in-java/</guid>
		<description><![CDATA[&#8230; is really simple since JDK 1.5:

java.nio.charset.Charset.defaultCharset()

So please don&#8217;t use messy, old workarounds such as this:

byte [] byteArray = {'a'};
InputStream inputStream = new ByteArrayInputStream(byteArray);
InputStreamReader reader = new InputStreamReader(inputStream);
String defaultEncoding = reader.getEncoding();

Which, unfortunately, is one of the first things you stumble upon when searching for this topic.
]]></description>
			<content:encoded><![CDATA[<p>&#8230; is really simple since JDK 1.5:</p>
<pre class="brush: java;">
java.nio.charset.Charset.defaultCharset()
</pre>
<p>So please don&#8217;t use messy, old workarounds such as this:</p>
<pre class="brush: java;">
byte [] byteArray = {'a'};
InputStream inputStream = new ByteArrayInputStream(byteArray);
InputStreamReader reader = new InputStreamReader(inputStream);
String defaultEncoding = reader.getEncoding();
</pre>
<p>Which, unfortunately, is one of the first things you stumble upon when searching for this topic.</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/obtaining-the-default-charset-aka-platform-encoding-in-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Intel linux drivers and new kernel gfx support reach mature state</title>
		<link>http://olafsblog.sysbsb.de/intel-linux-drivers-and-new-kernel-gfx-support-reach-mature-state/</link>
		<comments>http://olafsblog.sysbsb.de/intel-linux-drivers-and-new-kernel-gfx-support-reach-mature-state/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 07:22:14 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[Intel Graphics]]></category>
		<category><![CDATA[Karmic]]></category>
		<category><![CDATA[Xserver]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=77</guid>
		<description><![CDATA[The Linux Kernel and the XORG video rendering have been undergoing some significant improvements in the last year, with Intel&#8217;s linux open source team bringing in a lot of refactorings an architectural improvements.
I myself suffered from the lack of support for recent integrated intel gfx cards in notebooks and thus followed the excellent Intel Linux [...]]]></description>
			<content:encoded><![CDATA[<p>The Linux Kernel and the XORG video rendering have been undergoing some significant improvements in the last year, with <a href="http://intellinuxgraphics.org/">Intel&#8217;s linux open source team</a> bringing in a lot of refactorings an architectural improvements.</p>
<p>I myself suffered from the lack of support for recent integrated intel gfx cards in notebooks and thus followed the excellent <a href="http://ubuntuforums.org/showthread.php?t=1130582">Intel Linux graphics performance guide</a> using the bleeding-edge configuration, i.e. with the latest (non-stable) builds of the xorg / intel gfx drivers and the most recent kernels. However, this configuration was (not quite unexpected) somewhat unstable and had a lot of issues.</p>
<p>This phase is now over. I am happy to say that after<a href="http://kernel.ubuntu.com/~kernel-ppa/mainline/"> upgrading to Kernel version 2.6.32</a> and the xserver-xorg-video-intel driver 2:2.9.0-1ubuntu2~xup~3 the graphics support is now fast, reliable and stable. Desktop effects are back working like a charm, also in a multi-monitor setup and with sending the computer to hibernation and so forth.</p>
<p>I am quite optimistic that this state might make it into the <a href="http://www.ubuntu.com/testing/karmic/beta">upcoming Ubuntu release (Karmic)</a>, thus eliminating a lot of frustration laptop users have been experiencing with their intel gfx cards.</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/intel-linux-drivers-and-new-kernel-gfx-support-reach-mature-state/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using RPC-style, encoded Axis 1 webservices with spring-remoting</title>
		<link>http://olafsblog.sysbsb.de/using-rpc-style-encoded-axis-1-webservices-with-spring-remoting/</link>
		<comments>http://olafsblog.sysbsb.de/using-rpc-style-encoded-axis-1-webservices-with-spring-remoting/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 20:16:55 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[System architecture]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[Axis 1]]></category>
		<category><![CDATA[Jax-ws]]></category>
		<category><![CDATA[Spring-Remoting]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=76</guid>
		<description><![CDATA[Preamble
When working with enterprise integration you will quite often deal with the integration of legacy systems.
I was recently tasked with the integration of webservices and much to my surprise there are huge issues when attempting to integrate old webservices (i.e. pre axis-2 and pre jax-ws webservices).
These webservices use outdated or unsupported methods, such as rpc-style/encoded [...]]]></description>
			<content:encoded><![CDATA[<h2>Preamble</h2>
<p>When working with enterprise integration you will quite often deal with the integration of legacy systems.</p>
<p>I was recently tasked with the integration of webservices and much to my surprise there are huge issues when attempting to integrate old webservices (i.e. pre axis-2 and pre jax-ws webservices).</p>
<p>These webservices use outdated or unsupported methods, such as <a href="http://ws.apache.org/axis2/1_2/Axis2-rpc-support.html">rpc-style/encoded</a> communication, or even worce, outdated elements in the XML messages, for instance &lt;multiref&gt;&#8217;s. Having to integrate such services of course implies that you cannot change anything on the server side, and thus the outdated format must still be consumed by your webservice client.<br />
This however is a huge problem, since the current WS implementations, such as the popular axis2 framework, do simply not support these outdated formats.</p>
<p>What surprised me the most about this is that webservices are designed to make systems independent by defining a common communication and data format, which is the exact opposite of what is going on here &#8211; and these formats are not that old, actually, they where pretty common just about 5 years ago.</p>
<p>Developers facing these issues are taking rather desperate measures to work around these problems, such as <a href="http://www.jroller.com/0xcafebabe/entry/migrating_smoothly_from_rpc_encoded">using on-the-fly XSLT transformation to convert incoming and outgoing WS messages</a>. However, this binds your application even stronger to the outdated format and specific service data.</p>
<p>In my case I wanted to use <a href="http://static.springsource.org/spring/docs/2.5.x/reference/remoting.html">Spring-remoting</a>. Since the service was RPC-style, I wanted to use the <a href="http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/remoting/jaxrpc/JaxRpcPortProxyFactoryBean.html">JaxRpcPortProxyFactoryBean</a> to create an on-the-fly proxy implementing the service interface. What I did not want to do is having to write any additional code to consume the service. Furthermore, I wanted the complex objects transferred by the services to be represented by standard JAVA beans, and not be generated using the wsdl2java axis1 tools since they contain a lot of ugly dependencies. Here is how I got this to work.<br />
<span id="more-76"></span></p>
<h2>Using Spring-remoting&#8217;s jax-rpc support with axis 1</h2>
<h3>Required maven dependencies</h3>
<p>First, I was willing to make the compromise of having axis1 on my classpath. This might not be the way to go for everyone, unless you are using an OSGI framework, which was not an option in my case. Using jax-rpc with axis1 from spring requires the following dependencies (I am using <a href="http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html">maven&#8217;s dependency management</a> for the sake of simplicity):</p>
<pre class="brush: xml;">
&lt;dependency&gt;
  &lt;groupId&gt;commons-io&lt;/groupId&gt;
  &lt;artifactId&gt;commons-io&lt;/artifactId&gt;
  &lt;version&gt;1.4&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;commons-discovery&lt;/groupId&gt;
  &lt;artifactId&gt;commons-discovery&lt;/artifactId&gt;
  &lt;version&gt;0.4&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.apache.axis&lt;/groupId&gt;
  &lt;artifactId&gt;axis-jaxrpc&lt;/artifactId&gt;
  &lt;version&gt;1.4&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.apache.axis&lt;/groupId&gt;
  &lt;artifactId&gt;axis&lt;/artifactId&gt;
  &lt;version&gt;1.4&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.apache.axis&lt;/groupId&gt;
  &lt;artifactId&gt;axis-saaj&lt;/artifactId&gt;
  &lt;version&gt;1.4&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;wsdl4j&lt;/groupId&gt;
  &lt;artifactId&gt;wsdl4j&lt;/artifactId&gt;
  &lt;version&gt;1.6.2&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.springframework&lt;/groupId&gt;
  &lt;artifactId&gt;spring-aop&lt;/artifactId&gt;
  &lt;version&gt;2.5.6&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;org.springframework&lt;/groupId&gt;
  &lt;artifactId&gt;spring-web&lt;/artifactId&gt;
  &lt;version&gt;2.5.6&lt;/version&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
  &lt;groupId&gt;cglib&lt;/groupId&gt;
  &lt;artifactId&gt;cglib-nodep&lt;/artifactId&gt;
  &lt;version&gt;2.2&lt;/version&gt;
&lt;/dependency&gt;
</pre>
<p>Note that this setup is for JDK 1.5. JDK 1.6 ships with quite a lot of jax-ws libraries, so you might want to check whether all of these dependencies are still required when using 1.6, but they might.</p>
<h3>Configuring the service using the port proxy factory bean</h3>
<p>First, I downloaded the WSDL&#8217;s from the services and placed them within my src/main/resources folder to use them offline. This is not required, but I do recommend it. The Next step was to set up the factory beans for jax-rpc in order to let Spring generate implementations of my service interfaces:</p>
<pre class="brush: xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
  xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
  xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&quot;&gt;

  &lt;bean id=&quot;myWebService&quot; class=&quot;org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean&quot;&gt;
    &lt;property name=&quot;serviceInterface&quot; value=&quot;my.package.MYServiceInterface&quot; /&gt;
    &lt;property name=&quot;wsdlDocumentUrl&quot; value=&quot;classpath:path/to/my/wsdl.swdl&quot; /&gt;
    &lt;property name=&quot;namespaceUri&quot; value=&quot;namespace/as/defined/in/wsdl&quot; /&gt;
    &lt;property name=&quot;serviceName&quot; value=&quot;ServiceNameFromWsdl&quot; /&gt;
    &lt;property name=&quot;portName&quot; value=&quot;PortNameFromWsdl&quot; /&gt;
    &lt;property name=&quot;servicePostProcessors&quot;&gt;
      &lt;list&gt;
        &lt;!--
          This is for mapping your POJO's to the complex service objects (if you are using any).
          You can use an arbitrary number of mapping &lt;bean&gt; configurations for every model
          namespace of your WSDL.
        --&gt;
        &lt;bean
          class=&quot;org.springframework.remoting.jaxrpc.support.AxisBeanMappingServicePostProcessor&quot;&gt;
	  &lt;!-- encoding style as in WSDL, in my case the outdated soap/encoding --&gt;
          &lt;property name=&quot;encodingStyleUri&quot; value=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; /&gt;
          &lt;property name=&quot;typeNamespaceUri&quot; value=&quot;namespace/for/models/as/defined/in/wsdl&quot; /&gt;
          &lt;property name=&quot;beanMappings&quot;&gt;
            &lt;props&gt;
              &lt;prop key=&quot;my.package.MyPojo&quot;&gt;ModelNameInWsdl&lt;/prop&gt;
            &lt;/props&gt;
          &lt;/property&gt;
        &lt;/bean&gt;
      &lt;/list&gt;
    &lt;/property&gt;
  &lt;/bean&gt;
&lt;/beans&gt;
</pre>
<p>If the service specifies an operation such as <code>ComplexResponseVO getResults(ComplexRequestVO)</code>, you would thus define an interface like so:</p>
<pre class="brush: java;">
public interface MyService {
     MyResponsePojo getResults(MyRequestPojo);
}
</pre>
<p>And map the <code>MyResponsePojo</code> and <code>MyRequestPojo</code> using the AxisBeanMappingServicePostProcessor in the above spring configuration. Spring will serialize and deserialize the pojos using standard getter and setter methods to obtain the values, thus you do not have to care for serialization or marshalling. In fact, your pojos do not even have to be Serializable.</p>
<p>Once you have this stuff up and running, you can inject the <code>MyService</code> implementation into any other spring bean and use it like any other bean. Spring will convert the usually annoying and unrecoverable RemoteExceptions into unchecked remote exceptions, thus if you want to handle these, catching <a href="http://static.springsource.org/spring/docs/2.5.6/api/org/springframework/remoting/RemoteAccessException.html">remote access exceptions</a> is recommended.</p>
<p>Using an interface as the service representation has the additional advantage that it is pretty easy to <a href="http://www.martinfowler.com/bliki/SelfInitializingFake.html">fake or mock the service for integration testing</a>.</p>
<h3>Handling uppercase data type attributes</h3>
<p>Legacy services sometimes violate the JAVA standards of good coding and specify uppercase attribute names for their data types. This is like writing</p>
<pre class="brush: java;">
public class MyService {
     private SomeType MyFieldName;
     ...
}
</pre>
<p>And thus pretty ugly. When using spring&#8217;s <code>JaxRpcPortProxyFactoryBean</code> things are getting a lot worce: the <code>BeanDeserializer</code> will look for a getter/setter pair (aka &#8220;property&#8221;) to set a value obtained from the Webservice. Such a property must, by specification, start with a lowercase letter. However, in case of an uppercase attribute in the webservice, the Beandeserializer will look for an uppercase property &#8211; and will never find it. In example you&#8217;d have a getter/setter pair <code>getMyfieldName() / setMyFieldName()</code> that translates to the java beans property &#8220;myFieldName&#8221;, however the deserializer will look for a &#8220;MyFieldName&#8221; property. <a href="http://issues.apache.org/jira/browse/AXIS-1761">This is a known issue in Axis 1.x</a>, and there is no fix released for it (and most likely there will never be one). </p>
<p>I solved the problem by providing a subclass of the <code>org.apache.axis.encoding.ser.BeanDeserializer</code> to the <code>JaxRpcPortProxyFactoryBean</code> using a subclassed <code>AxisBeanMappingServicePostProcessor</code> and a customized <code>BeanDeserializerFactory</code>:</p>
<pre class="brush: xml;">
&lt;bean id=&quot;myWebService&quot; class=&quot;org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean&quot;&gt;
...
  &lt;property name=&quot;servicePostProcessors&quot;&gt;
    &lt;list&gt;
      &lt;bean class=&quot;my.package.MyServicePostProcessor&quot;&gt;
      ....
</pre>
<p>Here is the sourcecode for this post processor, the deserializer factory and deserializer:</p>
<h4>The post processor:</h4>
<pre class="brush: java;">
package my.package;

import javax.xml.namespace.QName;
import javax.xml.rpc.encoding.TypeMapping;

import org.apache.axis.encoding.ser.BeanSerializerFactory;
import org.springframework.remoting.jaxrpc.support.AxisBeanMappingServicePostProcessor;

/**
 * This {@link AxisBeanMappingServicePostProcessor} registers a
 * {@link MyBeanDeserializerFactory} during
 * {@link #registerBeanMapping(TypeMapping, Class, QName) mapping registration}.
 *
 * @author Olaf Otto
 */
public class MyServicePostProcessor extends AxisBeanMappingServicePostProcessor {

  /**
   * Registers the {@link MyBeanDeserializer} for the given mapping.
   */
  @Override
  @SuppressWarnings(&quot;unchecked&quot;)
  protected void registerBeanMapping(TypeMapping mapping, Class javaType, QName wsdlType) {
    mapping.register(javaType, wsdlType, new BeanSerializerFactory(javaType, wsdlType), new MyBeanDeserializerFactory(javaType, wsdlType));
  }
}
</pre>
<h4>The deserializer factory:</h4>
<pre class="brush: java;">
package my.package;

import javax.xml.namespace.QName;

import org.apache.axis.encoding.Deserializer;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.EnumDeserializer;

/**
 * This {@link BeanDeserializerFactory} provides a {@link #getGeneralPurpose(String) general-purpose}
 * deserializer {@link MyBeanDeserializer capable of handling local names not conforming to the java beans spec}.
 *
 * @author Olaf Otto
 */
public class MyBeanDeserializerFactory extends BeanDeserializerFactory {
  private static final long serialVersionUID = -8880103201020594221L;

  @SuppressWarnings(&quot;unchecked&quot;)
  public MyBeanDeserializerFactory(Class javaType, QName xmlType) {
    super(javaType, xmlType);
  }

  /**
   * Returns either:
   * &amp;lt;ol&amp;gt;
   *       &amp;lt;li&amp;gt;
   *           The super types general-purpose deserializer if the target type or
   *           the XML type is &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; or the pre-defined deserializer class
   *           is an {@link EnumDeserializer}
   *      &amp;lt;/li&amp;gt;

   *      &amp;lt;li&amp;gt;A {@link MyBeanDeserializer} otherwise (standard case)&amp;lt;/li&amp;gt;
   * &amp;lt;/ol&amp;gt;
   *
   *  @return never &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, rather throws a {@link RuntimeException}.
   */
  @Override
  protected Deserializer getGeneralPurpose(String mechanismType) {
    Deserializer deserializer;
    if (javaType == null || xmlType == null || deserClass == org.apache.axis.encoding.ser.EnumDeserializer.class) {
      deserializer = super.getGeneralPurpose(mechanismType);
    } else {
      deserializer = new MyBeanDeserializer(javaType, xmlType, typeDesc, propertyMap);
    }
    return deserializer;
  }
}
</pre>
<h4>The deserializer:</h4>
<pre class="brush: java;">
package my.package;

import static org.springframework.util.Assert.hasText;

import java.util.Map;

import javax.xml.namespace.QName;

import org.apache.axis.description.TypeDesc;
import org.apache.axis.encoding.DeserializationContext;
import org.apache.axis.encoding.ser.BeanDeserializer;
import org.apache.axis.message.SOAPHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

/**
 * This {@link BeanDeserializer} takes care of non-normal local names,
 * i.e. local names starting with an uppercase character.&amp;lt;br /&amp;gt;
 * Such a local name, usually derived from a WSDL description, will
 * lead to a property lookup for a getter/setter pair on the target bean of the deserialization
 * with an uppercase name start. However, all property names start with a lowercase character
 * according to the java beans spec, thus a property with an upper case name start
 * is never found, causing the deserialization to fail.&amp;lt;br /&amp;gt;
 *
 * @author Olaf Otto
 */
public class MyBeanDeserializer extends BeanDeserializer {
  private static final long serialVersionUID = 1183255594948119370L;

  @SuppressWarnings(&quot;unchecked&quot;)
  public MyBeanDeserializer(Class javaType, QName xmlType, TypeDesc typeDesc, Map propertyMap) {
    super(javaType, xmlType, typeDesc, propertyMap);
  }

  @SuppressWarnings(&quot;unchecked&quot;)
  public MyBeanDeserializer(Class javaType, QName xmlType, TypeDesc typeDesc) {
    super(javaType, xmlType, typeDesc);
  }

  @SuppressWarnings(&quot;unchecked&quot;)
  public MyBeanDeserializer(Class javaType, QName xmlType) {
    super(javaType, xmlType);
  }

  /**
   * {@link #normalizeLocalName(String) normalizes} the localName and invokes
   * {@link BeanDeserializer#onStartChild(String, String, String, Attributes, DeserializationContext)}.
   */
  @Override
  public SOAPHandler onStartChild(String namespace, String localName, String prefix, Attributes attributes1, DeserializationContext deserializationcontext) throws SAXException {
    String normalizedLocalName = normalizeLocalName(localName);
    return super.onStartChild(namespace, normalizedLocalName, prefix, attributes1, deserializationcontext);
  }

  /**
   * Converts the first character of the local name to
   * {@link Character#toLowerCase(char) lower case}, if it is
   * {@link Character#isUpperCase(char) upper case}.
   *
   * @param localName must not be &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; and not empty.
   * @return The normalized local name, never &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.
   */
  public String normalizeLocalName(String localName) {
    hasText(localName, &quot;The local name must not be null or empty.&quot;);
    char localNameStart  = localName.charAt(0);
    String normalizedLocalName = localName;
    if (Character.isUpperCase(localNameStart)) {
      StringBuilder builder = new StringBuilder(32)
                    .append(Character.toLowerCase(localNameStart))
                    .append(localName.substring(1));
      normalizedLocalName = builder.toString();
    }
    return normalizedLocalName;
  }
}
</pre>
<p>You might also write you own Serializer if you have the problem &#8220;in the opposite direction&#8221; which, luckily, I didn&#8217;t.</p>
<p>Let&#8217;s hope the current WS standards are not deprecated this fast&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/using-rpc-style-encoded-axis-1-webservices-with-spring-remoting/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Using apache to redirect from the root “/” context to a webapp context</title>
		<link>http://olafsblog.sysbsb.de/using-apache-to-redirect-from-the-root-%e2%80%9c%e2%80%9d-context-to-a-webapp-context/</link>
		<comments>http://olafsblog.sysbsb.de/using-apache-to-redirect-from-the-root-%e2%80%9c%e2%80%9d-context-to-a-webapp-context/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 19:54:26 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=75</guid>
		<description><![CDATA[Just a short note:
The best way of doing this avoiding endless recursion is to use apaches RedirectMatch rule, like this:

   RedirectMatch ^/$ http://targethost/mywebapp

Easy, agreed. But i&#8217;ve seen (and done it wrong my self) quite often&#8230;
]]></description>
			<content:encoded><![CDATA[<p>Just a short note:</p>
<p>The best way of doing this avoiding endless recursion is to use <a href="http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirectmatch">apaches RedirectMatch rule</a>, like this:</p>
<p><code><br />
   RedirectMatch ^/$ http://targethost/mywebapp<br />
</code></p>
<p>Easy, agreed. But i&#8217;ve seen (and done it wrong my self) quite often&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/using-apache-to-redirect-from-the-root-%e2%80%9c%e2%80%9d-context-to-a-webapp-context/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sorry guys, server crash&#8230;</title>
		<link>http://olafsblog.sysbsb.de/sorry-guys-server-crash/</link>
		<comments>http://olafsblog.sysbsb.de/sorry-guys-server-crash/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 23:38:18 +0000</pubDate>
		<dc:creator>olaf</dc:creator>
				<category><![CDATA[java]]></category>
		<category><![CDATA[dude]]></category>
		<category><![CDATA[oh crap]]></category>
		<category><![CDATA[where is that backup]]></category>

		<guid isPermaLink="false">http://olafsblog.sysbsb.de/?p=74</guid>
		<description><![CDATA[Folks,
There was a hardware crash at the hosting center that has caused a complete exchange and re-installation of this server.
I&#8217;ve got older backups running now, recent posts are not up yet but will be within the next week.
Posts may still look crappy and outtakes may occur, but for now, a least the older stuff is [...]]]></description>
			<content:encoded><![CDATA[<p>Folks,</p>
<p>There was a hardware crash at the hosting center that has caused a complete exchange and re-installation of this server.<br />
I&#8217;ve got older backups running now, recent posts are not up yet but will be within the next week.<br />
Posts may still look crappy and outtakes may occur, but for now, a least the older stuff is back online&#8230;</p>
<p>Greetings<br />
Olaf</p>
]]></content:encoded>
			<wfw:commentRss>http://olafsblog.sysbsb.de/sorry-guys-server-crash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

