<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Oliver Gierke</title>
 <link href="http://www.olivergierke.de/atom.xml" rel="self"/>
 <link href="http://www.olivergierke.de"/>
 <updated>2013-04-30T03:41:02+02:00</updated>
 <id>http://www.olivergierke.de</id>
 <author>
   <name>Oliver Gierke</name>
   <email>info@olivergierke.de</email>
 </author>

 
 <entry>
   <title>Jürgenized</title>
   <link href="http://www.olivergierke.de/2013/03/juergenized"/>
   <updated>2013-03-14T18:16:00+01:00</updated>
   <id>http://www.olivergierke.de/2013/03/juergenized</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Jürgenization | noun | jərgenajzeʃən&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The process of turning code to solve a problem at hand that might look sufficient at the first glance into rock solid, quality assured, perfectly documented and extensible code. This process might consist of a complete rewrite of the code that originally made it into the process (Karma level 0) to only minor modifications (Karma level 10), usually depending on how often the author of the code to be jürgenized has made it through the process yet.&lt;/p&gt;

&lt;p&gt;The term originates from &lt;a href='https://twitter.com/springjuergen'&gt;Jürgen Höller&lt;/a&gt;, Spring framework lead developer, coining this kind process to deal with code contributions about to make it into the Spring framework. To get your code into the core codebase, you and the code get jürgenized.&lt;/p&gt;

&lt;p&gt;Nowadays the term usually relates to the process of code quality assurance, in particular around Spring eco-system projects.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Websites VS. APIs</title>
   <link href="http://www.olivergierke.de/2013/02/websites-vs-apis"/>
   <updated>2013-02-21T00:00:00+01:00</updated>
   <id>http://www.olivergierke.de/2013/02/websites-vs-apis</id>
   <content type="html">&lt;p&gt;I&amp;#8217;ve been recently pulled into some Twitter conversations about the quality of the new open data portal &amp;#8220;launched&amp;#8221; by the German government available at &lt;a href='http://govdata.de'&gt;govdata.de&lt;/a&gt;. I put launched in quotation marks as the launch has been a rather rocky one critized &lt;a href='http://www.dw.de/net-activists-slam-germanys-open-data-portal/a-16611003'&gt;through out&lt;/a&gt; &lt;a href='http://opengovgermany.com/2013/02/04/german-government-screws-up-open-data/'&gt;the web&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I in particular made fun of the very verbose &lt;a href='http://www.govdata.de/ckan/api'&gt;&lt;code&gt;api&lt;/code&gt;&lt;/a&gt; resource the portal exposes. If you do a &lt;code&gt;GET&lt;/code&gt; on it all you get returned is a:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{ &amp;quot;version&amp;quot; : 1 }&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What I was trying to point at - and I think most of my Twitter followers are aware that I am into the field of REST web services a bit - is that it&amp;#8217;s absolutely sad that it&amp;#8217;s 2013 and we still see &amp;#8220;APIs&amp;#8221; published to the web that lack any kind of hypermedia elements. My &lt;a href='https://twitter.com/olivergierke/status/304562182350315520'&gt;initial tweet&lt;/a&gt; caused a bit of response and started some interesting conversation.&lt;/p&gt;

&lt;p&gt;&lt;a href='https://twitter.com/ischieferdecker'&gt;Ina Schiefendecker&lt;/a&gt; (I assume to be related to the GovData project as she is working for &lt;a href='http://www.fokus.fraunhofer.de/de/motion/index.html'&gt;Fraunhofer FOKUS&lt;/a&gt;, responsible for implementing the portal) &lt;a href='https://twitter.com/ischieferdecker/status/304567001819525121'&gt;pointed me&lt;/a&gt; to the documentation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Just have a look: &lt;a href='http://t.co/cA4Q0pXzKQ'&gt;http://t.co/cA4Q0pXzKQ&lt;/a&gt; or &lt;a href='http://t.co/Qd114XnfbG'&gt;http://t.co/Qd114XnfbG&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I &lt;a href='https://twitter.com/olivergierke/status/304568799187832832'&gt;replied&lt;/a&gt; that adding hypermedia elements to the responses would turn the chunks of data into a usable API, which she &lt;a href='https://twitter.com/ischieferdecker/status/304570536229474304'&gt;responded&lt;/a&gt; to with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you want hypermedia take the portal, if you want to program take the API&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My initial reaction to this was a deep *sigh* and thinking that the team apparently hasn&amp;#8217;t understood the value of hypermedia in API design. But taking a step back, this statement contains an interesting aspect:&lt;/p&gt;

&lt;h4 id='for_the_govdata_team_the_website_is_something_different_than_the_api'&gt;For the GovData team the website is something different than the API&lt;/h4&gt;

&lt;p&gt;Why is that the case? If it&amp;#8217;s on the web, embrace the web, period. Why would you choose the web as the platform of choice if the first thing you do right after that is starting to ignore it&amp;#8217;s core traits? Hypermedia is essential to way the web works, thus so should it be to your web site &lt;em&gt;and&lt;/em&gt; APIs you expose to the web.&lt;/p&gt;

&lt;p&gt;To me it feels like implementation aspects leaking through at this point. According to some leaked stack traces, the portal is built with JBoss, Liferay and JSF (&lt;em&gt;sigh&lt;/em&gt;), the API with &lt;a href='http://ckan.org/'&gt;CKAN&lt;/a&gt;. Totally different technology stacks, but does that impose a real conceptual difference to a web site and a web API?&lt;/p&gt;

&lt;p&gt;Playing devil&amp;#8217;s advocate a bit one now could ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If a web site is the same as an API and you have a website, why do you need something you call &amp;#8220;a dedicated API&amp;#8221; at all?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The core point here is what makes up &amp;#8220;dedicated&amp;#8221; in the first place. To stay with REST terms, in my opinion &amp;#8220;dedicated&amp;#8221; is embodied in the &lt;em&gt;representation design for different client types&lt;/em&gt;. Even for &lt;a href='http://roca-style.org/'&gt;well designed websites&lt;/a&gt; you usually serve a representation that consists of certain elements that serve the purpose of being displayed to a user through a browser. This is essentially a core principle of REST: you choose a media type tailored for a specific use case to optimize on bandwidth, performance and client (the browser in this case) usability. And so do web APIs, except the driving factors being others: potentially much more focused on limiting bandwidth usage, the numer of requests necessary and ease of extracting data from responses. You also do so when exposing your web site content to feed readers by choosing Atom or RSS. But in the end it&amp;#8217;s all about &lt;em&gt;designing representations&lt;/em&gt; for clients with different requirements. So here&amp;#8217;s what it boils down to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Both your website and your API benefit from being considered &amp;#8216;the same thing&amp;#8217; with different representations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There&amp;#8217;s absolutely no point in differentiating between the apparently different things &amp;#8220;website&amp;#8221; and &amp;#8220;web API&amp;#8221;, especially when it comes to the aspect of hypermedia: &lt;strong&gt;if it&amp;#8217;s on the web, embrace the web.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Edit - 2013-04-30: &lt;a href='https://twitter.com/owolf'&gt;Oliver Wolf&lt;/a&gt; has a great &lt;a href='https://speakerdeck.com/owolf/turning-passive-apis-into-active-apis'&gt;presentation&lt;/a&gt; on active VS. passive APIs on speakerdeck.com. It uses the issues with GovData (or the CKAN API to be precise) to suggest improvements to the APIs.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Whoops! Where did my architecture go</title>
   <link href="http://www.olivergierke.de/2013/01/whoops-where-did-my-architecture-go"/>
   <updated>2013-01-15T00:00:00+01:00</updated>
   <id>http://www.olivergierke.de/2013/01/whoops-where-did-my-architecture-go</id>
   <content type="html">&lt;p&gt;I am currently travelling conferences and Java User Groups with a talk called &amp;#8220;Whoops! Where did my architecture go?&amp;#8221;. It discusses approaches to create and maintain logical architectues in Java code bases, challenges, tools and tries to outline some ideas how one can accomplish this. A core part of the argumentation is the discussion about the importance of Java packages. Jens Schauder has written a &lt;a href='http://blog.schauderhaft.de/2013/01/13/the-importance-of-packages/'&gt;blog post&lt;/a&gt; about that topic recently and I felt I had some things to add. The more I though about it I got the conclusion that a comment I envision would exceed the length of a reasonable reply I thought I&amp;#8217;ll write up a blog post. I will point to the slides of the presentation in places where it comes in handy. The talk is also based on a lot of sample code which we will get to a bit later. The code can be found on &lt;a href='https://github.com/olivergierke/Whoops-Architecture'&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d like to take a step back at first and briefly discuss some general concepts and ideas that will be necessary to understand the approach I&amp;#8217;ll present later. I&amp;#8217;ll use the Java software development space as posterchild for this to make sure we can build relations into the day-to-day practice but the concepts apply to software systems in other languages, too.&lt;/p&gt;

&lt;h2 id='divide_and_conquer'&gt;Divide and conquer&lt;/h2&gt;

&lt;p&gt;A core principle of complex problem solving is &amp;#8220;divide and conquer&amp;#8221;. We split up a complex problem into smaller ones and approach those smaller ones individually. In Java software this is usually done in several artifact levels: deployment units (WARs, JARs), packages and classes eventually. As a side effect of that we create dependencies between these artifacts and we need some means to manage them.&lt;/p&gt;

&lt;p&gt;As a consequence of that we create artifacts with different (in)stability metrics (see &lt;a href='http://en.wikipedia.org/wiki/Software_package_metrics'&gt;Wikipedia&lt;/a&gt; for details). This metric essentially expresses the &lt;em&gt;risk of a change&lt;/em&gt; made to an artifact. Assume we have two artifacts A and B, A depending on B. A change in A will never affect B, whereas a change in B potentially breaks A. Thus, there&amp;#8217;s value in potentially splitting up a big artifact into two smaller ones with a defined dependency direction as it reduces the risk of a change in (in my just given case) A. If a dependency from B to A is introduced, both artifacts essentially become a single one from an &amp;#8220;the effect of change&amp;#8221; point of view as we cannot touch one without potentially affecting the other.&lt;/p&gt;

&lt;h2 id='layers'&gt;Layers&lt;/h2&gt;

&lt;p&gt;A practical example of this aproach is the layered architecture pattern where you split up you system in presentation layer, service layer and repository layer with directed dependencies from top to bottom. The exact number and names don&amp;#8217;t really matter. Still you can see that you can definitely change the presentation layer without any chance of breaking something in the repsoitory layer given you haven&amp;#8217;t violated the dependency rules.&lt;/p&gt;

&lt;p&gt;Layering is a reasonably understood by developers as it&amp;#8217;s decomposes the software system by by a &lt;em&gt;technical aspect&lt;/em&gt;. It&amp;#8217;s tought in university, probably practitioned in most of the development shops out there. So here&amp;#8217;s the interesting question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If we understand and value the benefits of the general approach of slicing code horizontally, why do we so horribly neglect that approach when it comes to vertical decomposition, i.e. business functionality?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I know this is a bold question, but it&amp;#8217;s essentially what I&amp;#8217;ve seen through most of the code reviews I&amp;#8217;ve done in the last couple of years. In general, I&amp;#8217;d even argue that splitting up business functionality in dedicated slices and monitoring and making sure the allowed defined dependencies are not violated is much more important for long-term maintainability of software. This is mostly do the cost of a change correlating to the risk of a change.&lt;/p&gt;

&lt;h2 id='slices'&gt;Slices&lt;/h2&gt;

&lt;p&gt;Take a CRM system as example: you&amp;#8217;ll probably have a Core slice that contains some code that other slices will depend on. You&amp;#8217;ll find a Customer management slice, that keeps track of customers, their addresses etc. On top of that you might then build a Contract management slice that clearly needs to know about the Customer and use the Core slice as well (see &lt;a href='https://speakerdeck.com/olivergierke/whoops-where-did-my-architecture-go-2?slide=10'&gt;this slide&lt;/a&gt;).&lt;/p&gt;

&lt;h2 id='architecture_vs_codebase'&gt;Architecture VS. Codebase&lt;/h2&gt;

&lt;p&gt;So let&amp;#8217;s assume we defined both slices and layers as architectural concepts, how do we make sure these architecture concepts are embodied in our Java codebase? What we usually do is creating naming conventions and map our layers and slices into package and class names. There are some great tools like &lt;a href='http://www.hello2morrow.com/products/sonargraph'&gt;Sonargraph&lt;/a&gt; and &lt;a href='http://structure101.com/products/'&gt;Structure 101&lt;/a&gt; available out there that help you at doing exactly that. Being a happy day-to-day user of Sonargraph I still asked myself: &amp;#8220;How far could we actually get with plain Java (language, compiler runtime) means only?&amp;#8221;.&lt;/p&gt;

&lt;p&gt;We already identified that controlling dependencies between code artifacts is key to reduce the risk of change effectively. Let&amp;#8217;s have a look how this is approached in general. A key aspect to dependency control is that an artifact is able to explicitly express a dependency. Interestingly we have solutions to do exactly that for two of the three artifact levels (JARs, packages, classes) mentioned above.&lt;/p&gt;

&lt;p&gt;Deployment units are usually managed through either Gradle, Maven or Ivy. At the class level dependency injection comes into play as a core aspect of it is to expose dependencies through either constructor arguments or setters (an interesting &lt;a href='http://blog.schauderhaft.de/2012/01/01/the-one-correct-way-to-do-dependency-injection'&gt;post&lt;/a&gt; on this at Jens Schauders blog again). Still this is not entirely sufficient cause at runtime the type space in the JVM is flat and a class can potentially &amp;#8220;ask&amp;#8221; for a dependency it shouldn&amp;#8217;t be able to and get it injected. This is where the aforementioned tools would step in again and veto at build time. But yeah, we wanted to see how far we can get without them.&lt;/p&gt;

&lt;p&gt;At this point, I&amp;#8217;d like to throw in another question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dear Java developer, have you ever wondered why you make your class&amp;#8217; properties private by default but the class itself public by default? Hint: &amp;#8216;Because my IDE generates it this way&amp;#8217; is not a valid answer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The observation that should lead you to is that Java developers usually just skip packages as means to control visibility of types. We practice information hiding in classes/properties (we actually don&amp;#8217;t as most developers run &amp;#8220;Generate getters and setters&amp;#8221; right away) but don&amp;#8217;t on the classes-in-a-package level. We just discovered that inside a JAR we essentially have to manage which type can see which other type as the class space of public types is flat in a JVM. Essentially this means that if a class is not public (i.e. package private), we don&amp;#8217;t have to dependency manage it on the global level but within the package only.&lt;/p&gt;

&lt;h2 id='packages'&gt;Packages&lt;/h2&gt;

&lt;p&gt;The reason packages are usually not used as dependency managment mean is that designing packages is not a trivial task, even you use an architecture tool like Sonargraph to help you. An aspect of that is that there are hardly any guidelines on how to do it and thus various kinds of crazy patterns have evolved over the years. Arbitrarily restricting the number of classes in a package is just - arbitrary (actually one of the few points I disagree with Jens Schauder&amp;#8217;s blog post). Simply grouping all exception types into a &lt;code&gt;exceptions&lt;/code&gt; package is not really reasonable either as it groups types by technical commonalities which usually doesn&amp;#8217;t provide any architectural benefit.&lt;/p&gt;

&lt;p&gt;Assuming we&amp;#8217;d like to map our previously defined architecture onto Java packages, here&amp;#8217;s what you&amp;#8217;ll probably see something like this. You find actual code backing this approach in the &lt;a href='https://github.com/olivergierke/Whoops-Architecture/tree/master/packages-before'&gt;packages-before project&lt;/a&gt; of this GitHub repo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;….account.domain
….account.presentation
….account.repository
….account.service
….core.domain
….customer.domain
….customer.presentation
….customer.service
….customer.repository&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is not bad in general but there are a few things to consider here. First, having the slice first is a good idea as you can easily separate or externalice and entire chunk of functionality. Remember that in our example, the &lt;code&gt;account&lt;/code&gt; slice was not depended on by anything else so we should be able to remove this package and all of it&amp;#8217;s sub folders to ditch the features implemented in the slice and the app should still work with the customer features only.&lt;/p&gt;

&lt;p&gt;Second, you see that the core slice does not have code in any of the actual layers, but a &lt;code&gt;domain&lt;/code&gt; package only. This essentially shows that we expose something that can be considered an implementation detail to the public: the layering. That might be considered not too important but it has a consequence that completely subverts our idea of reducing the number of types to manage. Let&amp;#8217;s have a more detailed look at that:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;….customer.domain
  + Customer
….customer.service
  + CustomerManagement
  + CustomerManagementImpl
  + CustomerNumberGenerator
….customer.repository
  + CustomerRepository&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Assume the following: &lt;code&gt;CustomerRepository&lt;/code&gt; is simply persisting &lt;code&gt;Customer&lt;/code&gt; instances. The core part of the service implementation is generating customer numbers when a new &lt;code&gt;Customer&lt;/code&gt; is created. This creates the need to make sure all customers are created through the service interface to make sure this behavior gets applied. Unfortunately, &lt;code&gt;CustomerRepository&lt;/code&gt; needs to be a public type so that it can be referred to from the service implementation. This opens it up to be an injection candidate into virtually any other component of the system, which is exactly what we want to avoid. So what if we ditched the layer packages entirely? (The code can be found &lt;a href='https://github.com/olivergierke/Whoops-Architecture/tree/master/packages-after'&gt;here&lt;/a&gt;.)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;….customer
  + Customer
  + CustomerManagement
  o CustomerManagementImpl
  o CustomerNumberGenerator
  o CustomerRepository&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We end up with less then a half of public types to manage. &lt;code&gt;CustomerRepository&lt;/code&gt; cannot be used from anywhere else as the Java compiler prevents us from doing so. &lt;code&gt;CustomerNumberGenerator&lt;/code&gt; and the layering in general becomes an implementation detail. Architecturally this creates stronger gates between the slices (the packages actually) and thinner ones between the layers (simple class-to-class dependencies) as illustrated in &lt;a href='https://speakerdeck.com/olivergierke/whoops-where-did-my-architecture-go-2?slide=35'&gt;this slide&lt;/a&gt; (compare to the slide before to see the difference).&lt;/p&gt;

&lt;h2 id='summary'&gt;Summary&lt;/h2&gt;

&lt;p&gt;The basic approach I recommend is to move the vertical slices into the focus of the package naming and try to model them in a way that the public API of a slice is as tiny as possible in the first place. This is of course no silver bullet approach as packages can grow significantly and it might make sense to extract certain types into a sub-package or the like which then usually leads you to the need to use an architecture management tool. The core idea here is to try to use the means of visibility control that are available in Java to write code that is not a giant potential dependency mess in the first place. Packages can actually help you to achieve exactly that.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hello World</title>
   <link href="http://www.olivergierke.de/2012/12/hello-world"/>
   <updated>2012-12-16T00:00:00+01:00</updated>
   <id>http://www.olivergierke.de/2012/12/hello-world</id>
   <content type="html">&lt;p&gt;When my former Wordpress-based blog crashed quite a while ago, I didn&amp;#8217;t really bother to set it up again as I was to busy with other things. But as I felt the urge to go beyond Twitter posts to elaborate on certain topics in the recent time I thought I&amp;#8217;d give it yet another spin.&lt;/p&gt;

&lt;p&gt;The course of re-setting up the blog essentially consisted of two aspects: selecting a new blog software, and trying to recover as many of the formerly written blog posts as I could. After some &lt;a href='https://twitter.com/olivergierke/status/280345756282523648'&gt;research on Twitter&lt;/a&gt; I tried &lt;a href='http://jekyllrb.com/'&gt;Jekyll&lt;/a&gt; and &lt;a href='http://jekyllbootstrap.com'&gt;Jekyll Bootstrap&lt;/a&gt; in particular. It&amp;#8217;s a Ruby-based website or blog generator that&amp;#8217;s entirely file-based and (in my case) Markdown-driven.&lt;/p&gt;

&lt;p&gt;I could extract some of my former blog posts from a very ancient backup I found and have tried to polish the more relevant posts to be present under their former URIs. Unfortunately there seems to be a minor gap between the time when the blog came down and the last backup so that I seem to have lost a hand full of posts.&lt;/p&gt;

&lt;p&gt;Going forward I&amp;#8217;ll probably drop a few blog posts now and then on topics that might be too unrelated to be posted on the official SpringSource blog, esp. as I think there&amp;#8217;ll might be some music content popping up once in a while.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Spring, logging and JMX</title>
   <link href="http://www.olivergierke.de/2010/10/spring-logging-and-jmx"/>
   <updated>2010-10-01T20:16:06+02:00</updated>
   <id>http://www.olivergierke.de/2010/10/spring-logging-and-jmx</id>
   <content type="html">&lt;p&gt;Pretty much every application out in the wild is using logging to some extend. As applications tend to have bugs (yes, yours as well) it’s a common requirement to alter log levels at runtime. As JMX (Java Management Extensions) is a standard to monitor and manage applications it seems to be a reasonable approach to expose the loggers used in an application via JMX to allow tuning of log levels via a JMX client like jconsole. So let’s take a look on how you enable JMX with Spring.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;context:mbean-server /&amp;gt;
&amp;lt;context:mbean-export /&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The first element from the context namespace sets up a JMX server so that MBeans can be registered. The second element activates automatic export of all Spring beans the either leverage Spring JMX support (annotation based) or Spring beans that satisfy the JMX naming scheme (a class implementing an interface named &lt;code&gt;${classname}MBean&lt;/code&gt;). Fortunately Log4J ships with a &lt;code&gt;LoggerDynamicMBean&lt;/code&gt; that exports a &lt;code&gt;Logger&lt;/code&gt; instance to the JMX infrastructure. It’s API is not really built with dependency injection in mind but due to the flexibility of the Spring XML configuration language we could register this MBean as follows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;bean class=&amp;quot;org.apache.log4j.jmx.LoggerDynamicMBean&amp;quot;&amp;gt;
  &amp;lt;constructor-arg&amp;gt;
    &amp;lt;bean class=&amp;quot;org.apache.log4j.Logger&amp;quot; factory-method=&amp;quot;getLogger&amp;quot;&amp;gt;
      &amp;lt;constructor-arg value=&amp;quot;org.springframework.jmx&amp;quot; /&amp;gt;
    &amp;lt;/bean&amp;gt;
  &amp;lt;/constructor-arg&amp;gt;
&amp;lt;/bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Running this in combination with the XML snippet above now exposes the logger for org.springframework.jmx as JMX MBean.&lt;/p&gt;

&lt;h2 id='xml_hell_go_make_it_clear_and_nice'&gt;XML Hell? Go make it clear and nice!&lt;/h2&gt;

&lt;p&gt;Declaring the MBean for a single logger requires quite an amount of XML and is boilerplate to a large degree. The two things that are unique in this case is that we want to expose a Log4J logger and the logger name of &lt;code&gt;org.springframework.jmx&lt;/code&gt;. So what if we could expose the logger with something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;jmx:logger type=&amp;quot;Log4J&amp;quot; name=&amp;quot;org.springframework.jmx&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We can! I’ve created a small &lt;a href='http://github.com/olivergierke/spring-jmx-namespace'&gt;sample project&lt;/a&gt; project containing a custom JMX namespace and put it up on Github. The README file contains instructions how to play around with the Sample class, altering the log level via jconsole and see results in the console output. Right now it’s pretty much just a proof of concept and could be improved in a few corners. We should support other logging libraries and we could transparently register and whcih is not the case currently. Feel free to suggest or add extensions!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Enabling Hibernate criteria query statistics with AspectJ</title>
   <link href="http://www.olivergierke.de/2010/09/enabling-hibernate-critera-query-statistics-with-aspectj"/>
   <updated>2010-09-15T20:16:06+02:00</updated>
   <id>http://www.olivergierke.de/2010/09/enabling-hibernate-critera-query-statistics-with-aspectj</id>
   <content type="html">&lt;p&gt;In the &lt;code&gt;#java.de&lt;/code&gt; IRC channel someone pointed me to this &lt;a href='http://opensource.atlassian.com/projects/hibernate/browse/HHH-3452'&gt;request for enhancement&lt;/a&gt; in Hibernate recently. The bottom line here is that Hibernate’s statistics feature that can be used to capture persistence metrics (information about query executions and execution times and so on) does not include queries triggered through using the criteria API.&lt;/p&gt;

&lt;p&gt;This is quite a a reasonable request for enhancement in my opinion and it’s quite surprising that the ticket has been open for over 2 years now, especially as the solution seems to be simply adding a method to &lt;code&gt;CriteriaLoader&lt;/code&gt; class, as Chuck May points out. So supposed you want to use this feature &lt;em&gt;now&lt;/em&gt;. The only option seems to be patching Hibernate (sort of doable), building it (a huge magnitude more complex – no offense, building Spring is not trivial either) and the use and maintain that patched version over further releases. Isn’t there another way to get that feature into Hibernate? Of course there is… AspectJ. As the fix seems to be simply adding a method to an existing class we can leverage AspectJ inter-type declarations to add this special method from the outside. Here’s the aspect code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public privileged aspect CriteriaStatisticsAspect {
  public String CriteriaLoader.getQueryIdentifier() {
    return &amp;quot;[CRITERIA] &amp;quot; + getSQLString();
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;It’s pretty easy to understand I think as the method declaration only slightly differs from a normal Java one (no pun intended). You actually only have to explicitly mention the type you want to add the method to. To weave this aspect into Hibernate you simply add the &lt;a href='http://mojo.codehaus.org/aspectj-maven-plugin/'&gt;Maven AspectJ plugin&lt;/a&gt; to your &lt;code&gt;pom.xml&lt;/code&gt; and tell it to consider the Hibernate JARs too by adding a &lt;code&gt;weaveDependencies&lt;/code&gt; block to the configuration section of the plugin.&lt;/p&gt;

&lt;p&gt;To ease the burden of getting started with this approach I have uploaded the &lt;a href='http://github.com/olivergierke/hibernate-criteria-statistics'&gt;sample code&lt;/a&gt; to Github, also containing a test case to demonstrate this actually works. Upgrading to another Hibernate versions should work seamlessly as the aspect gets woven into the never version then. As soon as the feature gets actually implemented (let’s hope it won’t take another two years ;) simply throw away the aspect.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Conference autumn 2010</title>
   <link href="http://www.olivergierke.de/2010/09/conference-autumn-2010"/>
   <updated>2010-09-10T20:16:06+02:00</updated>
   <id>http://www.olivergierke.de/2010/09/conference-autumn-2010</id>
   <content type="html">&lt;p&gt;As summer’s fading out more or less, it’s time to take a look at upcoming times. Autumn is usually quite packed with conferences and this seems to continue this year.&lt;/p&gt;

&lt;p&gt;I’ll kick off my conference autumn by speaking at &lt;a href='http://www.webappdays.de/'&gt;WebAppDays&lt;/a&gt; in Düsseldorf (Sept. 27th/28th) presenting &lt;a href='http://www.springsource.org/roo'&gt;Roo&lt;/a&gt; as rapid java application development framework as well as giving an overview about &lt;a href='http://www.springsource.com/products/tcserver'&gt;tcServer&lt;/a&gt;, the SpringSource commercial edition of &lt;a href='http://tomcat.apache.org/'&gt;Tomcat&lt;/a&gt;. To not make this a marketing talk entirely, I will concentrate on how developers can benefit from tcServer usage during development and in production.&lt;/p&gt;

&lt;p&gt;Next stop for me the is &lt;a href='http://gearconf.com/'&gt;GearConf&lt;/a&gt;, Düsseldorf (Oct. 11th/12th), a conference dedicated to the more soft topics of software development like processes and teams. This year I’ll be talking about &lt;a href='http://www.eclipse.org/mylyn/'&gt;Mylyn&lt;/a&gt; and how it can help developers to be more productive and ease context switches.&lt;/p&gt;

&lt;p&gt;If you register quickly there’s still the chance to get discount for both of these conferences. As they are rather small ones, it’s quite intensive as hallroom conversations take place pretty much everytime and everywhere so that the knowledge exchange rate is typically quite high.&lt;/p&gt;

&lt;p&gt;The main event this autum of course is &lt;a href='http://www.devoxx.com/'&gt;Devoxx&lt;/a&gt; 2010, Antwerp. Personally I’ll be holding the Mylyn talk there but there’s a ton of other speakers and talks to check out. As SpringSource is also official sponsor of the app a lot of my colleagues will also speak there, e.g &lt;a href='http://twitter.com/springjuergen'&gt;Jürgen Höller&lt;/a&gt; on &lt;a href='http://www.devoxx.com/display/Devoxx2K10/Spring+3.1+-+Themes+and+Trends'&gt;Spring 3.1&lt;/a&gt;, &lt;a href='http://twitter.com/benalexau'&gt;Ben Alex&lt;/a&gt; on &lt;a href='http://www.devoxx.com/display/Devoxx2K10/Extreme+Productivity+with+Spring+Roo'&gt;Roo&lt;/a&gt;, &lt;a href='http://twitter.com/cdupuis'&gt;Christian Dupuis&lt;/a&gt; on tooling for &lt;a href='http://www.devoxx.com/display/Devoxx2K10/Spring+Developer+Tools+to+push+your+Productivity'&gt;Spring&lt;/a&gt; and &lt;a href='http://www.devoxx.com/display/Devoxx2K10/Groovy+Grails+Development+in+Eclipse'&gt;Grails&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Right in between those events I will promote upcoming Hades 2.0 release at &lt;a href='http://87.230.78.21:8080/display/jugc/2010.11.08+Agile+in+a+Year+und+Hades'&gt;JUG Cologne Nov. 8th&lt;/a&gt;. Chances are high that we have published the release then already. I am currently speaking to a few other JUGs as well, so you can be sure Hades will be near your place, too. :)&lt;/p&gt;

&lt;p&gt;Anyway, I’m really looking forward to these events. Hope to see a lot of familiar faces and hopefully also some new ones (chances are not bad). Feel free to get in touch and let’s have a beer (malt for me, whatever you like for you :)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hades 2.0.0.RC2 introduces transactional DAOs</title>
   <link href="http://www.olivergierke.de/2010/06/hades-2-0-0-rc2-introduces-transactional-daos"/>
   <updated>2010-06-22T20:16:06+02:00</updated>
   <id>http://www.olivergierke.de/2010/06/hades-2-0-0-rc2-introduces-transactional-daos</id>
   <content type="html">&lt;p&gt;Our latest Hades &lt;a href='http://redmine.synyx.org/news/18'&gt;release&lt;/a&gt; of the 2.0 branch is introducing transactionality of DAO instances as main new feature. Of course you can read up the reference documentation for some general guidelines but I want to use the chance to give a more detailed look into why we introduce this and how some details work.&lt;/p&gt;

&lt;p&gt;These days, some kind of back-to-the-basics approach regarding architecture layering is widely accepted as best practices. Thus you don’t want to introduce a layer just because of some merely technical needs. A typical candidate layer for being obsolete is the service layer. Especially in web applications where you pretty much store entities that are equipped with rich behavior themselves the service layer is quite an artificial one that only demarcates transactions but then delegates to the underlying data access layer. Using Hades in such an application you had needed the additional transaction demarcation somewhere as it didn’t deal with transactions itself out of the box. So the only option to get rid of a service layer was to use e.g. &lt;code&gt;@Transactional&lt;/code&gt; at a Spring MVC controller e.g. which is rather a sub-optimal solution.&lt;/p&gt;

&lt;p&gt;So actually we were quite reluctant to the idea of applying transactions to Hades DAO instances as there were some crucial points to consider:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Actually a DAO layer might not be at the right level of abstraction.&lt;/em&gt; Usually you define transactions on a more business related method than a plain &lt;code&gt;save(…)&lt;/code&gt; or &lt;code&gt;findByUsername(…)&lt;/code&gt;. So if we enable transactions at DAO methods we have to make sure that they seamlessly can be expanded to more coarse grained methods and the DAOs take part in those transactions.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;If we apply transactions we don’t want to imply our transaction model to the user’s application.&lt;/em&gt; As Spring provides various means to define transactions, we don’t want to take that decision from the developer. So in case she wants to decide for a particular model, she has to be able to do so, no matter what we chose.&lt;/li&gt;

&lt;li&gt;Although the transactional behavior that we define for CRUD methods might be okay for 90% of the use cases &lt;em&gt;there has to be a way to override the defaults and replace them by some custom one.&lt;/em&gt;&lt;/li&gt;

&lt;li&gt;As Spring 3.0 &lt;em&gt;supports multiple transaction managers&lt;/em&gt; via &lt;code&gt;@Transactional&lt;/code&gt; we have to make sure we participate in the right transaction depending on in which context the DAO is used.&lt;/li&gt;

&lt;li&gt;&lt;em&gt;It has to be easy to define transaction configuration for DAO interfaces&lt;/em&gt; containing the finder methods.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We decided to use &lt;code&gt;@Transactional&lt;/code&gt; annotations at the &lt;code&gt;GenericJpaDao&lt;/code&gt; implementation class and activate annotation based transactions for the proxies explicitly through the &lt;code&gt;GenericDaoFactoryBean&lt;/code&gt;. This means that the CRUD operations of the DAO instances will be transactional if called standalone or participate in a transaction in case there’s already one running for the current transaction manager (read up details on multiple transaction managers here). So it doesn’t matter if you declare your transactional boundaries via &lt;code&gt;@Transactional&lt;/code&gt;, too, or use e.g. XML configuration or even &lt;code&gt;TransactionTemplate&lt;/code&gt;. This gets us solutions for issues 1 and 2.&lt;/p&gt;

&lt;p&gt;Issue 5 is quite easy to solve as you can simply annotate the finder methods of your DAO interface (or the interface itself) with &lt;code&gt;@Transactional&lt;/code&gt; and transactions get applied as you are used to with Spring.&lt;/p&gt;

&lt;p&gt;The actual tricky part is issue 3. The main idea here is to simply redeclare the CRUD method originally declared in &lt;code&gt;GenericDao&lt;/code&gt; inside your concrete DAO interface and reconfigure transactions as you like. So supposed you want to get rid of the &lt;code&gt;readOnly&lt;/code&gt; flag at &lt;code&gt;readByPrimaryKey(…)&lt;/code&gt; set to true (as we chose to default the transaction configuration to, as this applies some performance optimizations on the persistence provider as well as the JDBC driver), you can do this as follows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public interface UserDao extends GenericDao&amp;lt;User, Long&amp;gt; {

  @Override
  @Transactional
  User readByPrimaryKey(Long key);
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Getting this to work needs some reflection magic as we of course still have to delegate the call to that method to the &lt;code&gt;GenericJpaDao&lt;/code&gt; instance but according to the Java Reflection API it of course does only implement &lt;code&gt;GenericDao.readByPrimaryKey(…)&lt;/code&gt; and not &lt;code&gt;UserDao&lt;/code&gt;. &lt;code&gt;readByPrimaryKey(…)&lt;/code&gt;. Long story short, we can find out the method that has to be invoked so we can hand this reconfiguration model to the user and gain much flexibility on this side.&lt;/p&gt;

&lt;p&gt;Issue 4 is not that interesting as we simply have to configure our internal &lt;code&gt;TransactionInterceptor&lt;/code&gt; to lookup the appropriate &lt;code&gt;PlatformTransactionManager&lt;/code&gt; instance in a lazy-loading-like fashion but that all happens under the covers and you don’t need to take care of this.&lt;/p&gt;

&lt;p&gt;So let me quickly summarize what 2.0.0.RC2 brings you in regard of transactions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transactional CRUD methods (everything declared in &lt;code&gt;
GenericDao&lt;/code&gt;) with appropriate defaults (&lt;code&gt;readOnly&lt;/code&gt; flag set to true on read-only methods) that automatically take part in more coarse grained transactions if necessary&lt;/li&gt;

&lt;li&gt;The ability to use &lt;code&gt;@Transactional&lt;/code&gt; for your concrete DAO interfaces&lt;/li&gt;

&lt;li&gt;The ability to reconfigure the transactional behavior of the CRUD methods by simply redeclaring a method inside the concrete DAO interface&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Changing a project's artifactId in Sonar</title>
   <link href="http://www.olivergierke.de/2010/06/changing-a-projects-artifact-id-in-sonar"/>
   <updated>2010-06-10T20:16:06+02:00</updated>
   <id>http://www.olivergierke.de/2010/06/changing-a-projects-artifact-id-in-sonar</id>
   <content type="html">&lt;p&gt;&lt;a href='http://sonar.codehaus.org/'&gt;Sonar&lt;/a&gt; is a great tool to take care of code quality in your software projects. I use it heavily to monitor the &lt;a href='http://techqa.synyx.org/'&gt;open source projects I am involved with&lt;/a&gt;. When working on getting &lt;a href='http://hades.synyx.org/'&gt;Hades&lt;/a&gt; published into Maven central I had to polish it’s pom.xml and felt the need to align the parent project’s artifact to our chosen OSGi compatible package notation for artifacts. So prior to releasing it to Maven central I changed the artifact id from &lt;code&gt;hades-parent&lt;/code&gt; to &lt;code&gt;org.synyx.hades.parent&lt;/code&gt;. Everything fine until I pushed the metrics of the 1.5.1 release into Sonar.&lt;/p&gt;

&lt;p&gt;Sonar created a new project, as it cannot know about my refactoring. So what to do? I spoke to &lt;a href='http://twitter.com/SimonBrandhof'&gt;Simon Brandhof&lt;/a&gt; and apparently there’s no feature in Sonar to change the artifact id via the user interface. So I opened a &lt;a href='http://jira.codehaus.org/browse/SONAR-1608'&gt;JIRA issue&lt;/a&gt; for it, feel free to vote for it if you like. Meanwhile we could achieve this by manually altering the &lt;code&gt;kee&lt;/code&gt; column inside the &lt;code&gt;PROJECTS&lt;/code&gt; table. It contains entries of the form &lt;code&gt;${groupId}:${artifactId}(:${branchName})&lt;/code&gt; for entries of type &lt;code&gt;PRJ&lt;/code&gt; (i guess that stands for project. Altering these entries solved the problem.&lt;/p&gt;

&lt;p&gt;Thanks to Simon and Verschdl for help!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hades 1.5 released</title>
   <link href="http://www.olivergierke.de/2010/04/hades-1-5-released"/>
   <updated>2010-04-11T20:16:06+02:00</updated>
   <id>http://www.olivergierke.de/2010/04/hades-1-5-released</id>
   <content type="html">&lt;p&gt;As you probably already might have noticed, yesterday we released Hades 1.5. Alongside with that the firs 2.0 release candiate sees the light of the day, too. Let me just take some lines to elaborate on the specialty of this release.&lt;/p&gt;

&lt;h2 id='why_15'&gt;Why 1.5?&lt;/h2&gt;

&lt;p&gt;The first question that might arise is why this release is 1.5 whereas it’s predecessor was 1.1.2. Originally the release was planned as 1.2 but as it introduces some long-ranging features and changes we thought it might be worth indicating that in a larger step of version numbers. As 2.0 is already taken for our JPA 2 upgrade, 1.5 was the choice to go. So what do I mean with “long-ranging”?&lt;/p&gt;

&lt;p&gt;Since it’s beginning Hades relied on two major interfaces: &lt;code&gt;GenericDao&lt;/code&gt; and &lt;code&gt;Persistable&lt;/code&gt; where as especially the latter raised some discussions &lt;a href='http://redmine.synyx.org/boards/2/topics/8'&gt;here&lt;/a&gt; and there. Although it is not that of a big deal to implement a 3rd party interface with an entity class it was indeed a hurdle for adoption. So why was it introduced in the first place. &lt;code&gt;GenericDao&lt;/code&gt; had the aim to abstract between creation and updates of objects. Although there slight semantic differences this maps to the difference between using &lt;code&gt;EntityManager&lt;/code&gt; methods &lt;code&gt;persist(…)&lt;/code&gt; and &lt;code&gt;merge(…)&lt;/code&gt;. To know what to call when &lt;code&gt;save(…)&lt;/code&gt; is being called on &lt;code&gt;GenericDao&lt;/code&gt; we have to be able to differentiate between a new and an existing entity. As this algorithm might vary from entity to entity, we chose to leave the burdon to decide that to the entity developer by implementing the interface.&lt;/p&gt;

&lt;p&gt;Although implementing this interface should not be a big deal actually, we (and the developer community) were not really satisfied with that solutions as the technical infrastructure slightly leaks into the domain abstraction which is somewhat suboptimal kindly speaking. The good news is: as of Hades 1.5 there is no need to implement Persistable anymore. The DAO implementation now uses a reflective approach to lookup the id property of the entity and inspects its value. If it is &lt;code&gt;null&lt;/code&gt;, the entity is regarded as new or as already existing otherwise. So that’s the default. If you need to tweak the semantics of new, simply implement Persistable as the algorithm will be simply calling &lt;code&gt;isNew()&lt;/code&gt; on you instance then. So in effect, the interface comes into play if explicitly needed and not in any other case.&lt;/p&gt;

&lt;p&gt;That’s the big news. Behind that we have a few new features regarding the XML namespace to be used in Spring applications. In case you have multiple &lt;code&gt;EntityManagerFactory&lt;/code&gt; beans declared (e.g. in case you work with more than one JPA persistence unit), you can now point the dao-config and dao elements to a specific EMF bean by using entity-manager-factory-ref attribute. Furthermore using &lt;code&gt;exclude-filter&lt;/code&gt; and &lt;code&gt;include-filter&lt;/code&gt; (probably known from Spring’s context namespace) can be used to tune DAO auto configuration in a more fine grained way. Besides that we have done a general overhaul to the query creation subsystem and now also allow keywords like &lt;code&gt;Between&lt;/code&gt;, &lt;code&gt;LessThan&lt;/code&gt; and &lt;code&gt;GreaterThan&lt;/code&gt; in method names. To round things up we’ve fixed a few minor bugs here and there. For more details read the &lt;a href='http://redmine.synyx.org/versions/show/34'&gt;changelog&lt;/a&gt; or the updated &lt;a href='http://redmine.synyx.org/attachments/download/96'&gt;reference documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='hades_20'&gt;Hades 2.0&lt;/h2&gt;

&lt;p&gt;Alongside this important step we make another one. JPA 2.0 specification was released a while ago and most existing JPA 1 application wil definately benefit from an upgrade as the new spec version really fills gaps the old one left to workaround for the developers. So what is our approach to the new spec. From a Hades point of view the most intresting part of the new spec is the criteria API as user’s probably will base their custom DAO implementations on it. Furthermore upgrading (Spring) applications demands applications to upgrade to Spring 3.0 and a new major version of the persistence provider of choice we choose to dedicate a 2.0 version of Hades to it.&lt;/p&gt;

&lt;p&gt;So the first release candidate builds on top of Spring 3.0.2 as well as Hibernate 3.5, EclipseLink 2.0 as well as OpenJPA 2.0 Beta 3. We will probably wait for our final release until OpenJPA is final, too, but as the majority of users are split between Hibernate and EclipseLink we think that rolling out a release candidate is a good way to get feedback and battle proof the new version. The major change inside Hades 2.0 is that we dropped support of the read-by-example way to access entities. This had to be implemented in a provider specific way so that we could even simplify the codebase in that regard. Furthermore the DAO abstraction is now clearly centered around &lt;code&gt;GenericDao&lt;/code&gt; and not blurred with additional interfaces.&lt;/p&gt;

&lt;p&gt;So if you can upgrade to Spring 3.0.x and the JPA 2 ready persistence provider already, give Hades 2.0 a try. It should be a drop in replacement in this case. Having that said, it’s probably worth mentioning that even Hades 1.5 can be used with JPA 2.0 but requires more extensive pom configuration on the developer side (as Spring 2.5.6 does not support JPA 2). As you’d end up with a dependency setup similar to the one decalred in 2.0 you’re probably better of just upgrading to Hades 2.0.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Neglected classes in Spring - Part III</title>
   <link href="http://www.olivergierke.de/2010/04/neglected-classes-in-spring-part-iii"/>
   <updated>2010-04-07T20:16:06+02:00</updated>
   <id>http://www.olivergierke.de/2010/04/neglected-classes-in-spring-part-iii</id>
   <content type="html">&lt;p&gt;Java web application developers often face the need to inject a regular Spring bean into a non-Spring-managed artifact like a Servlet or a JSP tag.. If you browse the web for you find various quite outdated solutions to it. No offense, by the time being these were quite appropriate solutions. One of them you’ll probably will find is the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class MyServlet extends HttpServlet {

  private MyService service;

  @Override
  public void init(ServletConfig config) {

    ServletContext context =
      config.getServletContext();

    ApplicationContext ctx =
      WebApplicationContextUtils.
        getRequiredWebApplicationContext(context);

    service = ctx.getBean(MyService.class);
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Let’s recap what we just have done. First we need to get access to the &lt;code&gt;ServletContext&lt;/code&gt; of the web application. A Spring &lt;code&gt;WebApplicationContext&lt;/code&gt; that was registered by a &lt;code&gt;ContextLoaderListener&lt;/code&gt; will be registered in the &lt;code&gt;ServletContext&lt;/code&gt; under a special name the framework knows, so that &lt;code&gt;WebApplicationContextUtils&lt;/code&gt; can then look it up and hand it out to you to manually retrieve Spring beans from it.&lt;/p&gt;

&lt;p&gt;Okay, that get’s the job done. But we can reduce the effort and go a much nicer way, that reduces the amount of boilerplate even more. Spring 2.5.1 introduced a tiny helperclass &lt;code&gt;SpringBeanAutowiringSupport&lt;/code&gt; which is residing in &lt;code&gt;org.springframework.web.context.support&lt;/code&gt; spending a rather unregarded life. It offers a method &lt;code&gt;processInjectionBasedOnCurrentContext(Object target)&lt;/code&gt; that automatically injects Spring beans to properties of the given target using the usual annotation driven suspects (&lt;code&gt;@Autowired&lt;/code&gt;, &lt;code&gt;@Resource&lt;/code&gt;, &lt;code&gt;@Inject&lt;/code&gt;). So our sample code turns into something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class MyServlet extends HttpServlet {

  @Inject
  private MyService service;

  @Override
  public void init() {
    SpringBeanAutowiringSupport.
      processInjectionBasedOnCurrentContext(this);
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Done. Note, that we override the init method without the &lt;code&gt;ServletConfig&lt;/code&gt; parameter as the called method looks up the actual &lt;code&gt;ApplicationContext&lt;/code&gt; from a static map held in &lt;code&gt;ContextLoader&lt;/code&gt; which inherits from. If you need to lookup beans from an &lt;code&gt;ApplicationContext&lt;/code&gt; tied to a particular &lt;code&gt;ServletContext&lt;/code&gt; you can use &lt;code&gt;processInjectionBasedOnServletContext(Object target, ServletContext servletContext)&lt;/code&gt; and hand it the appropriate instances.&lt;/p&gt;

&lt;p&gt;P.S.: Thanks to &lt;a href='http://jandiandme.blogspot.com/'&gt;Eberhard Wolff&lt;/a&gt; for pointing me at this.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>REST based web applications with Spring 3</title>
   <link href="http://www.olivergierke.de/2010/04/rest-based-web-applications-with-spring-3"/>
   <updated>2010-04-01T20:16:06+02:00</updated>
   <id>http://www.olivergierke.de/2010/04/rest-based-web-applications-with-spring-3</id>
   <content type="html">&lt;p&gt;Yesterday I gave a talk on REST based web applications with Spring 3.&lt;/p&gt;
&lt;iframe allowfullscreen='true' frameborder='0' height='489' marginheight='0' marginwidth='0' mozallowfullscreen='true' scrolling='no' src='http://de.slideshare.net/slideshow/embed_code/3610375' style='border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:1em' webkitallowfullscreen='true' width='600'&gt; 
&lt;/iframe&gt;&lt;div style='margin-bottom:1em'&gt; 
    &lt;strong&gt; 
        &lt;a href='http://de.slideshare.net/olivergierke/rest-based-web-applications-with-spring-3' title='REST based web applications with Spring 3'&gt;REST based web applications with Spring 3&lt;/a&gt;
    &lt;/strong&gt; from 
    &lt;strong&gt;
        &lt;a href='http://de.slideshare.net/olivergierke'&gt;Oliver Gierke&lt;/a&gt;
    &lt;/strong&gt;
&lt;/div&gt;
&lt;p&gt;You can also grab the sample code at &lt;a href='http://github.com/olivergierke/spring-rest'&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>New challenges</title>
   <link href="http://www.olivergierke.de/2010/02/new-challenges"/>
   <updated>2010-02-10T19:16:06+01:00</updated>
   <id>http://www.olivergierke.de/2010/02/new-challenges</id>
   <content type="html">&lt;p&gt;It’s been official for a few days now, so I thought I could drop a public note about me joining &lt;a href='http://www.springsource.de/'&gt;SpringSource Germany (division of VMware)&lt;/a&gt; as Senior Consultant beginning March 1st this year. Time to look back on three exciting years at &lt;a href='http://www.synyx.de/'&gt;Synyx&lt;/a&gt; and an outlook of what’s about to come.&lt;/p&gt;

&lt;p&gt;I joined Synyx almost exactly 3 years ago. Since then I had an exciting time with awesome folks, a wide variety of customers, projects and conferences. As I dealt with enterprise Java software a ton, of course Spring has been a &lt;a href='/tags.html#spring-ref'&gt;crucial part&lt;/a&gt; of my daily job, no matter if it was the core framework, the software eco system and people around it or the open source project &lt;a href='http://hades.synyx.org/'&gt;Hades&lt;/a&gt; that I lead, which is based on Spring and carries Spring principles and values to the domain of easing data access with JPA.&lt;/p&gt;

&lt;p&gt;Besides that, the crucial part to me is that Spring and SpringSource as a company have always provided pragmatic solutions to real world problems that are of quality far beyond average. As I already became more and more involved with the Spring codebase, too, I am thrilled to join the team to even more close to the heart of the – to me – core principle of software engineering: pragmatic, high quality solutions to real world problems.&lt;/p&gt;

&lt;p&gt;To wrap things up, I’d like to say thank you to all the fellow developers, customers and people in general I met during my time at Synyx. If you need custom first class Java based business software, like to work with people that don’t hesitate to think out of the box – Synyx is the shop you’re looking for.&lt;/p&gt;

&lt;p&gt;It’s been a pleasure! And it will be…&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Neglected classes in Spring - Part II</title>
   <link href="http://www.olivergierke.de/2010/01/neglected-classes-in-spring-part-ii"/>
   <updated>2010-01-24T19:16:06+01:00</updated>
   <id>http://www.olivergierke.de/2010/01/neglected-classes-in-spring-part-ii</id>
   <content type="html">&lt;p&gt;If you have worked with Spring 2.5 annotation based web MVC framework you know that it allows you to freely design you controller method signatures:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@RequestMapping(value = &amp;quot;users&amp;quot;, method = GET)
public String showUsers(Model model) {
  model.addAttribute(&amp;quot;users&amp;quot;,
    userManagement.getUsers());
  return &amp;quot;users&amp;quot;;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;As you can see we use a parameter of type &lt;code&gt;Model&lt;/code&gt; that will we automatically get an instance handed by Spring. For a complete list of supported parameter and return types see &lt;a href='http://web.archive.org/web/20100207151300/http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments'&gt;Spring reference documentation&lt;/a&gt; on that topic.&lt;/p&gt;

&lt;p&gt;But why do I mention that? The title says “neglected classes”, not “things I also could have read up in the reference docs”. The crucial thing here is to know that the list of supported types is not fixed and there is an SPI to write your class allowing to get a parameter injected automatically.&lt;/p&gt;

&lt;h2 id='pagination'&gt;Pagination&lt;/h2&gt;

&lt;p&gt;The first example I want to come up with is pagination. The OpenSource framework Hades provides dedicated support to allow paginated access to databases via JPA. The core abstractions achieving this is the Pageable interface in combination with the &lt;code&gt;PageRequest&lt;/code&gt; implementation class. But there is still the question on how to create instances of &lt;code&gt;PageRequest&lt;/code&gt; from an incoming request. A naive might be the following:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@RequestMapping(value = &amp;quot;/users&amp;quot;, method = GET)
public String showUsers(Model model, WebRequest request) {

  Integer size = // extract size from request
  Integer page = // extract page from request
  Sort sort = // extract sort options from request

  Pageable pageable =
    new PageRequest(page, size, sort);

  model.addAttribute(&amp;quot;users&amp;quot;,
    userManagement.getUsers(pageable));
  return &amp;quot;users&amp;quot;;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What’s wrong with this? First, it shouldn’t be the controllers task to extract pagination information from the request. Second, even if we’d move this code into a utility class, we’d be forced to get &lt;code&gt;WebRequest&lt;/code&gt; injected into every controller method that wants to use pagination, which breaks the abstraction level gained.&lt;/p&gt;

&lt;p&gt;So what about rather something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@RequestMapping(value = &amp;quot;/users&amp;quot;, method = GET)
public String showUsers(Model model,
  Pageable pageable) {
  model.addAttribute(&amp;quot;users&amp;quot;,
    userManagement.getUsers(pageable));
  return &amp;quot;users&amp;quot;;
}

public class PageableArgumentResolver implements WebArgumentResolver {

  @Override
  public Object resolveArgument(
    MethodParameter methodParameter,
    NativeWebRequest webRequest) throws Exception {

    // implement extraction logic here
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Inside the implementation your first task is to determine, whether you can return the given &lt;code&gt;MethodParameter&lt;/code&gt; or return a &lt;code&gt;WebArgumentResolver.UNRESOLVED&lt;/code&gt;. Our resolver would have to check if the target type is a &lt;code&gt;Pageable&lt;/code&gt; and extract the request parameters then.&lt;/p&gt;

&lt;h2 id='accessing_the_current_user'&gt;Accessing the current user&lt;/h2&gt;

&lt;p&gt;A very often faced problem in web controllers is that one actually has to know which user has triggered the request. This could be of course done programatically inside the controller method similar to the naive approach shown above. What about this approach:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@RequestMapping(value = &amp;quot;/myaccount&amp;quot;, method = GET)
public String showUsers(Model model,
  @CurrentUser UserDetails userDetails) {
  model.addAttribute(&amp;quot;user&amp;quot;,
    userManagement.getUser(userDetails.getId());
  return &amp;quot;user&amp;quot;;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Similar to the plain type based &lt;code&gt;WebArgumentResolver&lt;/code&gt; implementation for &lt;code&gt;Pageable&lt;/code&gt; the implementation here would check for the custom &lt;code&gt;CurrentUser&lt;/code&gt; annotation and then access e.g. Spring Security API to access the currently logged in user. The additional annotation is “necessary” in this case, as one could also have a &lt;code&gt;UserDetails&lt;/code&gt; used as &lt;code&gt;ModelAttribute&lt;/code&gt;, but that depends on the detailed requirements of your application.&lt;/p&gt;

&lt;h2 id='summary'&gt;Summary&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;WebArgumentResolver&lt;/code&gt; allows providing your own custom controller method parameters to centralize either lookup or extraction logic, that would otherwise be scattered through your controller code.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Article on Hades in current issue of German JavaMagazin</title>
   <link href="http://www.olivergierke.de/2009/06/article-on-hades-in-current-issue-of-german-javamagazin"/>
   <updated>2009-06-04T07:03:20+02:00</updated>
   <id>http://www.olivergierke.de/2009/06/article-on-hades-in-current-issue-of-german-javamagazin</id>
   <content type="html">&lt;p&gt;The June issue of the German &lt;a href='http://it-republik.de/jaxenter/java-magazin-ausgaben/EJB-3.0-000304.html'&gt;JavaMagzin&lt;/a&gt; features an article about &lt;a href='http://www.synyx.org/de/projects/hades.html'&gt;Hades&lt;/a&gt; written by myself. I sketch out issues implementing persistence layers briefly and introduce solutions to these issues using Hades. Furthermore fellow developer &lt;a href='http://blog.alexander-hanschke.de/'&gt;Alexander Hanschke&lt;/a&gt;introduced &lt;a href='http://www.majug.de'&gt;Java User Group Mannheim&lt;/a&gt; in yet another article, too. Check out the current issue and get your copy.&lt;/p&gt;

&lt;p&gt;Beyond that, we at Synyx decided to give the part of our homepage that deals with our OpenSource projects a brush up. Check out &lt;a href='http://www.synyx.org'&gt;http://www.synyx.org&lt;/a&gt; to start diggin into the &lt;a href='http://www.synyx.org/de/projects/'&gt;projects&lt;/a&gt;, read up our &lt;a href='http://www.synyx.org/de/blogs/'&gt;developer&amp;#8217;s blogs&lt;/a&gt; and keep in touch via the &lt;a href='http://redmine.synyx.org'&gt;project tracker&lt;/a&gt;. Kudos to &lt;a href='http://bifrost.rei-network.info/blog/'&gt;Philip Reiman&lt;/a&gt; who did most of the work.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Diggin' into Spring 3 transactional test facilities</title>
   <link href="http://www.olivergierke.de/2009/05/diggin-into-spring-3-transactional-test-facilities"/>
   <updated>2009-05-28T20:16:06+02:00</updated>
   <id>http://www.olivergierke.de/2009/05/diggin-into-spring-3-transactional-test-facilities</id>
   <content type="html">&lt;p&gt;Today I devoted my day to a general check in how far Hades can be run with the &lt;a href='http://www.springsource.com/download/community?project='&gt;latest Spring 3 milestone&lt;/a&gt;. After managing the typical Maven foo I had a project profile up and running that builds &lt;a href='http://hades.synyx.org'&gt;Hades&lt;/a&gt; against Spring 3 M3 and executes the tests against it. In case you try to migrate some of your code, too, and wonder where &lt;code&gt;spring-agent&lt;/code&gt; JAR has gone: its &lt;code&gt;org.springframework.instrument&lt;/code&gt; now. But back to topic.&lt;/p&gt;

&lt;p&gt;The build went fine but unfortunately some of my test cases broke when executed under M3. I noticed that things started to get fuzzy with the first test case that was supposed to throw an exception. I have some test cases that look as follows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@Test(expected=DataAccessException.class)
public void checkDoesNotCascadeIfNotConfigured() {

  // Setup some persistent object graph that is
  // supposed to throw an exception

  userDao.saveAndFlush(user);
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The key thing to notice here is that I flush the database as the constraint violation I want to expose is only checked at the time the data gets pushed to the database actually. Stepping through the code of Spring testing library in a first level of detail, I realized that the exception is thrown correctly and even detected as the one that is supposed to be thrown. Nevertheless the test method was marked as failed with the exception supposed to be thrown. Furthermore all upcoming tests failed with a duplicate key exception as setting up the test fixture failed right in the beginning. What the heck was going on?&lt;/p&gt;

&lt;p&gt;It seemed obvious to me that there would have to be something wrong with the transaction management, so I digged a little further in that direction. Finally I found out this one: in &lt;a href='https://fisheye.springsource.org/browse/spring-framework/trunk/org.springframework.test/src/main/java/org/springframework/test/context/transaction/TransactionalTestExecutionListener.java?r1=134&amp;amp;amp;r2=655'&gt;this commit&lt;/a&gt; Jürgen Höller added a &lt;code&gt;transactionStatus.flush()&lt;/code&gt; during the rollback of a transaction after test execution. This of course raises the exception I wanted to raise a second time but - unfortunately - after the moment the first exception had already been checked to be the expected one. Thus the second exception bubbles up causing the test and the rollback to fail.&lt;/p&gt;

&lt;p&gt;As I spoke to &lt;a href='http://blog.springsource.com/author/juergenh/'&gt;Jürgen&lt;/a&gt; we found out that the flush was implemented due to a &lt;a href='http://jira.springframework.org/browse/SPR-5315'&gt;improvement&lt;/a&gt; filed in JIRA. Fortunately there is already &lt;a href='http://jira.springframework.org/browse/SPR-5699'&gt;another ticket&lt;/a&gt; that adresses the issue. Waiting for RC1 to see this fixed&amp;#8230;&lt;/p&gt;

&lt;p&gt;Hades itself seems to be Spring 3 ready already, so if you play around with both of &amp;#8216;em, I&amp;#8217;d be happy to address any issues you face.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Using Spring's @Configurable in three easy steps</title>
   <link href="http://www.olivergierke.de/2009/05/using-springs-configurable-in-three-easy-steps"/>
   <updated>2009-05-25T20:57:53+02:00</updated>
   <id>http://www.olivergierke.de/2009/05/using-springs-configurable-in-three-easy-steps</id>
   <content type="html">&lt;p&gt;As you might not be aware of, besides injecting dependencies into beans Spring is able to inject dependencies into objects that are not instantiated by Spring. This becomes especially handy if you&amp;#8217;re stuck to Domain Driven Design leveraging a rich domain model over an anemic one. As there&amp;#8217;s been some &lt;a href='http://twitter.com/springrod/status/1905699064'&gt;buzz&lt;/a&gt; around that functionality on twitter, I just put some small quickstart project together that has rather stripped down character but shows all the necessary steps nevertheless. The links to the sources as well as the binaries are attached below. Here is what you essentially have to do.&lt;/p&gt;

&lt;h2 id='1_equip_your_domain_class_with_'&gt;1. Equip your domain class with &lt;code&gt;@Configurable&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;The &lt;a href='http://svn.synyx.org/synyx/opensource/misc/org.synyx.samples.spring.atconfigurable/tags/org.synyx.samples.spring.atconfigurable-0.0.1/src/main/java/org/synyx/samples/spring/atconfigurable/domain/User.java'&gt;domain class&lt;/a&gt; in the sample is &lt;code&gt;org.synyx.samples.spring.atconfigurable.domain.User&lt;/code&gt;. Note that we can inject the referenced service by just stating an &lt;code&gt;@Autowired&lt;/code&gt; property. No setter needed, no pollution of the domain class&amp;#8217; interface.&lt;/p&gt;

&lt;h2 id='2_enable_injecting_capabilities_in_your_configuration_file'&gt;2. Enable injecting capabilities in your configuration file&lt;/h2&gt;

&lt;p&gt;The maven project I have created states a dependency to spring-context that allows two critical declarations: &lt;code&gt;&amp;lt;context:spring-configured /&amp;gt;&lt;/code&gt; activates injection into domain classes not managed by Spring. Note that I use &lt;code&gt;&amp;lt;context:component-scan /&amp;gt;&lt;/code&gt; in the &lt;a href='http://svn.synyx.org/synyx/opensource/misc/org.synyx.samples.spring.atconfigurable/tags/org.synyx.samples.spring.atconfigurable-0.0.1/src/main/resources/application-context.xml'&gt;&lt;code&gt;application-context.xml&lt;/code&gt;&lt;/a&gt; to pick up the &lt;code&gt;User&lt;/code&gt; class as well as &lt;code&gt;GreetingServiceImpl&lt;/code&gt; from the service package.&lt;/p&gt;

&lt;h2 id='3_enable_loadtime_weaving'&gt;3. Enable load-time weaving&lt;/h2&gt;

&lt;p&gt;To actually get the injection working you need to weave some Spring aspects in your domain class. While you could do this by compile time weaving, i chose load time weaving as it is much simpler to set up in development environment. To get it up and running you declare &lt;code&gt;&amp;lt;context:load-time-weaver aspectj-weaving=&amp;quot;autodetect&amp;quot;/&amp;gt;&lt;/code&gt; that pretty much tells Spring to look around for some available load time weaver an use it. The cruicial part now is to activate a Java agent for your runtime that now weaves the aspects into the domain class during class loading. In my case this is done by activating the agent via a &lt;a href='http://svn.synyx.org/synyx/opensource/misc/org.synyx.samples.spring.atconfigurable/tags/org.synyx.samples.spring.atconfigurable-0.0.1/pom.xml'&gt;command line argument&lt;/a&gt; for Maven&amp;#8217;s Surefire plugin.&lt;/p&gt;

&lt;p&gt;This way you can easily enrich domain objects maybe persisted by Hibernate with domain services managed by Spring&lt;/p&gt;

&lt;h2 id='resources'&gt;Resources&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://svn.synyx.org/synyx/opensource/misc/org.synyx.samples.spring.atconfigurable/tags/org.synyx.samples.spring.atconfigurable-0.0.1'&gt;Source code @ Synyx&amp;#8217; OpenSource SVN&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://repo.synyx.org/org/synyx/samples/spring/org.synyx.samples.spring.atconfigurable/0.0.1/org.synyx.samples.spring.atconfigurable-0.0.1.jar'&gt;Binaries @ Synyx&amp;#8217; OpenSource Maven Repository&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Hades 0.5.0 released</title>
   <link href="http://www.olivergierke.de/2009/05/hades-050-released"/>
   <updated>2009-05-22T16:40:40+02:00</updated>
   <id>http://www.olivergierke.de/2009/05/hades-050-released</id>
   <content type="html">&lt;p&gt;Let me prodly announce version 0.5.0 of Hades. As our &lt;a href='http://hades.synyx.org'&gt;project home&lt;/a&gt; gives you the quick overview and access to the latest binaries, sources and documentation I want to use this post to elaborate a little bit on the changes in 0.5.0 as well as the future roadmap.&lt;/p&gt;

&lt;h2 id='streamlining_of_the_spring_namespace'&gt;Streamlining of the Spring namespace&lt;/h2&gt;

&lt;p&gt;Version 0.5.0 one more time simplyfies the XML required to setup Hades DAOs with Spring. The only required attribute at the dao-config element now is &lt;code&gt;base-package&lt;/code&gt; which aligns pretty much from the &lt;code&gt;base-package&lt;/code&gt; Spring users know from Spring&amp;#8217;s context namespace. As with this namespace you can use Ant style wildcards to form package patterns to allow more flexibility. E.g. &lt;code&gt;&amp;lt;hades:dao-config base-package=&amp;quot;com.acme.**.dao&amp;quot; /&amp;gt;&lt;/code&gt; would scan all packages starting with &lt;code&gt;com.acme&lt;/code&gt; and ending on &lt;code&gt;dao&lt;/code&gt; for Hades DAO interfaces and create the appropriate instances for them.&lt;/p&gt;

&lt;h2 id='osgi_ready'&gt;OSGi ready&lt;/h2&gt;

&lt;p&gt;There was a bug in 0.4 &lt;code&gt;MANIFEST.MF&lt;/code&gt; that trapped a few users from using Hades in an OSGi environment. 0.5.0 is fully OSGi compatible and ships with a sample application that can be dropped into a Spring-DM OSGi platform (e.g. SpringSource DM Server). The sample app gives an overview about Hades functionality and exposes a User DAO as OSGi service. Check out the sample application &lt;a href='http://repo.synyx.org/org/synyx/hades/org.synyx.hades.sample/0.5.0/'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='programatic_api'&gt;Programatic API&lt;/h2&gt;

&lt;p&gt;Most users will happily use Hades in combination with Spring namespace configuration. Programatic use of Hades was always possible albeit only through a rather untyped &lt;code&gt;GenericDaoFactoryBean&lt;/code&gt; that implements Springs &lt;code&gt;FactoryBean&lt;/code&gt; interface. With 0.5.0 Hades provides a &lt;code&gt;GenericDaoFactory&lt;/code&gt; that provides an interface that suits needs for programatic access. Now you can create DAO instances by simply invoking &lt;code&gt;GenericDaoFactory.create(em).getDao(UserDao.class);&lt;/code&gt;&lt;/p&gt;

&lt;h2 id='miscellaneous'&gt;Miscellaneous&lt;/h2&gt;

&lt;p&gt;We aligned our versioning and artifact naming OSGi conventions.&lt;/p&gt;

&lt;h2 id='roadmap'&gt;Roadmap&lt;/h2&gt;

&lt;p&gt;As we consider Hades to be mature, we&amp;#8217;re going to release a version 1.0 next. Timeframe is about end of June. We will stay on JPA 1.0 for this 1.0 branch of Hades. So with the release of Hades 1.0 we will also open up a 2.0 branch that will contain features that required JPA 2.0.&lt;/p&gt;

&lt;h2 id='links'&gt;Links&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://hades.synyx.org'&gt;Hades project home&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Achieving application modularity with Hera</title>
   <link href="http://www.olivergierke.de/2009/05/achieving-application-modularity-with-hera"/>
   <updated>2009-05-17T16:04:27+02:00</updated>
   <id>http://www.olivergierke.de/2009/05/achieving-application-modularity-with-hera</id>
   <content type="html">&lt;p&gt;The &lt;a href='http://www.javaposse.com/index.php?post_id=479283'&gt;latest episode&lt;/a&gt; of the &lt;a href='http://www.javaposse.com/'&gt;JavaPosse podcast&lt;/a&gt; presents a session of the this year&amp;#8217;s JavaPosse roundup on Scala and application modularity. Although I attended the conference I did not attend this session, which is rather sad in retrospect as the attendees discuss a lot of things I also deal with.&lt;/p&gt;

&lt;p&gt;As a note aside I want to mention, that I am of course aware of &lt;a href='http://www.osgi.org'&gt;OSGi&lt;/a&gt; and it&amp;#8217;s capabilities, that prvide a very sophisticated and mature solution to this problem. Nevertheless using OSGi introduces a fair amount of additional complexity and - despite its maturity - still lacks tool support to a large extend. Thus I won&amp;#8217;t discuss anything OSGi related here.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://weblogs.java.net/blog/bv/'&gt;Bill Venners&lt;/a&gt; opens the session by describing how Scala&amp;#8217;s traits can be used to mix in functionality into objects at their construction time and wants to know how this can help solving problems regarding modularity in currently in-the-field Java. As I am facing these kinds of issues in my everyday development I will briefly describe the solution I came up with.&lt;/p&gt;

&lt;h2 id='the_concept_of_binding'&gt;The concept of binding&lt;/h2&gt;

&lt;p&gt;At some point &lt;a href='http://joelneely.wordpress.com/'&gt;Joel Neely&lt;/a&gt; brings the discussion to an interesting point. There is an example the group elaborates on dealing with a piece of software that contains a certain part with customer specific code that will change for each deployed instance of that software. A second example they discuss is somewhat similar but deals with tax calculating rules in various US states that can differ from state to state.&lt;/p&gt;

&lt;p&gt;Both examples should be factored out into modules as I think, but the distinction which of the modules shall be used by the application has to be made at different times. Joel uses the term &amp;#8220;binding time&amp;#8221; to describe this situation. In the case of the customer specific code binding time is application packaging time actually. Stepping one step back it boils down to the availability of the module JAR in the applications classpath. Using a dependency management system like Maven you actually would have a Maven project for customer A that declares a dependency to the application core &lt;strong&gt;plus&lt;/strong&gt; the JAR with customizations for customer A and the same for customer B but with a different customizations JAR. This way you also avoid shiping customer specific code to a different customer.&lt;/p&gt;

&lt;h2 id='aligning_object_creation_to_the_classpath_configuration'&gt;Aligning object creation to the classpath configuration&lt;/h2&gt;

&lt;p&gt;Besides the availability of types, organizing the object web an application consists of is the second part of the challenge. Spring serves this purpose quite well and supports a variety of configuration formats and options. A first step to real application modularity is aligning &lt;code&gt;ApplicationContext&lt;/code&gt; creation to the before mentioned usage of the classpath to assemble modules.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://www.springframework.org'&gt;Springs&lt;/a&gt; XML configuration is widely regarded as very static as typically changing something in the bean wiring means editing some of the config files. But using&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;import resource=&amp;quot;classpath*:com/acme/**/my-context.xml&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;in config files of a core application allows to transparently add beans from configuration files named &lt;code&gt;my-context.xml&lt;/code&gt; under a package &lt;code&gt;com.acme&lt;/code&gt; to an &lt;code&gt;ApplicationContext&lt;/code&gt;. This way determining the application classpath leads to the creation of certain Spring beans without actually touching any configuration files as long as module JARs declare their beans in &lt;code&gt;my-context.xml&lt;/code&gt; and thus aligns availability of beans in the &lt;code&gt;ApplicationContext&lt;/code&gt; to the classpath configuration.&lt;/p&gt;

&lt;h2 id='client_side_binding'&gt;Client side binding&lt;/h2&gt;

&lt;p&gt;This leads us to the question how an extensible object gets access to the instance that is created from an module JAR&amp;#8217;s &lt;code&gt;my-context.xml&lt;/code&gt;. Referencing by bean id does not seem to be a good idea as this would imply to much on the module author and entirely break if there is more than one bean to be referenced. This is where &lt;a href='http://hera.synyx.org'&gt;Hera&lt;/a&gt; comes into play. It provides a Spring namespace to dynamically lookup beans from an &lt;code&gt;ApplicationContext&lt;/code&gt; and let them be bound to a collecting bean. Thus by defining&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;hera:list id=&amp;quot;foo&amp;quot; class=&amp;quot;my.plugin.Interface&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;all beans implementing &lt;code&gt;my.plugin.Interface&lt;/code&gt; would be collected into a &lt;code&gt;ListFactoryBean&lt;/code&gt; and could be referenced by other beans. In effect this will allow you to dynamically inject dependency in your beans just by configuring your classpath. For our customer sample you would create two modules with classes implementing &lt;code&gt;Interface&lt;/code&gt; and use your build system to package one into the one assembly the other one into the other. No Spring reconfiguration needed - configure your app by stating it&amp;#8217;s dependencies.&lt;/p&gt;

&lt;h2 id='binding_at_runtime'&gt;Binding at runtime&lt;/h2&gt;

&lt;p&gt;As this serves fine for our customer code example what about the taxes example. To find a suitable answer for this problem you actually would have to add all the JARs for the different states and decide at runtime which one to use dependeing on the state the user originates from. Here&amp;#8217;s how you&amp;#8217;d approach this using Hera. The first step is to let your &lt;code&gt;TaxCalculator&lt;/code&gt; extend Hera&amp;#8217;s &lt;code&gt;Plugin&amp;lt;T&amp;gt;&lt;/code&gt; interface, that adds a &lt;code&gt;supports(T delimiter)&lt;/code&gt; method to allow determining if the plugin is suitable in a given context. The delimiter type in our example could be a &lt;code&gt;State&lt;/code&gt; enum or the &lt;code&gt;User&lt;/code&gt; type itself. Thus the plugin itself can decide which states it provides tax calculation for.&lt;/p&gt;

&lt;p&gt;At the client side aquiring a simple list of all the &lt;code&gt;TaxCalculator&lt;/code&gt; instances is not sufficient anymore. You probably want to gain a little more detailed access to certain instances. Thus instead of the list element you now use a&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;hera:registry id=&amp;quot;foo&amp;quot; class=&amp;quot;my.plugin.TaxCalcuator&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;to obtain an instance of &lt;code&gt;PluginRegistry&amp;lt;TaxCalculator, User&amp;gt;&lt;/code&gt; that allows you to access the plugin instance in various way, returning defaults if no plugin found for given delimiter and so on. See the &lt;a href='http://trac.synyx.org/hera/chrome/site/mvn/hera-core/apidocs/index.html'&gt;JavaDoc&lt;/a&gt; for details.&lt;/p&gt;

&lt;h2 id='bringin_the_parts_together'&gt;Bringin the parts together&lt;/h2&gt;

&lt;p&gt;Now suppose you have a set of tax modules for the states as well as some for european countries. Then you can &amp;#8220;configure&amp;#8221; one instance of your application by declaring customer A customizations JAR as well as the US tax jars in the pom.xml for customer A. The same applies to customer B where you might choose the set of european tax jars.&lt;/p&gt;

&lt;h2 id='summary'&gt;Summary&lt;/h2&gt;

&lt;p&gt;OSGi of course is still the way to go if you&amp;#8217;re looking for a really sophisticated Java module system. If you are not willing or able to bear the increased complexity and can live without runtime swapping of JARs and visibility constraints enforced at runtime the combination of Maven, Spring and Hera provides a powerful development environment for modular Java applications.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Unit testing annotation based Spring MVC controllers</title>
   <link href="http://www.olivergierke.de/2009/05/unit-testing-annotation-based-spring-mvc-controllers"/>
   <updated>2009-05-17T08:18:54+02:00</updated>
   <id>http://www.olivergierke.de/2009/05/unit-testing-annotation-based-spring-mvc-controllers</id>
   <content type="html">&lt;p&gt;Although it took me a while to get used to them, I now pretty much like the annotation based programming model for controllers in Spring MVC. The major advantage over the traditional inheritance based approach is, that the methods, that are bound to requests are simple public methods, that can easily be unit tested.&lt;/p&gt;

&lt;p&gt;So while unit testing the behaviour of the method is fine, one actually might want to test the mapping of URLs. Current Spring code requires you to invoke &lt;code&gt;AnnotationHandlerMethodAdapter&lt;/code&gt;, that is responsible for detecting the method to be invoked AND invoking it. This is rather suboptimal as there is actual a private class contained in it that does the method lookup only. I already filed a &lt;a href='http://jira.springframework.org/browse/SPR-5763'&gt;request for enhancement&lt;/a&gt; to extract that class and thus offer an easy way to test URL mappings.&lt;/p&gt;

&lt;p&gt;But that does not mean, that pure mapping testing is impossible right now. As long as you can live with executing the body of the controller methods you&amp;#8217;re fine anyway. If that causes too much preparation overhead or you simply don&amp;#8217;t like (as I do) there is a solution for you: mocking.&lt;/p&gt;

&lt;p&gt;Suppose you have a controller class like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@Controller
public class MyController {

  @RequestMapping(&amp;quot;/users&amp;quot;)
  public void foo(HttpServletResponse response) {
    // Controller code goes here...
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you can set up a mock of this controller using EasyMock classextensions or another mocking framework of your choice and thus only check the URL mappings of your controller:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class RequestMappingTest {

  MockHttpServletRequest request;
  MockHttpServletResponse response;
  MyController controller;
  AnnotationMethodHandlerAdapter adapter;

  @Before
  public void setUp() {

    controller = EasyMock.createNiceMock(
      MyController.class);

    adapter = new AnnotationMethodHandlerAdapter();
    request = new MockHttpServletRequest();
    response = new MockHttpServletResponse();
  }

  @Test
  public void testname() throws Exception {

    request.setRequestURI(&amp;quot;/users&amp;quot;);

    controller.foo(response);
    EasyMock.expectLastCall().once();
    EasyMock.replay(controller);

    adapter.handle(request, response, 
      controller);

    EasyMock.verify(controller);
  }
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You probably want to factor out basic behaviour into a common superclass to easily write mapping tests for all of your controllers.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hera 0.4 released</title>
   <link href="http://www.olivergierke.de/2009/03/hera-04-released"/>
   <updated>2009-03-30T15:50:48+02:00</updated>
   <id>http://www.olivergierke.de/2009/03/hera-04-released</id>
   <content type="html">&lt;p&gt;It&amp;#8217;s been a silent release, nevertheless I want to post a tiny shout about it. Hera is a small plugin library that allows you to create pluggable architectures based on Spring using build time configuration. You might want to find out details by skimming &lt;a href='http://www.olivergierke.de/2008/10/09/the-smallest-plugin-system-ever/'&gt;my introducing blog post&lt;/a&gt; about it.&lt;/p&gt;

&lt;p&gt;Version 0.4 is not a very feature rich release as there is actually only one new one. With this release you can leverage the Core Spring&amp;#8217;s ordering capabilities (either through implementing &lt;code&gt;Ordered&lt;/code&gt; or by annotating your plugin classes with &lt;code&gt;@Order&lt;/code&gt;) to fix the order of plugins in the registry. Furthermore we made &lt;code&gt;PluginRegistry&lt;/code&gt; an interface with 0.4 and provide a &lt;code&gt;SimplePluginRegistry&lt;/code&gt; (without ordering capabilities) that is completely independent of Spring and a &lt;code&gt;OrderAwarePluginRegistry&lt;/code&gt; that will be used when you use the Hera Spring namespace.&lt;/p&gt;

&lt;p&gt;Feel free to check out the new release at &lt;a href='http://hera.synyx.org'&gt;http://hera.synyx.org&lt;/a&gt; and give feedback!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Java Posse Roundup 2009 - Part I</title>
   <link href="http://www.olivergierke.de/2009/03/java-posse-roundup-09-part-i"/>
   <updated>2009-03-05T10:53:16+01:00</updated>
   <id>http://www.olivergierke.de/2009/03/java-posse-roundup-09-part-i</id>
   <content type="html">&lt;p&gt;The first two days are over, time to wrap up the first half of it. The actual conference started on Tuesday but the day before there was a Hackathon on alternative languages on the JVM. But let me start from scratch.&lt;/p&gt;

&lt;p&gt;My flight to the states was actually quite nice although it took me almost 24h to finally get to Crested Butte, Colorado. &lt;a href='http://maps.google.de/maps?f=q&amp;amp;amp;source=s_q&amp;amp;amp;hl=de&amp;amp;amp;geocode=&amp;amp;amp;q=Whiterock+716,+Crested+Butte,+CO,+USA&amp;amp;amp;sll=38.8758,-106.981773&amp;amp;amp;sspn=0.131502,0.30899&amp;amp;amp;ie=UTF8&amp;amp;amp;ll=40.680638,-106.962891&amp;amp;amp;spn=16.381406,39.550781&amp;amp;amp;t=h&amp;amp;amp;z=5&amp;amp;amp;iwloc=addr'&gt;Crested Butte&lt;/a&gt; is situated in the western Rocky Mountains about 4h south west from Denver. It&amp;#8217;s named after the mountain right next to the city and very nice place to do wintersports of all kinds.&lt;/p&gt;

&lt;h2 id='monday'&gt;Monday&lt;/h2&gt;

&lt;p&gt;Monday was really messed up because of the jetlag, but that really just turned out in the evening. We had a so called Hackathon the entire day. We split up into few groups exploring features of Scala, JavaFx, Fan as well as Groovy/Grails. In the morning I joined the Groovy/Grails group and met Todd Costella, Alf Kristian Støyle and D.J. Hagberg. We discussed various intentions why you might want to introduce a scripting languages, pitfalls of doing so and so on. After that we kickstarted some grails application. And tried to investigate a little more on that. Intrestingly it didn&amp;#8217;t take us that much time to find the first serious things. if you want to take a look at the summarizing presentation we gave, check out the &lt;a href='http://www.youtube.com/javaposse'&gt;JavaPosse Youtube channel&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the afternoon we went back to Posse house joining the Scala and JavaFx folks. Tor Norby was some kind of hosting the JavaFx group. They decided to programm some kind of stopwatch that counts down from 5 minutes and changes background and audio the further it targets the 0. They did a kinda ugly prototype just to explore the languages features while Joe Nuxoll (another JavaPosse member) designed a much more pleasing interface with Photoshop. The kinda awesome thing is, that you can simply export the Photoshop file, import it into JavaFx Netbeans plugin and you will be able to manipulate all the layers named &lt;code&gt;jfx:*&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The reason the build this thing was the so called Lightning Talks that we use to do in the evenings. The idea is that you have exactly 5 minutes - not a single second more - to present whatever you like. So you esentially have to sell your point in these 5 minutes, which is kinda hard, as we have seen the last two days ;). If you want to check out these lightning talks, go to &lt;a href='http://www.youtube.com/javaposse'&gt;JavaPosse Youtube channel&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='tuesday'&gt;Tuesday&lt;/h2&gt;

&lt;p&gt;Tuesday morning we were introduced to the concept of Open Space Conferences. It boils down to rather some kind of discussion thing instead of the one-guy-talks-one-hundred-are-sleeping thing you are used from other conferences. Bruce Eckel who some of you might be familiar with ganve some short intro into that and then we putÂ  our session suggestions for the days on a whiteboard.&lt;/p&gt;

&lt;p&gt;The first session was on (measuring) productivity. Intrestingly we did not discuss any tools at all but rather discovered that communication and processes very much are the critical point. The second one was on application modularity. We briefly covered plugin architectures, OSGi, (plain) Spring based ones and so on&amp;#8230;&lt;/p&gt;

&lt;p&gt;In the afternoon I decided not to go skiing so I went to Bruce Eckels house joining the guys who wrote a JavaFx as well as Flex port of Dick Walls JFlubber. These coding dojos are really kind of an seance thing. Although I rather prepared my lightning talk for Wednesday there is an amazing spirit kreeping up there.&lt;/p&gt;

&lt;p&gt;In the evening we had the first &amp;#8220;real&amp;#8221; lightning talks that were actually quite impressing as you can see that some of these guys are pretty much into it and know how to sell their point in 5 minutes. A key thing is that there is absolutely no topic scope given so we had a lightning talk on Selenium as well as a &amp;#8220;How did I get 3/4 of the man I was&amp;#8221; by Bill Pugh speaking about his diet where he lost a lot of weight. So all that stuff is kinda funny and really geeky&amp;#8230;&lt;/p&gt;

&lt;h2 id='wednesday'&gt;Wednesday&lt;/h2&gt;

&lt;p&gt;This morning we started of with a session on developer communication skills, pointed out problems of non colocated teams and all those kinds of stuff. The second one was on Maven. We got actually into bashing it a lot of times but every now and then we emphasized that it actually does a great job except the pitfalls we had discussed. I hope I could convince Dick to take a look at the m2Eclipse plugin. The last session before lunch target developer productivity, how to setup workplaces and so on. Unfortunately I couldn&amp;#8217;t attend it entirely as my snowboard lessons kicked rigth of at 1pm. This one was awesome, too. I actually had booked a group lesson but was the only one showing up. So I spend 1 and a half hour in the playgrounds and had 2 (rather sloppy) rides downhill then.&lt;/p&gt;

&lt;p&gt;In the evenings there were a lot of further lightningtalks. I had my first one on Hades. I probably will do another one tomorrow. Topic: Coding and Music - Passion and Profession. I actually want to point out some analogies between being a developer and being a musician.&lt;/p&gt;

&lt;h2 id='summing_up_the_first_days'&gt;Summing up the first days&lt;/h2&gt;

&lt;p&gt;Actually there is not that much to say except that it&amp;#8217;s awesome. Everyone here is so passionated, talented and into it, I can hardly believe it. Just to give you an impression: Take the last conference you attended. Take the 3 most intresting hallway discussions you had there. Imagine this kind of thing happen 5 days and yo will pretty much get the sense of what this event here is about. I&amp;#8217;m really looking forward to the last few days&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hades 0.4 released</title>
   <link href="http://www.olivergierke.de/2009/02/hades-04-released"/>
   <updated>2009-02-26T16:34:58+01:00</updated>
   <id>http://www.olivergierke.de/2009/02/hades-04-released</id>
   <content type="html">&lt;p&gt;Passionatedly practicing conference driven development I&amp;#8217;d like to announce version 0.4 of the DAO implementation library Hades.&lt;/p&gt;

&lt;h2 id='eclipse_plugin'&gt;Eclipse plugin&lt;/h2&gt;

&lt;p&gt;Using Hades namespace configuration in Spring applications can now be simplyfied by installing the Hades Eclipse Plugin from our update site. The plugin will extend Spring IDE to know the Hades namespace, parse the DAO beans correctly and thus provide the content assist you from from Spring Core&amp;#8217;s namespaces. As you can see below it is even able to resolve the classpath scanned DAO instances.&lt;/p&gt;

&lt;h2 id='automatic_detection_of_jpa_persistence_provider'&gt;Automatic detection of JPA persistence provider&lt;/h2&gt;

&lt;p&gt;As of version 0.4 Hades is able to detect the JPA persistence provider you use by inspecting the &lt;code&gt;EntityManager&lt;/code&gt; instance. Thus no explicit configuration is necessary anymore.&lt;/p&gt;

&lt;p&gt;So feel free to take a look at and provide feedback.&lt;/p&gt;

&lt;h2 id='links'&gt;Links&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://hades.synyx.org'&gt;Hades project home&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://redmine.synyx.org/wiki/hades/Eclipse'&gt;Documentation of the Eclipse plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Heading Java Posse Roundup 2009</title>
   <link href="http://www.olivergierke.de/2009/02/heading-javaposse-roundup-2009"/>
   <updated>2009-02-26T16:15:17+01:00</updated>
   <id>http://www.olivergierke.de/2009/02/heading-javaposse-roundup-2009</id>
   <content type="html">&lt;p&gt;2 more days and I will make my way to Crested Butte, Colorado to join this year&amp;#8217;s &lt;a href='http://www.mindviewinc.com/Conferences/JavaPosseRoundup/'&gt;Java Posse Roundup&lt;/a&gt;. Not having attended an &amp;#8220;Uncoference&amp;#8221; before I really look forward to this style of conference as the &lt;a href='http://en.wikipedia.org/wiki/Unconference'&gt;concept&lt;/a&gt; sounds promising. The week will be packed with geek activities but also leave room for leisure as Crested Butte is situated in a large skiing area actually. &lt;a href='http://www.flickr.com/photos/tags/javaposseroundup08/'&gt;Last year&amp;#8217;s pictures&lt;/a&gt; look awesome.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll try to post here now and then to reflect what&amp;#8217;s going on over there but i guess &lt;a href='http://twitter.com/olivergierke'&gt;Twitter&lt;/a&gt; frequency will be much higher.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Integrating Hades into existing applications</title>
   <link href="http://www.olivergierke.de/2009/02/integrating-hades-into-existing-applications"/>
   <updated>2009-02-06T19:11:58+01:00</updated>
   <id>http://www.olivergierke.de/2009/02/integrating-hades-into-existing-applications</id>
   <content type="html">&lt;p&gt;Today I&amp;#8217;ve got an email by &lt;a href='https://www.xing.com/profile/Thomas_Braun14/N1.1.4.2.b6504d'&gt;Thomas Braun&lt;/a&gt; who considered to play around with Hades. He is facing an application with an existing data access layer based on Spring&amp;#8217;s &lt;code&gt;HibernateDaoSupport&lt;/code&gt; class. This raised the question of how to integrate Hades into the app without changing existing code.&lt;/p&gt;

&lt;p&gt;Thomas was using &lt;code&gt;AnnotationSessionFactoryBean&lt;/code&gt; to create the &lt;code&gt;SessionFactory&lt;/code&gt; from annotation metadata. As Hades relies on JPA &lt;code&gt;EntityManager&lt;/code&gt; interface the basic question was how to use it next to the SessionFactory while avoiding duplicate metadata evaluation and thus two entity handling infrastructure.&lt;/p&gt;

&lt;p&gt;The solutions is unexpectedly simple. Supposed you use &lt;code&gt;LocalContainerEntityManagerFactoryBean&lt;/code&gt; as you normally would do in plain JPA setup and register it under &lt;code&gt;entityManagerFactory&lt;/code&gt; in your Spring configuration file you can configure DAOs based on &lt;code&gt;HibernateDaoSupport&lt;/code&gt; as follows:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;bean class=&amp;quot;your.dao.based.on.HibernateDaoSupport&amp;quot;&amp;gt;
  &amp;lt;property name=&amp;quot;sessionFactory&amp;quot;&amp;gt;
    &amp;lt;bean factory-bean=&amp;quot;entityManagerFactory&amp;quot;
      factory-method=&amp;quot;getSessionFactory&amp;quot; /&amp;gt;
  &amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The key here is, that &lt;code&gt;HibernateEntityManagerFactory&lt;/code&gt; (which is the type that will be created by the LCEMFB if you use the &lt;code&gt;HibernateVendorAdaptor&lt;/code&gt;) offers a method &lt;code&gt;getSessionFactory&lt;/code&gt; to get access to the underlying SessionFactory instance.&lt;/p&gt;

&lt;p&gt;Once again nice to see how easy Spring helps integrating applications, existing code with new approaches.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Clean Code - Review Part I</title>
   <link href="http://www.olivergierke.de/2009/01/clean-code-review-part-i"/>
   <updated>2009-01-23T20:37:03+01:00</updated>
   <id>http://www.olivergierke.de/2009/01/clean-code-review-part-i</id>
   <content type="html">&lt;p&gt;As I have twittered already, I am reading &amp;#8220;Clean Code&amp;#8221; by Robert C. Martin right now. I expected the book to be a very fundamental one. Although there are a few parts I do not entirely agree with, I just rummaged throught chapter 11 &amp;#8220;Systems&amp;#8221; on my way home and was surprised how condensed Robert summarizes principles constructing software systems that I usually promote discussing such topics with colleagues.&lt;/p&gt;

&lt;h2 id='1_separate_constructing_a_system_frum_using_it'&gt;1. Separate constructing a system frum using it&lt;/h2&gt;

&lt;p&gt;Detractors of the Spring framework very often claim, configuring a system construction using XML sucks because of lacking type safety et cetera. I don&amp;#8217;t want to get into discussion do detailed, but Spring&amp;#8217;s way of describing system construction is not tied to XML at all (see &lt;a href='http://www.springsource.org/javaconfig'&gt;Spring JavaConfig&lt;/a&gt;). For Robert the startup process of an application actually a &lt;strong&gt;concern&lt;/strong&gt;. A view I kinda like as such, as you then can easily argument in terms of Separation of Concerns as well as the Single Responsibility Principle.&lt;/p&gt;

&lt;h2 id='2_dependency_injection'&gt;2. Dependency Injection&lt;/h2&gt;

&lt;p&gt;DI is widely accepted these days, besides the myth that you always need a fully fledged container to use DI in your application. Robert shows some nice examples and points out that the conceptual idea is much more important that the tool you use.&lt;/p&gt;

&lt;h2 id='3_cross_cutting_concerns__aop'&gt;3. Cross cutting concerns / AOP&lt;/h2&gt;

&lt;p&gt;Systems usually face logic that - coded in plain OO - is tangled though all the codebase. Adressing these issues with AOP leads to much more concise and extendable systems. Robert presents the concept from a very high level point of view and briefly introduces various AOP implementations, advising simple proxy based solutions like Spring AOP or JBoss AOP as suffient for most cases.&lt;/p&gt;

&lt;h2 id='4_incremental_design'&gt;4. Incremental design&lt;/h2&gt;

&lt;p&gt;Robert emphasizes the importance of natural growth of designs. Big upfront designs often appear to be overengineered and too technical that does not abstract business domain on an appropriate level. Which leads us to…&lt;/p&gt;

&lt;h2 id='5_domain_specific_languages'&gt;5. Domain specific languages&lt;/h2&gt;

&lt;p&gt;I also don&amp;#8217;t want to open this pandora&amp;#8217;s box but clearly second the opinion that you have to find abstractions that are clean, simple and thightly wrapped around the domain to deal with, whether is a technical domain.&lt;/p&gt;

&lt;h2 id='summary'&gt;Summary&lt;/h2&gt;

&lt;p&gt;Robert boils down the chapter to the following paragraph:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An optimal system architecture consists of modualrized domains of concern, each of which is implemented with Plain Old Java Objects (or other) objects. The different domains are integrated together with minimally invasive Aspects or Aspect-like tools. This architecture can be test-driven, just like code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I really just scratch the surface of what the chapter actually covers, but even this single chapter boils the topic down to its essences quite well. Nice to see all these concepts, priciples and attitudes distilled in a few pages.&lt;/p&gt;

&lt;p&gt;If you like, check out the &lt;a href='http://www.amazon.de/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?ie=UTF8&amp;amp;amp;s=books-intl-de&amp;amp;amp;qid=1232735586&amp;amp;amp;sr=8-1'&gt;book @ Amazon&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The DAO is dead! Long live the DAO!</title>
   <link href="http://www.olivergierke.de/2009/01/se-radio-episode-121-or-mappers"/>
   <updated>2009-01-14T21:30:09+01:00</updated>
   <id>http://www.olivergierke.de/2009/01/se-radio-episode-121-or-mappers</id>
   <content type="html">&lt;p&gt;&lt;a href='http://www.se-radio.net/podcast/2008-12/episode-121-or-mappers-michael-ploed'&gt;Episode 121&lt;/a&gt; of &lt;a href='http://www.se-radio.net'&gt;Software Engineering Radio&lt;/a&gt; deals with the topic of OR Mappers. Michael Plöd introduces the concept of &lt;a href='http://en.wikipedia.org/wiki/Object-relational_mapping'&gt;object-relational mapping&lt;/a&gt; technologies, discusses advantages and disadvantages. The content of the episode is very basic to a large extend, which makes it ideal to get an introducing idea of the topic.&lt;/p&gt;

&lt;p&gt;The reason I discuss this here is a discussion Arno (the interviewer) is introducing regarding the necessity of the DAO (Data Access Object) Pattern, if you use OR Mappers. Michael thinks that the DAO Pattern still has the right to exist and I decidedly second that. Let me explain why&amp;#8230;&lt;/p&gt;

&lt;p&gt;First, let&amp;#8217;s take a look at the origin of the DAO Pattern, the problems it was meant to address in times it was invented. According to Wikipedia DAO is defined as follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8230;a &lt;strong&gt;Data Access Object&lt;/strong&gt; (DAO) is an &lt;a href='http://en.wikipedia.org/wiki/Object_%28computer_science%29'&gt;object&lt;/a&gt; that provides an abstract &lt;a href='http://en.wikipedia.org/wiki/Interface_%28computer_science%29'&gt;interface&lt;/a&gt; to some type of &lt;a href='http://en.wikipedia.org/wiki/Database'&gt;database&lt;/a&gt; or persistence mechanism, providing some specific operations without exposing details of the database.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the days it was invented &amp;#8220;persistence mechanism&amp;#8221; was equal to &amp;#8220;JDBC and SQL&amp;#8221;. This of coure has changed a lot if you use an OR Mapper or even another abstraction layer above it like JPA. As they provide a more object oriented view on persistence or even a standardized interface. Nevertheless I definately propose the DAO for a lot of reasons. In the podcast Michael coins two main reasons, that I will briefly will describe here. Furthermore I&amp;#8217;m going to add some other ones.&lt;/p&gt;

&lt;h2 id='separation_of_persistence_logic_and_business_logic'&gt;Separation of persistence logic and business logic&lt;/h2&gt;

&lt;p&gt;Using JPA in your service class directly (whether it is a Statless Session Bean or Spring bean) works well as long as you can rely on the really basic CRUD methods: create, update, delete, read. Reading persistent objects already is not that simple anymore.&lt;/p&gt;

&lt;h2 id='tangled_code__more_sophisticated_api'&gt;Tangled code / More sophisticated API&lt;/h2&gt;

&lt;p&gt;I have never seen an application that did only read all objects at once. You always need to select objects based on a given criteria, sort, page results and so on. If you try to set this up with JPA API or a vendor specific one you tangle your code with persistence code probably even proprietary API (if you use OR Mapper API directly). Furthermore you can easily mix and match persistence technology, if it becomes handy. I&amp;#8217;ve seen few projects that use OR Mappers for classic data access and low level JDBC code to perform bulk operations.&lt;/p&gt;

&lt;h2 id='exchange_implementation'&gt;Exchange implementation&lt;/h2&gt;

&lt;p&gt;This is the &amp;#8220;Yessss&amp;#8230; but who does this?&amp;#8221; argument. The answer is: You do! Or at least you should. Unit testing your business logic you should be able to easily mock or stub out your data access code.&lt;/p&gt;

&lt;h2 id='dont_repeat_the_dao'&gt;Don&amp;#8217;t repeat the DAO!&lt;/h2&gt;

&lt;p&gt;Another aspect of the problem is that CRUD code as well as DAO implementations tend to be boilerplate. Repeated code here and there. Using a DAO layer allows you to gently generalize the code and thus reduce the amount of coded needed to implement it.&lt;/p&gt;

&lt;h2 id='hades_to_help'&gt;Hades to help!&lt;/h2&gt;

&lt;p&gt;Why am I so passionate about this? If you read my blog now and then you know that I lead project Hades that addresses exactly these issues. So if you ever have experienced one of the issues mentioned above, take a glance at &lt;a href='http://hades.synyx.org'&gt;Hades&lt;/a&gt; and play around with it if you like.&lt;/p&gt;

&lt;p&gt;If you are from Frankfurt/Main area you have the chance to get introduced to it tomorrow evening where I will give a talk on &lt;a href='http://hades.synyx.org'&gt;Hades&lt;/a&gt; (and the DAO question) on 2009&amp;#8217;s first &lt;a href='http://www.devdusk.de'&gt;DevDusk&lt;/a&gt; - Technology for Techies, a bimonthly meeting of passionated geeks, nerds, techies, whatever you wnt to call them. Would be nice to see you there.&lt;/p&gt;

&lt;h2 id='links'&gt;Links&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://www.ibm.com/developerworks/java/library/j-genericdao.html'&gt;Don&amp;#8217;t repeat the DAO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>Subtleties on java.lang.Enum</title>
   <link href="http://www.olivergierke.de/2009/01/subtleties-on-javalangenum"/>
   <updated>2009-01-12T07:32:01+01:00</updated>
   <id>http://www.olivergierke.de/2009/01/subtleties-on-javalangenum</id>
   <content type="html">&lt;p&gt;As i twittered a few days ago, I stumbled over a subtle issue in the core Java library. Not as extreme as &lt;a href='http://www.olivergierke.de/wordpress/2008/12/javac-issues-implementing-generics/'&gt;here&lt;/a&gt; but one to raise ones eyebrows, too.&lt;/p&gt;

&lt;p&gt;I just wanted to write a small method to access an enum value by its &lt;code&gt;String&lt;/code&gt; representation or use a default, if the conversion fails:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public static &amp;lt;T extends Enum&amp;lt;T&amp;gt;&amp;gt; T toEnum(String value, T default) {

  // Checking values omitted
  return (T) Enum.valueOf((Class) defaultValue.getClass(), StringUtils
    .upperCase(value))
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Of course, I wrote a unittest to verify the behaviour and it worked fine. Nevetheless using this class in my application threw an exception for a different (than the one in the testcase) &lt;code&gt;Enum&lt;/code&gt; type, claiming the type handed to the &lt;code&gt;valueOf(…)&lt;/code&gt; method was not an Enum?&lt;/p&gt;

&lt;p&gt;What? I&amp;#8217;ve handed over an &lt;code&gt;Enum&lt;/code&gt; as default value and you tell me, it is not of an &lt;code&gt;Enum&lt;/code&gt; type. I digged down into the details. Looked like Enums with methods broke the code, Enums without methods worked. Seems like the compiler works with anonymous inner classes when creating byte code. The solution to the problem is using &lt;code&gt;getDeclaringClass()&lt;/code&gt; instead, as the JavaDoc reveals.&lt;/p&gt;

&lt;p&gt;Although I understand that &lt;code&gt;Enum&lt;/code&gt;s with methods are implemented with inner classes, I do not understand why these inner classes do not extend &lt;code&gt;Enum&amp;lt;T&amp;gt;&lt;/code&gt;. Futhermore I cannot believe that the behaviour of &lt;code&gt;getClass()&lt;/code&gt; changes depending on whether you use methods in your &lt;code&gt;Enum&lt;/code&gt; or not. Strange thing…&lt;/p&gt;

&lt;p&gt;Below you find a small test case to reproduce the issue. Be sure you have JUnit in version 4 or above on the classpath.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class EnumSample {

  private enum Foo {
    FOO;
  }

  private enum Bar {

    BAR {
      @Override
      public void doSomething() {
        System.out.println(&amp;quot;INVOKED!&amp;quot;);
      }
    };

    public abstract void doSomething();
  }

  @SuppressWarnings(&amp;quot;unchecked&amp;quot;)
  private &amp;lt;T extends Enum&amp;lt;T&amp;gt;&amp;gt; T toEnum(String value, T defaultValue) {
    return (T) Enum.valueOf(defaultValue.getClass(), value);
  }

  @Test
  public void useSimpleEnum() {
    toEnum(&amp;quot;FOO&amp;quot;, Foo.FOO);
  }

  @Test(expected = IllegalArgumentException.class)
  public void useComplexEnum() {
    toEnum(&amp;quot;BAR&amp;quot;, Bar.BAR);
  }
}&lt;/code&gt;&lt;/pre&gt;</content>
 </entry>
 
 <entry>
   <title>Hades at Java User Group Karlsruhe</title>
   <link href="http://www.olivergierke.de/2008/12/hades-at-jug-karlsruhe"/>
   <updated>2008-12-18T14:11:22+01:00</updated>
   <id>http://www.olivergierke.de/2008/12/hades-at-jug-karlsruhe</id>
   <content type="html">&lt;p&gt;Yesterday I gave a presentation about &lt;a href='http://trac.synyx.org/hades'&gt;Hades&lt;/a&gt; at the Java User Group Karlsruhe. It was preceeded by an introduction to Aspect Oriented Programming by &lt;a href='http://dlinsin.blogspot.com/'&gt;David Linsin&lt;/a&gt; and Florian Waibel of Netpioneer that showed the usage of AOP to define system architecture constraints.&lt;/p&gt;

&lt;p&gt;You can download the &lt;a href='http://www.olivergierke.de/wordpress/wp-content/uploads/2008/12/generic-daos-with-hades1.pdf'&gt;slides&lt;/a&gt; as well as the &lt;a href='http://www.olivergierke.de/wordpress/wp-content/uploads/2008/12/hades-sample.zip'&gt;sample code&lt;/a&gt; here or all stuff at the &lt;a href='http://groups.google.com/group/jug-karlsruhe'&gt;JUG Karlsruhe Google group&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>JavaC issues implementing generics</title>
   <link href="http://www.olivergierke.de/2008/12/javac-issues-implementing-generics"/>
   <updated>2008-12-15T15:02:20+01:00</updated>
   <id>http://www.olivergierke.de/2008/12/javac-issues-implementing-generics</id>
   <content type="html">&lt;p&gt;Attenting &lt;a href='http://www.olivergierke.de/wordpress/2008/12/devoxx-2008'&gt;Devoxx last week&lt;/a&gt;, I had the chance to talk to Joshua Bloch about an compiler issue I had a while ago implementing static factory method pattern from his book. Take this as example:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class PluginRegistry &amp;lt;T extends Plugin&amp;lt;S&amp;gt;, S&amp;gt; {
  public static &amp;lt;T extends Plugin&amp;lt;S&amp;gt;, S&amp;gt;
    PluginRegistry&amp;lt;T, S&amp;gt; create() {
    return new PluginRegistry();
  }
}

PluginRegistry&amp;lt;Plugin&amp;lt;String&amp;gt;, String&amp;gt; registry =
  PluginRegistry.create();&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Don&amp;#8217;t try to get the details, there are only three important things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two generic parametrizations, where one is a derived one from the other&lt;/li&gt;

&lt;li&gt;The static factory method as suggested to ease using this generic class in Josh Blochs &amp;#8220;Effective Java 2&amp;#8221; (Item 1)&lt;/li&gt;

&lt;li&gt;The last line takes advantage of this method to create an instance of the registry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The strange thing is, this compiles within Eclipse but does not on plain &lt;code&gt;javac&lt;/code&gt;. I mailed Alex Buckley about the issue and after some back and forth he discovered a strange issue with javac.&lt;/p&gt;

&lt;p&gt;To let the cat out of the bag: its a bug in javac. Actually according to Maurizio Cimadamore it is a coeffect of some bugs that are actually already marked as fixed (&lt;a href='http://bugs.sun.com/view_bug.do?bug_id=6192945'&gt;6192945&lt;/a&gt;, &lt;a href='http://bugs.sun.com/view_bug.do?bug_id=6369605'&gt;6369605&lt;/a&gt;, &lt;a href='http://bugs.sun.com/view_bug.do?bug_id=6193815'&gt;6193815&lt;/a&gt;). I&amp;#8217;ll leave out the bloody details, here is, what it boils down to:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Javac&lt;/code&gt; somehow only tries to lookup types forward in this case. It infers &lt;code&gt;T == Plugin&amp;lt;String&amp;gt;&lt;/code&gt;, but complains that for it &lt;code&gt;Plugin&amp;lt;String&amp;gt;&lt;/code&gt; is not a subtype of &lt;code&gt;Plugin&amp;lt;S&amp;gt;&lt;/code&gt; (as it has not inferred S yet). Guess what, if you simply switch the generic parameters, it compiles like a charm:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class PluginRegistry &amp;lt;T extends Plugin&amp;lt;S&amp;gt;, S&amp;gt; {
  public static &amp;lt;S, T extends Plugin&amp;lt;S&amp;gt;&amp;gt;
    PluginRegistry&amp;lt;T, S&amp;gt; create() {
    return new PluginRegistry();
  }
}

PluginRegistry&amp;lt;Plugin&amp;lt;String&amp;gt;, String&amp;gt; registry =
  PluginRegistry.create();&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(Note the order of the generic types in the method signature)&lt;/p&gt;

&lt;p&gt;Tell me if it&amp;#8217;s just me, but now the method signature somehow looks &amp;#8220;wrong&amp;#8221; to me. As the types are not being derived in the order they are declared at the method. Nevertheless, I at least compiles both on &lt;code&gt;javac&lt;/code&gt; and the Eclipse compiler. So keep an eye on stuff like this, if you implement generic types ;). I&amp;#8217;ll give you an update if there are further things happen on this.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Spring 3.0 M1 is out now for Maven users, too</title>
   <link href="http://www.olivergierke.de/2008/12/spring-30-m1-is-out-now-for-maven-users-too"/>
   <updated>2008-12-12T04:17:06+01:00</updated>
   <id>http://www.olivergierke.de/2008/12/spring-30-m1-is-out-now-for-maven-users-too</id>
   <content type="html">&lt;p&gt;After the announcement of the release of Spring 3.0 M1 Jürgen Höller blog comments complained the artifacts not to be available in a Maven repository. Actually, according to Chris Beams, it now is. Take a look at his &lt;a href='http://blog.springsource.com/2008/12/05/spring-framework-30-m1-released/#comment-131869'&gt;blog comment&lt;/a&gt;. I&amp;#8217;m leaching it from the servers right now&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Devoxx 2008</title>
   <link href="http://www.olivergierke.de/2008/12/devoxx-2008"/>
   <updated>2008-12-11T18:30:16+01:00</updated>
   <id>http://www.olivergierke.de/2008/12/devoxx-2008</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m taking a break currently, skipping one of the talks here. Devoxx is actually the most exciting conference I ever attended and I want to take the chance to recap some of the impressions I got here. After 4 days of non-daylight, lots of coffee and coke, I really have to say that I liked it very much. I will see a presentation by &lt;a href='http://www.devoxx.com/display/JV08/The+next+versions+of+Parleys.com'&gt;Stephan Janssen&lt;/a&gt; on the new &lt;a href='http://www.parleys.com'&gt;Parleys.com&lt;/a&gt; as well as some other ones tomorrow but as The days were so fully packed, I&amp;#8217;ll try to organize stuff a little.&lt;/p&gt;

&lt;h2 id='monday'&gt;Monday&lt;/h2&gt;

&lt;p&gt;The first university day, I especially remember a &lt;a href='http://www.devoxx.com/display/JV08/The+Scala+Experience'&gt;talk&lt;/a&gt; of Ted Neward and Bill Vinner on &lt;a href='http://www.scala-lang.org/'&gt;Scala&lt;/a&gt;. They gave an impressive introduction on it explaining some of the philosophical stuff, as well a lot of hands on demos. Ted coined a nice quote, when someone was about to ask if he could turn a Scala class into an EJB he answered:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;No, I will not make this an EJB! Get out!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Of course he was not serious (well, actually I don&amp;#8217;t know).&lt;/p&gt;

&lt;h2 id='tuesday'&gt;Tuesday&lt;/h2&gt;

&lt;p&gt;Tuesday started out with a presentation of Holly Cummins and Kirk Pepperdine on &lt;a href='http://www.devoxx.com/display/JV08/Java+Performance'&gt;Java performance tools&lt;/a&gt;. The talk had quite a balanced weight between theoretical introduction and tools in action to discover and track performance bottlenecks.&lt;/p&gt;

&lt;p&gt;In the lunch break I had my quicky session on Hades, with actually worked out quite well. Actually I stripped it down to be more demo centric the night before. You can download the slides &lt;a href='http://www.olivergierke.de/wordpress/wp-content/uploads/2008/12/generic-daos-with-hades.pdf'&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href='http://www.devoxx.com/display/JV08/Pro+Spring+2.5'&gt;Pro Spring 2.5&lt;/a&gt; talk actually summed up all the neat features introduced in 2.5. One thing I got stuck on was the fact that you can use &lt;code&gt;@Autowired&lt;/code&gt; on a property of type &lt;code&gt;List&lt;/code&gt; and it will get all Spring beans injected implementing the &lt;code&gt;Foo&lt;/code&gt; interface. Of course this raises the question of how Spring can detect the generic type at runtime. Seems like &lt;code&gt;org.sfw.core.GenericCollectionTypeResolver&lt;/code&gt; does the trick.&lt;/p&gt;

&lt;h2 id='wednesday'&gt;Wednesday&lt;/h2&gt;

&lt;p&gt;The session day ended with a &lt;a href='http://www.devoxx.com/display/JV08/RESTful+Design%2C+Patterns+and+Anti-Patterns'&gt;talk&lt;/a&gt; of &lt;a href='http://www.innoq.com/blog/st/'&gt;Stefan Tilkov&lt;/a&gt; on REST Webservices. He could not have given a better and shorter REST introduction than he did. He very nicely unfolded the - sometimes absurd - concepts and abuses SOAP does to HTTP. Just two small examples: have you ever thought about the SOAP notion of an &lt;strong&gt;endpoint&lt;/strong&gt;? As the web is build to be interconnected, the term is just ridiculous. The same applies to tunneling every call through POST or GET, not only freeing HTTP verbs from all its semantics, but intentionally abusing them. As Stefan said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It&amp;#8217;s like overriding a &lt;code&gt;plus&lt;/code&gt; method, with formatting your harddrive.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Note, that same as to the quote of Ted - exeggeration serves descriptiveness. ;)&lt;/p&gt;

&lt;p&gt;Yesterday evening was a &lt;a href='http://www.devoxx.com/display/JV08/European+JUG+Gathering'&gt;BOF session of JUG leaders&lt;/a&gt;. As I&amp;#8217;m not an official leader of any but helping the Mannheim JUG to kickstart these days, I took the chance to map names to faces a little. Some kind of networking activity. Belgian JUG leader Stephan Janssen raised the idea to get more interconnected between local JUGs as well as on European scale. Synchronizing scedules or even build some kind of umbrella organization could help get more famous speakers to smaller JUGs and help attracting more meeting members as well as speakers, too.&lt;/p&gt;

&lt;h2 id='thursday'&gt;Thursday&lt;/h2&gt;

&lt;p&gt;Today started with the keynote of Josh Bloch who introduced the Generics and Enum chapters from his book. Unfortunately I read it already so there were no big surprises. Josh was followed by Mark Reinhold who spoke about the process of modularizing the JRE into profiles.Â  Furthermore he gave more detailled insights into the release plan for Java 7, which shall be released in early 2010. The main topics I can remember were&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no closures (jihaa! let&amp;#8217;s simply talk another 3 years about it)&amp;lt;/li&amp;gt;&lt;/li&gt;

&lt;li&gt;no Properties&lt;/li&gt;

&lt;li&gt;no reimplemented Generics&lt;/li&gt;

&lt;li&gt;small language changes: ** multiple exceptions in catchclause: &lt;code&gt;catch (Foo, Bar e)&lt;/code&gt; ** null-safe object traversal: &lt;code&gt;a?.foo()?.bar()?&lt;/code&gt; -&amp;gt; returns &lt;code&gt;null&lt;/code&gt; if one of the values in between is &lt;code&gt;null&lt;/code&gt; ** type inference: &lt;code&gt;Map&amp;lt;String, Object&amp;gt; map = new HashMap();&lt;/code&gt; &amp;lt;- gets &lt;code&gt;new HashMap&amp;lt;String, Object&amp;gt;();&lt;/code&gt; automatically&lt;/li&gt;

&lt;li&gt;modularity on language level&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Furthermore Mark mentioned that Sun is thinking about dropping backwards compatibility in one of the next version for the sake of cleaning things up. I suspect that to happen with Java 8, as Alex explicitly rejected changes to the Generics implementation which could be done in a clean rewrite.&lt;/p&gt;

&lt;p&gt;More detailled information can be found in &lt;a href='http://hamletdarcy.blogspot.com/2008/12/java-7-update-from-mark-reinhold-at.html'&gt;Hamlet D&amp;#8217;Arcy&amp;#8217;s blog&lt;/a&gt;, who I occasionally met discussing the language changes with Josh Bloch at the whiteboards.&lt;/p&gt;

&lt;p&gt;After that I had a lot of hallway conversions as it is nice to get the chance to talk to people being directly involved. With &lt;a href='http://en.wikipedia.org/wiki/Joshua_Bloch'&gt;Josh Bloch&lt;/a&gt; I discussed a possible bug in either the Eclipse or Sun compiler, I discovered implementing the static factory method pattern from his Effective Java 2. I&amp;#8217;m about to hand this one over to &lt;a href='http://blogs.sun.com/abuckley/'&gt;Alex Buckley&lt;/a&gt; an try to keep track on it.&lt;/p&gt;

&lt;p&gt;Furthermore I had a chat with Michael Keith of Oracle about EclipseLink as we had some issues with it implementing support for it in Hades. Here I will also keep in touch with him, hoping to fix the problems.&lt;/p&gt;

&lt;p&gt;The most funny part - as I could have predicted - was the &lt;a href='http://www.javaposse.org'&gt;Java Posse&lt;/a&gt; Live recording. Carl Quinn and Dick Wall were leading it, Tor Norbye and Joe Nuxoll got connected via iChat. I turned out that Tor&amp;#8217;s internet connection was not the best and so there was no sound from his side. The guys recapped the stuff they saw so far and it was fun as expected. Ocassionally I met Carl and Dick in the hallways and we had the chance to have a quick chat. As I proudly wore my JavaPosse tshirt, they noticed that the Java code printed on it would not compile actually. If you also own one and haven&amp;#8217;t noticed already - go and take a look. I will do so, too.&lt;/p&gt;

&lt;p&gt;The day finished with a talk of Stephan Janssen about the future of Parleys.com. Perleys is a platform to publish talks and provide functionality like comments and bookmarks around them. The 3.0 version of it will come with a new publisher module, that eases the post processing of the talks a lot easier. Furthermore channels are to be introduced and you can rent your one space in it. The will be free access for all Java Groups&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hades 0.3 is out</title>
   <link href="http://www.olivergierke.de/2008/12/hades-03-is-out"/>
   <updated>2008-12-06T21:19:00+01:00</updated>
   <id>http://www.olivergierke.de/2008/12/hades-03-is-out</id>
   <content type="html">&lt;p&gt;I am pleased to announce version 0.3 of &lt;a href='http://trac.synyx.org/hades'&gt;Hades&lt;/a&gt;, an open source project I lead. The release bundles a new &lt;code&gt;ExtendedGenericDao&lt;/code&gt; implementation based on &lt;a href='http://www.eclipse.org/eclipselink/'&gt;EclipseLink&lt;/a&gt; as well as some major package refactorings. For more information and a detailed changelog see the &lt;a href='http://trac.synyx.org/hades'&gt;project homepage&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>On the way to Devoxx</title>
   <link href="http://www.olivergierke.de/2008/12/on-the-way-to-devoxx"/>
   <updated>2008-12-06T17:55:04+01:00</updated>
   <id>http://www.olivergierke.de/2008/12/on-the-way-to-devoxx</id>
   <content type="html">&lt;p&gt;Tomorrow some colleagues and me will be travelling to Antwerp, Belgium to attend this years &lt;a href='http://www.devoxx.com'&gt;Devoxx&lt;/a&gt; (formerly known as JavaPolis / Javoxx) conference. I really look forward to this as conferences are always a good change to sniff the latest news and currents as well as meeting a lot of &lt;a href='http://dlinsin.blogspot.com/'&gt;fellow developers&lt;/a&gt;. Furthermore I will give a short intro into &lt;a href='http://trac.synyx.org/hades'&gt;Hades&lt;/a&gt; on &lt;a href='http://www.devoxx.com/display/JV08/Easing+JPA+DAO+development+with+Hades'&gt;Tuesday&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I will try to sum up every day with a small blog post as I did on &lt;a href='http://www.olivergierke.de/wordpress/tag/springone08/'&gt;SpringOne&lt;/a&gt; Europe already.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Is REST the next Spring?</title>
   <link href="http://www.olivergierke.de/2008/12/is-rest-the-next-spring"/>
   <updated>2008-12-04T18:25:11+01:00</updated>
   <id>http://www.olivergierke.de/2008/12/is-rest-the-next-spring</id>
   <content type="html">&lt;p&gt;Browsing the latest JavaMagazin leader written by &lt;a href='http://www.innoq.com/blog/st/'&gt;Stefan Tilkov&lt;/a&gt;, I stumbled about a phrase in his abstract, that triggered some thought I wanna share with you. Stefan claims REST to be a more lightweight approach to web services than SOAP.&lt;/p&gt;

&lt;p&gt;First I have to admit, that I clearly favour REST style webservices over SOAP one, too. The projects I worked with them were clearly less cluttered, less overheaded, and the API much more close to the domain concepts compared to those rumbling with SOAP. But back to the headline statement.&lt;/p&gt;

&lt;p&gt;REST webservices - as well as Spring - claims to simplify its technical domain. Spring does for the much broader scope of Java EE development, REST webservices do for loosely connecting software systems. The key concept of both is to concentrate on very core concepts, achieving power through simplicity.&lt;/p&gt;

&lt;p&gt;Spring leverages POJO development, the very basic component model of Java Beans. REST webservices do so by cleanly emphasizing the power of REST (as the name suggests).&lt;/p&gt;

&lt;p&gt;The last analogy I see is that Spring was not born out of a clinical spec but does is rather based on experiences in real world project. So do REST webservices. Currently there are &amp;#8220;only&amp;#8221; best practices to REST development, whereas SOAP was backed by a specification since day one. A spec that did not really fit well to real world development introducing way too much overhead. As we saw what influence open source projects like Spring and Hibernate had on EJB 3.0, perhaps we can hope for a much more simplified and natural SOAP 2.0 or even REST WS 1.0?&lt;/p&gt;

&lt;p&gt;So you can conclude that despite the different technical domains and scopes you can find subtle similarities in history, core ideas and influence on spec based competitors.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hades on tour</title>
   <link href="http://www.olivergierke.de/2008/11/hades-on-tour"/>
   <updated>2008-11-18T10:33:17+01:00</updated>
   <id>http://www.olivergierke.de/2008/11/hades-on-tour</id>
   <content type="html">&lt;p&gt;There some upcoming talks on Hades I will give on a variety of locations and events. As I don&amp;#8217;t want to deprive the dates from you, here we go:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dec, 9th 2008 - &lt;a href='http://www.devoxx.com/display/JV08/Easing+JPA+DAO+development+with+Hades'&gt;Devoxx Conference, Antwerpen&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Dec, 17th 2008 - &lt;a href='http://groups.google.com/groups/jug-karlsruhe'&gt;Java User Group, Karlsruhe&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Jan, 15th, 2008 - &lt;a href='http://www.devdusk.de'&gt;DevDusk, Frankfurt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perhaps some of you will attend one of these events. Don&amp;#8217;t hesitate to contact me, get in touch and come by to share thought.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>The metadata dilemma</title>
   <link href="http://www.olivergierke.de/2008/11/the-metadata-dilemma"/>
   <updated>2008-11-18T10:24:59+01:00</updated>
   <id>http://www.olivergierke.de/2008/11/the-metadata-dilemma</id>
   <content type="html">&lt;p&gt;Java EE development has been packed with lots of metadata since day one. Things have changed a lot over times and we have been provided with more elegant solutions. I don&amp;#8217;t want to go deeply into the ongoing debate on Annotations versus XML but rather go one step back and discuss metadata on a more conceptual level.&lt;/p&gt;

&lt;h2 id='what_is_metadata'&gt;What is metadata?&lt;/h2&gt;

&lt;p&gt;&lt;a href='http://de.wikipedia.org/wiki/Metadata'&gt;Wikipedia&lt;/a&gt; names &amp;#8220;data about data&amp;#8221; and further explains:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In data processing, metadata is definitional data that provides information about or documentation of other data managed within an application or environment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In case of application development metadata mostly is a model of some functional or nonfunctional aspect of the application domain. JavaEE defines metadata models to express persistence, transactionality, security. These are mostly technical aspects but often tied to business requirements.&lt;/p&gt;

&lt;h2 id='to_tie_or_not_to_tie'&gt;To tie or not to tie?&lt;/h2&gt;

&lt;p&gt;Thus one could raise the question of how to capture the metadata in a way that it&amp;#8217;s relation to functional requirements can be derived easily on the on hand and nevertheless be separated from core domain logic to avoid tangling on the other hand.&lt;/p&gt;

&lt;p&gt;Spring was rolemodel in stating that the distinction between business and technical aspects are key to maintainable software. Due to its origin (no annotations available those days) it provided a clean component model based on XML to apply technical aspects with AOP means. Thus the separation was logical AND physical.&lt;/p&gt;

&lt;p&gt;JavaEE and Spring 2.0 (and upwards) leverage annotations to express metadata concerns as the preferred way (especially in case of JavaEE). Annotations are tied to the actual code and thus mostly compiled into the class files. Here we separate the metadata aspects logically from the actual code but physically tie it to the class.&lt;/p&gt;

&lt;p&gt;The is an ongoing debate if this tight coupling is really suitable, especially defining crosscutting concerns (the JavaEE interceptor model) in one place and binding (and thus tangling) them around classes all over the application.&lt;/p&gt;

&lt;p&gt;Nevertheless I definately see advantage in defining e.g. security attributes right at the class - or even more public - at the interface of a component. This would tighten the contract between client and implementation much more. From a business perspective I maybe want the user management component only allow an administrator to delete users, completely independent from what the implementation looks like. Thus it would enrich the interface&amp;#8217;s semantics.&lt;/p&gt;

&lt;h2 id='problems'&gt;Problems&lt;/h2&gt;

&lt;p&gt;I see two issues in this: first, what if the client is not interested in this particular aspect modeled to the interface at all. As the annotation is compiled into the class to be evaluated at runtime, clients would need the annotation JAR in their classpath. Taking persistence as example I actually don&amp;#8217;t see no point why a plain client should be bothered to have the JPA JAR in its classpath just to deal with JPA annotated entities. Very often I end up with more JARs in my classpath that are simply required by metadata annotations rather than implementation libraries.&lt;/p&gt;

&lt;p&gt;The second thing is the pure amount of annotations. Suppose you want to persist an entity with JPA and serialize it via JAXB. Welcome to annotation hell ;). Oh, I forgot there is a validation JSR based on annotations on its way round the corner. Erm&amp;#8230; do you see the problem?&lt;/p&gt;

&lt;h2 id='conclusion'&gt;Conclusion?&lt;/h2&gt;

&lt;p&gt;While the first issue can be somewhat limited by a set of standardized annotations available via the JRE, I can not really see a way out of problem two today. Of course we raised the abstraction of expressing metadata around application logic, the next quest seems to manage the pure amount of metadata created.&lt;/p&gt;

&lt;p&gt;What do you think?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Videos of the Four Sided Cube unplugged gig</title>
   <link href="http://www.olivergierke.de/2008/11/videos-of-the-unplugged-gig"/>
   <updated>2008-11-02T19:18:02+01:00</updated>
   <id>http://www.olivergierke.de/2008/11/videos-of-the-unplugged-gig</id>
   <content type="html">&lt;p&gt;We just played another unplugged gig at fresh!-Club Mannheim last Friday. My wife took videos of some songs with our photo camera. I just mixed that stuff with the recording of the sound guy, who did a very good job (as usual). I like to post &amp;#8220;Bad Day&amp;#8217;s Rememberance&amp;#8221; as sample here. You can find all videos at our &lt;a href='http://www.youtube.com/foursidedcube'&gt;YouTube channel&lt;/a&gt;.&lt;/p&gt;
&lt;iframe allowfullscreen='true' frameborder='0' height='315' src='http://www.youtube.com/embed/GmJLyX2P1YI' width='420' /&gt;</content>
 </entry>
 
 <entry>
   <title>The smallest plugin system ever</title>
   <link href="http://www.olivergierke.de/2008/10/the-smallest-plugin-system-ever"/>
   <updated>2008-10-09T10:13:58+02:00</updated>
   <id>http://www.olivergierke.de/2008/10/the-smallest-plugin-system-ever</id>
   <content type="html">&lt;p&gt;I blogged about &lt;a href='http://www.olivergierke.de/wordpress/2008/09/26/hades-02-is-out/'&gt;Hades&lt;/a&gt;, an OpenSource project I lead a while ago. Today I want to launch another neat library. Much smaller than Hades but IMHO useful nevertheless.&lt;/p&gt;

&lt;p&gt;Developing Spring applications you often come to the point of having a component that should get a list of collaborateurs injected. The component in turn does select one or many of these collaborateurs based on a defined criteria and works with them. This raises a few requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The component should have the easiest possible access to collaborateurs.&lt;/li&gt;

&lt;li&gt;Plugins (hey, we got a name for it!) should be addable by just dropping in a JAR file with an implementation of the collaborateurs interface.&lt;/li&gt;

&lt;li&gt;I would be nice if we could integrate this with Spring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here&amp;#8217;s the solution I came up with…&lt;/p&gt;

&lt;p&gt;I have an interface &lt;code&gt;Plugin&amp;lt;T&amp;gt;&lt;/code&gt;, where T defines the criteria or delimiter to select plugins that shall actually be invoked. The only method this interface contains is &lt;code&gt;boolean supports(T delimiter)&lt;/code&gt;. To define an actual plugin interface you create an interface that extends Plugin, declare the delimiter and add the business methods you want the plugin to provide. E.g.:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public interface NotificationProvider implements Plugin&amp;lt;String&amp;gt; {
  void notify(Notification notification);
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Your &lt;code&gt;NotificationProvider&lt;/code&gt; instances have to implement &lt;code&gt;supports&lt;/code&gt; thus decide if they are able to handle the given delimiter or not. In most cases the delimiter might be a parameter of some business method like &lt;code&gt;Notification&lt;/code&gt; in this case, but it does not have to be.&lt;/p&gt;

&lt;p&gt;The next core abstraction is the &lt;code&gt;PluginRegistry&amp;lt;S extends Plugin&amp;lt;T&amp;gt;, T&amp;gt;&lt;/code&gt;. Wow, whatta signature. Instantiating it, it allows you to register &lt;code&gt;Plugin&lt;/code&gt;s of type &lt;code&gt;S&lt;/code&gt; and in turn access the by providing delimiter in various ways. You can ask the registry for the first suitable &lt;code&gt;Plugin&lt;/code&gt;, all suitable plugins or ask for mandatory plugins and let the registry throw an exception if none found. See the &lt;a href='http://trac.synyx.org/hera/chrome/site/mvn/plugin-core/apidocs/index.html'&gt;JavaDoc&lt;/a&gt; for details.&lt;/p&gt;

&lt;p&gt;Thats a lot of lowlevel code but enables you to define clean plugin interfaces and manage access to plugin instances in an elegant way. So you can easily inject a &lt;code&gt;PluginRegistry&lt;/code&gt; into a Spring bean and access plugins as you like.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;bean id=&amp;quot;notificationProviders&amp;quot; class=&amp;quot;org.synyx.plugin.core.PluginRegistry&amp;quot;&amp;gt;
  &amp;lt;property name=&amp;quot;plugins&amp;quot;&amp;gt;
    &amp;lt;list&amp;gt;
      &amp;lt;bean class=&amp;quot;com.acme.notification.EmailNotificationProvider&amp;quot; /&amp;gt;
      &amp;lt;bean class=&amp;quot;com.acme.notification.JabberNotificationProvider&amp;quot; /&amp;gt;
    &amp;lt;/list&amp;gt;
  &amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id='how_to_create_a_registry'&gt;How to create a registry?&lt;/h2&gt;

&lt;p&gt;Well, thats nice but quite static. What if you would like to allow your colleague to create a JAR file to drop in your classpath and automatically find his &lt;code&gt;NotificationProvider&lt;/code&gt; implementation after next application restart.&lt;/p&gt;

&lt;p&gt;Note that I do not want to cover exchanging JARs at runtime, rather want to feature some kind of &amp;#8220;configuration on packaging&amp;#8221; with the least overhead possible.&lt;/p&gt;

&lt;p&gt;This is where Spring comes into play again. I implemented a &lt;code&gt;PluginRegistryBeanFactoryPostProcessor&lt;/code&gt; (only less than half of the class name length is my fault ;). It will rummage the parsed bean definitions and combine those implementing a certain interface in a &lt;code&gt;PluginRegistry&lt;/code&gt; and expose it as a new bean in the application context itself.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;bean class=&amp;quot;org.synyx.plugin.support.PluginRegistryBeanFactoryPostProcessor&amp;quot;&amp;gt;
  &amp;lt;property name=&amp;quot;lists&amp;quot;&amp;gt;
    &amp;lt;map&amp;gt;
      &amp;lt;entry key=&amp;quot;notificationProviders&amp;quot;
        value=&amp;quot;com.acme.notification.NotificationProvider&amp;quot; /&amp;gt;
    &amp;lt;/map&amp;gt;
  &amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The property name lists is somewhat ugly as it expects a map as parameter. This is because you ca define multiple lists, each entry results in one list or better named &lt;code&gt;PluginRegistry&lt;/code&gt;. This is mainly due to the requirement to create multiple &lt;code&gt;PluginRegistry&lt;/code&gt;s with one &lt;code&gt;BeanPostProcessor&lt;/code&gt;. Maybe we&amp;#8217;d drop this providing a more speaking interface but take into account to register one &lt;code&gt;BeanFactoryPostProcessor&lt;/code&gt; for one &lt;code&gt;PluginRegistry&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id='so_how_do_you_set_up_your_plugin_jars'&gt;So how do you set up your plugin JARs?&lt;/h2&gt;

&lt;p&gt;What we can&amp;#8217;t free you from is declaring your plugin implementation as a Spring bean. You should define a special configuration file location and name to allow the plugin host to automatically lookup the plugin configuration file via a wildcarded import, e.g.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;lt;import resource=&amp;quot;classpath*:com/acme/**/plugin-context.xml&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Defining this along with the &lt;code&gt;BeanPostProcessor&lt;/code&gt; above in your plugin host JAR will allow you to simply drop plugin JARs into your classpath and let them provide plugin implementation. Using maven you simply need to declare the plugin implementation project as dependency, turning Maven &lt;code&gt;pom.xml&lt;/code&gt; files into some kind of program instance configuration.&lt;/p&gt;

&lt;h2 id='syntactic_sugar'&gt;Syntactic sugar&lt;/h2&gt;

&lt;p&gt;As you might have noticed, registration of the &lt;code&gt;BeanFactoryPostProcessor&lt;/code&gt; is somewhat ugly. Besides the enormous name it is a LOT of XML to just define registering all beans implementing &lt;code&gt;Foo&lt;/code&gt; under &lt;code&gt;bar&lt;/code&gt;. Furthermore the entry&amp;#8217;s &amp;#8220;key&amp;#8221; is actually the bean id the &lt;code&gt;PluginRegistry&lt;/code&gt; is registered under, the &amp;#8220;value&amp;#8221; is actually a type name.&lt;/p&gt;

&lt;p&gt;To ease configuration a little I&amp;#8217;ve added a Spring namespace implementation , that boils declaring a &lt;code&gt;PluginRegistry&lt;/code&gt; down to something like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;plugin:registry id=&amp;quot;notificationProviders&amp;quot;
  class=&amp;quot;com.acme.notification.NotificationProvider&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You can gain Eclipse classname code completion by adding &lt;code&gt;org/synyx/plugin/core/config/plugin-config.xsd&lt;/code&gt; to your XML catalog. If you installed &lt;a href='http://springide.org'&gt;Spring IDE&lt;/a&gt;, it should come up with the code completion if you edit the class attribute of the registry element.&lt;/p&gt;

&lt;h2 id='simple_lists'&gt;Simple lists&lt;/h2&gt;

&lt;p&gt;The project also includes Spring support for a little stripped down version of the requirements by providing a &lt;code&gt;BeanListBeanFactoryPostProcessor&lt;/code&gt;, that simply combines bean implementing a given interface to a list. This is useful if you want to leverage the automatic lookup functionality but do not need to select beans based on a given criteria and thus in turn not need to implement &lt;code&gt;Plugin&lt;/code&gt; and use &lt;code&gt;PluginRegistry&lt;/code&gt;. Of course there is also a namespace element list, that provides a configuration shortcut to define this &lt;code&gt;BeanFactoryPostProcessor&lt;/code&gt;, too.&lt;/p&gt;

&lt;h2 id='summary'&gt;Summary&lt;/h2&gt;

&lt;p&gt;The library offers sophisticated support for the little man&amp;#8217;s need to dynamically add and remove plugins at packaging time and thus helps to modularize applications where a fully fledged plugin environment like OSGi can not be used or would be overkill to use.&lt;/p&gt;

&lt;p&gt;The library is available in version 0.1 under Apache License 2.0 and can be downloaded from the project website or directly accessed via our Maven repository. I haven&amp;#8217;t really polished the website nor declared license text in the source files. This is due to change in a few days.&lt;/p&gt;

&lt;p&gt;We don&amp;#8217;t have an offical name for the library yet, so any suggestion is welcome. It would be nice, if we could find a name based in greek mythology as we at Synyx typically use names from that scope for software projects.&lt;/p&gt;

&lt;p&gt;If you have any comments, ideas, critique dont&amp;#8217;t hesitate to leave a comment or contact me directly.&lt;/p&gt;

&lt;h2 id='links'&gt;Links&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://trac.synyx.org/hera'&gt;Project website&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Update: We decided to use Hera as the name for the project as all our projects are named around gods of the greek mythology. This affected the project URL.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hades 0.2 is out</title>
   <link href="http://www.olivergierke.de/2008/09/hades-02-is-out"/>
   <updated>2008-09-26T20:35:09+02:00</updated>
   <id>http://www.olivergierke.de/2008/09/hades-02-is-out</id>
   <content type="html">&lt;p&gt;Today we officially released version 0.2 of &lt;a href='http://trac.synyx.org/hades'&gt;Hades&lt;/a&gt;, a domain class and DAO development library based on JPA and &lt;a href='http://www.springframework.org'&gt;Spring&lt;/a&gt;. Hades is mainly based on an idea provided by &lt;a href='http://jandiandme.blogspot.com/'&gt;Eberhard Wolff&lt;/a&gt; in Java Magazin. Hades feature list reads as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implementation of CRUD methods for JPA Entities&lt;/li&gt;

&lt;li&gt;Transparent triggering of JPA NamedQueries by finder methods&lt;/li&gt;

&lt;li&gt;Dynamic query generation from finder method names&lt;/li&gt;

&lt;li&gt;Implementation domain base classes providing basic properties&lt;/li&gt;

&lt;li&gt;Support for transparent auditioning (created, last changed)&lt;/li&gt;

&lt;li&gt;Easy Spring integration with custom namespace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Version 0.2 mainly brings minor enhancements and polishes. Since today we&amp;#8217;re also listed at &lt;a href='https://www.ohloh.net/projects/hades'&gt;ohloh.net&lt;/a&gt;. So feel free to check out the documentation and play with it a little.&lt;/p&gt;

&lt;h2 id='links'&gt;Links&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://trac.synyx.org/hades'&gt;Hades project site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content>
 </entry>
 
 <entry>
   <title>How to feed link SCM paths into your Trac</title>
   <link href="http://www.olivergierke.de/2008/09/how-to-feed-long-scm-paths-to-your-trac"/>
   <updated>2008-09-26T13:11:35+02:00</updated>
   <id>http://www.olivergierke.de/2008/09/how-to-feed-long-scm-paths-to-your-trac</id>
   <content type="html">&lt;p&gt;We&amp;#8217;re using &lt;a href='http://trac.edgewall.org'&gt;Trac&lt;/a&gt; 0.10.3 in combination with MySQL at work. Trying to setup a new instance and importing the SVN history i faced an ugly duplicate key error trying to insert the revision logs into the database. As &lt;a href='http://trac.edgewall.org/ticket/3676'&gt;this ticket&lt;/a&gt;explains this is due to an index over a part of the SVN path affected. By default Trac only uses the first 111 characters of it. This of course will crash if you have deeply nested folders in your project.&lt;/p&gt;

&lt;p&gt;As the ticket describes this is just an index and can easily be dropped with&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ALTER TABLE `node_change` DROP PRIMARY KEY;&lt;/code&gt;&lt;/pre&gt;</content>
 </entry>
 
 <entry>
   <title>Developers facing the real world</title>
   <link href="http://www.olivergierke.de/2008/09/developers-facing-the-real-world"/>
   <updated>2008-09-05T12:45:07+02:00</updated>
   <id>http://www.olivergierke.de/2008/09/developers-facing-the-real-world</id>
   <content type="html">&lt;p&gt;A few minutes ago I once again stumbled on the strange fact, that every now and then I unconciously apply development concepts to my everyday life or at least detect concepts or violations of &amp;#8216;em. Just now, we decided to order lunch at the chinese restaurant round the corner. Rummaging through the restaurants brochure, guess what was the first meal offered: Pizza Magarita. WTF? This clearly violates the principle of &lt;a href='http://en.wikipedia.org/wiki/Separation_of_concerns'&gt;Separation of Concerns&lt;/a&gt; and is also known as the &lt;a href='http://en.wikipedia.org/wiki/God_object'&gt;God object antipattern&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Validating domain objects</title>
   <link href="http://www.olivergierke.de/2008/08/validating-domain-objects"/>
   <updated>2008-08-11T20:58:20+02:00</updated>
   <id>http://www.olivergierke.de/2008/08/validating-domain-objects</id>
   <content type="html">&lt;p&gt;Fellow developer &lt;a href='http://dlinsin.blogspot.com/'&gt;David Linsin&lt;/a&gt; wrote a &lt;a href='http://dlinsin.blogspot.com/2008/08/how-to-validate-your-domain-objects.html'&gt;blogpost&lt;/a&gt; about validation of domain objects recently. I actually wanted to leave him a reply but it got kinda long so I decided to post it here. So this is what came to my mind:&lt;/p&gt;

&lt;p&gt;Prototyping some web portal kind of software I&amp;#8217;ve encountered a similar situation. Take a User domain object as example for this problem. I decided to have a domain object as well as DTOs for maybe different clients. Why did I decide to do so? Well, the example beautifully shows what is a client specific vie on domain data. To edit the user on a web frontend (no matter if you want to create a new user or edit an existing one) you mostly let the real application user enter a password twice to ensure he enters the one he really wanted to enter. Nevertheless I of course don&amp;#8217;t want to extend my domain object to hold a second password field, just because one single client needs it.&lt;/p&gt;

&lt;p&gt;Another thing is registration of new users. I might want to ensure unique email addresses as I don&amp;#8217;t want to have two users sharing the same mail address (whether this is a good idea or not).&lt;/p&gt;

&lt;p&gt;What has this to do with validation. First of all I realized that validation is a client specific thing to a given extend and cannot be restricted do domain objects. Thus the decision to have DTOs the client technology specific exporters (an MVC controller, a WebService Endpoint a.s.o) handle and validate.&lt;/p&gt;

&lt;p&gt;In consequence this means that my DTOs are &amp;#8220;userfriendly&amp;#8221; taking user form input as it is given. They are validated by external validation classes (maybe nicely separated into a hierarchy to avoid implementing common validation logic twice but allowing client specific validation logic where necessary). These also ensure the identity of both given passwords e.g. or the uniqueness of the user&amp;#8217;s email address.&lt;/p&gt;

&lt;p&gt;My domain objects are much more restrictive then. I tend to reject as much invalid input as possible. An email class definately would reject an invalid email string with an &lt;code&gt;IllegalArgumentException&lt;/code&gt;. Doing so in a DTO would make clean error messaging almost impossible.&lt;/p&gt;

&lt;p&gt;As the validation subsystem or layer is allowed to depend on the domain layer I try to use eventually exposable validation logic from the domain layer. The regular expression to reject invalid email addresses in the email domain class could be used to nicely capture and reject the email field on the &lt;code&gt;UserDTO&lt;/code&gt; in an Spring MVC validator implementation.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Effective bug smashing with test cases</title>
   <link href="http://www.olivergierke.de/2008/07/effective-bug-smashing-with-test-cases"/>
   <updated>2008-07-01T11:59:50+02:00</updated>
   <id>http://www.olivergierke.de/2008/07/effective-bug-smashing-with-test-cases</id>
   <content type="html">&lt;p&gt;There are a lot of opinions buzzing around about how testing and test driven development helps you writing better software. Reading &lt;a href='http://www.amazon.de/Secrets-Rockstar-Programmers-Riding-Crest/dp/0071490833/ref=sr_1_1?ie=UTF8&amp;amp;amp;s=books-intl-de&amp;amp;amp;qid=1214904407&amp;amp;amp;sr=8-1'&gt;Secrets of the rockstar programmers&lt;/a&gt; just now, I&amp;#8217;ve stumbled over an intresting interview with &lt;a href='http://www.bileblog.org/about/'&gt;Hani Suleiman&lt;/a&gt;, co-author of &lt;a href='http://www.amazon.de/Next-Generation-Java-Testing-Advanced/dp/0321503104/ref=sr_1_1?ie=UTF8&amp;amp;amp;s=books-intl-de&amp;amp;amp;qid=1214904551&amp;amp;amp;sr=8-1'&gt;Next Generation Java Testing&lt;/a&gt;. As this is a book purely on testing, you could expect him to be a fervent advocat of TDD. Surprisingly, he takes a very pragmatic approach to testing and simply states, that it should be as easy as possible to be done while understanding that deadlines often prevent you from equipping your polished code with the last 20 percent of test coverage.&lt;/p&gt;

&lt;p&gt;Nevertheless, the quote, that pinged my mind, was this one:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The user said, &amp;#8220;This thing doesn&amp;#8217;t work.&amp;#8221; You&amp;#8217;re gonna test something that potentially doesn&amp;#8217;t work. And so, once you have that test, it&amp;#8217;s very easy, because you have that verifiable bug.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style='text-align: right;'&gt;(Hani Suleiman on testing and bugs)&lt;/p&gt;
&lt;p&gt;Let me elaborate on that a little bit. Hani&amp;#8217;s observations largely correspond to the way I usually get started swinging my swat. So suppose you have system in state A in your version control system and a bug report claiming that there is something wrong in this state. Starting to find the cause for the bug you typically accept the ticket, indicating that you are currently working on it. Assume you can reproduce the issue with a test case you fix the according code snippets, make sure you get that green bar and commit everything to the VCS again. Finally you mark the ticket as fixed and add &amp;#8220;fixed with revision XYZ&amp;#8221; as comment to guarantee tracability, that&amp;#8217;s it.&lt;/p&gt;

&lt;p&gt;That sound really proficient, doesn&amp;#8217;t it? Where the hell is the problem? I have to admit, that this is the way I am working currently, and I really feel comfortable with it. So here is, what the quote made me think about:&lt;/p&gt;

&lt;p&gt;Comparing the original state of the VCS (revision XYZ - 1) and the fixed state of the VCS (revision XYZ) you only see one more test case and some modified. Who really tells you that the test case did not work before? As you have committed the already working test case along with the changes, you don&amp;#8217;t have a possibility to check, whether the test case is really tight enough to reproduce the problem correctly. So wouldn&amp;#8217;t it be better to add the following step to the bug fixing heuristic described above:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After you have completed the test case reproducing the issue you check that one in into the VCS (although this is not buildable, due to the failing testcase!)&lt;/li&gt;

&lt;li&gt;You add a comment to the ticket that the current revision lets you reproduce the bug&lt;/li&gt;

&lt;li&gt;Continue, like described above&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perhaps I am to addicted to traceability but I really like to be able to track what&amp;#8217;s going on, what&amp;#8217;s going wrong, what could be solved how and so on.&lt;/p&gt;

&lt;p&gt;What do you think about this?&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SpringOne 2008 - Application platform keynote</title>
   <link href="http://www.olivergierke.de/2008/06/application-platform-keynote"/>
   <updated>2008-06-12T12:00:19+02:00</updated>
   <id>http://www.olivergierke.de/2008/06/application-platform-keynote</id>
   <content type="html">&lt;p&gt;Adrian Colyer led the send day&amp;#8217;s keynote centered about the Spring Source Application Platform. Unfortunately the duck that became famous last year could not be with him this year. Fortunately Rob Harrop - AP lead developer - replaced it quite well ;).&lt;/p&gt;

&lt;p&gt;Adrian and Rob coined out the primary challanges of enterprise applications the standard has not resolved. Of course they presented OSGi as the main foundation to build a solution on that could solve these problems: modularity, dynamics and so on.&lt;/p&gt;

&lt;p&gt;Rob discussed an intresting point regarding standard JavaEE applications. As soon as you take the app in production you simply lose insight about all that nicely structured services, repositories and architectural concepts of your application. In operation it is only a WAR (no pun intended). OSGi in combination enables you to take these concepts into production a lot more.&lt;/p&gt;

&lt;p&gt;Finally they gave some short demo to see hot bundle replacement. All in all a keynote presenting the current state of the application platform, pointing at the paths still to go. Rob and Adrian expect a lot of improvements regarding dependency profiles and provisioning dependencies into the platform.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Spring 2008 - Summing up day one</title>
   <link href="http://www.olivergierke.de/2008/06/summing-up-day-one"/>
   <updated>2008-06-12T11:58:48+02:00</updated>
   <id>http://www.olivergierke.de/2008/06/summing-up-day-one</id>
   <content type="html">&lt;p&gt;First da of SpringOne was really intresting. I saw a lot of good talks, either to earn new knowledge or ideas to share thoughts about or at least get a feeling that attitudes, ideas and programming habits I cultivate are very much state of the art.&lt;/p&gt;

&lt;p&gt;After the session I enjoyed to talk to a few Spring developers discussing ideas and problems I&amp;#8217;ve stumbled above. I talked to Christian Dupuis - lead developer of SpringIDE and the Spring Tool Suite - to get tighter integration of a generic DAO library im currentl working on. He gave me useful tips of how to get the IDE to recognize beans i create through a custom namespace. Maybe we can get our hands on this today and get this working.&lt;/p&gt;

&lt;p&gt;After that I discussed a problem with Jürgen Höller that kept me quite confused a while ago. I recently ran into the idea to dynamically lookup configuration files fulfilling a certain naming and placing convention on application startup time enabling the app to work with some kind of plugins just by dropping JAR files into the classpath. Stupidly this did not work in Tomcat. I could dig the problem down to Spring asking the classloader for resources named like the part of the wildcarded config file include up to the first wildcard. Unfortunately these are mostly package names, that correspond to folders. Not all JAR packaging mechanisms do create JarEntries for folders thus the classloader does not find these although there are certainly resources in or below that folders. I myself thought this would be inherent to the JarFile datastructure that would mess up things but Jürgen pointed out that these entries can be created by configuring JAR packageing correctly. Guess what - it works. ;)&lt;/p&gt;

&lt;p&gt;Finally I have got some opinions about the Spring Source Application Platform licensing model. The key question to me was when is the point, my application has to be GPL. Seems there are a few different opinions on that, even among the Spring Source guys. Eberhard Wolf gave the most definite one IMHO. As long as you work with the platform in-house and develop and run your application on it, you&amp;#8217;re fine. The tricky part is when you have customers that want to host the app themselves. As you develop for Spring Source Application Platform your deployment format differs a lot from a standard WAR format (assuming you want to take advantage of OSGi and other platform features). The key notion in this case is &amp;#8220;derivative work&amp;#8221;. If you provide derivative work from the AP your app has to be GPL, too. Unfortunately there is no clean definition of this term, yet. You actually come into the debate if you have to either deliver AP with your app to the customer (that would match the term IMHO) or your customer decides to host the AP herself and just drops in your application. Actually that shouldn&amp;#8217;t cause a lot of trouble because as your customer decides for Spring Source AP, he probably would want to have some dedicated support, taking apps into production.&lt;/p&gt;

&lt;p&gt;This issue is really some subtle problem with GPL in general as it uses terms that do not have been judicially debated seemingly.&lt;/p&gt;

&lt;p&gt;As you can see, I came back with my brain packed with a lot of cool new ideas. And there is yet another day ;).&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>5 (or 3) aspects you probably haven't thought about</title>
   <link href="http://www.olivergierke.de/2008/06/5-or-3-aspects-you-probably-havent-thought-about"/>
   <updated>2008-06-11T20:09:35+02:00</updated>
   <id>http://www.olivergierke.de/2008/06/5-or-3-aspects-you-probably-havent-thought-about</id>
   <content type="html">&lt;p&gt;Alef Arendsen started by giving a short introduction into basic AOP concepts. After that he presented a sample project using Hibernate and JDBC data access together. He construted a business case where the Hibernate property of delaying actual data insert to the database until transaction commit. The solution to the problem would be to flush the hibernate session appropriately. But what means appropriately in this case? Who is responsible to execute the flush? Alef constructed an aspect that watches JdbcTemplate operations and executes the flush accordingly.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;The next example was about retrieving localized data. Localized in the sense, that Alef wanted to access all car parts available in a given area. He introduced a view localizing the data into the database and let Hibernate work against that view. Finally he let the current area to retrieve the data for be propagated. This was realized applying an advice to transaction begin time to write the session state area context into the database. To prevent duplicate propagation Alef introduced the AspectJ cflow concept allowing to define pointcuts in the context of anoher pointcut. This means you can describe a pointcut to match a transactional method and only get it fired on the first transactional method even if it triggers other transactional methods that would fire the advice again otherwise. The neat thing about this advice application was, that the filter logic is kept in the database. The aspect itself is only the controller for the actually transparent logic.&lt;/p&gt;

&lt;p&gt;Alefs last example was first failure capturing adressing the need to trigger logic on the first occurrence of an exception avoiding to handle the exception twice. Once again he made heavy use of cflow ponitcut definitions. Alef also used a custom aspect instatiation model - instance per pointcut call in this case.&lt;/p&gt;

&lt;p&gt;This was a really awesome talk as it showed up the enormous power of AOP and the things you actually can achieve with it.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>EclipseLink - Hig performance persistence for Spring</title>
   <link href="http://www.olivergierke.de/2008/06/eclipselink-hig-performance-persistence-for-spring"/>
   <updated>2008-06-11T17:57:14+02:00</updated>
   <id>http://www.olivergierke.de/2008/06/eclipselink-hig-performance-persistence-for-spring</id>
   <content type="html">&lt;p&gt;Rob Harrop and Shaun Smith gave an overview about Oracle Toplinks successor EclipseLink. They started by outlining the problems Rob faced when trying to integrate a JPA provider into SpringSource Application Platform. Shaun then gave a brief overview over EclipseLink which definately exceeds ToplinkEssentials functionality I have used before. It seems to abstract data access in a more broad way including access to XML or JCA.&lt;/p&gt;

&lt;p&gt;A major point of the bothy guy&amp;#8217;s talk was caching. Shaun presented a demo where a listener constantly triggered a query to the database. It of course was only executed once. Further queries hit the cache as expected. The nice thing about EclipseLink then was that a thread updating the data transparently updated the cached value, so that the changes were reflected in the listener without triggering a new query.&lt;/p&gt;

&lt;p&gt;Another hot topic of the presentation was the use of query hints to optimize data access. Rob suggested to have two aspects defined - one to register hints on named queries in a certain business method call context and another one looking up the hints to append when executing the named queries. This sounds quite good and i think i will take some time to reiterate this.&lt;/p&gt;

&lt;p&gt;The last amazing topic was a transparent implementation of a database state history. With EclipseLink it is or will (I don&amp;#8217;t remember exactly) to query database state at a given point in time. Especi&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Thomas Risberg - Persistence tuning for Spring environments</title>
   <link href="http://www.olivergierke.de/2008/06/thomas-risberg-persistence-tuning-for-the-spring-environments"/>
   <updated>2008-06-11T14:37:31+02:00</updated>
   <id>http://www.olivergierke.de/2008/06/thomas-risberg-persistence-tuning-for-the-spring-environments</id>
   <content type="html">&lt;p&gt;Thomas Risberg, Spring JDBC lead developer, held a talk about data access performance tuning using Spring. He focused on different things like optimizing JDBC statements, transaction manager and data source implementation choices and how you you can configure OR mappers properly.&lt;/p&gt;

&lt;p&gt;Besides tuning the application Thomas mentioned a few optimization possibilities around your software. Getting to know the tweaks and trick of you particular database, letting the DBA take a look at the table structure and SQL statments generated can bring you forward, too.&lt;/p&gt;

&lt;p&gt;Thomas showed a lot of examples to develop and work with data access, pointed out configuration options for various techniques to let you see what&amp;#8217;s going on in detail. He also showed some tools that allow detailled analysis of queries. Developing the &lt;a href='http://www.springsource.com/products/suite/apfororacledb'&gt;SpringSource Advanced Pack for Oracle&lt;/a&gt; he gave some more detailled insights in Oracle database performance tunings.&lt;/p&gt;

&lt;p&gt;Ending the talk with some deep down performance tunings of actual databases I really hope to get slides as the talk included so many tips I&amp;#8217;d like our DBAs be aware of.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SpringOne 2008 - Jürgen Höller - Spring 2.5 on it's way to 3.0</title>
   <link href="http://www.olivergierke.de/2008/06/jurgen-holler-spring-25-on-its-way-to-30"/>
   <updated>2008-06-11T13:26:41+02:00</updated>
   <id>http://www.olivergierke.de/2008/06/jurgen-holler-spring-25-on-its-way-to-30</id>
   <content type="html">&lt;p&gt;In the first part of Jürgen&amp;#8217;s talk he summarized the main innovations of Spring 2.5. The release brought significant enhancements regarding stereotype annotation configuration of Spring components. He especially focused on the combination of annotation configuration and AspectJ load-time-weaving. He pointed out some nice examples on the use of @Configurable to transparently inject Spring beans into components created outside the bean container and using @Transactional to allow even in-component method calls to be transactionally intercepted.&lt;/p&gt;

&lt;p&gt;Jürgen summarized this part of his presentation by giving recomendations for mixing configuration types. Annotation configuration is primarily meant to express stereotype configuration - meaning to express default configuration. You always have the option to override these defaults by external XML configuration.&lt;/p&gt;

&lt;p&gt;Personally I really fight to try experimenting with annotation as this throws away all the consistence in configuration I especially liked about Spring. But I think I&amp;#8217;ll give it a try as I had to get used to the namespace configuration as well and really like it now. Nevertheless, the variety in configuration options unfortunately raises the hurdle for beginners a lot.&lt;/p&gt;

&lt;p&gt;Jürgen continued giving short insights into Spring 3.0 development. It will be entirely based on Java 5 and its first milestone is expected in August. We can expect to see some cleanups resulting from dropping some supprt for old libraries. Nevertheless Spring 3.0 will be fully backwards compatible to 2.5.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SpringOne 2008 - Kickoff</title>
   <link href="http://www.olivergierke.de/2008/06/springone-kickoff"/>
   <updated>2008-06-11T12:20:15+02:00</updated>
   <id>http://www.olivergierke.de/2008/06/springone-kickoff</id>
   <content type="html">&lt;p&gt;We got up early this morning because we had no clue at all how to get to the conference center. After having breakfast with some of the SpringSource guys we somehow managed to get to the Metropolis. It was quite difficult as the only almost direct line from the hotel is so new, that isn&amp;#8217;t noted on any train plan. Happy searching!&lt;/p&gt;

&lt;p&gt;Rod Johnson, who we accidently met in the hotel&amp;#8217;s elevetor this morning, opened SpringOne 2008 with a keynote exceeding two hours. He primarily stated Springs current position in enterprise development and outlined benefits developers and architects gain from using Spring and SpringSource&amp;#8217;s enterprise offerings. Keith Donald and Christian Dupuis gave short overviews of Spring development in the web and the SpringSource Tool Suite.&lt;/p&gt;

&lt;p&gt;Finally Rod introduced new VP of product management Peter Cooper-Ellis who has been hired by SpringSource recently and was working for BEA over 10 years.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>My software engineering book Top 5</title>
   <link href="http://www.olivergierke.de/2008/06/my-software-engineering-book-top-5"/>
   <updated>2008-06-08T14:03:33+02:00</updated>
   <id>http://www.olivergierke.de/2008/06/my-software-engineering-book-top-5</id>
   <content type="html">&lt;p&gt;As I &lt;a href='http://www.olivergierke.de/wordpress/2008/06/06/reading-domain-driven-design-again/'&gt;rummage in Eric Evans&amp;#8217; &lt;strong&gt;Domain Driven Design&lt;/strong&gt; again&lt;/a&gt;, I thougt I&amp;#8217;d collect my favourite software engineering books to provide a list of what you as a software professional should have taken a glance at. Althought it seems to be a hitlist, actually there is no real ranking between the chosen.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id='eric_evans__domain_driven_design'&gt;Eric Evans - Domain Driven Design&lt;/h2&gt;

&lt;p&gt;This book focuses on software design and on distilling domain knowledge into it. Thus unlike the GoF book that covers rather technical patterns, DDD tends to be coming from a more business point of view. Eric introduces Entities, Value Objects, Aggregates, Services, Repository (DAO) and so on. I especially like this point of view as it focuses on functional requirements and derives patterns from them. Erics core aim is to tie software design to an ubiquitous language so that developers and business persons speak in the same terms, thus letting the software artifacts created reflect the business more incisively.&lt;/p&gt;

&lt;p&gt;Definiately the first book I hand to beginners as it provides a basic pattern catalogue along with a mindset I really think is indispensable - building easy to understand abstractions, care about design, about code, about functional requirements. &lt;ul&gt;
	&lt;li&gt;[Domain Driven Design @ Amazon](http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1212925819&amp;amp;sr=8-1)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;h2 id='martin_fowler__refactoring'&gt;Martin Fowler - Refactoring&lt;/h2&gt;

&lt;p&gt;Recently I discovered a &lt;a href='http://www.infoq.com/news/2008/06/soa-without-esb'&gt;presentation of Martin Fowler on SOA&lt;/a&gt; where he accidentally gave the key rational to refactoring: accept change as intrinsic trait of software development and be prepared to adapt to it. Now refactoring is the key concept that enables you treating your code not to be carved in stone but rather allows you to adopt emerging changes.&lt;/p&gt;

&lt;p&gt;Martin introduces a lot of core refactoring concepts and patterns. Most of the can be found in state-of-the-art IDEs like Eclipse or IntelliJ. &lt;ul&gt;
	&lt;li&gt;[Refactoring @ Amazon](http://http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1212925933&amp;amp;sr=1-1)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;h2 id='johannes_link__softwaretests_mit_junit'&gt;Johannes Link - Softwaretests mit JUnit&lt;/h2&gt;

&lt;p&gt;Agile software development builds on various heuristics and methodologies like continuos integration and first of all unit testing or even &lt;strong&gt;Test Driven Development&lt;/strong&gt; (TDD). Trying to become agile without adopting these techniques you will find your self in a mess very fastly. Softwaretests mit JUnit introduces core testing principles and methodologies. Although there are much more sophisticated testing frameworks like TestNG available today the book reads well because of the its very basic starting point. It was published in times when unit testing was not that of a prominent idea. Thus it really gives an introduction from the very first steps. &lt;ul&gt;
	&lt;li&gt;[Softwaretest mit JUnit @ Amazon](http://www.amazon.com/Softwaretests-mit-JUnit-Johannes-Link/dp/3898643255/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1212925974&amp;amp;sr=1-1)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;

&lt;h2 id='steve_mcconnell__code_complete'&gt;Steve McConnell - Code Complete&lt;/h2&gt;

&lt;p&gt;That&amp;#8217;s a really huge one. And all on coding? This &lt;strong&gt;has&lt;/strong&gt; to be boring! Well, it isn&amp;#8217;t. Code complete is on a much more technical level of abstraction that DDD but it takes a look on code from the same point of view: communication. Steve discusses everyday quests developers fight: method naming, method&amp;#8217;s lengths.&lt;/p&gt;

&lt;p&gt;This one&amp;#8217;s a must-read for every developer IMHO. It was eye-opening to me and influence my attitude towards code totally. Actually the current version is named &lt;strong&gt;Code Complete 2&lt;/strong&gt;, althought it&amp;#8217; just a second edition of the original one. I guess, it&amp;#8217;s because of the amount of changes that were made throughout the update. &lt;ul&gt;
	&lt;li&gt;[Code Complete @ Amazon](http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1212926233&amp;amp;sr=1-1)&lt;/li&gt;
&lt;/ul&gt; &lt;strong&gt;Martin Fowler - Patterns of Enterprise Application Architecture
&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This one is rather technical. Technical in a sense, that it adresses non-functional requirements much more than DDD thus being much more relevant for architecture decisions and development. So you will find patterns like Adaptor, Gateway, Unit of Work, Plugin etc.&lt;/p&gt;

&lt;p&gt;In fact, this is not a beginner one but is rather an architects groundwork to build further knowledge and experience on. &lt;ul&gt;
	&lt;li&gt;[Patterns of Enterprise Application Architecture @ Amazon](http://www.amazon.com/Enterprise-Application-Architecture-Addison-Wesley-Signature/dp/0321127420/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1212926280&amp;amp;sr=1-1)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Reading "Domain Driven Design" again</title>
   <link href="http://www.olivergierke.de/2008/06/reading-domain-driven-design-again"/>
   <updated>2008-06-06T14:56:51+02:00</updated>
   <id>http://www.olivergierke.de/2008/06/reading-domain-driven-design-again</id>
   <content type="html">&lt;p&gt;Currently I read Eric Evans&amp;#8217; &amp;#8221;&lt;a href='http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=sr_1_1?ie=UTF8&amp;amp;amp;s=books-intl-de&amp;amp;amp;qid=1212756929&amp;amp;amp;sr=8-1'&gt;Domain Driven Design&lt;/a&gt;&amp;#8221; once again. Having done so 3 times already, I discovered a paragraph that reminded me of a &lt;a href='http://dlinsin.blogspot.com/2008/05/do-you-care-about-your-code.html'&gt;blog post&lt;/a&gt; written by David Linsin a while ago. Eric writes as follows: &lt;blockquote&gt;&quot;Well-written code ca be very communicative, but the message it communicates isnot guaranteed to be accurate. Oh, the reality of the **behaviour** caused by a section of code is inescapeable. but a method name can be ambiguous, misleading, or out of date compared to the internals of the method. The assertions in a test are rigorous, but the story told byvariable names and the organization of the code is not. Good programming style keeps this connection as direct as possible, but it is still an exercise in self-discipline. It takes fastidiousness to write code that doesn't just **do** the right thing but also **says** the right thing&quot;&lt;/blockquote&gt; This states that well written code is not about just to look nice in your IDE - it&amp;#8217;s about communicating. I e.g. favour an EmailAddress class over a simple String property in a User type cause this simple change distills so much more semantics.&lt;/p&gt;

&lt;p&gt;&amp;#8220;Domain Driven Design&amp;#8221; is a book you can actually start reading from the front if you have reached the end. From time to time I reiterate over the book just to find new influences or judge new knowledge I gained in projects. I can only recommend to take a glance at it. For those of you that shy digging through over 500 pages there is a distilled version at infoq.com that nicely wraps up the book.&lt;/p&gt;

&lt;p&gt;There are a few other books that influence my attitude towards coding a lot. Perhaps I&amp;#8217;ll find time to provide a Top 5 on my upcoming trip to Antwerp.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Switching language / SpringOne ahead</title>
   <link href="http://www.olivergierke.de/2008/06/switching-language-springone-ahead"/>
   <updated>2008-06-04T21:16:24+02:00</updated>
   <id>http://www.olivergierke.de/2008/06/switching-language-springone-ahead</id>
   <content type="html">&lt;p&gt;As I am concentrating on IT related posts more and more in this blog, I&amp;#8217;ll post in English from now on. Currently I&amp;#8217;ve not deciced whether to translate old posts. Depends on how I will find time.&lt;/p&gt;

&lt;p&gt;Next Tuesday I&amp;#8217;ll hit the road towards Antwerpen where this years SpringOne will take place. I really look forward to meet all the guys and soak up Spring spirit. I&amp;#8217;ll post about the sessions I attend.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Clueso - So sehr dabei</title>
   <link href="http://www.olivergierke.de/2008/06/clueso-so-sehr-dabei"/>
   <updated>2008-06-01T20:23:38+02:00</updated>
   <id>http://www.olivergierke.de/2008/06/clueso-so-sehr-dabei</id>
   <content type="html">&lt;p&gt;Zufrüh geflucht. Donnerstag abend schneite die Versandbenachrichtigung in meinen Strompostkasten. &amp;#8220;Dann ist die nie und nimmer morgen Mittag da.&amp;#8221;, dachte ich und war schon etwas geknickt. Als ich Freitag Mittag nach Hause kam, lag der Benachichtigungszettel im Briefkasten ;). Da ich es allerdings nicht erwarten konnte die Platte schon Freitag zu hören, gabs früh um 6 einfach noch die iTunes Edition. Da das Wochenende gespickt war mit 17 Stunden Autofahren, gab es reichlich Gelegenheit &amp;#8220;So sehr dabei&amp;#8221; zu sein und Eindrücke zu verarbeiten. Zeit, nach gefühltem 10 Mal hören ResumÃ© zu ziehen.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Das mittlerweile 4. Album von Clueso trägt wie oben schon erwähnt den Namen &amp;#8220;So sehr dabei&amp;#8221;. Die iTunes Edition enthält ein paar Audiokommentare zu diversen Songs und auch zum Album selbst. Spannend dabei ist, dass der Titel der Platte wohl langezeit vakant war. Der andere Kandidat war &amp;#8220;Augen zu&amp;#8221;, Track Nummer 2 des Albums. Meiner Meinung nach hat der falsche Titel das Rennen gemacht. Warum? Dazu später mehr.&lt;/p&gt;

&lt;p&gt;Grundsätzlich setzt &amp;#8220;So sehr dabei&amp;#8221; die Richtung fort, die über die letzten 3 Alben deutlich wurde. Ich kann mich noch erinnern, als ein Freund von mir beim Release von &amp;#8220;Gute Musik&amp;#8221; zu mir kam und meinte, die Platte wäre sehr untypisch für HipHop, eher ein Singer / Songwriter Ding. Wenn wir damals gewusst hätten, wohin sich diese Entwicklung steigert.&lt;/p&gt;

&lt;p&gt;&amp;#8220;So sehr dabei&amp;#8221; ist vor allem deshalb &amp;#8220;So sehr anders&amp;#8221; weil sie im Gegensatz zu ihren Vorgängern anders entstand. Geschrieben haben Clueso und einige andere Vertraute die Songs hauptsächlich im ostsächsischen Görlitz. Aufgenommen wurde die Scheibe mit der kompletten Band in einer spanischen Finca im Sommer letzten Jahres. Beim ersten Hören mag man allerdings nicht ganz glauben, dass dieses Album im Sommer enstanden ist. Inhaltlich und auch musikalisch wirkt vieles schwerer als in den Vorgängeralben.&lt;/p&gt;

&lt;p&gt;Doch genau hier findet sich die erste Stärke der Platte: die Songreihenfolge. Jedes mal, wenn man das Gefühl bekommt, nun hat man aber einen ziemlichen Brocken vorgesetzt bekommen, der erstmal zu verdauen ist, setzen Clueso und Band eine lockeren Kontrapunkt, der das Ganze wieder etwas auflockert. Klar, von der poppigen Frische von &amp;#8220;Weit weg&amp;#8221; hat man sich wieder etwas entfernt - mir isses recht ;). &amp;#8220;Wir woll&amp;#8217;n Sommer&amp;#8221;, &amp;#8220;Mitnehm&amp;#8217;&amp;#8221; und das seit dem Bundesvision Song Contest deutschlandweit bekannte &amp;#8220;Keinen Zentimeter&amp;#8221; sind eher die lockeren Songs. Dazwischen finden sich viele zum teil sehr kopflastige Stücke, die jedoch alle wohldurchdacht aneinandergereiht scheinen.&lt;/p&gt;

&lt;p&gt;Viele Stücke der Platte scheinen inhaltliche oder musikalische Nachfolger früherer Songs zu sein. &amp;#8220;Geisterstadt&amp;#8221; - einer meiner Favoriten - erinnert mich musikalisch sehr an &amp;#8220;Nacht unterwegs&amp;#8221;. Inhaltlich kann man ihn mit &amp;#8220;Bleib einfach hier&amp;#8221; in eine Reihe stellen.&lt;/p&gt;

&lt;p&gt;Kommen wir zur zweiten Stärke der Platte - die Band. Ich weiß gar nicht wie viele Konzerte ich mittlerweile Schon von den Jungs gesehen habe. Es ist einfach jedes Mal aufs neue ein Erlebnis, die 7 zu erleben. Es gibt nicht viele Musiker die in diesem Alter schon so viel Gefühl für das richtige Maß haben. Hier spielt nie jemand zu viel, jeder songdienlich und mut soviel Geschmack. Diese Energie auf CD zu pressen, haben schon viele versucht und die meisten sind daran gescheitert. Für mich ist eben dieses Experiment genau das, was die Platte von den vorherigen unterscheidt, das was &amp;#8220;So sehr dabei&amp;#8221; zu &amp;#8220;So sehr dabei&amp;#8221; macht.&lt;/p&gt;

&lt;p&gt;Was mir bei &amp;#8220;Weit weg&amp;#8221; ein wenig gefehlt hat, findet man auf dieser Platte wieder verstärkt. Kleine versteckte Ideen, Witzeleien oder halt überhaupt Sachen, die erst beim 4. oder 5. Hören auffallen. Sei es das leise 50Hz Brummen auf der Akustikgitarre in &amp;#8220;Barfuss&amp;#8221; (zu hören nach den ersten paar Akkorden im Intro - Kopfhörer und schön aufdrehen&amp;#8221;, Philips Tastengeräusche im Intro zu &amp;#8220;Augen zu&amp;#8221;, Pauls Arschbombe nach &amp;#8220;Wir woll&amp;#8217;n Sommer&amp;#8221;, Philips 5/8tel Outro aus Geisterstadt.&lt;/p&gt;

&lt;p&gt;Insgesagt ist &amp;#8220;So sehr dabei&amp;#8221; eine konsequente Platte. Konsequent in Bezug auf die musikalische Entwicklung, konsequent aber auch in Bezug auf den Faktor Pop, der mit Veranstaltungen wie dem Bundesvision Song Contest natürlich auch vermehrt Einzug in die musikalische Welt von Clueso und Band hält. &amp;#8220;Keinen Zentimeter&amp;#8221; und &amp;#8220;Mitnehm&amp;#8221; sind genau das - Pop - trotzdem eigenständig, echt und auf verdammt hohem Niveau. &amp;#8220;So sehr dabei&amp;#8221; ist keine einfachte Platte. Besonders Fans der neueren jüngeren Generation könnten evtl. etwas überfordert sein angesichts der textlichen und musikalischen Tiefe. Sehen wir das halt als Herrausvorderung und Chance ;).&lt;/p&gt;

&lt;p&gt;Einziger Fehler der Platte ist meiner Meinung nach, dass sie nicht &amp;#8220;Augen zu&amp;#8221; heißt. Ich finde, dass dieser Song ein Spiegelbild der Scheibe ist. &amp;#8220;Bandlastige&amp;#8221; Strophen, 4 to the floor im Refrain, zum Schluss läuft das ganze zusammen. Auch textlich einer der intensivsten Stücke des Albums. Also - ab, Augen zu, weit weg mit Text &amp;#38; Ton und Guter Musik.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Spass mit Maven Archetypes</title>
   <link href="http://www.olivergierke.de/2008/04/spass-mit-maven-archetypes"/>
   <updated>2008-04-22T17:37:13+02:00</updated>
   <id>http://www.olivergierke.de/2008/04/spass-mit-maven-archetypes</id>
   <content type="html">&lt;p&gt;Wir führen in der &lt;a href='http://www.synyx.de' target='_blank' title='Synyx GmbH &amp;amp; Co. KG'&gt;Firma&lt;/a&gt; nach und nach &lt;a href='http://www.docbook.org' target='_blank' title='Docbook'&gt;Docbook&lt;/a&gt; als Dokumentationsstandard ein. Mit &lt;a href='http://docs.codehaus.org/display/MAVENUSER/Docbkx+Maven+Plugin' target='_blank' title='Dokumentation zu docbkx'&gt;docbkx&lt;/a&gt; steht auch ein Plugin für unser Buildsystem &lt;a href='http://maven.apache.org/' target='_blank' title='Maven'&gt;Maven&lt;/a&gt; zur Verfügung. Nachdem ich die letzte Woche das Synyx CI in ein XSLT Stylesheet gegossen hatte, versuchte ich aus dem Proof of Concept Maven Projekt einen Archetype zu machen.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Archetypes sind Projektvorlagen in Maven mit denen man bei einem Projektstart on the fly eine Ordnerstruktur generieren und Konfigurationsfiles vorerzeugen kann. Dies verringert den Aufwandand die Infrastruktur einzurichten am Anfang eines Projektes erheblich.&lt;/p&gt;

&lt;p&gt;Ein Archetype ist selbst wiederum ein Mavenprojekt, in dem die für ein neues Projekt notwendigen Dateien an eine Bestimmte Stelle im Archetypeprojekt gelegt werden und ein Archetypedeskriptor namens &lt;code&gt;archetype.xml&lt;/code&gt; im META-INF abgelegt werden muss. Soweit die Dokumentation die &lt;a href='http://maven.apache.org/guides/mini/guide-creating-archetypes.html' target='_blank' title='Dokumentation zu Maven Archetypes'&gt;hier&lt;/a&gt; zu finden ist.&lt;/p&gt;

&lt;p&gt;Nun will das Archetype Plugin von Maven allerdings in den bereitgestellten Dateien typische Mavenplatzhalter wie &lt;code&gt;${version}&lt;/code&gt; durch Parameter ersetzen, die man beim initialisieren des neuen Projektes mitgibt. Es war nun schon nicht einfach herauszufinden, wie ich Maven aber dazu bringe diese Platzhalter einfach Platzhalter sein zu lassen. Nach einer Weile googlen fand ich dann heraus, dass das Dollarzeichen einfach escaped werden muss (&lt;code&gt;\${version}&lt;/code&gt;). Dies funktioniert aber nur ab Maven 2.0.8.&lt;/p&gt;

&lt;p&gt;Nachdem diese Hürde genommen war musste ich &lt;a href='http://velocity.apache.org/' target='_blank' title='Velocity'&gt;Velocity&lt;/a&gt; (was Maven benutzt um diese Platzhalter zu ersetzen) nur noch ausreden die TrueType Fontfiles für unsere Hausschrift zu parsen. Das Problem: für den Archetypedeskriptor gibt es weder DTD noch ein XSD. In den &lt;a href='http://www.nabble.com/filtering-of-archetype-resources-td15579593s177.html' target='_blank' title='Nabble Forum zum Them Resourcen filtern in Maven Archetypes'&gt;Untiefen des Nabble Forums&lt;/a&gt; stieß ich dann auf den Hinweis, das Attribut &lt;code&gt;filtered=&amp;quot;true&amp;quot;&lt;/code&gt; in den &lt;code&gt;&amp;lt;resource /&amp;gt;&lt;/code&gt; Elementen würde genau dies bewerkstelligen.&lt;/p&gt;

&lt;p&gt;Was ihr jetzt hier in knapp 5 Minuten gelesen habt, hat mich locker 3 Stunden gekostet^^. Jaja, Dokumentation ist manchmal eben doch hilfreich ;).&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Trac 0.10.3 auf MySQL</title>
   <link href="http://www.olivergierke.de/2008/04/trac-0103-auf-mysql"/>
   <updated>2008-04-21T15:59:47+02:00</updated>
   <id>http://www.olivergierke.de/2008/04/trac-0103-auf-mysql</id>
   <content type="html">&lt;p&gt;Ich habe mir bei meinem &lt;a href='http://www.synyx.de'&gt;Arbeitgeber&lt;/a&gt; für ein paar kleinere Projekte ein &lt;a href='http://trac.edgewall.org'&gt;Trac&lt;/a&gt; eingerichtet, das gegen eine &lt;a href='http://www.mysql.com/'&gt;MySQL&lt;/a&gt; Datenbank läuft. Das ganze macht besonders im Zusammenspiel mit &lt;a href='http://www.eclipse.org/mylyn/'&gt;Mylyn&lt;/a&gt; großen Spaß. Gestern fiel mir jedoch auf, dass ein paar der vorbereiteten Ticketqueries nicht funktionierten. Angeblich sei der Query falsch.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Nach kurzer Recherche stieß ich auf einige die &lt;a href='http://groups.google.com/group/trac-users/browse_thread/thread/bf57366c435e57b5/5f7900106c34f5d5?lnk=gst&amp;amp;q=ticket+mysql#5f7900106c34f5d5'&gt;das gleiche Problem&lt;/a&gt; hatten. Es handelt sich wohl um einen &lt;a href='http://trac.edgewall.org/ticket/4387'&gt;known Bug&lt;/a&gt;, der mit Release 0.10.4 behoben sein wird. Denjenigen die - wie ich - nicht so einfach auf diese Version upgraden können, sei geraten einfach die einfachen Hochkommata um Vorkommen von &lt;code&gt;$User&lt;/code&gt; in den Queries zu entfernen. Dann tut alles wieder wie erwartet.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Spring Webinar</title>
   <link href="http://www.olivergierke.de/2008/03/spring-webinar"/>
   <updated>2008-03-10T20:46:03+01:00</updated>
   <id>http://www.olivergierke.de/2008/03/spring-webinar</id>
   <content type="html">&lt;p&gt;Nächsten Dienstag (18.03.08) werde ich über den IRC des Forums &lt;a href='http://www.tutorials.de' target='_blank' title='Tutorials.de'&gt;tutorials.de&lt;/a&gt; ein Minitutorial zu Thema &amp;#8220;Leichtgewichtige JavaEE Entwicklung mit Spring&amp;#8221; halten. Der Code basiert zum Großteil auf dem &lt;a href='http://www.synyx.de/de/galleries/download/schulungen/j2ee-entwicklung-mit-spring-beispielcode.zip' target='_blank' title='Beispielcode zum Webinar'&gt;Beispielcode&lt;/a&gt; meines Vortrages bei der Java User Group Karlsruhe.&lt;/p&gt;

&lt;p&gt;Nähere Informationen zum Vortrag gibts &lt;a href='http://http://www.tutorials.de/forum/java-technology-webconferences/306938-18-03-2008-21-00-uhr-java-entwickler-chat-zum-thema-lightweight-javaee-mit-spring.html' target='_blank' title='Informationen zum Spring Webinar'&gt;hier&lt;/a&gt;.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Agim Emruli - Spring WebFlow</title>
   <link href="http://www.olivergierke.de/2008/03/agim-emruli-spring-webflow"/>
   <updated>2008-03-03T18:30:33+01:00</updated>
   <id>http://www.olivergierke.de/2008/03/agim-emruli-spring-webflow</id>
   <content type="html">&lt;p&gt;&lt;a href='http://www.agimemruli.de/'&gt;Agim&lt;/a&gt; schloss die Vortragsreihe mit einer Präsentation zu &lt;a href='http://www.springframework.org/webflow'&gt;Spring WebFlow&lt;/a&gt; und Spring Faces. Zu Beginn stellte er die zentralen Konuepte Flow und Conversation vor und ging im weiteren auf den Flow scoped &lt;code&gt;PersistenceContext&lt;/code&gt; ein, der Persistenzkontexte an einen Flow bindet und somit unnötiges mergen von Domänenklassen an eine Datenbanksession vermeidet, dadurch aber das Risiko erhöht Probleme mit dem Optimistic Locking zu bekommen.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Spring Faces ist ein JSF Integration für Spring WebFlow. Diese erlaubt die nahtlose Integration von JSF Komponenten in Spring WebFlow. Abschließend gab Agim noch Best Practices beim Arbeiten mit beiden Frameworks preis.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Erich Eichinger - Spring .NET</title>
   <link href="http://www.olivergierke.de/2008/03/erich-eichinger-erich-eichinger-springnet"/>
   <updated>2008-03-03T17:30:16+01:00</updated>
   <id>http://www.olivergierke.de/2008/03/erich-eichinger-erich-eichinger-springnet</id>
   <content type="html">&lt;p&gt;Spring ist nicht nur im Javaumfeld beliebt sonder erfreut sich auch in .NET Umgebungen steigendere Beliebtheit. &lt;a href='https://www.xing.com/profile/Erich_Eichinger'&gt;Erich&lt;/a&gt; stellte den aktuellen Stand des .NET Ports von Spring vor. Der aktuelle Funktionsumfang des Projekts kann ungefähr mit dem Stand von Spring 1.2 allerdings mit Namespace Support gleichgesetzt werden. Erfahrenen Springanwender sollten sich also ohne große Mühe in &lt;a href='http://www.springframework.net/'&gt;Spring .NET&lt;/a&gt; zurechtfinden.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Spring .NET beschränkt sich allerdings nicht nur auf den Port bereits existierender Funktionalität aus der Java Version von Spring. Mit der Spring Expression Language (SpEL) entstehen auch interessante Features die wohl früher oder später auch auf die Java Plattform protiert werden. Mit der SpEL lassen sich zum Beispiel Exceptionübersetzungen und Retrymechanismen in DSL Manier formulieren:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;on exception is ConcurrentModificationException retry 3x delay 1s&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Insgesamt ein recht spannender Vortrag der wieder einmal deutlich macht, wie gut Spring unterschiedliche Technologien und Plattformen abstrahiert.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Arjen Poutsma - Spring WebServices</title>
   <link href="http://www.olivergierke.de/2008/03/arjen-poutsma-spring-webservices"/>
   <updated>2008-03-03T16:15:54+01:00</updated>
   <id>http://www.olivergierke.de/2008/03/arjen-poutsma-spring-webservices</id>
   <content type="html">&lt;p&gt;&lt;a href='http://blog.springframework.com/arjen/'&gt;Arjen&lt;/a&gt; stellte mit &lt;a href='http://www.springframework.org/spring-ws'&gt;Spring WebServices&lt;/a&gt; ein WebService Framework vor, dass explizit den dokumentgetriebenen Contract-First Ansatz addressiert. Hierbei beschränkt man sich jedoch darauf die Messages als XSD zu beschreiben. Das verfassen von WSDL Dateien wird überflüssig. Ebenfalls ist es nicht nötig Stubklassen generieren zu lassen.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Arjen zeigte anhand eines kleines Hotelbuchungsbeispiels die grundätzliche Vorgehensweise und deutete die verschiedenen Integrationsmechanismen an (DOM API oder Object XML Mapping.&lt;/p&gt;

&lt;p&gt;Die Dokumentenorientierung und vor allem der Contract-First Ansatz sorgen insbesondere in heterogenen Umgebungen für weitreichendere Kompatibiltät als dies bei Code-First Ansätzen der Fall ist.&lt;/p&gt;

&lt;p&gt;Zum Schluss gab Arjen noch einen Einblick in das kommende 1.5 Release. Dieser addressiert vor allem verschiedene Transportmechanismen wie JMS. Auch etwas extravagante Lösungen wie WebServices über SMTP wurde angedeuted. Ohne angeschaltete Validierung, die evtl. auftretenden Spam ausfiltert sollte sowas jedoch wahrscheinlich nicht in Betrieb genommen werden ;)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Mike Wiesner - Spring Security</title>
   <link href="http://www.olivergierke.de/2008/03/mike-wiesner-spring-security"/>
   <updated>2008-03-03T14:45:55+01:00</updated>
   <id>http://www.olivergierke.de/2008/03/mike-wiesner-spring-security</id>
   <content type="html">&lt;p&gt;&lt;a href='http://www.mwiesner.com/'&gt;Mike&lt;/a&gt; stellte dann das aktuelle M2 Release von &lt;a href='http://acegisecurity.sourceforge.net/'&gt;Spring Security&lt;/a&gt; vor. Hier ging er sehr detailliert auf den in M1 eingeführten Namespace ein, der die Konfiguration des Frameworks erheblich vereinfacht. Die auf der Standard Bean Konfiguration basierende Konfiguration war unheimlich umfangreich und ein Kritikpunkt des 1.x Release. Die Dokumentation des Namespaces war Hauptinhalt des M2 Releases.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Insgesamt ist durch den Namespace die Konfiguration erheblich kürzer und - IMHO noch wichtiger - wesentlich sprechender geworden. Mike stellte einzelne XML Elemente im Detail vor und bot damit mit seinen Folien einen ersten Draft der für die finale Version angekündigte Doku. Abschließend zeigte Mike noch die Verwendung der &lt;code&gt;&amp;lt;authz:... /&amp;gt;&lt;/code&gt; Taglibrary vor und gab einen kurzen Einblick in den manuellen Zugriff auf Authentifikationsdaten.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Jürgen Höller - Spring 2.5</title>
   <link href="http://www.olivergierke.de/2008/03/jurgen-holler-spring-25"/>
   <updated>2008-03-03T12:25:11+01:00</updated>
   <id>http://www.olivergierke.de/2008/03/jurgen-holler-spring-25</id>
   <content type="html">&lt;p&gt;Als nächstes gab &lt;a href='http://blog.springsource.com/main/author/juergenh/'&gt;Jürgen Höller&lt;/a&gt; Einsichten in neue Features von &lt;a href='http://www.springframework.org'&gt;Spring 2.5&lt;/a&gt;. Diese bauen zum Großteil auf Features von 2.0 auf und vereinfachen die Nutzung dieser. Dies betrifft vor allem die Unterstützung der Common Annotations (JSR-250) die auch in JavaEE Verwendung finden.&lt;/p&gt;

&lt;p&gt;Desweiteren bietet Spring 2.5 eine verstärkte Unterstützung für JavaEE Plattformen und vereinheitlicht die angebotenen APIs verschiedener Vendors. Für den IBM WebSphere Application Server zum Beispiel wird nun TransactionSuspension unterstützt.&lt;/p&gt;

&lt;p&gt;Im Bereich der angewandten AOP liegt in Spring 2.5 der Fokus auf dem Loadtime Weaving, zumindest hat sich in diesem Bereich am meisten getan. Mit &lt;code&gt;&amp;lt;context:load-time-weaver /&amp;gt;&lt;/code&gt; wählt Spring automatisch den zur Plattform passenden Loadtime Weaver aus und man kann damit transparent vom einer SE Umgebung in den Tomcat wechseln.&lt;/p&gt;

&lt;p&gt;Jürgen ging dann noch kurz auf die unterschiedliche Implementierungs- oder Anwendungsmechanismen von AOP ein. Der proxybasierte Ansatz, den Spring standardmäßig benutzt, sorgt zwar für einen minimalen Overhead, erlaubt jedoch sehr gezieltes Anwenden von Aspekten. Loadtime Weaving bietet hingegen Performancevorteile, birgt jedoch die Gefahr bei ungenauen PoincutDefinitionen unbeabsichtigt Klassen zu advisen.&lt;/p&gt;

&lt;p&gt;Im Kontext der Plattformen auf denen Spring eingsetzt wird erläuterte Jürgen dann noch, dass das Weavingkonzept Teil von JavaEE (insbesondere der JPA) ist und somit auf allen JavaEE Servern zur Verfügung steht. Spring ermöglicht es, diesen Mechanismus auf andere Anwendungsbereiche auszudehnen.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Eberhard Wolff - Spring Portfolio</title>
   <link href="http://www.olivergierke.de/2008/03/eberhard-wolff-spring-portfolio"/>
   <updated>2008-03-03T10:30:33+01:00</updated>
   <id>http://www.olivergierke.de/2008/03/eberhard-wolff-spring-portfolio</id>
   <content type="html">&lt;p&gt;Nach eine kurzen organisatorischen Einführung begann &lt;a href='http://jandiandme.blogspot.com/'&gt;Eberhard&lt;/a&gt; mit einem Ãœberblick über OSGi, das dynamische Komponentenmodell für Java. Danach stellte er &lt;a href='http://www.springframework.org/osgi'&gt;Spring OSGi&lt;/a&gt; im Detail vor, das einem die Arbeit mit OSGi etwas erleichtert und die Anwendung völlig unabhängig von OSGi APIs zu prgrammieren. Das Deklarieren von Services, die für andere Bundles sichtbar sein sollen geschieht hierbei wie gewohnt mit einem Spring Namespace.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Als nächstes stellte Eberhard Spring Integration vor, das hilfreiche Unterstützung für EAI Projekte bietet. Er ging auf Kernabstraktionen ein und stellte verschiedene Konfigurationsmechanismen (Plain Java, XML mit Beans, XML mit Namespaces, Annotationen) vor. Interessant dabei war für mich insbesondere, dass Spring Subprojekte alle auf dem gleichen grundsätzlichen Programmiermodell aufsetzen: grundsätzliche Abstraktionen über Interfaces, diverse Basisimplemenierungen für einfache Fälle und die Konfigurationsmöglichkeiten, die ich oben bereits erwähnt hatte.&lt;/p&gt;

&lt;p&gt;Als letztes bekamen wir erste Eindrücke in SpringSource Tools. Die Spring Application Managements Suite erlaubt das monitoring von Springanwendungen und liefert Informationen zum ApplicationContext, TransactionManagers usw. Die Spring ToolSuite selbst ist eine auf Eclipse basierende IDE, die zum einen aus der &lt;a href='http://www.springide.org/blog/'&gt;SpringIDE&lt;/a&gt; bekannte Unterstützung für Springanwendungen bietet. Darüber hinaus besteht eine verstärkte Integration von Mylyn (das jedoch auch in der reinen Eclipse IDE integriert ist). Die Suite wird darüber hinaus mit Tutorials und weiteren Hilfen und Demos angereichert.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Spring Release Party</title>
   <link href="http://www.olivergierke.de/2008/03/spring-release-party"/>
   <updated>2008-03-03T08:36:11+01:00</updated>
   <id>http://www.olivergierke.de/2008/03/spring-release-party</id>
   <content type="html">&lt;p&gt;Gleich gehts auf nach Stuttgart zur Spring Release Party. Diesmal findet die Party &lt;strong&gt;nach&lt;/strong&gt; dem Release von Spring 2.5 vor etwa 4 Monaten. Bei der &lt;a href='http://www.jugs.de/protokolle2006.html#300306'&gt;letzten Party&lt;/a&gt; war man ja etwa 6 Monate zu früh ;). Der Event scheint sich zu einem festen Termin bei Spring Releases zu etablieren.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Neue Four Sided Cube Platte am 8.2.2008</title>
   <link href="http://www.olivergierke.de/2008/02/neue-four-sided-cube-platte-am-822008"/>
   <updated>2008-02-01T22:03:05+01:00</updated>
   <id>http://www.olivergierke.de/2008/02/neue-four-sided-cube-platte-am-822008</id>
   <content type="html">&lt;img alt='CD Teaser 4' src='http://www.olivergierke.de/wordpress/wp-content/uploads/2008/02/cdteaser_datum.jpg' /&gt;
&lt;p&gt;Was lange währt wird endlich gut. Nächsten Freitag kommt unsere neue LP. Viel Arbeit steckt in dem kleinen Silberling aber auch jede Menge Spass, Leidenschaft und eine verdammt coole Zeit.&lt;/p&gt;

&lt;p&gt;Ordern könnt ihr die Platte über die &lt;a href='http://www.foursidedcube.de'&gt;Webseite&lt;/a&gt;. Im Rhein-Neckar Raum werden wohl auch die Großhandelsketten versorgt.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Googles Android</title>
   <link href="http://www.olivergierke.de/2007/11/googles-android"/>
   <updated>2007-11-14T12:04:43+01:00</updated>
   <id>http://www.olivergierke.de/2007/11/googles-android</id>
   <content type="html">&lt;p&gt;Vor ein paar Tagen hat &lt;a href='http://www.google.de' target='_blank' title='Google'&gt;Google &lt;/a&gt;ein SDK für sein Handybetriebssystem Android veröffentlicht. Gerade eben hatte ich ein wenig Zeit mal damit rumzuzspielen. Der erste Eindruck ist echt klasse&amp;#8230;&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Ich hatte bereits in ein paar Projekten mit J2ME Erfahrung machen müssen und dabei festgestellt das Handyentwicklung eher Handygefrickel ist. Das Entwickeln auf Basis einer abgespekten JavaSE ist mühsam und zieht eine Reihe zum Teil sehr hässlicher Workarounds nach sich.&lt;/p&gt;

&lt;p&gt;Android basiert auf Dalvik, einer virtuellen Maschine, die der Java VM von Sun sehr ähnlich ist. Aus lizenzrechtlichen Gründen meidet Google jedoch das Erwähnen von &amp;#8220;Kompatibilität zu Java&amp;#8221;. Der Clou an der Sache ist, dass Entwickler trotzdem Javacode schreiben und der vom Javacompiler generierte Bytecode einfach durch einen zweiten Compileschritt auf Darwin lauffähig gemacht wird. Das heißt im Klartext: einfach Java entwickeln (ja, auch Generics, Java 5 For Schleifen usw.) - den rest erledigt das Android SDK oder für diejenigen, die es ganz elegant mögen das Eclipseplugin.&lt;/p&gt;

&lt;p&gt;Wer mag kann sich ja mal das &lt;a href='http://code.google.com/android/intro/tutorial.html' target='_blank' title='Android tutorial'&gt;Tutorial&lt;/a&gt; anschauen. Es liefert einen guten Ãœberblick über die Technologie und das Arbeiten mit dem SDK.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>13949712720901ForOSX</title>
   <link href="http://www.olivergierke.de/2007/11/13949712720901forosx"/>
   <updated>2007-11-05T13:43:44+01:00</updated>
   <id>http://www.olivergierke.de/2007/11/13949712720901forosx</id>
   <content type="html">&lt;p&gt;&amp;#8220;Hö, wie bitte?&amp;#8221;, dachte ich, als ich diese Zeichenkette im &lt;a href='http://www.retokiefer.com/archives/13949712720901forosx/'&gt;Blog eines Bekannten&lt;/a&gt; las. Hintergrund ist folgender: Auf dem aktuellen Apple Betriebssystem &amp;#8220;Leopard&amp;#8221; gibt es noch keine Java 6. Was für den Ottonormal MacUser (gibt es die überhaupt ? ;) kein großes Problem darstellt, ist für Entwickler relativ problematisch. Die Zeichenkette oben ist nun eine Art Web 2.0 Unterschriftensammlung, Apple dazu zu bewegen recht zeitnah ein Java 6 für Leopard bereitzustellen. Hier also meine Unterschrift&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Four Sided Cube mit neuer Hompage</title>
   <link href="http://www.olivergierke.de/2007/10/four-sided-cube-mit-neuer-hompage"/>
   <updated>2007-10-13T18:00:54+02:00</updated>
   <id>http://www.olivergierke.de/2007/10/four-sided-cube-mit-neuer-hompage</id>
   <content type="html">&lt;p&gt;Wie ihr &lt;a href='http://www.foursidedcube.de'&gt;hier&lt;/a&gt; sehen könnt haben Four Sided Cube eine neue Webseite. Darauf zu finden ist unter anderem das Recordingtagebuch zum 4. Album, was noch dieses Jahr erscheinen wird. Ich werde da wohl so alle 2 Tage Stories und nette Anekdoten des Recordinggeschehens festhalten. Schaut vorbei&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Domainumzug</title>
   <link href="http://www.olivergierke.de/2007/09/domainumzug"/>
   <updated>2007-09-27T15:56:22+02:00</updated>
   <id>http://www.olivergierke.de/2007/09/domainumzug</id>
   <content type="html">&lt;p&gt;Wie ihr vielleicht bemerkt habt, läuft die Seite jetzt unter www.olivergierke.de. Der Grund ist ein sehr simpler - ich werde morgen heiraten und den Namen meiner Frau annehmen. Ansonsten habe ich mich endlich mal bequemt, eine aktuelle Worpressversion einzuspielen. ;) Muss los, es gibt noch viel zu tun&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Neues von Four Sided Cube</title>
   <link href="http://www.olivergierke.de/2007/08/neues-von-four-sided-cube"/>
   <updated>2007-08-12T13:31:05+02:00</updated>
   <id>http://www.olivergierke.de/2007/08/neues-von-four-sided-cube</id>
   <content type="html">&lt;p&gt;Wie ihr bestimmt schon oben bei den Fotos gesehen habt, gibt es endlich aktuelle Bandfotos von Four Sided Cube. Wir hatten an einem wettertechnisch durchwachsenen Tag viel Spaß am Neckarsteg in Ladenburg. Weitere Arbeiten des Fotografen Jan findet ihr bei &lt;a href='http://www.flickr.com/photos/90861917@N00/'&gt;Flickr&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Die neuen Bilder sind quasi Startschuss für einen neuen Abschnitt FSC. Wir spielen am 9.9. als Headliner beim Ladenburger Altstadtfest, werden dort schon ein paar neue Songs präsentieren und wahrscheinlich bis dahin auch eine überarbeitete Webseite haben. Danach gehts ins Studio um die Arbeit der letzten Monate festzuhalten. Wenn alles klappt gibt es dann zum diesjährigen FESTival eine neue FSC Scheibe.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Dixie Chicks - Shut up and sing</title>
   <link href="http://www.olivergierke.de/2007/08/dixie-chicks-shut-up-and-sing"/>
   <updated>2007-08-12T13:24:58+02:00</updated>
   <id>http://www.olivergierke.de/2007/08/dixie-chicks-shut-up-and-sing</id>
   <content type="html">&lt;p&gt;Ein spontaner Kinobesuch gestern Abend führte mich in den Film &amp;#8220;Dixie Chicks - Shut up and sing&amp;#8221;. Es ist die Geschichte der erfolgreichsten Frauenband weltweit, der Dixie Chicks. Leadsängerin Natalie Maines äußerte am 10. März 2003 bei einem Konzert in London während einer Ansage folgenden Satz: &lt;blockquote&gt;**&quot;Just so you know, weâ€™re on the good side with yâ€™all. We do not want this war, this violence, and weâ€™re ashamed that the President of the United States is from Texas.&quot; &lt;cite&gt;- &lt;/cite&gt;**&lt;cite style='font-style: normal'&gt;Natalie Maines&lt;/cite&gt;&lt;/blockquote&gt; Darauf folgte eine hexenjagdähnliche Hetzkampagne in ganz Amerika. CDs wurden vernichtet, die Countryradiosender boykottierten die Band komplett, es kam sogar zu Morddrohungen gegenüber Natalie.&lt;/p&gt;

&lt;p&gt;Der Film schildert eindrucksvoll die faschistoide Meinungsmache der amerikanischen Gesellschaft, wie die Band damit umgeht, sich nicht mundtot machen lässt und die Geschehnisse in ihrem 2006 erschienenen Album &amp;#8220;Taking the long way&amp;#8221; verarbeitet. Höhepunkt der Platte ist wohl der Song &amp;#8220;Not ready to make nice&amp;#8221;, der die Geschehnisse emotional dokumentiert und mit 2 Grammys ausgezeichnet wurde.&lt;/p&gt;

&lt;p&gt;Der Film läuft aktuell in deutschen Kinos, das Video sowie die Liveperformance bei den Grammyawards (äußerst sehenswert) habe ich unten verlinkt. &lt;ul&gt;
	&lt;li&gt;[Webseite zum Film](http://www.shutupandsing.de/)&lt;/li&gt;
	&lt;li&gt;[&quot;Not ready to make nice&quot; Musikvideo @ YouTube](http://www.youtube.com/watch?v=fwc5YSAc-7g)&lt;/li&gt;
	&lt;li&gt;[&quot;Not ready to make nice&quot; Live performance bei den Grammy Awards @ YouTube](http://www.youtube.com/watch?v=o-lJu5ibAM8)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Drum Clinic mit Ralf Gustke, Wolfgang Haffner und Felix Lehmann im Rock Shop Karlsruhe</title>
   <link href="http://www.olivergierke.de/2007/04/drum-clinic-mit-ralf-gustke-wolfgang-haffner-und-felix-lehmann-im-rock-shop-karlsruhe"/>
   <updated>2007-04-28T20:17:57+02:00</updated>
   <id>http://www.olivergierke.de/2007/04/drum-clinic-mit-ralf-gustke-wolfgang-haffner-und-felix-lehmann-im-rock-shop-karlsruhe</id>
   <content type="html">&lt;p&gt;Grad eben bin ich zurück von einem Drumworkshop mit den 3 oben genannten Herren. Gute 2 Stunden deilkates Drumming gabs im Rockshop Karlsruhe auf die Ohren. Ausserdem diese oder jene kleine Anekdote.&lt;!--more--&gt;Als erstes betrat Felix Lehrmann die Bühne und spielte zu Rivo Drei Playbacks, die mit schon sehr bekannt waren, dem großen Restlichen Publikum allerdings schon das staunen ins Gesicht zauberten. Ja, der ist erst 22 ;).&lt;/p&gt;

&lt;p&gt;Nach ihm kam Wolfgang Haffner auf die Bühne, der wohl so eine Art Kopf der Truppe war. Zumindest erzählte er von einer sehr entspannten Workshopwoche. Die Clinic in Karlsruhe war wohl die letzte der Tour und alle 3 schienen das Ende arg zu bedauern. Lustig waren 2 Anekdoten die er erzählte: das neue Jazzride, was er mit der Firma Meinl zusammen entworfen hat, trägt wohl den Namen &amp;#8220;Jazz Club Ride&amp;#8221; aufgrund seiner großen liebe zum Nürnberger Fußballverein. Da seine Yamaha Signature Snare auch wegen dieser Liebe in rot schwarz gehalten ist, lässt den Eindruck aufkommen er plane ein komplettes Drumset für den Verein - vielleicht sollte er mal nach einer Finanzspritze fragen ;).&lt;/p&gt;

&lt;p&gt;Die zweite lustige Sache, die mir in Erinnerung geblieben ist war ein Kommentar zu den Musikern einer Band in der er trommelt. Die seien alle noch ganz jung, touren wohl mit Madonna und werden &amp;#8220;mit Sicherheit nochmal weltberühmt&amp;#8221;. Nunja ^^.&lt;/p&gt;

&lt;p&gt;Was mich bei Ralfs Performance erwartet konnte ich mir ungefähr denken, da ich seine &amp;#8220;World of Groove&amp;#8221; DVD im Schrank hab. Ich mag seine Art zu spielen sehr, obwohl er mir heute vieles zuviel zugespielt hat. Gerade im Abschlussteil, in dem die 3 zusammen trommelten, war er doch eindeutig der dominierende Part. Aber hey, er bekommt sicher sonst nicht so oft die Gelegenheit, Soli vor Publikum zu zocken.&lt;/p&gt;

&lt;p&gt;Alles in allem ein entspannter Nachmittag, auch wenn es nach einer Stunde arg heiß war im Foyer. Auf der Suche nach einer neuen Hihat hat mich Ralfs &amp;#8220;Meinl 13&amp;#8221; Fast HiHat&amp;#8221; sehr angesprochen. Sehr chrisper sound, werd ich auf jeden Fall mal anspielen&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>AOP Logging ist kein Logging - oder wie IT Fachzeitschriften erheblich nachlassen...</title>
   <link href="http://www.olivergierke.de/2007/04/aop-logging-ist-kein-logging-oder-wie-it-fachzeitschriften-erheblich-nachlassen"/>
   <updated>2007-04-03T13:27:51+02:00</updated>
   <id>http://www.olivergierke.de/2007/04/aop-logging-ist-kein-logging-oder-wie-it-fachzeitschriften-erheblich-nachlassen</id>
   <content type="html">&lt;p&gt;Als ich mir vor ein paar Tagen die aktuelle JavaSpektrum zugelegt habe, sah der Inhalt ganz vielversprechend aus. Modelbasierte Entwicklung (hieß es bisher nicht immer modellgetriebene Entwicklung?), neues von AspectJ - die Themenliste klang gut. Nachdem ich dann allerdings den zweiten Artikel las, der mit der versprochenen Ãœberschrift relativ wenig zu tun hatte, kam schon eine Art Misstimmung auf. Ein Artikel, der angeblich die Arbeit mit den Eclipse WST dokumentieren sollte, entpuppte sich als kurzer Abriss über Spring, Axis und das Java Caching System. Für das WST blieben dann noch ein paar kurze Zeilen, die allerdings nicht mehr Information beinhalteten als die gemeinhin bekannten Eclipse Tutorials. Dann stieß ich (mal wieder) auf einen Fehler, der meiner Meinung nach penetrant übersehen wird&amp;#8230;&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Der Artikel über AspectJ ging natürlich auf die Grundlagen aspektorientierter Programmierung ein. Als Anwendungsbeispiel für AOP fällt in jedem Artikel eigentlich das Thema Logging. Was dabei immer verschwiegen wird ist, das mit &amp;#8220;Logging mit AOP&amp;#8221; nichts anderes gemeint ist als Tracing mit AOP. Das Pointcutmodell von AOP Implementierungen wie AspectJ oder Spring AOP bezieht sich sinnvollerweise auf Methodenaufrufe.&lt;/p&gt;

&lt;p&gt;Praktisch bedeutet das, das man mit AOP die Möglichkeit hat Methodenaufrufe abzufangen und Code vor der Ausführung der Methode, nach der Ausführung und im Falle einer Exception auszuführen. Und da liegt auch schon der Hase im Pfeffer begraben. Ich weiß nicht, wie es euch geht, aber in meinem Quellcode stehen Logausgaben nicht nur am Anfang oder Ende einer Methode bzw. im Catchblock. Detaillierteres Logging für den Debugmodus (z.B. in verschiedenen If-Zweigen) ist schlichtweg nicht mit AOP möglich.&lt;/p&gt;

&lt;p&gt;Warum diesen Fakt niemand bei seinen Artikeln im Netz oder in Fachzeitschriften klarstellt, bleibt mir schleierhaft. AOP Anfänger (zu denen ich mich auch noch zähle) verwirrt das ganze doch ein wenig&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Recordingworkshop an der Popakademie</title>
   <link href="http://www.olivergierke.de/2007/01/recordingworkshop-an-der-popakademie"/>
   <updated>2007-01-21T21:59:35+01:00</updated>
   <id>http://www.olivergierke.de/2007/01/recordingworkshop-an-der-popakademie</id>
   <content type="html">&lt;p&gt;Am vergangenen Wochenende fand wieder ein Seminarwochenende an der Popakademie statt. Ich hatte mich für den Aufbauworkshop &amp;#8220;Recording&amp;#8221; angemeldet und freute mich auf ein spannendes Wochenende im Studio. Dozent war Marcus Thiel, freier Mitarbeiter an der Popakademie, Toningeneur und Produzent.&lt;!--more--&gt;Der Samstag begann gemütlich mit einer Vorstellungsrunde und Tasse Kaffee. Danach stellte Marcus nochmal verschiedene Mikrofontypen vor, erläuterte Einsatzbereiche und Preissegmente. Nach dem Essen probierten wir die einzelnen Mikros dann praktisch aus um preisliche sowie bauartbedingte Unterschiede zu erhören. Zum Ende hin besprachen wir kurz Grundlagen von Dynamikprozessoren und Effekten, ehe wir diese an dem &amp;#8220;Mannheim Song&amp;#8221; von Chris Cosmo wiederum praktisch erhören konnten. Der Song lag ungemischt im Logic und wir konnten die verschiedenen Mittelchen und Wege mal an sauber recordeten Spuren ausprobieren. Insgesamt bot der erste Teil für mich nicht wahnsinnig viel neues, hier und da konnte ich mir jedoch einen Trick abschauen.&lt;/p&gt;

&lt;p&gt;Der Sonntag begann ähnlich gemütlich wie der Samstag. Wir probierten verschiedene Mirkofonierungsarten an einer Bassdrum und Snaredrum. Auch hier gab es wieder kleine aber feine Aha Effekte. Spannender für mich wurde es dann als wir eigene Produktionen vorspielten und diskutierten. Hier gab es trotz des technisch hohen Levels gute Anregungen.&lt;/p&gt;

&lt;p&gt;Alles in allem ein angenehmes Wochende, dass mir sicherlich nicht vollkommen neues aufgezeigt hat. Allerdings ist es schon nett zu wissen, dass man mit seinem eingeschlagenen Weg, seinen selbst angeeigneten Techniken und Methodiken richtig liegt und insgesamt ein technisch und musikalisch hohes Level fährt. &lt;ul&gt;
	&lt;li&gt;[Popakademie](http://www.popakademie.de)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Joy Denalane zum Thema "Artist Development" @ Popakademie</title>
   <link href="http://www.olivergierke.de/2007/01/joy-denalane-zum-thema-artist-development-popakademie"/>
   <updated>2007-01-17T12:32:56+01:00</updated>
   <id>http://www.olivergierke.de/2007/01/joy-denalane-zum-thema-artist-development-popakademie</id>
   <content type="html">&lt;p&gt;Gestern war Joy zu Gast in der OpenHouse Reihe der Popakademie. Dort referieren bekannte Größen aus der Musikwelt über bestimmte Themen, ihre Ansichten, Eigenheiten und Erfahrungen. Leider fand die Veranstaltung nicht wie aus anderen OpenHouse Seminaren gewohnt um 19 Uhr statt sondern schon um 18 Uhr. So stand ich also fünf vor sieben vor einer verschlossenen Tür. Arrrgh&amp;#8230;&lt;!--more--&gt;Da ab und zu allerdings jemand aus dem Foyer kam, konnte ich wenigstens noch der Diskussionsrunde folgen. Das Thema drehte sich natürlich im groben um Joys Entscheidung auf dem aktuellen Album englisch zu singen, was für sie eine Entscheidung persönliche Entscheidung war. An den kommerziellen Erfolg ihres Erstlingswerks &amp;#8220;Mamani&amp;#8221; konnte &amp;#8220;Born and raised&amp;#8221; dadurch auch trotz eines für Soulalben verhältnismäßige hohen Charteinstieges nicht anknüpfen. Dass Joy und Four Music Labelchef Fitz Braum, der ebenfalls anwesend war, dies als okay ansahen macht durchaus einmal mehr die Sonderstellung eines Labels wie Four Music deutlich. Auch in (musik)wirtschaftlich schwierigen Zeiten, setzt das Label auf Kontinuität und artist development, womit wir den Kreis zum Vortragsthema wieder geschlossen hätten ;).&lt;/p&gt;

&lt;p&gt;Insgesamt immer wieder nett, mal Meinungen, Erfahrungen und kleine Anekdoten aus &amp;#8220;dem Inneren&amp;#8221; der Musikbranche zu hören zu bekommen. Joy ist nächste Woche Donnerstag anlässlich des Mannheimer Stadtjubiläums zu Gast in der Alten Feuerwache in Mannheim. &lt;ul&gt;
	&lt;li&gt;[www.joydenalane.de](http://www.joydenalane.de)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Vortrag - Komponentenbasierte Softwareentwicklung mit PHP</title>
   <link href="http://www.olivergierke.de/2007/01/vortrag-komponentenbasierte-softwareentwicklung-mit-php"/>
   <updated>2007-01-12T13:43:37+01:00</updated>
   <id>http://www.olivergierke.de/2007/01/vortrag-komponentenbasierte-softwareentwicklung-mit-php</id>
   <content type="html">&lt;p&gt;Gestern habe ich bei der PHP User Group Frankfurt einen Vortrag zum Thema &amp;#8220;Komponentenbasierte Softwareentwicklung mit PHP&amp;#8221; gehalten. Dabei habe ich das Dependency Injection Framework Garden vorgestellt und anhand eines Beispieldesigns unsere Weiterentwicklung des Frameworks und die generelle Arbeit mit Dependency Injection gezeigt. Die Vortragsfolien, sowie die Sourcen von Garden findet ihr auf der Webseite der PHPUG. &lt;ul&gt;
	&lt;li&gt;[PHP User Group Frankfurt](http://www.phpugffm.de)&lt;/li&gt;
	&lt;li&gt;[Komponentenbasierte Softwareentwicklung mit PHP](http://www.olivergierke.de/wordpress/wp-content/uploads/2007/01/oliver-schlicht-komponentenbasierte-softwareentwicklung-mit-php.pdf)&lt;/li&gt;
	&lt;li&gt;[Blogeintrag zum Thema](http://phpugffm.de/index.php/archives/126)&lt;/li&gt;
	&lt;li&gt;[Garden](http://garden.tigris.org)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>FESTival 2006 - neues von Four Sided Cube?</title>
   <link href="http://www.olivergierke.de/2006/12/festival-2006-neues-von-four-sided-cube"/>
   <updated>2006-12-01T18:02:01+01:00</updated>
   <id>http://www.olivergierke.de/2006/12/festival-2006-neues-von-four-sided-cube</id>
   <content type="html">&lt;p&gt;Am 23.12.2006 findet das alljährliche FESTival als Benefizveranstaltung für das Jugendzentrum Kiste in selbigem in Ladenburg. Diese Jahr sind neben Four Sided Cube die Bands Cages und OIDO mit von der Partie. Ich freu mich auf einen gemütlichen Gig am Tag vor Weihnachten.&lt;/p&gt;

&lt;p&gt;In Vorbereitung des Events arbeiten wir bereits seit etlichen Wochen an neuen Songs und werden wohl auch einige davon beim FESTival spielen. Es sind viele interessante Sachen dabei, vielleicht auch die ein oder andere Ãœberraschung ;) &lt;ul&gt;
	&lt;li&gt;[Webseite zum FESTival](http://festival.foursidedcube.de)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Mein Weg zu Spring</title>
   <link href="http://www.olivergierke.de/2006/10/mein-weg-zu-spring"/>
   <updated>2006-10-21T23:09:08+02:00</updated>
   <id>http://www.olivergierke.de/2006/10/mein-weg-zu-spring</id>
   <content type="html">&lt;p&gt;Mein erster Blogpost zum Thema Informatik. Während meines Studiums hat sich mein Interesse vor allem im Bereich Serveranwendungen mit Java entwickelt. Zum ersten kam ich damit während des Programmiermethodikpraktikums im Sommersemester &amp;#8216;05. Wir entwickelten eine Art Studenten- bzw. Tutoriumsverwaltung auf der Basis der EJB 2.1 und JBoss. Der technische Overhead den die Technolgie mit sich brachte erschlug meine Arbeitsgruppe und mich schon ziemlich. Da musste es etwas besseres geben&amp;#8230;&lt;!--more--&gt;Auf der Suche nach Alternativen lief mit das Buch &amp;#8220;J2EE Development without EJB&amp;#8221; von Rod Johnson über den Weg. Zum damaligen Zeitpunkt schon 1 Jahr alt, brachte das Buch eine Alternative zum EJB Stack als Democode mit sich. Was ich damals noch nicht wusste - dieses Stück Code hatte sich bereits zu einem Open Source Framework entwickelt: Spring.&lt;/p&gt;

&lt;p&gt;Auch wenn der Buchtitel nach polemischer Abrechnung klingt - er fasst eigentlich nur eine nüchterne Analyse des damaligen Standes der Technik zusammen. Der EJB2.1 Standard zog von der ersten Codezeile an einen riesigen Overhead nach sich und verlangte umständliches Implementieren einer Vielzahl von Interfaces, egal ob man überhaupt Features wie die physische Verteilung von Objekten auf verschiedenen Servern wirklich Nutzen wollte. Desweiteren musste man die Kommunikation zwischen Komponenten von Hand programmieren und verbrachte dadurch mehr Zeit damit, Infrastruktur zu programmieren, als Businesscode zu schreiben.&lt;/p&gt;

&lt;p&gt;Spring setzt dem einen komplett anderen Ansatz entgegen. Basierend auf Martin Fowlers Idee der Dependency Inversion / - Injection, übernimmt bei Spring ein Container die Instantiierung der Komponenten und &amp;#8220;injiziert&amp;#8221; ihnen abhängige Komponenten. Ein weiterer Vorteil ist, das die Komponenten selbst reine POJOs sind und nichts von ihrer Umgebung bzw. Spring wissen. Sie werden dadurch leichter testbar und in unterschiedlichen Infrastrukturen einsetzbar (Tomcat, JBoss, im RichClient etc.).&lt;/p&gt;

&lt;p&gt;Bei der Suche nach einer Basistechnologie für meine Bachelorarbeit fiel mein erster Gedanke sofort auf Spring. Die &amp;#8220;neue&amp;#8221; Art zu programmieren (DI-basiert) erfordert schon ein wenig Eingewöhnungszeit. Hat man das Prinzip jedoch, einmal verinnerlicht möchte man gar nicht mehr ohne ;). Hinzu kommt, dass Spring neben der BeanFactory (dem DI-Container) noch mit einer Reihe von dünnen Abstraktionslayern über viele weit verbreitete APIs und Technologien daher kommt und somit für viele Implementierungsfrage bereits eine Unterstützung bietet. In vielen Fällen reichen bereits 10 Zeilen Konfigurationscode und Spring erledigt den Rest. Um einen Webservice anzusprechen ist zum Beispiel nur ein WSDL Dokument und ein Interface nötig. Der Client arbeitet gegen das Interface, der Stub wird zur Konfigurationszeit von Spring generiert und dem Client per DI injiziert.&lt;/p&gt;

&lt;p&gt;Mit EJB 3.0 sei vieles einfacher geworden, argumentiert die EJB Gemeinde. Manche gehen sogar soweit zu meinen, Spring werde dadurch überflüssig. Was dabei oft vergessen wird, das EJB 3.0 eigentlich nur die technischen Gegebenheiten von Spring bzw. Hibernate vom Stand von Ende 2005 übernimmt und dabei sogar auf halber Strecke stehen bleibt. Es gibt zum Beispiel keine Konstruktorinjection, das Konfigurieren von Komponenten mittels Annotations macht sie wieder von der Infrastruktur abhängig. Desweiteren ist die DI auf EJB Komponenten beschränkt - in Spring kann man jedes POJO per DI verarbeiten. Auch das Konfigurieren von AOP ähnlichen Interceptoren per Annotations führt die Idee von AOP eigentlich ad absurdum - Aspekte will ich zentral verwalten und nicht wieder über sämtliche Komponenten im Code verteilen.&lt;/p&gt;

&lt;p&gt;Verglichen mit EJB 2.1 ist EJB 3.0 sicher ein Fortschritt. Doch EJB 2.1 war Ende der 90er. Verglichen mit aktuellen Technologien ist der EJB 3.0 Standard eigentlich schon wieder überholt, was vor allem an langen Releasezyklen bei Standardspezifikationen liegt. OpenSource Software, die von einer lebendigen Community lebt hat da die Nase schon vorn. Spring 2.0 ist vor kurzem entschieden und bringt viele Schritte nach vorn mit sich. Eine AspectJ Integration, erste Schritte in Richtung OSGi sowie zahlreiche kleine Verbesserungen hier und da.&lt;/p&gt;

&lt;p&gt;Für mich ist Spring eine flexible Variante Serveranwendungen mit Java zu bauen, da es einem Anbietet genau das zu benutzen, was man benötigt, kaum Einfluss auf den Code nimmt und an sich ein recht sauberes Design forciert. &lt;ul&gt;
	&lt;li&gt;[Springwebsite](http://www.springframework.org)&lt;/li&gt;
	&lt;li&gt;[Springbuch](http://www.amazon.de/Spring-Frameworks-f%fcr-die-Java-Entwicklung/dp/3898643654/sr=8-1/qid=1161463255/ref=pd_bbs_sr_1/028-5102242-3789349?ie=UTF8) von Eberhard Wolff&lt;/li&gt;
	&lt;li&gt;[What's new in Spring 2.0](http://static.springframework.org/spring/docs/2.0.x/reference/new-in-2.html)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Wallis Bird</title>
   <link href="http://www.olivergierke.de/2006/10/wallis-bird"/>
   <updated>2006-10-15T16:24:10+02:00</updated>
   <id>http://www.olivergierke.de/2006/10/wallis-bird</id>
   <content type="html">&lt;p&gt;Zum ersten Mal gehört hatte ich von Wallis Bird über Christian Vinne, einen Schlagzeuger von der Popakademie Mannheim, den ich über ein paar Ecken kenne. Er hätte da ein paar Gigs mit so einer irischen Sängerin gespielt. Ahja, okay&amp;#8230; Als Rainer, Sänger meiner Band &amp;#8220;Four Sided Cube&amp;#8221; und ebenfalls Popakademiestudent von Wallis erzählte und sie unheimlich spannend fand musste ich mir die Sache natürlich näher ansehen. Myspace gecheckt, ihre Webseite besucht - ja, das klingt nett.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Als Wallis dann letztens hier in der Feuerwache spielte, lies ich mir natürlich nicht die Chance nehmen, mir das mal live anzusehen. Es war ein denkwürdiges Konzert - nicht nur für mich, sondern wohl auch für die Band. Es ging technisch eigentlich alles schief, was schief gehen kann. Dennoch blieben die drei - Wallis (Gitarre &amp;#38; Gesang), Christian (Drums &amp;#38; Vocal entertainment ;) und sein Bruder Michael (Bass) locker. Wallis hatte das Publikum eigentlich von Anfang an auf ihrer Seite. Unheimlich sympathisch, chaotisch und durchgeknallt im positiven Sinne - das hat Unterhaltungswert. Doch was bei manchen in nur übertriebener Selbstdarstellung endet, kanalisiert sie in Songs die so unheimlich vor Emotion strotzen, Spass machen und dabei musikalisch auf einem unglaublich hohen Niveau sind.&lt;/p&gt;

&lt;p&gt;Aus musikalischer Sicht gefällt mir besonders, wie die drei mit ungeraden Taktarten spielen und diese aber Publikumsgerecht verpacken. Desweiteren ist es schon erstaunlich wie man mit einer sehr rudimentären Besetzung (Drums, Bass, Akustikgitarre) so vielfältige Songs produzieren kann - keine Song klingt wie der andere. Der rote Faden ist allerdings Wallis&amp;#8217; Stimme. Mir fallen eigentlich bei jedem Song andere Parallelen ein und doch ist da etwas sehr eigenständiges. Am besten ihr hört euch das mal selbst an&amp;#8230; Wallis&amp;#8217; aktuelle EP heißt &amp;#8220;Branches Untangle&amp;#8221; und ist auf ihrer Webseite für nur 7,50â‚¬ käuflich zu erwerben. Pflichtkauf! &lt;ul&gt;
	&lt;li&gt;[Wallis Bird Homepage](http://www.wallisbird.de)&lt;/li&gt;
	&lt;li&gt;[Wallis Bird @ Myspace](http://www.myspace.com/wallisbird)&lt;/li&gt;
&lt;/ul&gt;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Neues Template</title>
   <link href="http://www.olivergierke.de/2006/10/neues-template"/>
   <updated>2006-10-15T16:08:22+02:00</updated>
   <id>http://www.olivergierke.de/2006/10/neues-template</id>
   <content type="html">&lt;p&gt;Nachdem ich mit WordPress relativ zufrieden bin, lies mir das dunkle Template keine Ruhe. Deshalb hier was frischeres. Den Header werde ich sicher nochmal austauschen. Desweiteren habe ich mich entschlossen, den Blog um Posts über Gedanken zu meiner Arbeit im IT Bereich auszuweiten. Ausserdem habe ich eine Kategorie für Musiktipps eingerichtet, da mir in letzter Zeit jede Menge Künstler begegnet sind, die es verdient haben gefeatured zu werden.&lt;/p&gt;

&lt;p&gt;Viel Spass damit&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Barfuss in Bildern</title>
   <link href="http://www.olivergierke.de/2006/10/barfuss-in-bildern"/>
   <updated>2006-10-01T19:08:54+02:00</updated>
   <id>http://www.olivergierke.de/2006/10/barfuss-in-bildern</id>
   <content type="html">&lt;p&gt;Gestern früh fand das Fotoshooting für die Barfuss Platte statt. Ich hatte &lt;a href='http://www.fotocommunity.de/pc/account/myprofile/544103'&gt;Nico Becherer&lt;/a&gt;, einen befreundeten Musiker und Fotografen, gebeten die Fotos zu schießen und da sich das gute Wetter wahrscheinlich bald dem Ende zu neigt, hatten wir diesen Samstag als Termin unserer Wahl auserkoren. Der Wetterbericht hatte allerdings Regen angesagt.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Nachdem es also zunächst eher düster aussah und ich schon Angst hatte, die ganze Aktion könnte ins Wasser fallen, kam so gegen 10 Uhr doch glatt die Sonne raus ;). Ich hatte passend zum Namen Motive wie Fußabdrücke im Sand, nasse Fußabdrücke auf einem Holzsteg, Füße im Gras usw. im Kopf. Nico hat mir gestern Nacht noch die ersten Ergebnisse geschickt und ich muss sagen, meine Erwartungen wurden übertroffen. Einen kleinen Eindruck von den Bildern könnt ihr in Nico&amp;#8217;s &lt;a href='http://www.fotocommunity.de/pc/pc/mypics/544103' target='_blank'&gt;Gallerie in der Fotocommunity&lt;/a&gt; bekommen. Ich setz mich dann mal an die Coverentwürfe ;)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Bilder vom Gig bei Rock @ Church</title>
   <link href="http://www.olivergierke.de/2006/09/bilder-vom-gig-bei-rock-church"/>
   <updated>2006-09-12T20:49:54+02:00</updated>
   <id>http://www.olivergierke.de/2006/09/bilder-vom-gig-bei-rock-church</id>
   <content type="html">&lt;p&gt;Kurzes Update&amp;#8230; ich habe ein paar Bilder vom Gig am Samstag rausgekramt und die zu ein paar anderen Photos von einem vorherigen Gig bei meinem &lt;a href='http://www.myspace.com/oliverschlicht'&gt;Myspace Account&lt;/a&gt; hochgeladen. Glücklicherweise kann man die Slideshow auch recht leicht in Webseiten einbinden ;) Et voila.&lt;/p&gt;

&lt;p&gt;Die Bilder stammen von einer sehr nette Photografin namens Jutta Leiske (&lt;a href='http://www.fokus-eventphotos.de'&gt;www.fokus-eventphotos.de&lt;/a&gt;), die regelmäßig uns und andere Bands fotografiert und es dabei eindrucksvoll versteht Konzertatmosphäre einzufangen und festzu halten. Besucht einfach mal die Seite - es lohnt sich.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Hallo mal wieder...</title>
   <link href="http://www.olivergierke.de/2006/09/hallo-mal-wieder"/>
   <updated>2006-09-02T12:29:50+02:00</updated>
   <id>http://www.olivergierke.de/2006/09/hallo-mal-wieder</id>
   <content type="html">&lt;p&gt;Es ist schon wieder 3 Monate her seit dem letzten Update. Wie ihr seht, hab ich das CMS gewechselt. Wollte was einfaches, sportliches. Bisher gefällt mir Wordpress sehr gut ;) Es sind noch nicht alle Contents im neuen System aber ich geb mir mühe, das so schnell wie möglich nachzuholen. Hier kurz die nettesten neuen Features: &lt;ul&gt;
	&lt;li&gt;links findet ihr immer die aktuellsten Dates, wie sie auch auf der Soulism Seite zu finden sind&lt;/li&gt;
	&lt;li&gt;unter &quot;Zuletzt im Player&quot; (ebenfalls links) findet ihr Songs, die ich grad so hör... klick drauf führ euch zum jeweiligen Künstler auf &lt;a href='http://www.last.fm/'&gt;www.last.fm&lt;/a&gt;. Vielleicht schaut ihr euch den ein oder anderen ja mal an&lt;!--more--&gt;&lt;/li&gt;
&lt;/ul&gt; Momentan find ich eigentlich wenig Zeit für musikalisches, da sich mein Studium dem Ende zuneigt und eine Abschlussarbeit aufwändiger ist, als ich gedacht hatte ;). Deshalb liegt Barfuss momentan kurz vor der Ziellinie auf Eis. Ich hoff, dass ich das Projekt Ende September zuende bringen kann. Mit Four Sided Cube spiel ich heute Abend beim Nachtlabyrinth am Hegehof in Ladenburg. Nächste Woche gibts ein FSC-Allstars Konzert beim Rock @ Church in Ladenburg.&lt;/p&gt;

&lt;p&gt;Ãœber die Soulism Plattform hat sich eine Menge getan in den letzten Tagen. Wir haben zwei neue Künstler (Alibi und Profound) die auch gleich auf dem Sampler der &amp;#8220;Bandits&amp;#8221; (Dresdner Graffiticrew) ordentlich für Furore sorgen. Mit auf dem Sampler sind unter anderem auch Kool Savas und Spax, für den Profound das Instrumental produziert hat. &lt;a href='http://www.bandits-dresden.de/'&gt;www.bandits-dresden.de&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desweiteren ist seit kurzem ein der 44-Sampler erhältlich, der erstmals alle Dresdner HipHops vereint und geschlossen präsentiert. Weiter Infos findet ihr unter &lt;a href='http://www.fortyfour./'&gt;www.fortyfour.biz&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Soweit erstmal&amp;#8230; REINHAUN!&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Es tut sich was</title>
   <link href="http://www.olivergierke.de/2006/05/es-tut-sich-was"/>
   <updated>2006-05-01T20:06:28+02:00</updated>
   <id>http://www.olivergierke.de/2006/05/es-tut-sich-was</id>
   <content type="html">&lt;p&gt;Sorry, dass seit dem letzten Update so viel Zeit ins Land gegangen ist, aber mein Studium neigt sich dem Ende zu (und eine Abschlussarbeit schreibt sich nicht von allein ;) und auch musikalisch hat sich einiges getan.&lt;/p&gt;

&lt;p&gt;Da das Label Einsdreizehn in seiner alten Form nicht mehr zu betreiben war (vor allem aus zeitlichen Gründen), entschied ich mich, zusammen mit Fridl Schreiter ein neues Baby aus der Taufe zu heben. Soulism - so der Name - soll nun einen etwas anderen Ansatz fahren.&lt;!--more--&gt; Weg von dem &amp;#8220;Ein Label hat Künstler, die haben Platten usw&amp;#8221; hin zu eine Plattform für erdige Musik mit Seele, die allen offen steht, die sich in gewissen Grundeinstellungen von Soulism wiederfinden. Aufgeteil ist das ganze in die Bereiche Music und Management, wobei ich primär den Music Bereich übernehme und Fridl das Management. Schon in den ersten zwei Monaten haben sich Interessante Connections und Projekte ergeben. Mehr dazu findet ihr allerdings auf der Seite direkt&amp;#8230; viel Spass damit und drückt uns die Daumen, dass wir viel bewegen können.&lt;/p&gt;

&lt;p&gt;Seit dem Aus von &amp;#8220;Barfuss&amp;#8221; war ich auf der Suche nach einer neuen Sängerin für das Projekt. Viele Bewerberinnen kamen, gingen&amp;#8230; darunter auch viele gute, vor allem Martina Gebelein aus Bayreuth (Gruß ;). Letzendlich haben wir uns allerdings doch wieder für Isabel Haist (die Barfusssängerin) entschieden. Wir werden also die vorhandenen Songs nochmal sauber recorden und dann gibt es in naher Zukunft auch mal hier was zu hören.&lt;/p&gt;

&lt;p&gt;Nachdem ich nach dem &amp;#8220;Barfuss&amp;#8221; Projekt eine Weile auf Bandsuche war, bin ich seit Mitte März bei der Ladenburger Band &amp;#8220;Four Sided Cube&amp;#8221; als Drummer untergekommen. Die Jungs haben bereits 3 Studioalben veröffentlich und sind nach einigen Umbrüchen in der Band wieder unheimlich motiviert und hungrig auf neues. Wir stecken mitten in den Proben für die ersten Gigs und haben auch schon ein paar Ideen für neue Songs zusammen erarbeitet. Die Jungs sind auch unheimlich aktiv, was die Nachwuchsförderung und das Veranstalten angeht, wo sich sicherlich auch Synergieeffekte mit Soulism ergeben werden&amp;#8230; Die ersten Livertermine findet ihr auf &lt;a href='http://www.oliverschlicht.de/wordpress/www.soulism.de'&gt;www.soulism.de&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Es scheint ein spannender Sommer zu werden ;)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Quo vadis 2006?</title>
   <link href="http://www.olivergierke.de/2005/12/quo-vadis-2006"/>
   <updated>2005-12-14T12:10:12+01:00</updated>
   <id>http://www.olivergierke.de/2005/12/quo-vadis-2006</id>
   <content type="html">&lt;p&gt;Hallo zusammen,&lt;/p&gt;

&lt;p&gt;nach dem das Jahr 2005 sich dem Ende zu neigt, hier noch ein kleines Update, woran ich gerade so sitze und was 2006 bevorsteht. Zusammen mit Fridl (www.rkee.net) bin ich momentan dabei das &amp;#8220;alte&amp;#8221; Label Einsdreizehn umzustrukturieren. Das Kind wird dazu in &amp;#8220;Soulism&amp;#8221; umfirmiert. Vorwiegend aus beruflichen Gründen hatte ich kaum noch Zeit, mich um die Administrativen Arbeiten, die so ein Vorhaben mit sich bringt, zu kümmern. Deshalb übernimmt Fridl bei Soulism den Management Teil, die Abteilung Musik leite ich. Wir hoffen, das Projekt dadurch ein wenig schlanker zu bekommen und 2006 ein wenig produktiver als dieses Jahr arbeiten zu können.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Das Soulprojekt, dass ich momentan am laufen haben bzw. hatte erfährt fast ebenso einschneidende Umbrüche. Da Isa, unsere Sängerin, Nachwuchs erwartet und Jörg, ihr Mann und unser Bassist ( ;) ) beruflich auch stark eingespannt ist, haben die zwei sich entschieden uns zu verlassen. Was uns jedoch bleibt sind jede Menge Songideen, die auch teilweise schon recordet sind. Momentan bin ich zusammen mit unserer Keyboarderin auf Musikercasting ;) (in 30min kommen die ersten zum Vorspielen, morgen kommen auch nochmal 3) und hoffen, das Projekt am laufen zu halten. Sollten alle Stricke reißen, basteln Fridl und ich im stillen Kämmerlein weiter an dem Material ;) &amp;#8230; 2006 wird Soulism Jahr&amp;#8230; so long&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>SPAX Projekt am Start / Bandtreffenupdate</title>
   <link href="http://www.olivergierke.de/2005/08/spax-projekt-am-start-bandtreffenupdate"/>
   <updated>2005-08-13T16:02:12+02:00</updated>
   <id>http://www.olivergierke.de/2005/08/spax-projekt-am-start-bandtreffenupdate</id>
   <content type="html">&lt;p&gt;Seit letzten Montag ist das Ergebnis des &amp;#8220;Allcityallstars&amp;#8221; Projekts von SPAX auf dem Markt. Ich habe hierfür Friedel &amp;#8220;RKee&amp;#8221; Schreiter bei der Produktion des Titeltracks &amp;#8220;Schattenkrieger&amp;#8221; unterstützt. Leider gabs kurz vor Mixingschluss ein paar kleine Missverständnisse, so dass unser Streicherarrangement und das von Fridl gespielte Klavier beim Mix etwas stark in den Hintergrund geraten sind. Ein bissl ärgerlich, aber angesichts der über 20 vertretenen Acts und der enormen organisatorischen Arbeit nicht ganz so tragisch. Alles in allem eine angenehme Zusammenarbeit, dessen Ergebnis sich hören lassen kann.&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;Mehr Informationen findet ihr unter &lt;a href='http://www.oliverschlicht.de/wordpress/www.allcityallstars.de'&gt;www.allcityallstars.de&lt;/a&gt;, zu kaufen gibts die Scheibe im Shop von www.mzee.com&lt;/p&gt;

&lt;p&gt;Das Bandtreffenprojekt hat jetzt den Namen &amp;#8220;Die üblichen Verdächtigen&amp;#8221; bekommen und entwickelt sich prima ;-) Wir werden 2 Sängerinnen und einen Rapper dabei haben, haben bereits Songs ausgewählt und bereiten grad die Probewoche vor. Ich versorg euch demnächst mit weiterein Infos&amp;#8230; ;-)&lt;/p&gt;

&lt;p&gt;So long&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Clueso Remixcontestergebnisse / Neues Projekt</title>
   <link href="http://www.olivergierke.de/2005/07/clueso-remixcontestergebnisse-neues-projekt"/>
   <updated>2005-07-09T14:23:57+02:00</updated>
   <id>http://www.olivergierke.de/2005/07/clueso-remixcontestergebnisse-neues-projekt</id>
   <content type="html">&lt;p&gt;Seit circa 1,5h sind die Ergebnisse des Contests online. Leider haben wir es nicht unter die Topplätze geschafft. Ein besuch von &lt;a href='http://www.start-ab.com' target='_blank'&gt;www.start-ab.com&lt;/a&gt; lohnt sich jedoch trotzdem - es gibt viele gute Remixe dort.&lt;/p&gt;

&lt;p&gt;Zum diesjähigen Bandtreffen habe ich ein recht außergewöhnliches Projekt ins Leben gerufen. Ich werde mich mit 3 befreundeten Musikern (Martin Schneider, Alexander Lau, Friedemann Schreiter) eine Woche vor dem Event in meiner Heimatstadt Forst treffen. Wir werden dort unter dem Namen &amp;#8220;Die üblichen Verdächtigen&amp;#8221; 4 Tage mit Proben verbringen. Weiterhin mit von der Partie sind die Sängerinnen Raphaela Poltermann, Julia Schöning und der Rapper Dita Rantel. Wir haben vor mit den 3en ein 45 minütiges Programm auszuarbeiten, was dann am Freitag beim Bandreffen präsentiert wird.&lt;/p&gt;

&lt;p&gt;Ich freu mich auf eine aufregende Woche und einen geilen Gig ;-)&lt;/p&gt;

&lt;p&gt;Bis dann&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Remixcontestsong online</title>
   <link href="http://www.olivergierke.de/2005/06/remixcontestsong-online"/>
   <updated>2005-06-05T19:54:56+02:00</updated>
   <id>http://www.olivergierke.de/2005/06/remixcontestsong-online</id>
   <content type="html">&lt;p&gt;Da nun alle Remixe zum Contest online sind, hier auch nun mein Beitrag.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://www.soulism.de/soulismv2/content/e306/furtherContent308/projects452/mediaList/files456/pizzaschachteln_113remix.mp3'&gt;Clueso - Pizzaschachteln (113 Remix)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Der Vollständigkeit halber noch die Credits:&lt;/p&gt;

&lt;p&gt;Thomas Hübner: Vocals Isabel Haist: Vocals Friedemann Schreiter: Piano Martin Schneider: Gitarre Oliver Schlicht: Drums/Bass/Gitarre/Klavier&lt;/p&gt;

&lt;p&gt;Aufnahme, Produktion, Mischung, Mastering: Oliver Schlicht&lt;/p&gt;

&lt;p&gt;Mal schauen was draus wird ;-)&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Clueso Remix Contest dieses Wochenende</title>
   <link href="http://www.olivergierke.de/2005/06/clueso-remix-contest-dieses-wochenende"/>
   <updated>2005-06-04T19:51:14+02:00</updated>
   <id>http://www.olivergierke.de/2005/06/clueso-remix-contest-dieses-wochenende</id>
   <content type="html">&lt;p&gt;Dieses wochenende findet über das Webportal &lt;a href='http://www.start-ab.com'&gt;www.start-ab.com&lt;/a&gt; ein Remixcontest zu der am Montag erscheinden Single &amp;#8220;Pizzaschachteln&amp;#8221; des Erfurter FourMusic Artists Clueso statt. Mitsamt den üblichen verdächtigen Martin Schneider (Gitarrensolo) und Friedeman Schreiter (Piano) und der Sängerin Isabel Haist habe ich ein nettes Stück musik zum Song von Clueso produziert. Abgabetermin ist Montag 6 Uhr. Sobald man die Sachen rausgeben darf findet ihr den Song hier auf der Seite&amp;#8230;&lt;/p&gt;

&lt;p&gt;stay Tuned&amp;#8230;&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>Updates... was geht momentan?</title>
   <link href="http://www.olivergierke.de/2005/04/4"/>
   <updated>2005-04-01T17:30:30+02:00</updated>
   <id>http://www.olivergierke.de/2005/04/4</id>
   <content type="html">&lt;p&gt;Hallo zusammen. Ich hab&amp;#8217;s endlich geschafft, mal ein Photo (bzw. mehrere für ne Photomontage ;-) vom kompletten Set zu machen, da wir vor gut 3 Wochen in einen neuen Proberaum in Mannheim gezogen sind. Das Projekt, mit dem ich jetzt da Musik mach hat noch keinen offiziellen Namen - egal, die sind eh Schall und Rauch. Wir bewegen uns musikalisch zwischen Soul, Funk, HipHop, Pop und die ersten Songs klingen vielversprechend. Momentan suchen wir noch ein paar Mitmusiker, die die Sache komplett machen&amp;#8230; ich halte euch auf dem Laufenden ;-)&lt;!--more--&gt;&lt;/p&gt;

&lt;p&gt;In Sachen Raphaela gehts auch voran: der Martin schreibt seit kurzem fleißig eine art Albumtagebuch auf der Einsdreizehn-Seite (www.einsdreizehn.de) Reinschauen lohnt. Bei meinem Beusch in Forst, in der Woche vor Ostern hab ich wieder einige nette Songideen vom Martin mitgenommen. Das Kind gedeiht momentan recht prächtig&amp;#8230;&lt;/p&gt;

&lt;p&gt;Morgen kommt meine (ehemalige) Bandkollegin Goeschi zu mir ins Studio - wir recorden ein paar Songs und sammeln Material für zukünftige Releases.&lt;/p&gt;

&lt;p&gt;Weiterhin arbeite ich mit RKEE (dem Pianisten aus der Liveband vom Dita Rantel - &lt;a href='http://www.rkee.net'&gt;www.rkee.net&lt;/a&gt;) am Feinschliff eine EP für einen Rapper namens Deckah (&lt;a href='http://www.deckah.de'&gt;www.deckah.de&lt;/a&gt;). Ich werde die Platte mischen und mastern. Die ersten Demo klingen extrem intressant. Wahrscheinlich werden auch noch ein paar weitere Musiker an dem Projekt teilnehmen.&lt;/p&gt;

&lt;p&gt;Ein weiteres Projekt, an dem ich beteiligt bin geht in die heiße Phase. RKEE (siehe oben) hat für SPAX&amp;#8217; Allstars Projekt einen Beat produziert, an dem ich ein wenig mitproduziert hab. Sobald ein genaues Releasedate steht, bekommt ihr Infos ;-)&lt;/p&gt;

&lt;p&gt;So, soweit erstmal&amp;#8230; Bis zum nächsten mal.&lt;/p&gt;</content>
 </entry>
 
 <entry>
   <title>So viel neues...</title>
   <link href="http://www.olivergierke.de/2005/02/so-viel-neues"/>
   <updated>2005-02-13T14:12:24+01:00</updated>
   <id>http://www.olivergierke.de/2005/02/so-viel-neues</id>
   <content type="html">&lt;p&gt;Da sind es schon weider 6 Monate, die ich nun in Mannheim wohne. Ein halbes Jahr musikalische Um- und Neuorientierung. Die Rockband, in die ich hier im Oktober eingestiegen bin wagt sich am 26.02.2005 zum ersten mal aus dem Proberaum. &amp;#8220;True Tempest&amp;#8221; werden in Wallstadt ihr Bühnendebut feiern. Jedoch werde ich die Band aus musikalischen Gründen nach dem Gig wieder verlassen.&lt;/p&gt;

&lt;p&gt;Das zweite Projekt, was momentan läuft ist noch jünger. Eine Funk- / Soulband mit dem Fokus auf eigenen Songs in Richtung Joss Stone, Erykah Badu. Gestern abend haben wir den ersten Song recorded - sehr vielversprechendes Material. Wir suchen noch nach weiteren Musikern, feilen an Songs und schauen wo es uns hintreibt ;-)&lt;/p&gt;

&lt;p&gt;So, hier noch der Flyer für den Gig am 26. Vorbeikommen lohnt sich!!&lt;/p&gt;</content>
 </entry>
 
 
</feed>