<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2424622516012859853</id><updated>2011-11-08T09:16:42.542-08:00</updated><category term='jUDDI'/><category term='JBoss'/><category term='single sign-on'/><category term='MySQL'/><category term='Maven'/><category term='generics'/><category term='Seam'/><category term='service orchestration'/><category term='jBPM'/><category term='Hibernate'/><category term='JBossESB'/><category term='battery'/><category term='Rules'/><category term='Java'/><category term='SOA'/><category term='JOSSO'/><category term='profiling'/><category term='Ant'/><category term='database'/><title type='text'>Fresh Espresso</title><subtitle type='html'>On all things Java, SOA, and Technology in general.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-7421922271856909728</id><published>2011-03-18T10:07:00.000-07:00</published><updated>2011-03-18T12:17:27.715-07:00</updated><title type='text'>As if Time isn't difficult enough! I say this is huge bug in java.sql.Timestamp</title><content type='html'>BACKGROUND&lt;br /&gt;I found a bug in java.sql.Timestamp that was making my unit tests fail &lt;br /&gt;once it a while when the planets aligned just the right way. I was &lt;br /&gt;storing java.util.Date values to a Db using Hibernate and when they come &lt;br /&gt;back out, they are represented as java.sql.Timestamp, which is a small &lt;br /&gt;wrapper around java.util.Date.&lt;br /&gt;&lt;br /&gt;ISSUE&lt;br /&gt;In TimeStamp, they are storing the time in whole seconds and the &lt;br /&gt;remaining nanos seperately. In the Timestamp.compareTo, they call the &lt;br /&gt;super class first (but pass the time part only). So methods like &lt;br /&gt;before() and after() are all in error when milliseconds count. Check out the following code:&lt;br /&gt;&lt;br /&gt;&lt;pre class="java" name="code" &gt;&lt;br /&gt;/*&lt;br /&gt; * Copyright 2001-2009 The Apache Software Foundation.&lt;br /&gt; * &lt;br /&gt; * Licensed under the Apache License, Version 2.0 (the "License");&lt;br /&gt; * you may not use this file except in compliance with the License.&lt;br /&gt; * You may obtain a copy of the License at&lt;br /&gt; *      http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt; * &lt;br /&gt; * Unless required by applicable law or agreed to in writing, software&lt;br /&gt; * distributed under the License is distributed on an "AS IS" BASIS,&lt;br /&gt; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt; * See the License for the specific language governing permissions and&lt;br /&gt; * limitations under the License.&lt;br /&gt; */&lt;br /&gt;package org.apache.juddi;&lt;br /&gt;&lt;br /&gt;import java.sql.Timestamp;&lt;br /&gt;import java.util.Date;&lt;br /&gt;&lt;br /&gt;import junit.framework.Assert;&lt;br /&gt;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public class TimeStampDateTest {&lt;br /&gt; &lt;br /&gt; @Test&lt;br /&gt; public void testDates()  {&lt;br /&gt;  &lt;br /&gt;  java.util.Date startDate    = new Date(1300286601055l);&lt;br /&gt;  java.util.Date modifiedDate = new Date(1300286601334l);&lt;br /&gt;  Timestamp timeStamp = new Timestamp(modifiedDate.getTime());&lt;br /&gt; &lt;br /&gt;  System.out.println(startDate.getTime()                 + " startDate    " + startDate);&lt;br /&gt;  System.out.println(modifiedDate.getTime()              + " modifiedDate " + modifiedDate);&lt;br /&gt;  System.out.println(timeStamp.getTime() + " modifiedDtDB " + timeStamp);&lt;br /&gt;   &lt;br /&gt;  System.out.print("DT:" + startDate.getTime() + " is before " + modifiedDate.getTime() + ": "); &lt;br /&gt;  if (startDate.before(modifiedDate)) {&lt;br /&gt;   System.out.println("before");&lt;br /&gt;  } else {&lt;br /&gt;   System.out.println("after ******* WRONG!!!!");&lt;br /&gt;  }&lt;br /&gt;  Assert.assertTrue(startDate.before(modifiedDate));&lt;br /&gt;  &lt;br /&gt;  System.out.print("DB:" + startDate.getTime() + " is before " + timeStamp.getTime() + ": ");&lt;br /&gt;  if (startDate.before(timeStamp)) {&lt;br /&gt;   System.out.println("before");&lt;br /&gt;  } else {&lt;br /&gt;   System.out.println("after ******* WRONG!!!!");&lt;br /&gt;   System.out.println("The reason is a bug in Timestamp, it stores the time (whole seconds) and the nanos seperately," +&lt;br /&gt;     "and when running a compareTo it only uses the nanos when the Time part is inconclusive, however" +&lt;br /&gt;     "it is not inconclusive because the compareTo from the super class (java.util.Date) DOES" +&lt;br /&gt;     "already take into account the millies!");&lt;br /&gt;  }&lt;br /&gt;  Assert.assertTrue(startDate.before(timeStamp));&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The second time the date comparison will fail and it will print out: 'after ******* WRONG!!!!'. &lt;br /&gt;&lt;br /&gt;Yes Really!!&lt;br /&gt;&lt;br /&gt;Then I was told to read the  &lt;a href="http://download.oracle.com/javase/6/docs/api/java/sql/Timestamp.html"&gt;javadoc&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style:italic;"&gt;Note: This type is a composite of a java.util.Date and a separate nanoseconds value. Only integral seconds are stored in the java.util.Date component. The fractional seconds - the nanos - are separate. The Timestamp.equals(Object) method never returns true when passed an object that isn't an instance of java.sql.Timestamp, because the nanos component of a date is unknown. As a result, the Timestamp.equals(Object) method is not symmetric with respect to the java.util.Date.equals(Object) method. Also, the hashcode method uses the underlying java.util.Date implementation and therefore does not include nanos in its computation.&lt;br /&gt;&lt;br /&gt;Due to the differences between the Timestamp class and the java.util.Date class mentioned above, it is recommended that code not view Timestamp values generically as an instance of java.util.Date. The inheritance relationship between Timestamp and java.util.Date really denotes implementation inheritance, and not type inheritance.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Ahh that makes it all better! No no no, this is just &lt;span style="font-weight:bold;"&gt;crap&lt;/span&gt; and so easy to fix. Time skrewed up enough, please don't do this Snoracle!&lt;br /&gt;&lt;br /&gt;There's a few of my life that I will never get back. The issue is that my unit test failed when the build machine was fast enough to make milli-seconds count when comparing dates!&lt;br /&gt;&lt;br /&gt;GRRRR.. &lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-7421922271856909728?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/7421922271856909728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=7421922271856909728' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7421922271856909728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7421922271856909728'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2011/03/as-if-time-isnt-difficult-enough-i-say.html' title='As if Time isn&apos;t difficult enough! I say this is huge bug in java.sql.Timestamp'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-6134743055359534146</id><published>2011-02-14T18:14:00.001-08:00</published><updated>2011-02-14T18:17:14.145-08:00</updated><title type='text'>IPhone 3Gs Battery Drain - part 2</title><content type='html'>OK so after removing all my apps, it was still draining the battery. Turns out the VPN I had installed was causing it. Not sure why it suddenly went sideways. It had been working just fine for about a year. &lt;br /&gt;&lt;br /&gt;Now I'm busy putting all my apps back. It's kind off refreshing though to start with a clean phone :).&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-6134743055359534146?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/6134743055359534146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=6134743055359534146' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6134743055359534146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6134743055359534146'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2011/02/iphone-3gs-battery-drain-part-2.html' title='IPhone 3Gs Battery Drain - part 2'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-6644370095170097708</id><published>2011-02-13T11:12:00.000-08:00</published><updated>2011-02-14T06:53:16.800-08:00</updated><title type='text'>IPhone 3Gs Battery Drain - part 1</title><content type='html'>I've had my iphone for a little over a year, and since last Friday it drains the battery in about 5 hours, this while the day before I could go for 48 hours between charges. I also noticed it being warmish. I figured it is an app that is stuck, however&lt;br /&gt;&lt;br /&gt;- hard reset does not alleviate the issue, and&lt;br /&gt;- doing a full restore does not help either.&lt;br /&gt;&lt;br /&gt;I figured that before going over to see apple store I would restore it to having the default OS/firmware only. The idea being, that if it still drains in this configuration, then the phone is just defect. Well I did, and.. my phone is fine now! So while this is good news, this must mean that it is an app that is somehow causing the issues. How am I going to find which app is causing the issues?? I guess I have the following options:&lt;br /&gt;&lt;br /&gt;1. Leave it the way it is and slow add apps back as I need them&lt;br /&gt;2. Do a full restore and use bisection on app deletion/addition.&lt;br /&gt;3. I guess i could try to figure out which apps I upgraded last week and delete those, hoping that it is one of these updates of last week.&lt;br /&gt;4. There is no taskmon app right? Wouldn't it be great to simply see which process is eating my CPU cycles/battery..&lt;br /&gt;&lt;br /&gt;Love to hear your ideas!&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-6644370095170097708?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/6644370095170097708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=6644370095170097708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6644370095170097708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6644370095170097708'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2011/02/iphone-3gs-battery-drain-part-1.html' title='IPhone 3Gs Battery Drain - part 1'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-3575660335803068008</id><published>2010-09-11T15:14:00.000-07:00</published><updated>2010-11-08T16:39:37.152-08:00</updated><title type='text'>Guvnor JCR Implementation Support: JackRabbit and ModeShape</title><content type='html'>I have started working on the &lt;a href="http://jboss.org/guvnor"&gt;Guvnor&lt;/a&gt; project recently. Guvnor manages a SOA repository and sits on top of a JCR implementation. Up until now there really where not too many &lt;a href="http://en.wikipedia.org/wiki/Content_repository_API_for_Java"&gt;JCR&lt;/a&gt; implementation available. Really &lt;a href="http://jackrabbit.apache.org/"&gt;JackRabbit&lt;/a&gt; was the only viable Open Source gig in town. This has changed now the &lt;a href="http://www.jboss.org/modeshape"&gt;ModeShape&lt;/a&gt; project really has been picking up steam. They recently completed implementing the JCR 2.0 specification. ModeShape has been designed from the ground up with scalability in mind, and it can run in a clustered environment (using &lt;a href="http://www.jgroups.org/"&gt;JGroups&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-3575660335803068008?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/3575660335803068008/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=3575660335803068008' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3575660335803068008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3575660335803068008'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2010/09/guvnor-jcr-implementation-support.html' title='Guvnor JCR Implementation Support: JackRabbit and ModeShape'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-7050094308254275666</id><published>2010-07-20T11:22:00.000-07:00</published><updated>2010-07-20T11:23:35.171-07:00</updated><title type='text'>Matt Ridley explains how open source works</title><content type='html'>Although he doesn't know it he is explaining the inner workings of open &lt;br /&gt;source, and why it will be more successful as the number of people with &lt;br /&gt;computers increases.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ted.com/talks/matt_ridley_when_ideas_have_sex.html"&gt;http://www.ted.com/talks/matt_ridley_when_ideas_have_sex.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-7050094308254275666?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/7050094308254275666/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=7050094308254275666' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7050094308254275666'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7050094308254275666'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2010/07/matt-ridley-explains-how-open-source.html' title='Matt Ridley explains how open source works'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-3395241715590355288</id><published>2010-07-08T07:51:00.000-07:00</published><updated>2010-07-08T07:53:49.466-07:00</updated><title type='text'>OSX and slow DNS issue</title><content type='html'>I just 'fixed' my macbook from having terribly slow DNS lookup performance by turning off IPv6 in both of my network adapters (switch from automatic to off). The difference is not funny.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-3395241715590355288?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/3395241715590355288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=3395241715590355288' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3395241715590355288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3395241715590355288'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2010/07/osx-and-slow-dns-issue.html' title='OSX and slow DNS issue'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-9088860614502485993</id><published>2010-05-13T15:09:00.000-07:00</published><updated>2010-05-19T11:48:55.604-07:00</updated><title type='text'>Guerrilla SOA in the Cloud.</title><content type='html'>This evening I'm listening to a presentation by John Graham "From the ESB to REST and Clouds an Open Source", who is talking about &lt;a href="http://www.nejug.org/events/show/110"&gt;ESB, REST and Clouds&lt;/a&gt; at the SUN campus in Burlington, MA. It is a nice overview of the evolution of system architectures, with the conclusion that as system became more distributed we developed different integration solutions; from Corba, Asynch Messaging to ESB. The talk is spiced up by some good word plays ("Being thrown under the ESB"), quizzes and code examples. It's entertaining.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAUX2tnEInU/S_QqQIaYOUI/AAAAAAAAAHM/oO7a8J7xs7w/s1600/photo.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://3.bp.blogspot.com/_fAUX2tnEInU/S_QqQIaYOUI/AAAAAAAAAHM/oO7a8J7xs7w/s400/photo.jpg" alt="" id="BLOGGER_PHOTO_ID_5473045903786391874" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After a little while we arrive at &lt;a href="http://www.infoq.com/interviews/jim-webber-qcon-london"&gt;Guerrilla SOA&lt;/a&gt; coined by Jim Webber, which is a lighter style of SOA. Finally we arrive at how REST can be used in a cloud environment in a complementary fashion to manage ESBs.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-9088860614502485993?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/9088860614502485993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=9088860614502485993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/9088860614502485993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/9088860614502485993'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2010/05/guerrilla-soa-in-cloud.html' title='Guerrilla SOA in the Cloud.'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fAUX2tnEInU/S_QqQIaYOUI/AAAAAAAAAHM/oO7a8J7xs7w/s72-c/photo.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-8054832225056800496</id><published>2010-05-07T11:48:00.000-07:00</published><updated>2010-05-07T12:01:35.096-07:00</updated><title type='text'>Match made in Heaven: Maven Multi-Project and Eclipse Working Sets</title><content type='html'>Recently Maven dropped support for 'nested modules' which was nice from an organizational point of view, but since all the maven modules shared one classpath in this case it wasn't really working. So I started using the 'import maven modules' after checking out the main project, which creates  different project for each maven module. This works well, but it explodes the amount of project in my project explorer. I have been looking for a way to organize this and today I tripped over &lt;a href="http://eclipse.dzone.com/articles/categorise-projects-package"&gt;this article from Byron&lt;/a&gt;, about Categorization of projects in Eclipse using 'Working Sets'.  This is what I had been looking for, and it was there all this time!&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-8054832225056800496?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/8054832225056800496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=8054832225056800496' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/8054832225056800496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/8054832225056800496'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2010/05/match-made-in-heaven-maven-multi.html' title='Match made in Heaven: Maven Multi-Project and Eclipse Working Sets'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-8840416613494528118</id><published>2010-05-04T10:18:00.000-07:00</published><updated>2010-05-04T10:22:43.051-07:00</updated><title type='text'>JBoss Quick Reference Card</title><content type='html'>This is the best &lt;a href="http://www.osconsulting.org/code-fragments/rc097-010d-jbosseap_0.pdf"&gt;Getting Started Guide on JBoss&lt;/a&gt; I have seen! Short and to the point.&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-8840416613494528118?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/8840416613494528118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=8840416613494528118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/8840416613494528118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/8840416613494528118'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2010/05/jboss-quick-reference-card.html' title='JBoss Quick Reference Card'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-2408484934359461446</id><published>2010-05-04T10:13:00.000-07:00</published><updated>2010-05-07T11:46:47.083-07:00</updated><title type='text'>jBPM Developer Guide Book (P)Review</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.packtpub.com/jboss-business-process-management-jbpm-developer-guide/book"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 125px; height: 152px;" src="http://2.bp.blogspot.com/_fAUX2tnEInU/S-BWCQB2L2I/AAAAAAAAAG8/n1Ph7vrJnRM/s320/jBPM+Dev+Guide.png" alt="" id="BLOGGER_PHOTO_ID_5467464544290221922" border="0" /&gt;&lt;/a&gt;When I returned from our spring vacation trip one of the things I found  waiting for me on the porch was a copy of the book "jBPM Developer  Guide". After my last &lt;a href="http://kurtstam.blogspot.com/2008/04/book-review-business-process-management.html"&gt;jBPM  book review&lt;/a&gt; I mentioned that the target audience for that book was  not the jBPM developer. Well that seems to be addressed now. Here is a &lt;a href="http://www.osconsulting.org/code-fragments/5685-jbpm-developer-guide-sample-chapter-5-getting-your-hands-dirty-with-jpdl.pdf"&gt;link  the chapter 5&lt;/a&gt;, if you're interested while I'm reading the book  myself.&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-2408484934359461446?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/2408484934359461446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=2408484934359461446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/2408484934359461446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/2408484934359461446'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2010/05/jbpm-developer-guide-book-preview.html' title='jBPM Developer Guide Book (P)Review'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fAUX2tnEInU/S-BWCQB2L2I/AAAAAAAAAG8/n1Ph7vrJnRM/s72-c/jBPM+Dev+Guide.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-698086638202138726</id><published>2010-03-17T16:55:00.000-07:00</published><updated>2010-03-25T05:47:14.382-07:00</updated><title type='text'>JBossESB MBean Service Deployment Order</title><content type='html'>In JBossESB, MBeans can be deployed inside of .esb archives. The deployment is pretty much standard and the mbean configuration lives in the jbossesb-service.xml right in the root of the .esb archive. If you need the mbean to be up before the rest of the .esb deployment, then you can reference the mbean in the META-INF/deployment.xml. If the mbean depends on another .esb service archive to be deployed first the you need to add that dependency to the jbossesb-service.xml.&lt;br /&gt;&lt;br /&gt;If you're looking for an example check out the jbossesb.esb.&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-698086638202138726?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/698086638202138726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=698086638202138726' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/698086638202138726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/698086638202138726'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2010/03/jbossesb-mbean-service-deployment-order.html' title='JBossESB MBean Service Deployment Order'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-7943923738614517064</id><published>2010-02-07T08:29:00.000-08:00</published><updated>2010-02-07T09:19:54.754-08:00</updated><title type='text'>Cool MySQL Database Queries</title><content type='html'>1. Select a count of all rows in your database:&lt;br /&gt;&lt;pre class="SQL" name="code"&gt;&lt;br /&gt;SELECT SUM(table_rows) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'database_name';&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. Select count of all rows of each table in your database:&lt;br /&gt;&lt;pre class="SQL" name="code"&gt;&lt;br /&gt;SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'database_name';&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. Gets stats on a per hour basis, written out to CSV:&lt;br /&gt;&lt;pre class="SQL" name="code"&gt;&lt;br /&gt;SELECT  DATE_FORMAT(date, '%m/%d/%Y %H:00:00') AS date, DATE_FORMAT(date, '%Y%m%d%H') AS hour, count(id) AS requests, max(time), avg(time),  count(distinct userName)  INTO OUTFILE '/tmp/usage.csv' FIELDS TERMINATED BY ',' FROM statslog GROUP BY hour ORDER BY hour ASC;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-7943923738614517064?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/7943923738614517064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=7943923738614517064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7943923738614517064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7943923738614517064'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2010/02/cool-mysql-database-queries.html' title='Cool MySQL Database Queries'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-681390086193245798</id><published>2009-06-05T16:44:00.000-07:00</published><updated>2009-06-06T06:31:21.481-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='jUDDI'/><title type='text'>jUDDI Release-3.0.0.beta</title><content type='html'>I'm proud to announce the release of &lt;a href="http://ws.apache.org/juddi/"&gt;jUDDI-3.0.0.beta&lt;/a&gt;. Since the alpha release the implementation has shown stability and performance, and it implements the final two UDDI API implementations targeted for the 3.0.0 release; "Subscription" and "Custody transfer". Subscriptions allow you to register for updates in the Registry. The registry will send out the notification by calling an endpoint defined at registration time. The generic UDDI client now supports InVM transport to allow jUDDI to run in embedded mode. For a complete overview of what went into this release see the release notes:&lt;br /&gt;&lt;a href="http://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=10401&amp;styleName=Html&amp;version=12313630"&gt;http://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=10401&amp;styleName=Html&amp;version=12313630&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;Finally, we also started work on the console.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAUX2tnEInU/Shf5SNa7FLI/AAAAAAAAAFk/sXvR7aAcJI0/s1600-h/Picture+3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 400px; height: 227px;" src="http://1.bp.blogspot.com/_fAUX2tnEInU/Shf5SNa7FLI/AAAAAAAAAFk/sXvR7aAcJI0/s400/Picture+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5339009974506558642" /&gt;&lt;/a&gt;&lt;br /&gt;The console is Pluto portal which plugs in uddi-portlets. The portlets are GWT based. We'd have one to Publish, Search, Browse, Subscribe etc.. Right now you can see a tree of services under the publisher you log in as. You can download the portal-bundle from the following url if you want to see it all in action.&lt;br /&gt;&lt;a href="http://www.apache.org/dist/ws/juddi/3_0/juddi-portal-bundle-3.0.0.beta.zip"&gt;http://www.apache.org/dist/ws/juddi/3_0/juddi-portal-bundle-3.0.0.beta.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-681390086193245798?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/681390086193245798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=681390086193245798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/681390086193245798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/681390086193245798'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/06/juddi-release-300beta.html' title='jUDDI Release-3.0.0.beta'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fAUX2tnEInU/Shf5SNa7FLI/AAAAAAAAAFk/sXvR7aAcJI0/s72-c/Picture+3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-4543964970081131015</id><published>2009-06-05T11:14:00.000-07:00</published><updated>2009-06-05T11:26:44.212-07:00</updated><title type='text'>Synergy rocks (for once)</title><content type='html'>Whenever companies merge great "Synergies" are promised by upper-management. I hate that word. It's a red flag for me. So for that reason alone I had not tried out &lt;a href="http://synergy2.sourceforge.net/"&gt;Synergy&lt;/a&gt; until yesterday. However I really like working on the mac, and this way I can; I can simply move my mouse across to the other machines. This is really pretty sweet. Finally a good use of the word synergy! Great work guys. Thx.&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-4543964970081131015?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/4543964970081131015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=4543964970081131015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4543964970081131015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4543964970081131015'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/06/synergy-rocks-for-once.html' title='Synergy rocks (for once)'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-6098943380728158727</id><published>2009-06-03T17:07:00.000-07:00</published><updated>2009-06-03T20:17:21.130-07:00</updated><title type='text'>Setup of a Wireless Connection on a Lenovo T400 running centos 5.3</title><content type='html'>I recently installed Centos 5.3 on my Lenovo T400, and everything pretty much worked except for the wireless connection. I had a hard time finding instructions on how to get it working but &lt;a href="http://zgambitx.wordpress.com/2009/05/11/connecting-a-lenovo-t61-to-a-wireless-network-with-centos-5-3-gnome/"&gt;this blog entry&lt;/a&gt; was most helpful.&lt;br /&gt;&lt;br /&gt;First make sure the RPMForge repo is installed&lt;br /&gt;&lt;br /&gt;rpm -Uhv http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm&lt;br /&gt;yum clean all&lt;br /&gt;yum update&lt;br /&gt;&lt;br /&gt;Next install the driver for the PRO/Wireless 5100 AGN[Shiloh] card from Intel&lt;br /&gt;&lt;br /&gt;yum install iwl5000-firmware&lt;br /&gt;&lt;br /&gt;The wireless device should now be working, and you can enable the NetworkManager to start using it&lt;br /&gt;&lt;br /&gt;chkconfig NetworkManager on&lt;br /&gt;service NetworkManager start&lt;br /&gt;&lt;br /&gt;and you may want to save yourself some wait time at boottime by disabling the network since you don't need that anymore&lt;br /&gt;&lt;br /&gt;chkconfig network off&lt;br /&gt;&lt;br /&gt;Next you need to configure your wireless connection settings by going to System &gt; Preferences &gt; More Preferences &gt; Network Connections&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAUX2tnEInU/SicUmShBYYI/AAAAAAAAAFs/5aelISHKDHI/s1600-h/wireless-connection.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 325px;" src="http://4.bp.blogspot.com/_fAUX2tnEInU/SicUmShBYYI/AAAAAAAAAFs/5aelISHKDHI/s400/wireless-connection.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5343262130936308098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Select the Wireless tab and click on Add, and fill out your connection settings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-6098943380728158727?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/6098943380728158727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=6098943380728158727' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6098943380728158727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6098943380728158727'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/06/setup-of-wireless-connection-on-lenovo.html' title='Setup of a Wireless Connection on a Lenovo T400 running centos 5.3'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fAUX2tnEInU/SicUmShBYYI/AAAAAAAAAFs/5aelISHKDHI/s72-c/wireless-connection.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-7024467485604604964</id><published>2009-05-23T06:16:00.000-07:00</published><updated>2009-06-06T06:32:19.973-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='jUDDI'/><title type='text'>jUDDI v3.0.0 SNAPSHOT</title><content type='html'>The &lt;a href="http://ws.apache.org/juddi/"&gt;jUDDI&lt;/a&gt; project has seen a lot of activity lately in the ramp up for the jUDDIv3 beta release. The biggest change with the alpha release is that for beta the Subscription API will be fully implemented. One of the missing features of jUDDI has always been a good console. After the beta release we will work hard to get that work completed. However it is very exciting that we already have the beginnings of the console.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAUX2tnEInU/Shf5SNa7FLI/AAAAAAAAAFk/sXvR7aAcJI0/s1600-h/Picture+3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 227px;" src="http://1.bp.blogspot.com/_fAUX2tnEInU/Shf5SNa7FLI/AAAAAAAAAFk/sXvR7aAcJI0/s400/Picture+3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5339009974506558642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can download a ready to go bundle (3.0.0.SNAPSHOT) from the &lt;a href="http://people.apache.org/repo/m2-snapshot-repository/org/apache/juddi/juddi-portal-bundle/3.0.0.SNAPSHOT/"&gt;repos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-7024467485604604964?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/7024467485604604964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=7024467485604604964' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7024467485604604964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7024467485604604964'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/05/juddi-v300-snapshot.html' title='jUDDI v3.0.0 SNAPSHOT'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fAUX2tnEInU/Shf5SNa7FLI/AAAAAAAAAFk/sXvR7aAcJI0/s72-c/Picture+3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-4478284952159536936</id><published>2009-04-03T14:55:00.000-07:00</published><updated>2009-04-06T07:51:41.632-07:00</updated><title type='text'>Switch JBossESB-4.5.GA from HSQL to MSSQL</title><content type='html'>To switch JBossESB from the default HSQL embedded database to a "real" database like MSSQL, the persistence configuration of JMS, jUDDI, ESB MessageStore and jBPM needs updating.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. JMS&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;rm server/default/deploy/jms/hsqldb-jdbc2-service.xml&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cp docs/examples/jms/mssql-jdbc2-service.xml server/default/deploy/jms&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cp docs/examples/jca/mssql-ds.xml server/default/deploy/jms&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mv server/default/deploy/jms/hsql-jdbc-state-service.xml server/default/deploy/jms/mssql-jdbc-state-service.xml&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;update the mssql-jdbc-state-service.xml to point to the MSSQLDS datasource&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;&amp;lt;depends optional-attribute-name="ConnectionManager"&amp;gt;jboss.jca:service=DataSourceBinding,name=MSSQLDS&amp;lt;/depends&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;update the "Security domain for JBossMQ" in the &lt;span style="font-family:courier new;"&gt;server/default/conf/login-config.xml&lt;/span&gt; to &lt;span style="font-family:courier new;"&gt;java:/MSSQLDS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. jUDDI&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;cp docs/examples/jca/mssql-ds.xml server/default/deploy/jbossesb.sar/juddi-ds.xml&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;update the&lt;span style=";font-family:courier new;font-size:85%;"  &gt; juddi-ds.xml&lt;/span&gt;, make sure the &amp;lt;jndi-name&amp;gt;juddiDB&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;update the &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;server/default/deploy/jbossesb.sar/esb.juddi.xml&lt;/span&gt;&lt;/span&gt; to make sure the mssql sql is used to create the jUDDI tables&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;&amp;lt;entry key="juddi.sqlFiles"&amp;gt;juddi-sql/mssql/create_database.sql,juddi-sql/mssql/import.sql&amp;lt;/entry&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;3. JBossESB MessageStore&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;rm server/default/deploy/jbossesb.esb/hsql-ds.xml&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cp docs/examples/jca/mssql-ds.xml server/default/deploy/jbossesb.esb&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;update the mssql-ds.xml, make sure the &amp;lt;jndi-name&amp;gt;JBossESBDS&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;update the &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;server/default/deploy/jbossesb.esb/jbossesb-service.xml&lt;/span&gt;&lt;/span&gt; to point to the mssql sql for creating the message table&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;&amp;lt;attribute name="SqlFiles"&amp;gt;&lt;br /&gt;     message-store-sql/mssql/create_database.sql&lt;br /&gt;&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;4. jBPM&lt;/b&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;rm server/default/deploy/jbpm.esb/hsql-ds.xml&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;cp docs/examples/jca/mssql-ds.xml server/default/deploy/jbpm.esb/&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;update the mssql-ds.xml, make sure the &amp;lt;jndi-name&amp;gt;JbpmDS&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;update the &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;server/default/deploy/jbpm.esb/hibernate.cfg.xml&lt;/span&gt;&lt;/span&gt; to make sure the &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;SQLServerDialect&lt;/span&gt;&lt;/span&gt; is used&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;&amp;lt;!-- hibernate dialect --&amp;gt;&lt;br /&gt;&amp;lt;property name="hibernate.dialect"&amp;gt;org.hibernate.dialect.SQLServerDialect&amp;lt;/property&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;update the &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;server/default/deploy/jbpm.esb/jbpm-service.xml&lt;/span&gt;&lt;/span&gt; so it points to the mssql sql file&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;&amp;lt;attribute name="SqlFiles"&amp;gt;&lt;br /&gt;     jbpm-sql/jbpm.jpdl.mssql.sql,&lt;br /&gt;     jbpm-sql/import.sql&lt;br /&gt;&amp;lt;/attribute&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Not that the import.sql tries to set the primary key, which is an autoincrement column. MSSQL does not like this. Simply setting this column from this script will get you going.&lt;br /&gt;&lt;b&gt;5. Finishing up&lt;/b&gt;&lt;br /&gt;To Finish up, make sure you add the &lt;a href="http://jtds.sourceforge.net/"&gt;mssql database driver&lt;/a&gt; jar to the &lt;span style=";font-family:courier new;font-size:85%;"  &gt;server/default/lib &lt;/span&gt;directory, and make sure you added your credentials to the various mssql-ds.xml files.&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;&amp;lt;datasources&amp;gt;&lt;br /&gt; &amp;lt;local-tx-datasource&amp;gt;&lt;br /&gt;   &amp;lt;jndi-name&amp;gt;JbpmDS&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;&amp;lt;connection-url&amp;gt;jdbc:jtds:sqlserver://192.168.1.2:1433/jbossesb&amp;lt;/connection-url&amp;gt;&lt;br /&gt;   &amp;lt;driver-class&amp;gt;net.sourceforge.jtds.jdbc.Driver&amp;lt;/driver-class&amp;gt;&lt;br /&gt;   &amp;lt;user-name&amp;gt;jbossesb_admin&amp;lt;/user-name&amp;gt;&lt;br /&gt;   &amp;lt;password&amp;gt;admin&amp;lt;/password&amp;gt;&lt;br /&gt;     &amp;lt;!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) --&amp;gt;&lt;br /&gt;     &amp;lt;metadata&amp;gt;&lt;br /&gt;        &amp;lt;type-mapping&amp;gt;MS SQLSERVER2000&amp;lt;/type-mapping&amp;gt;&lt;br /&gt;     &amp;lt;/metadata&amp;gt;&lt;br /&gt; &amp;lt;/local-tx-datasource&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Make sure this user has table create rights, so that when you start up JBossESB it can create the tables.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-4478284952159536936?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/4478284952159536936/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=4478284952159536936' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4478284952159536936'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4478284952159536936'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/04/switch-jbossesb-45ga-from-hsql-to-mssql.html' title='Switch JBossESB-4.5.GA from HSQL to MSSQL'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-6103912161631994715</id><published>2009-04-03T11:13:00.000-07:00</published><updated>2009-04-03T11:21:56.910-07:00</updated><title type='text'>MSSQL Drop all constraints from the database</title><content type='html'>Recently I had to drop all tables from a MSSQL Server Database, and this proved to be harder than expected because of foreign key contraints in the database. I found a &lt;a href="http://house9-code-samples.blogspot.com/2008/05/mssql-drop-and-re-add-constraints.html"&gt;post on how do disable them&lt;/a&gt; but that turned out to be not enough to allow to drop the tables. Instead I had to drop all the constraints from the database. The few lines below generate the commands to do this.&lt;br /&gt;&lt;pre class="Java" name="code"&gt;&lt;br /&gt;select&lt;br /&gt;'ALTER TABLE ' + so.table_name + ' DROP CONSTRAINT ' + so.constraint_name&lt;br /&gt;from INFORMATION_SCHEMA.TABLE_CONSTRAINTS so &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-6103912161631994715?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/6103912161631994715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=6103912161631994715' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6103912161631994715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6103912161631994715'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/04/mssql-drop-all-constraints-from.html' title='MSSQL Drop all constraints from the database'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-7415734232490263473</id><published>2009-03-25T14:34:00.000-07:00</published><updated>2009-03-26T05:40:49.638-07:00</updated><title type='text'>Smooks XML2Java Transformation</title><content type='html'>Previously I wrote about using Smooks for &lt;a href="http://kurtstam.blogspot.com/2008_09_01_archive.html"&gt;XML2XML&lt;/a&gt; transformations. Today I worked on an XML2Java transformation. It so happens that my incoming XML is completely flat, and looks like&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;br /&gt;  &amp;lt;my-example-data&amp;gt;&lt;br /&gt;  &amp;lt;id&amp;gt;1234&amp;lt;/id&amp;gt;&lt;br /&gt;  &amp;lt;fname&amp;gt;First Name&amp;lt;/fname&amp;gt;&lt;br /&gt;  &amp;lt;mname&amp;gt;Middle Name&amp;lt;/mname&amp;gt;&lt;br /&gt;  &amp;lt;lname&amp;gt;Last Name&amp;lt;/lname&amp;gt;&lt;br /&gt;  &amp;lt;jobTitle&amp;gt;Job Title&amp;lt;/jobTitle&amp;gt;&lt;br /&gt;  &amp;lt;/my-example-data&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Which lends itself really well to be stuffed into a Map, with the key being the name of the element. This is where a really handy Smooks trick comes in handy&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"&lt;br /&gt; xmlns:jb="http://www.milyn.org/xsd/smooks/javabean-1.1.xsd"&amp;gt;&lt;br /&gt;&amp;lt;jb:bindings beanId="inquiryMap" class="java.util.HashMap" createOnElement="$document"&amp;gt;&lt;br /&gt;  &amp;lt;jb:value data="inquiry-email-data/*"/&amp;gt;&lt;br /&gt;&amp;lt;/jb:bindings&amp;gt;&lt;br /&gt;&amp;lt;/smooks-resource-list&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now when running the following code:&lt;br /&gt;&lt;pre class="Java" name="code"&gt;&lt;br /&gt;Smooks smooks = new Smooks("smooks-config.xml");&lt;br /&gt;JavaResult javaResult = new JavaResult();&lt;br /&gt;smooks.filter(new StreamSource(new StringReader(xml)), javaResult);&lt;br /&gt;Map results = (Map&amp;lt;String,String&amp;gt;) javaResult.getBean("inquiryMap");&lt;br /&gt;System.out.println("result=" + results);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It prints out:&lt;br /&gt;&lt;pre class="Java" name="code"&gt;&lt;br /&gt;results={lname=Last Name, mname=Middle Name, fname=First Name, id=1234, jobTitle=Job Title}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The Smooks User Guide talks about something similar when your XML uses &lt;a href="http://docs.google.com/View?docid=dfp8fxm6_1fv2nj3hn&amp;hgd=1#SmooksUserGuide_BindingKeyValu"&gt;property elements&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;By the way if you like mapping out your transformation graphically you should check out the new &lt;a href="http://docs.jboss.org/tools/3.0.0.GA/en/jboss_smooks_plugin_ref_guide/html/introduction.html"&gt;Smooks Graphical Editor&lt;/a&gt;.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_fAUX2tnEInU/ScrJrnoENaI/AAAAAAAAAFc/DZx3ySxqCQg/s1600-h/graph_editor1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 342px;" src="http://3.bp.blogspot.com/_fAUX2tnEInU/ScrJrnoENaI/AAAAAAAAAFc/DZx3ySxqCQg/s400/graph_editor1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5317284061272880546" /&gt;&lt;/a&gt;&lt;br /&gt;The Eclipse plugin can be downloaded from &lt;a href="http://www.smooks.org/news/eclipseeditorforsmooksinjbosstools"&gt;http://www.smooks.org/news/eclipseeditorforsmooksinjbosstools&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-7415734232490263473?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/7415734232490263473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=7415734232490263473' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7415734232490263473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7415734232490263473'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/03/smooks-xml2java-transformation.html' title='Smooks XML2Java Transformation'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_fAUX2tnEInU/ScrJrnoENaI/AAAAAAAAAFc/DZx3ySxqCQg/s72-c/graph_editor1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-1535142304163604421</id><published>2009-03-12T16:55:00.000-07:00</published><updated>2009-03-12T17:06:38.210-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><title type='text'>JBoss Deployment Dependencies of a War</title><content type='html'>When your war file depends on another service to deploy first you can add a &lt;span style="font-style:italic;"&gt;depends&lt;/span&gt; element in the WEF-INF/jboss-web.xml. This will guaranty the deployment order, and the war file will not be deployed until the PluginManager Service is deployed first.&lt;br /&gt;&lt;pre class="XML" name="code"&gt; &lt;br /&gt;   &lt;!-- The war depends on the --&gt;&lt;br /&gt;   &lt;depends&gt;jboss.admin:service=PluginManager&lt;/depends&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I know I looked for this before and was not able to find it. Now I won't forget.&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-1535142304163604421?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/1535142304163604421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=1535142304163604421' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/1535142304163604421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/1535142304163604421'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/03/jboss-deployment-dependencies-of-war.html' title='JBoss Deployment Dependencies of a War'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-302883323263099422</id><published>2009-02-17T18:01:00.001-08:00</published><updated>2009-02-18T09:30:52.748-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBossESB'/><category scheme='http://www.blogger.com/atom/ns#' term='Rules'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>Using Regexp in Drools 5</title><content type='html'>I've spend waaay too much time on this, so I need to scribble this '&lt;span style="font-style:italic;"&gt;note to self&lt;/span&gt;'. I'm working with JBossESB and I have a piece of text in the body of the message. Now if a certain word is found in this text I want to route the message a certain way. This example is based on the simple_cbr quickstart.&lt;br /&gt;&lt;br /&gt;1. So let's first take a look how to match a word in a string. To demonstrate how to do this I created this logging rule:&lt;br /&gt;&lt;pre class="Java" name="code"&gt;&lt;br /&gt;rule "Logging"&lt;br /&gt;    when &lt;br /&gt;        b: String(this matches "(?i).*Order(.|\n|\r)*" &amp;&amp; this matches ".*EST(.|\n|\r)*")&lt;br /&gt;    then&lt;br /&gt;        System.out.println("b=|" + b + "|");&lt;br /&gt;    end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This rule will print out the incoming string if both the words 'Order' and 'EST' are matched.&lt;br /&gt;The (?i) means 'ignore case', .*Order*. means the word 'Order' or 'order' anywhere in the string will be matched, but this will still not work if the string is multi-line (The '.' character does not match the newline character). So to fix that we need to make it .*Order(.|\n)*. Same story for the '\r'. This is the first word match which we can combine with '&amp;&amp;' or '||' with other matches like I did here looking for 'EST'.&lt;br /&gt;&lt;br /&gt;2. Finally to push the String from the default place in the ESB message into the rules engine you need to use an object path of "body.'org.jboss.soa.esb.message.defaultEntry'" as shown in the XML fragment taking from a jboss-esb.xml.&lt;br /&gt;&lt;br /&gt;&lt;pre class="xml" name="code"&gt;&lt;br /&gt;&amp;lt;action class="org.jboss.soa.esb.actions.ContentBasedRouter" name="ContentBasedRouter"&amp;gt;&lt;br /&gt;    &amp;lt;property name="ruleSet" value="ShippingRules.drl"/&amp;gt;&lt;br /&gt;    &amp;lt;property name="ruleReload" value="true"/&amp;gt;&lt;br /&gt;    &amp;lt;property name="object-paths"&amp;gt;&lt;br /&gt;        &amp;lt;object-path esb="body.'org.jboss.soa.esb.message.defaultEntry'" /&amp;gt;&lt;br /&gt;    &amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;property name="destinations"&amp;gt;&lt;br /&gt;        &amp;lt;route-to destination-name="express" service-category="ExpressShipping" service-name="ExpressShippingService"/&amp;gt;&lt;br /&gt;        &amp;lt;route-to destination-name="normal"  service-category="NormalShipping"  service-name="NormalShippingService"/&amp;gt;&lt;br /&gt;    &amp;lt;/property&amp;gt;  &lt;br /&gt;&amp;lt;/action&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;alternatively you can use a path of esb="BODY_CONTENT".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-302883323263099422?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/302883323263099422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=302883323263099422' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/302883323263099422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/302883323263099422'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/02/using-regexp-in-drools.html' title='Using Regexp in Drools 5'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-1645184932919989645</id><published>2009-02-17T06:01:00.000-08:00</published><updated>2009-02-17T19:03:48.789-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='jUDDI'/><title type='text'>jUDDI-3.0.0.alpha released</title><content type='html'>For details see the &lt;a href="http://ws.apache.org/juddi/index.html"&gt;jUDDI website&lt;/a&gt; or the &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=53648"&gt;TSS announcement&lt;/a&gt;. This release duplicates the functionality that is available in jUDDIv2.x and we'll be working on the newly added UDDI v3 APIs (such as the Subscription, Replication and Custody transfer) going forward. To get started we created a ready-to-go UDDI v3 server in one download: &lt;a href="http://www.apache.org/dist/ws/juddi/3_0/juddi-tomcat-3.0.0.alpha.zip"&gt;juddi-tomcat.zip&lt;/a&gt; (based on jUDDI-3.0.0.alpha, Tomcat and Derby). Please contact us if you want to help out. Now that the jUDDI-v3.x code base is functional it is relativity easy to contribute.&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-1645184932919989645?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/1645184932919989645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=1645184932919989645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/1645184932919989645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/1645184932919989645'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/02/juddi-300alpha-released.html' title='jUDDI-3.0.0.alpha released'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-1912292167157344053</id><published>2009-02-13T09:14:00.000-08:00</published><updated>2010-01-09T12:27:03.202-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java Architecture Management</title><content type='html'>Yesterday I attended a NEJUG meeting presented by Alexander von Zitzewitz called "&lt;a href="http://www.nejug.org/events/show/89"&gt;Java Architecture Management or how to avoid the structural erosion of your code base&lt;/a&gt;". It was a pretty entertaining talk where he reviewed a number of scenarios that lead to the creation of unmaintainable complexity. He confirmed a lot of what I already knew, but nicely formulated and explained. He argued that no documentation is going to help you, it's prohibitively  expensive to create and always outdated by the latest code. A general theme was that you need to have an architecture that slices horizontally (architectural layers) as well as vertically (functional slices). Think of vertical slices as your java package naming and how packages end up in a jar. This way you end up with a grid of subsystems. Next you can start analyzing the dependencies between the subsystems. He described a number of code metrics that can be used to quantify the number of architecture violations in the code. He came up with a list of 6 rules that one should follow to write maintainable code:&lt;br /&gt;&lt;br /&gt;Rule 1: Define a cycle free logical architecture down to the level of subsystems and a strict and consistent package naming convention&lt;br /&gt;Rule 2: Do not allow cyclic dependencies between different packages&lt;br /&gt;Rule 3: Keep the relative ACD low (&lt; 7% for 500 compilation units, NCCD &lt; 6)&lt;br /&gt;Rule 4: Limit the size of Java files (700 LOC is a reasonable value)&lt;br /&gt;Rule 5: Limit the cyclomatic complexity of methods (e.g. 15)&lt;br /&gt;Rule 6: Limit the size of a Java package (e.g. less than 50 types)&lt;br /&gt;&lt;br /&gt;To break a dependency cycle you can should introduce an interface; this reverses the dependency. It is that simple. This leads to the observation that "good code" can be recognized using certain metrics (see also a white paper by &lt;a href="http://www.google.com/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fwww.objectmentor.com%2Fresources%2Farticles%2Foodmetrc.pdf&amp;ei=gd6WSde2D4G4tweWk5mcCw&amp;usg=AFQjCNEkD0ytLR4RsHBdUDYgCkz-iXzzwg&amp;sig2=VKElA22tJ45ODbTiMREgOw"&gt;Robert Martin&lt;/a&gt;. Good code should have a certain ration of abstractness (classes vs interfaces), and if more code depends on your code, you will likely need more interfaces. The two extremes of this "metric distance" from the optimal ratio, are:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;zone of uselessness&lt;/span&gt; which means a high number of interfaces and few things depending on you. This happens when coders plan for complexity that never happened.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;zone of pain&lt;/span&gt; which means very few interfaces and lots of code depends on you. So each change in your class can break lots of other things elsewhere. This usually happens when people cut corners to make a deadline.&lt;br /&gt;&lt;br /&gt;To monitor this adherence to the rules you need a tool. Commercially he listed three; &lt;a href="http://www.lattix.com/"&gt;Lattix&lt;/a&gt; here in Massachusetts, Structure101 and &lt;a href="http://www.hello2morrow.com/products/sonarj"&gt;SonarJ&lt;/a&gt;, which is his product and which was later demoed. I was actually involved in a case study with Lattix a few years ago, which was interesting but felt like moving the chair on the deck of the Titanic. The case study only took into account the Java side and our major issue was the duplication of code on the server (Java) and the client side (Javascript). Code duplication is something that is not easily picked up and certainly not when it appears in the different Languages. We were simply to deep into our own poo to fix things. I think a rewrite was the only option for that product. Anyway I still learned a lot from it. For one that it is never too early to hook up a static code analyzer to the nightly build. If you register with hello2morrow you can download a free version of &lt;a href="http://www.hello2morrow.com/products/sonarj"&gt;SonarJ&lt;/a&gt; meant for projects with fewer then 500 Java classes. If you want to go Open Source then you can try: &lt;a href="http://pmd.sourceforge.net/"&gt;PMD&lt;/a&gt;, &lt;a href="http://clarkware.com/software/JDepend.html"&gt;jDepend&lt;/a&gt; (dependencies only) and &lt;a href="http://72miles.com/architecturerules/"&gt;Architecture Rules&lt;/a&gt; (on top of jDepend).&lt;br /&gt;&lt;br /&gt;The meeting really confirmed my own experiences, that the process of creating good code is simple. You just have to follow it *all the f***ing time* (much like &lt;a href="http://vimeo.com/1534976"&gt;Bryan Liles' TATFT framework&lt;/a&gt;). Bad code is like a black hole attracting other bad code. So simply don't put black holes in your code! If your system gets large, make sure you use tools to monitor that none of these simple rules are broken. Hook them up to the nightly build and have any violations be fixed the very next day. Note that you need an architecture before you can use any of these tools!&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-1912292167157344053?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/1912292167157344053/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=1912292167157344053' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/1912292167157344053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/1912292167157344053'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/02/java-architecture-management.html' title='Java Architecture Management'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-299824927822842742</id><published>2009-02-10T11:48:00.000-08:00</published><updated>2009-02-17T09:31:16.633-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='jUDDI'/><title type='text'>jUDDI 2.0rc6 released</title><content type='html'>Today the &lt;a href="http://ws.apache.org/juddi/"&gt;jUDDI&lt;/a&gt; team released the -hopefully final- &lt;a href="http://www.apache.org/dist/ws/juddi/2_0RC6/"&gt;release candidate for of jUDDI-2.0&lt;/a&gt;. One of the major new release artifacts is a &lt;a href="http://www.apache.org/dist/ws/juddi/2_0RC6/juddi-tomcat-2.0rc6.zip"&gt;jUDDI-tomcat bundle&lt;/a&gt; which is a jUDDI server bundled with Tomcat and an embedded Derby database. This means that users can start using their UDDI server instantly. It is expected that the jUDDI-2.0 release will follow shortly, as well as a jUDDI-3.0alpha release. The full release notes can be found &lt;a href="http://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=10401&amp;styleName=Html&amp;version=12313406"&gt;here&lt;/a&gt;. jUDDI-3.0 implements the &lt;a href="http://www.oasis-open.org/specs/index.php#uddi"&gt;UDDI v3.0.2 spec&lt;/a&gt;, while jUDDI-2.0 implements the &lt;a href="http://www.oasis-open.org/specs/index.php#uddi"&gt;UDDI v2 spec&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-299824927822842742?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/299824927822842742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=299824927822842742' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/299824927822842742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/299824927822842742'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/02/juddi-20rc6-released.html' title='jUDDI 2.0rc6 released'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-9047401704439979390</id><published>2009-02-09T16:18:00.000-08:00</published><updated>2009-02-10T12:09:10.216-08:00</updated><title type='text'>Code Listings on Blogger</title><content type='html'>I finally found a great post about inserting &lt;a href="http://developertips.blogspot.com/2007/08/syntaxhighlighter-on-blogger.html"&gt;code listings on Blogger&lt;/a&gt;. They use a javascript library called &lt;a href="http://code.google.com/p/syntaxhighlighter/"&gt;syntax-highlighter&lt;/a&gt;.&lt;br /&gt;Let's see if it works:&lt;br /&gt;&lt;pre class="Java" name="code"&gt;&lt;br /&gt;package freshespresso.listing;&lt;br /&gt;&lt;br /&gt;public class List {&lt;br /&gt;&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        System.out.println("That's some high octane cup!");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note that for Java code you would use the class="Java" and name="code" attributes on the pre element, like&lt;br /&gt;&lt;pre class="Java" name="code"&gt;&lt;br /&gt;&amp;lt;pre class="Java" name="code"&amp;gt;&lt;br /&gt; java code here...&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I love it! Here is a cup of goodness for you &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter"&gt;Mr Alex Gorbatchev&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_fAUX2tnEInU/SZDU7NKOHBI/AAAAAAAAAE8/RI10Azm6AjM/s1600-h/180px-Espresso_still_life.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 180px; height: 120px;" src="http://1.bp.blogspot.com/_fAUX2tnEInU/SZDU7NKOHBI/AAAAAAAAAE8/RI10Azm6AjM/s400/180px-Espresso_still_life.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5300970875024972818" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-9047401704439979390?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/9047401704439979390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=9047401704439979390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/9047401704439979390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/9047401704439979390'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/02/code-listings-on-blogger.html' title='Code Listings on Blogger'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_fAUX2tnEInU/SZDU7NKOHBI/AAAAAAAAAE8/RI10Azm6AjM/s72-c/180px-Espresso_still_life.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-4256656517543926644</id><published>2009-01-29T09:00:00.000-08:00</published><updated>2009-01-29T09:08:23.710-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><title type='text'>Maven: The Definitive Guide</title><content type='html'>I'm trying to get a jUDDI release out the door, threw a fit with maven and finally picked up a copy of the book "Maven: The Defintive Guide". This book is pretty good and a free online version of it can be found at the &lt;a href="http://books.sonatype.com/maven-book/reference/public-book.html"&gt;Sonatype website&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I love the standardization of Maven, but as the number of plugin grow it is sometimes hard to figure out which plugin to use, and how the configuration works. This book is certainly a help.&lt;br /&gt;&lt;br /&gt;--Kurt&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-4256656517543926644?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/4256656517543926644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=4256656517543926644' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4256656517543926644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4256656517543926644'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/01/maven-definitive-guide.html' title='Maven: The Definitive Guide'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-3067321179506192172</id><published>2009-01-19T16:48:00.000-08:00</published><updated>2009-02-09T19:30:13.727-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JOSSO'/><category scheme='http://www.blogger.com/atom/ns#' term='single sign-on'/><title type='text'>JOSSO 1.8 Released</title><content type='html'>&lt;a href="http://www.josso.org/confluence/display/JOSSO1/JOSSO+-+Java+Open+Single+Sign-On+Project+Home"&gt;JOSSO&lt;/a&gt; 1.8 was &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=52931"&gt;released&lt;/a&gt; last week and in my opinion the 5 minute setup is a &lt;span style="font-style: italic;"&gt;key&lt;/span&gt; feature. Using the deployment console &lt;a href="http://www.josso.org/confluence/display/JOSSO1/Quick+Start"&gt;getting started&lt;/a&gt; with JOSSO will now be &lt;span style="font-style: italic;"&gt;that&lt;/span&gt; much easier.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-3067321179506192172?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/3067321179506192172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=3067321179506192172' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3067321179506192172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3067321179506192172'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2009/01/josso-18-released.html' title='JOSSO 1.8 Released'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-4094469153542957669</id><published>2008-11-19T13:58:00.000-08:00</published><updated>2009-02-09T12:39:22.346-08:00</updated><title type='text'>Deploy Ruby on Rails to JBoss (Tomcat)</title><content type='html'>Ruby can be run on the JVM as a war file. The Hello World is really very simple following the steps outlined by &lt;a href="http://weblogs.java.net/blog/arungupta/archive/2008/05/warbased_packag.html"&gt;Arun Gupta&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;1. Install &lt;a href="http://jruby.codehaus.org/Getting+Started"&gt;jruby&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;2. Install rails and JRuby-Jack&lt;br /&gt;&lt;br /&gt;kstam-mbpro-2:ruby kstam$ jruby -S gem install rails warbler --no-ri --no-rdoc&lt;br /&gt;JRuby limited openssl loaded. gem install jruby-openssl for full support.&lt;br /&gt;http://wiki.jruby.org/wiki/JRuby_Builtin_OpenSSL&lt;br /&gt;Successfully installed activesupport-2.1.2&lt;br /&gt;Successfully installed activerecord-2.1.2&lt;br /&gt;Successfully installed actionpack-2.1.2&lt;br /&gt;Successfully installed actionmailer-2.1.2&lt;br /&gt;Successfully installed activeresource-2.1.2&lt;br /&gt;Successfully installed rails-2.1.2&lt;br /&gt;Successfully installed warbler-0.9.11&lt;br /&gt;7 gems installed&lt;br /&gt;&lt;br /&gt;3. Create a Hello Rails app: jruby -S rails hello -d mysql&lt;br /&gt;&lt;br /&gt;4. open hello/config/environment.rb in your favorite editor and uncomment so the line looks like&lt;br /&gt;config.frameworks -= [ :active_record, :active_resource, :action_mailer ]&lt;br /&gt;&lt;br /&gt;5. Use warble to create your war file&lt;br /&gt;jruby -S warble&lt;br /&gt;&lt;br /&gt;6. copy the hello.war to your server/default/deploy directory&lt;br /&gt;&lt;br /&gt;7. Hit http://localhost:8080/hello in your browser.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_fAUX2tnEInU/SSSQSjSLOSI/AAAAAAAAADk/kkmaRQ0olJc/s1600-h/helloworld.png"&gt;&lt;img style="cursor: pointer; width: 400px; height: 359px;" src="http://4.bp.blogspot.com/_fAUX2tnEInU/SSSQSjSLOSI/AAAAAAAAADk/kkmaRQ0olJc/s400/helloworld.png" alt="" id="BLOGGER_PHOTO_ID_5270496112313841954" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Conclusion: A rails application is basically packaged up in the WEB-INF/ directory of the war and a ruby filter defined in the web.xml takes care of running it.&lt;br /&gt;&lt;br /&gt;I also found that in JBoss 5, there would be no need for deploying it in a war, as the the deployer framework of JBoss-Microcontainer enables in-place &lt;a href="http://oddthesis.org/theses/jboss-rails"&gt;native deployment of Rails applications&lt;/a&gt; in a way familiar to traditional rubyists.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-4094469153542957669?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/4094469153542957669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=4094469153542957669' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4094469153542957669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4094469153542957669'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/11/deploy-ruby-on-rails-to-jboss-tomcat.html' title='Deploy Ruby on Rails to JBoss (Tomcat)'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_fAUX2tnEInU/SSSQSjSLOSI/AAAAAAAAADk/kkmaRQ0olJc/s72-c/helloworld.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-6333217524883135906</id><published>2008-11-19T07:14:00.000-08:00</published><updated>2008-11-20T08:11:37.668-08:00</updated><title type='text'>Voices that matter, Professional Ruby Conference</title><content type='html'>As stated before I'm a Java guy, however this week I'm at a &lt;a href="http://www.voicesthatmatter.com/ruby2008/index.aspx"&gt;Ruby conference in Boston&lt;/a&gt;. I'm working on a 2 year old java based application and we started to do Ruby on Rails right when I got on board. The RoR has been pretty successful, and I have to admit it sure is much, much easier to work with than Struts and jsps. There is still a chance Seam may save Java for the web tier, but for the current project Seam is not an option. So we're working on a hybrid architecture where we can run RoR and Java, so here I am at the Ruby conference! So when I write this review you will now hopefully understand my point of view.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.voicesthatmatter.com/ruby2008/schedule.aspx"&gt;Schedule&lt;/a&gt;: November 17-20, 2008.&lt;br /&gt;&lt;br /&gt;For me the presentation by Thomas Enebo, &lt;strong&gt;&lt;/strong&gt;&lt;a href="http://www.voicesthatmatter.com/ruby2008/sessions.aspx#virtual"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;a name="virtual"&gt;Ruby and the Java Virtual Machine&lt;/a&gt;&lt;/strong&gt; was an eye opener. Being new to Ruby in general I didn't not have much understanding on how JRuby worked on the JVM until now. It turns out that although &lt;a href="http://jruby.codehaus.org/"&gt;JRuby&lt;/a&gt; trails Ruby a bit in terms of releases, it is identical to Ruby, but will have a different sets of bugs ;), however the best part is that JRuby is faster, and it can call into Java natively. It does run your code as byte code, but it stays dynamic! On the flipside this means that it won't ever be as fast as running Java on the JVM. Now the cool part is that you can deploy a RoR application as war file to your appserver, and talk natively to any code written in Java. Currently they are working on to finalize Ruby 1.9 features. This presentation really came to live for me when I went to the 'Lightning Round' later that night, where Mark Menard (from &lt;a href="http://www.vitarara.net/"&gt;Vita Rara&lt;/a&gt;) spoke about his experiences with JRuby. He runs a Spring based application and first tried Groovy on Rails, but in the end he discovered that Groovy meta-model is too close to Java and so he started experimenting with RoR deployed to the JVM, and discovered that it really works as advertised. He is rewriting his application from the ground up and just replaced Hibernate by ActiveRecord, which proves that you can port pieces of your app while being in flight. For me this is very exciting to hear. Not necessarily that Hibernate can be swapped out from ActiveRecord, but more that it is not only possible but that it is actually a practical solution to build hybrid apps by running Ruby on the JVM!&lt;br /&gt;&lt;br /&gt;Another talk I really liked was given by Ezra Zygmuntowicz, &lt;a href="http://www.voicesthatmatter.com/ruby2008/sessions.aspx#fouryears"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;a name="fouryears"&gt;Four Years of Ruby Deployment&lt;/a&gt;&lt;/strong&gt;. He went over the history of Ruby webservers (Mongrel, Thin, Ebb, NginX, Passenger), and liked Rack as the web equalizer since it abstracts these different implementation, and he picked Thin + NginX as his implementation preference. However then he demoed an application called Nanite, which is a web-based app to configure a linux server, with the possibility of cloning a certain configuration to multiple other nodes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Oh I almost forgot, everyone seems to run their own little consulting firm writing Rails apps, all the speakers wrote a book and everyone uses Twitter.&lt;br /&gt;&lt;br /&gt;It's actually pretty cool as I learn more about it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-6333217524883135906?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/6333217524883135906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=6333217524883135906' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6333217524883135906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6333217524883135906'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/11/voices-that-matter-day-1-professional.html' title='Voices that matter, Professional Ruby Conference'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-9163398478238007736</id><published>2008-10-13T17:35:00.000-07:00</published><updated>2008-10-13T18:15:48.730-07:00</updated><title type='text'>Anything goes alternative Olympic Games</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://devicedaily.com/misc/faster-than-phelps-lunocet-for-underwater-speed-and-mobility.html"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px;" src="http://devicedaily.com/wp-content/uploads/2008/08/lunocet-01.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I've been toying with the idea of an alternative Olympics where anything goes as long as it is human powered. The rules are simple, (if you're stupid enough) you can use any kind of dope but more interestingly you can use any kind of technology, just as long as it is human powered. I want to see Phelps with one of these things! Maybe he can wear a fin on his back to go with it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-9163398478238007736?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/9163398478238007736/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=9163398478238007736' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/9163398478238007736'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/9163398478238007736'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/10/anything-goes-alternative-olympic-games.html' title='Anything goes alternative Olympic Games'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-6454743528292314398</id><published>2008-10-11T08:13:00.000-07:00</published><updated>2008-10-12T06:24:39.771-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><category scheme='http://www.blogger.com/atom/ns#' term='Hibernate'/><title type='text'>Hibernate Interceptors, Events and JPA Entity Listeners</title><content type='html'>Hibernate became is an implementation of the JPA specification. The JPA specification is part of the EJB3 specification (&lt;a href="http://jcp.org/aboutJava/communityprocess/final/jsr220/index.html"&gt;JSR-220&lt;/a&gt;). See, &lt;a href="http://java.sun.com/javaee/overview/faq/persistence.jsp"&gt;SUNs FAQ&lt;/a&gt; on that if you want to know more about that.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Hibernate Interceptors&lt;/span&gt;&lt;br /&gt;In a recent project I wanted to intercept Create, Update and Delete events. From the &lt;a href="http://www.hibernate.org/hib_docs/v3/reference/en-US/html/events.html"&gt;Hibernate Reference Documentation&lt;/a&gt; it was pretty straightforward to find out how to create an Interceptor class. I extended my AuditInterceptor class from the EmptyInterceptor interface and implemented the onSave, onFlushDirty and onDelete methods but then was a bit puzzled how to activate the interceptor. &lt;a href="http://www.hibernate.org/hib_docs/entitymanager/reference/en/html/configuration.html"&gt;Chapter 2&lt;/a&gt; talks about specific hibernate configuration properties, but how to use those when you're using a JPA persistence.xml? It turns out the answer is very simple. Pretty much any vendor specific property can be set in the persistence.xml using a properties block. In this case a property with name hibernate.ejb.interceptor needs to be set to the full name of my AuditInterceptor class.&lt;br /&gt;&lt;br /&gt;Some advantages are that&lt;br /&gt;&lt;ul&gt;&lt;li&gt;you don't to change any of your existing code, just add your interceptor and update the persistence.xml &lt;/li&gt;&lt;li&gt;the &lt;a href="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Interceptor.html"&gt;onFlushDirty&lt;/a&gt; gives you a nice detailed information on what changed&lt;/li&gt;&lt;/ul&gt;but on the flipside&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the interceptor fires for &lt;span style="font-style: italic;"&gt;every&lt;/span&gt; entity bean, and chances are you're only interested in a subset. I ended up doing the filtering in my AudutInterceptor.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;if your primary key is set by the database, the id is still undefined when onSave fires.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Hibernate Events&lt;/span&gt;&lt;br /&gt;The capabilities of&lt;a href="http://www.hibernate.org/hib_docs/v3/reference/en-US/html/objectstate-events.html"&gt; Hibernate Events&lt;/a&gt; API goes beyond those of the Interceptors. It gives you very fine-grained control over where to hook into the event stream. Check out the &lt;a href="http://www.hibernate.org/hib_docs/v3/api/org/hibernate/event/package-summary.html"&gt;org.hibernate.event&lt;/a&gt; package for all the different interfaces you can implement.&lt;br /&gt;&lt;br /&gt;Some advantages&lt;br /&gt;&lt;ul&gt;&lt;li&gt;fine-grained control over where to hook into the persistence process (lots of Pre- and Post-event interfaces)&lt;/li&gt;&lt;li&gt;The event objects are contain a wealth of information, including previous and current state of the entity. &lt;/li&gt;&lt;/ul&gt;but on the flipside&lt;br /&gt;&lt;ul&gt;&lt;li&gt;hooking up your EventListener is either done programmatically or using the Hibernate session-factory configuration block. I guess I could use a hibernate.cfg.xml file and reference that in my persistence.xml, but it started to feel convoluted to me.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;JPA EntityListeners&lt;/span&gt;&lt;br /&gt;FInally there are non vendor specific JPA &lt;a href="http://www.hibernate.org/hib_docs/entitymanager/reference/en/html/listeners.html"&gt;EntityListeners&lt;/a&gt;. To use an EntityListener you simply add a '@EntityListener (class=&lt;your&gt;)' annotation. Then in your listener class you can use other annotations (like @PrePersist, @PreRemove, @PostPersist, @PostRemove, @PreUpdate, @PostUpdate and @PostLoad) to decorate your listener methods.&lt;br /&gt;&lt;br /&gt;Some advantages are&lt;br /&gt;&lt;ul&gt;&lt;li&gt;fine-grained control as to which entities you want to listen to (annotation on the entity, referencing your listener class)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;pretty good control on where you want to hook in your listener (annotation on a method on the listeners class)&lt;/li&gt;&lt;/ul&gt;but on flipside&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the API only gives you the current state of the entity, and does not provide information as to what changed in case of an update.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;In my case I ended up with a hybrid solution using a HibernateInterceptor for the Update and Delete, and using EntityListeners for the Create event, listening to the PostInsert events so that the &lt;span style="font-family:arial;"&gt;id&lt;/span&gt; field on my entities are defined.&lt;/your&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-6454743528292314398?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/6454743528292314398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=6454743528292314398' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6454743528292314398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6454743528292314398'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/10/hibernate-interceptors-events-and-jpa.html' title='Hibernate Interceptors, Events and JPA Entity Listeners'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-942324090201137448</id><published>2008-09-27T10:49:00.000-07:00</published><updated>2009-02-10T10:40:15.776-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBossESB'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>Transformation using Smooks, part 1: XML2XML</title><content type='html'>Part 1 is sort of the Hello World on Smooks, and how it is better then using plain XSLT.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://milyn.codehaus.org/Smooks"&gt;Smooks&lt;/a&gt; is fragment based data transformation framework. It can handle many different data formats and is the default transformation engine of three open source ESBs: (&lt;a href="http://www.jboss.org/jbossesb/"&gt;JBossESB&lt;/a&gt;, &lt;a href="http://synapse.apache.org/"&gt;Synapse&lt;/a&gt; and &lt;a href="http://www.mulesource.com/"&gt;Mule ESB&lt;/a&gt;). In this case I needed an XML2XML transformation. I'm used to using XSLT for that, but I had some date formatting to do, so I figured I would use Smooks. Currently the latest release is v1.0.1, so this is what I used. Note that some of the documentation on the Smooks website  already referring the v1.1.x version (you can tell by the xsd reference, smooks-1.1.xsd), so watch out for that since that will &lt;font style="font-weight: bold;"&gt;not&lt;/font&gt; work using 1.0.x. However you can still use v1.0.x notation in v1.1. x&lt;br /&gt;&lt;br /&gt;So how to go get started?&lt;br /&gt;&lt;br /&gt;1. First you will need to &lt;a href="http://www.smooks.org/downloads"&gt;download&lt;/a&gt; the Smooks Libraries, but if you're like me and use JBossESB, then you can skip this step. Note that Smooks is very modular, so if you don't need all the features you'll only need a subset of the jars provided by Smooks.&lt;br /&gt;&lt;br /&gt;2. Create a transformation unittest, like the one below to test your transformation. I based this one on the one given in the &lt;a href="http://www.smooks.org/documentation/documentation-smooks-1-0-x/user-guide"&gt;Smook User Guide&lt;/a&gt;, the one at the very end of the document).&lt;br /&gt;&lt;pre class="Java" name="code"&gt;&lt;br /&gt;package com.sermo.services.foley.transform;&lt;br /&gt;&lt;br /&gt;import java.io.FileInputStream;&lt;br /&gt;import java.io.FileNotFoundException;&lt;br /&gt;import java.io.FileWriter;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.io.InputStreamReader;&lt;br /&gt;import java.io.StringReader;&lt;br /&gt;import java.io.StringWriter;&lt;br /&gt;import java.io.Writer;&lt;br /&gt;&lt;br /&gt;import javax.xml.transform.stream.StreamResult;&lt;br /&gt;import javax.xml.transform.stream.StreamSource;&lt;br /&gt;&lt;br /&gt;import org.custommonkey.xmlunit.XMLAssert;&lt;br /&gt;import org.custommonkey.xmlunit.XMLUnit;&lt;br /&gt;import org.junit.BeforeClass;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;import org.milyn.Smooks;&lt;br /&gt;import org.milyn.container.ExecutionContext;&lt;br /&gt;import org.milyn.event.report.HtmlReportGenerator;&lt;br /&gt;import org.milyn.payload.JavaSource;&lt;br /&gt;import org.xml.sax.SAXException;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Unit test for Smooks transformation.&lt;br /&gt; *&lt;br /&gt; * Smooks configuration file is located in src/main/resources/smooks-config.xml&lt;br /&gt; * Input file for transformation is located in src/test/resouces/input.xml&lt;br /&gt; * Expected file from trasformation is located in src/test/resouces/expected.xml&lt;br /&gt; * Smooks execution report will be created in target/smooks-report.html&lt;br /&gt; */&lt;br /&gt;public class SmooksTest {&lt;br /&gt; &lt;br /&gt; public static Smooks smooks = null;&lt;br /&gt; &lt;br /&gt;    @BeforeClass&lt;br /&gt;    public static void setupSmooks() throws SAXException, IOException&lt;br /&gt;    {&lt;br /&gt;     smooks = new Smooks( "smooks-res.xml");&lt;br /&gt;    }&lt;br /&gt;    @Test&lt;br /&gt;    public void testTransformation()&lt;br /&gt;    throws FileNotFoundException, IOException, SAXException&lt;br /&gt;    {&lt;br /&gt;     InputStream in = this.getClass().getResourceAsStream("/input.xml");&lt;br /&gt;     System.out.println(new InputStreamReader(in).toString());&lt;br /&gt;     StreamSource source = new StreamSource(this.getClass().getResourceAsStream("/input.xml"));&lt;br /&gt;     ExecutionContext executionContext = smooks.createExecutionContext();&lt;br /&gt;        //create smooks report&lt;br /&gt;        Writer reportWriter = new FileWriter( "smooks-report.html" );&lt;br /&gt;        executionContext.setEventListener( new HtmlReportGenerator( reportWriter ) );&lt;br /&gt;        StreamResult result = new StreamResult( new StringWriter() );&lt;br /&gt;        smooks.filter( source, result, executionContext );&lt;br /&gt;        System.out.println("Smooks output:" + result.getWriter().toString());&lt;br /&gt;        InputStream is = this.getClass().getResourceAsStream("/expected.xml");&lt;br /&gt;        //compare the expected xml (src/test/resources/expected.xml) with the transformation result.&lt;br /&gt;        XMLUnit.setIgnoreWhitespace( true );&lt;br /&gt;        XMLAssert.assertXMLEqual(new InputStreamReader(is), new StringReader(result.getWriter().toString()));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In this case it transforms the XML in the &lt;span style="font-style:italic;"&gt;input.xml&lt;/span&gt; file into a format that should correspond to the XML in the &lt;span style="font-style:italic;"&gt;expected.xml&lt;/span&gt; file. The actual transformation happens at line 55 (smooks.filter), and the result can be accessed using a StreamResult called &lt;span style="font-style:italic;"&gt;result&lt;/span&gt;. XMLAssert is used to check that the output corresponds to our expectation.&lt;br /&gt;&lt;br /&gt;3. Smooks has one configuration file, the &lt;font style="font-style: italic;"&gt;smooks-res.xml&lt;/font&gt; file, in which you define the &lt;font style="font-style: italic;"&gt;smooks-resource-list&lt;/font&gt;, and any entry in this list is a &lt;font style="font-style: italic;"&gt;resource-config&lt;/font&gt; entry. This file contains the definition of the transformation:&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;br /&gt;&amp;lt;smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd" &amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;resource-config selector="global-parameters"&amp;gt;&lt;br /&gt;        &amp;lt;param name="default.serialization.on"&amp;gt;false&amp;lt;/param&amp;gt;&lt;br /&gt;        &amp;lt;param name="stream.filter.type"&amp;gt;SAX&amp;lt;/param&amp;gt;&lt;br /&gt;    &amp;lt;/resource-config&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;!--  Date Parser used by all the bean populators --&amp;gt;&lt;br /&gt;    &amp;lt;resource-config selector="decoder:UTCDateTime"&amp;gt;&lt;br /&gt;        &amp;lt;resource&amp;gt;org.milyn.javabean.decoders.DateDecoder&amp;lt;/resource&amp;gt;&lt;br /&gt;        &amp;lt;param name="format"&amp;gt;yyyy-MM-dd HH:mm:ss&amp;lt;/param&amp;gt;&lt;br /&gt;    &amp;lt;/resource-config&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;resource-config selector="hibernate-event"&amp;gt;&lt;br /&gt;    &amp;lt;resource&amp;gt;org.milyn.javabean.BeanPopulator&amp;lt;/resource&amp;gt;&lt;br /&gt;    &amp;lt;param name="beanId"&amp;gt;eventType&amp;lt;/param&amp;gt;&lt;br /&gt;    &amp;lt;param name="beanClass"&amp;gt;java.util.HashMap&amp;lt;/param&amp;gt;&lt;br /&gt;    &amp;lt;param name="bindings"&amp;gt;&lt;br /&gt;        &amp;lt;binding property="type"  selector="hibernate-event/@eventType" /&amp;gt;&lt;br /&gt;    &amp;lt;/param&amp;gt;&lt;br /&gt;    &amp;lt;/resource-config&amp;gt;&lt;br /&gt;   &lt;br /&gt;    &amp;lt;resource-config selector="category"&amp;gt;&lt;br /&gt;        &amp;lt;resource&amp;gt;org.milyn.javabean.BeanPopulator&amp;lt;/resource&amp;gt;&lt;br /&gt;        &amp;lt;param name="beanId"&amp;gt;category&amp;lt;/param&amp;gt;&lt;br /&gt;        &amp;lt;param name="beanClass"&amp;gt;java.util.HashMap&amp;lt;/param&amp;gt;&lt;br /&gt;        &amp;lt;param name="bindings"&amp;gt;&lt;br /&gt;            &amp;lt;binding property="name"       selector="category/name" /&amp;gt;&lt;br /&gt;            &amp;lt;binding property="type"       selector="category/type" /&amp;gt;&lt;br /&gt;            &amp;lt;binding property="id"         selector="category/id" /&amp;gt;&lt;br /&gt;            &amp;lt;binding property="createDate" selector="category/createDate" type="UTCDateTime" /&amp;gt;&lt;br /&gt;        &amp;lt;/param&amp;gt;&lt;br /&gt;    &amp;lt;/resource-config&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;resource-config selector="category"&amp;gt;&lt;br /&gt;        &amp;lt;resource type="ftl"&amp;gt;&lt;br /&gt;            &amp;lt;![CDATA[&amp;lt;caffeine-event type="${eventType.type}"&amp;gt;&lt;br /&gt;                     &amp;lt;category&amp;gt;&lt;br /&gt;        &amp;lt;cat-name&amp;gt;${category.name}&amp;lt;/cat-name&amp;gt;&lt;br /&gt;        &amp;lt;cat-type&amp;gt;${category.type}&amp;lt;/cat-type&amp;gt;&lt;br /&gt;        &amp;lt;id type="integer"&amp;gt;${category.id}&amp;lt;/id&amp;gt;&lt;br /&gt;        &amp;lt;utc-date&amp;gt;&amp;lt;#if category.createDate?exists&amp;gt;${category.createDate?string("yyyy-MM-dd'T'HH:mm:ss'Z'")}&amp;lt;/#if&amp;gt;&amp;lt;/utc-date&amp;gt;&lt;br /&gt;      &amp;lt;/category&amp;gt;&lt;br /&gt;     &amp;lt;/caffeine-event&amp;gt;]]&amp;gt;&lt;br /&gt;        &amp;lt;/resource&amp;gt;&lt;br /&gt;    &amp;lt;/resource-config&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/smooks-resource-list&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note that the first sections sets up some global parameters like which parser it should be using under the hood (SAX in this case). Next I defined a date parser called 'decoder:UTCDateTime' which can parse the date format in the input.xml, so that it can be transformed into another date format later. The next two sections set up two Java beans (using a HashMap actually), so we can add name, value pairs. The first bean selects data on the 'hibernate-event' tag, setting the &lt;span style="font-style:italic;"&gt;type&lt;/span&gt;, by selecting the value of &lt;span style="font-style:italic;"&gt;eventType&lt;/span&gt; attribute. The second section populates another HashMap by looking at the data in the &lt;span style="font-style:italic;"&gt;category&lt;/span&gt; element. This is what Smooks means with being fragment based. You can use different types of technologies to parse your incoming message (XML in this case). Finally in the last section it builds the output message. Here I chose to use &lt;a href="http://freemarker.sourceforge.net/docs/"&gt;FreeMarker&lt;/a&gt; (ftl), which is very nice templating language.&lt;br /&gt;&lt;br /&gt;4. input.xml&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;&amp;lt;hibernate-event eventType="create"&amp;gt;&lt;br /&gt; &amp;lt;category&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;Sumatra&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;type&amp;gt;Coffee Bean&amp;lt;/type&amp;gt;&lt;br /&gt;  &amp;lt;id type="integer"&amp;gt;5000&amp;lt;/id&amp;gt;&lt;br /&gt;  &amp;lt;createDate&amp;gt;2009-02-09 21:00:01&amp;lt;/createDate&amp;gt;&lt;br /&gt; &amp;lt;/category&amp;gt;&lt;br /&gt;&amp;lt;/hibernate-event&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is the incoming XML message.&lt;br /&gt;&lt;br /&gt;5. expected.xml&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;&amp;lt;caffeine-event type="create"&amp;gt;&lt;br /&gt; &amp;lt;category&amp;gt;&lt;br /&gt;  &amp;lt;cat-name&amp;gt;Sumatra&amp;lt;/cat-name&amp;gt;&lt;br /&gt;  &amp;lt;cat-type&amp;gt;Coffee Bean&amp;lt;/cat-type&amp;gt;&lt;br /&gt;  &amp;lt;id type="integer"&amp;gt;5000&amp;lt;/id&amp;gt;&lt;br /&gt;  &amp;lt;utc-date&amp;gt;2009-02-09T21:00:01Z&amp;lt;/utc-date&amp;gt;&lt;br /&gt; &amp;lt;/category&amp;gt;&lt;br /&gt;&amp;lt;/caffeine-event&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This is the XML we want to transform the input.xml to. So this file is the expected output, so we can use &lt;a href="http://xmlunit.sourceforge.net/"&gt;XMLUnit&lt;/a&gt; to assert that we got what we were expecting.&lt;br /&gt;&lt;br /&gt;6. Smooks Execution Report&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_fAUX2tnEInU/SZDyE-Jc8HI/AAAAAAAAAFU/hWQsd-_55YM/s1600-h/Picture+1.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 361px;" src="http://2.bp.blogspot.com/_fAUX2tnEInU/SZDyE-Jc8HI/AAAAAAAAAFU/hWQsd-_55YM/s400/Picture+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5301002928631115890" /&gt;&lt;/a&gt;&lt;br /&gt;When you are in the middle of building your smooks-res.xml, the Smooks Execution Report can come in very handy for debugging purposes. The lines&lt;br /&gt;&lt;pre class="Java" name="code"&gt;&lt;br /&gt;//create smooks report&lt;br /&gt;Writer reportWriter = new FileWriter( "smooks-report.html" );&lt;br /&gt;executionContext.setEventListener( new HtmlReportGenerator( reportWriter ) );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;create an HTML based report called '&lt;span style="font-style:italic;"&gt;smooks-report.html&lt;/span&gt;', which you can simply open in your favorite browser.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Conclusion&lt;/span&gt;&lt;br /&gt;Fragment based transformation rocks, have you ever tried to do any date manipulation or working on a highly normalized XML in XSLT? By the way you can still use XSLT instead of a BeanPopulator; mix and match. I also like having a real templating language to create my outgoing message. By picking the tool for the task you can expect high transformation performance. There was nice thread on theServerSide on that &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=49313"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Part 2, will be about how a Java2XML transformation and how you'd deploy the transformation as a service to JBossESB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-942324090201137448?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/942324090201137448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=942324090201137448' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/942324090201137448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/942324090201137448'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/09/transformation-using-smooks-part-1.html' title='Transformation using Smooks, part 1: XML2XML'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_fAUX2tnEInU/SZDyE-Jc8HI/AAAAAAAAAFU/hWQsd-_55YM/s72-c/Picture+1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-2922500970377425635</id><published>2008-08-15T14:57:00.000-07:00</published><updated>2009-02-09T19:29:39.854-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Javadoc</title><content type='html'>I've been writing Java for more then a decade now and the funny thing is that I never actually read how to write Javadoc. Don't get me wrong I write it alright, but when I came across &lt;a href="http://java.sun.com/j2se/javadoc/writingdoccomments/index.html"&gt;this document&lt;/a&gt;, it was kinda fun to discover the true intentions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-2922500970377425635?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/2922500970377425635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=2922500970377425635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/2922500970377425635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/2922500970377425635'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/08/javadoc.html' title='Javadoc'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-7589871567735752739</id><published>2008-08-06T12:41:00.000-07:00</published><updated>2008-08-07T05:41:45.480-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='profiling'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>MySQL Profiling and Performance tools</title><content type='html'>I'm working with a MySQL database that has been growing, and has reached about 2 Gb these days. So needless to say we're getting more interested in profiling the database. I started a search for some tools and this is the list thus far, in no particular order.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. MyTop&lt;/span&gt;&lt;br /&gt;The first tool I came across was &lt;a href="http://jeremy.zawodny.com/mysql/mytop/"&gt;mytop&lt;/a&gt;, which is a little tool inspired by 'top'. I also found this quick tutorial &lt;a href="http://www.opensourcetutorials.com/tutorials/Server-Side-Coding/Administration/mytop/page1.html"&gt;tutorial&lt;/a&gt; on how to interpret the screens. It does require depend on some Perl libraries, which you can &lt;a href="http://nosheep.net/story/installing-mytop/"&gt;install using MCPAN&lt;/a&gt;:&lt;br /&gt;&lt;span style="font-size:85%;" style="font-family:arial;"&gt;sudo perl -MCPAN -e shell&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;then at the cpan prompt:&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"  &gt;install DBI&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"  &gt;install DBD::mysql&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"  &gt;install Term::ReadKey&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"  &gt;install Term::ANSIColor&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;font-size:85%;"  &gt;install Time::HiRes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In the directory where you extracted mytop execute:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;perl Makefile.PL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;make&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;make test&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;sudo make install&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Maatkit&lt;/span&gt;&lt;br /&gt;MySQL toolkit is now called Maatkit. Maatkit can be found on &lt;a href="http://sourceforge.net/projects/maatkit"&gt;sourceforge&lt;/a&gt; and more recently on &lt;a href="http://code.google.com/p/maatkit/"&gt;code.google&lt;/a&gt;. It looks like it can come in very handy with running replicated databases. Peter Zeitsev has &lt;a href="http://www.xaprb.com/blog/category/maatkit/"&gt;nice blog&lt;/a&gt; entries on what it can do, or you can just read the &lt;a href="http://maatkit.sourceforge.net/doc/maatkit.html"&gt;docs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. MySQL Query Profiling&lt;/span&gt;&lt;br /&gt;Recently MySQL added a profiling tool in the server itself called &lt;a href="http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html"&gt;MySQL Query Profiler&lt;/a&gt;. This tool provides very detailed information on where the time is spend for a query.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. MyProfi&lt;/span&gt;&lt;br /&gt;&lt;a href="http://sourceforge.net/projects/myprofi/?abmode=1"&gt;MyProfi&lt;/a&gt; is a log analyzer and profiler. Extracts the most popular queries grouping them by their normalized form and shows the statistics for each group. Helps you recognize the most frequently run queries to be able to optimize overall db performance.&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family:times new roman;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-family:times new roman;" &gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-7589871567735752739?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/7589871567735752739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=7589871567735752739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7589871567735752739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/7589871567735752739'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/08/mysql-profiling-and-performance-tools.html' title='MySQL Profiling and Performance tools'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-9214014263277658699</id><published>2008-07-30T05:33:00.000-07:00</published><updated>2009-02-09T19:30:34.878-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Where did my class get loaded from?</title><content type='html'>In Java is it not always easy to figure out from where a certain class is loaded. Particularly when the same class is packaged up in more then one archive. So if you want to figure out from which archive the class got loaded from, this little piece of code may come in handy&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.osconsulting.org/code-fragments/classloader.html" class="source_code" style="width: 100%; height: 31em;" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-9214014263277658699?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/9214014263277658699/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=9214014263277658699' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/9214014263277658699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/9214014263277658699'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/07/where-did-my-class-get-loaded-from.html' title='Where did my class get loaded from?'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-4370676016750674481</id><published>2008-07-21T19:06:00.000-07:00</published><updated>2008-07-21T19:14:18.741-07:00</updated><title type='text'>JBoss IDE Timeout waiting for server to come up</title><content type='html'>"Did not start in 50s". That's a pretty annoying message to receive when you're trying to fire up JBoss from within eclipse using the JBoss IDE plugin. It turns out that there is a setting called "Server timeout delay" where: Unlimited (-1), Longer (1) - Shortest (9)&lt;br /&gt;&lt;br /&gt;Open the file&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.wst.server.core.prefs&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and add&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;machine-speed=1&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-4370676016750674481?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/4370676016750674481/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=4370676016750674481' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4370676016750674481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4370676016750674481'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/07/jboss-ide-timeout-waiting-for-server-to.html' title='JBoss IDE Timeout waiting for server to come up'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-5344920087819105698</id><published>2008-05-04T10:43:00.000-07:00</published><updated>2008-05-04T10:57:38.105-07:00</updated><title type='text'>PiecesOfFlare Version 1.1.1 released</title><content type='html'>I recently upgraded to the Europa version of Eclipse (3.3) and I noticed that my &lt;a href="http://piecesofflare.sourceforge.net/"&gt;PiecesOfFlare&lt;/a&gt; (POF) plugin stopped working. So after 2 years, we now have a new release. The POF plugin is a small plugin that enables you to hit the save button in eclipse, and then have the updated (jsp, js, php, etc) file being copied to another destination outside your source tree. When I say outside, think to your webserver or appserver on the same file system, or even a to a remote machine (using scp).&lt;br /&gt;&lt;br /&gt;You can &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=153567"&gt;download&lt;/a&gt; the plugin from sourceforge, or you can use the update site at &lt;a href="http://piecesofflare.sourceforge.net/updates/"&gt;http://piecesofflare.sourceforge.net/updates/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-5344920087819105698?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/5344920087819105698/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=5344920087819105698' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/5344920087819105698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/5344920087819105698'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/05/piecesofflare-version-111-released.html' title='PiecesOfFlare Version 1.1.1 released'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-1012427019553992542</id><published>2008-04-08T18:54:00.000-07:00</published><updated>2010-05-07T12:05:02.616-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><category scheme='http://www.blogger.com/atom/ns#' term='jBPM'/><title type='text'>Book Review: Business Process Management with JBoss jBPM</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.packtpub.com/jboss-jbpm/book"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://ecx.images-amazon.com/images/I/51-QBk5%2BRWL._SL500_AA240_.jpg" alt="" border="0" /&gt;&lt;/a&gt;Business Process Management with&lt;span style="font-weight: bold;"&gt; JBoss jBPM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;A Practical Guide for Business Analysts&lt;/span&gt;, by Matt Cumberlidge&lt;br /&gt;&lt;br /&gt;I have been working on &lt;a href="http://jbossesb.blogspot.com/2008/01/service-orchestration-using-jbpm.html"&gt;Service Orchestration in JBossESB&lt;/a&gt;, using &lt;a href="http://www.jboss.org/jbossjbpm/"&gt;jBPM&lt;/a&gt;, and a few weeks back PACKT Publishing asked me to review the &lt;a href="http://www.packtpub.com/jboss-jbpm/book"&gt;JBoss jBPM book&lt;/a&gt;. I have been reading it whenever I had a spare moment. I have to admit the book was not what I initially expected it to be. For some reason I thought the book would be an in depth text book about jBPM and it's features. It is not, well it's got some of that, but what it really is, is what the title already says:  “Business Process Management with JBoss jBPM; &lt;span style="font-style: italic;"&gt;A Practical Guide for the Business Analyst&lt;/span&gt;”. So I guess I skipped over the 'for the Business Analyst' part. However after actually reading the book, I think the author picked the right subject by explaining how to &lt;span style="font-style: italic;"&gt;do a BPM project&lt;/span&gt; in the first place.&lt;br /&gt;&lt;br /&gt;Truth be told I  may have some idea about it, but I never read anything that formal on the matter, and the best part is that Matt simply follows a fictitious (or is it?) project about a record company called “Bland Records”. In Matt's words “&lt;span style="font-style: italic;"&gt;Bland Records' specialty is in finding talentless, yet attractive youths, assembling them into bands of four or five, partnering the ready-made band with a songwriter and some real musicians, who finish the product with an addictive set of tunes. The end product is released on an unsuspecting public who promptly shoot the band to number one in the charts&lt;/span&gt;”.&lt;br /&gt;&lt;br /&gt;The book is to the point and an easy read. The first few chapters are about what a Business Process actually is, what the interaction the Business Analyst and the Developer should be and how to set up interaction channels with the customer, how to put together the project team and how to find the right project sponsors to optimize the chances to deliver a successful product. In his book he sets up a workshop for the project team where the business process is analyzed and a flow diagram is created, before breaking for lunch. After lunch the team goes through the flow diagram to identify the roles and responsibilities. He goes over terminology like PID (Process Identification Document), SME (Subject Matter Experts) and RACI (Responsible, Accountable, Consulted, Informed), and how to use the RACI Matrix, and finishes by how to end up with a realistic implementation plan. I really enjoyed these two chapters.&lt;br /&gt;&lt;br /&gt;Chapter 3 explains how to install jBPM and it gives a quick introduction to the product.  The chapter has plenty of screenshots to keep you on track and you should get a good visual picture in your mind about jBPM capabilities, the chapter finishes by implementing the business process as a proof-of-concept system. Chapter 4 adds a user interface to the prototype and by the end of the chapter you have a fully functional system, for which you can get sign off from the client. This is a nice break point in the project where some wrinkles can get ironed out before putting more time into making the thing look nice. Chapter 5 speaks to how to deploy and setup the proof-of-concept and how to go through some iterations with the team. At this point the integration points with other systems should still be stubbed out. Finally, when the iterations have honed the business process implementation, another sign off follows and in Chapter 6 he describes how to convert the proof-of-concept to a production ready system and by setting up a BAM (Business Activity Monitor) to gather process metrics in production.  At the end of chapter 6 the project goes to production and in chapter 7 the team comes together for a post mortem, where they try to evaluate the success of the project, and they try to come up with an ROI of the system. Assuming all is in order a final sign-off from the client can now be obtained. Over time the process metrics can be tracked and future projects may implement process change requests.&lt;br /&gt;&lt;br /&gt;The book is a quick read and I think it very wise to hand out a copy to each of the members on your team when starting a BPM project. The price may be a little steep, but part of it goes to the jBPM project and I'm sure those costs can be  expensed on the project anyway ;). Thumbs up on this one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-1012427019553992542?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/1012427019553992542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=1012427019553992542' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/1012427019553992542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/1012427019553992542'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/04/book-review-business-process-management.html' title='Book Review: Business Process Management with JBoss jBPM'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-6439185381183323517</id><published>2008-03-17T12:37:00.000-07:00</published><updated>2008-03-17T13:19:51.758-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Seam'/><title type='text'>Using an EJB3 Interceptor in Seam</title><content type='html'>For one of the demos for the NEJUG presentation we integrated the JPetStore (Spring based) and the DVDStore (Seam based) with JBossESB. The idea is that when orders are placed in either store the orders are processed in some ESB based Order Processing Service, using jBPM for the Orchestration. Here I want to show what you need to do to intercept a the order when the user hits the 'confirm' button in the Seam based DVD Store. For this we use an EJB3 interceptor. The beauty of this solution is that no code changes are needed in the DVD Store itself.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Modify the ejb-jar.xml&lt;/span&gt;&lt;br /&gt;First we need to add some configuration to the ejb-jar.xml, as shown in Figure 1.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.osconsulting.org/code-fragments/ejb3-interceptor.html" class="source_code" style="width: 100%; height: 31em;" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Figure 1. Add the interceptor to the ejb-jar.xml&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So first we define the interceptor class by referencing &lt;pre&gt;com.jboss.dvd.seam.CheckoutInterceptor&lt;/pre&gt;, next we need to specify when this class should be called, which is done by adding the second piece of xml which specifies the bean name for which the interceptor should fire. Here we want it to fire when the &lt;pre&gt;CheckoutAction&lt;/pre&gt; is called. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Add the interceptor class&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The interceptor class itself looks like&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;package com.jboss.dvd.seam;&lt;br /&gt;&lt;br /&gt;import javax.interceptor.AroundInvoke;&lt;br /&gt;import javax.interceptor.InvocationContext;&lt;br /&gt;&lt;br /&gt;public class CheckoutInterceptor {&lt;br /&gt;&lt;br /&gt;    @AroundInvoke&lt;br /&gt;    public Object sendOrderToESB(InvocationContext ctx) throws Exception {&lt;br /&gt;&lt;br /&gt;        System.out.println("*** Entering CheckoutInterceptor");&lt;br /&gt;        Object target = ctx.getTarget();&lt;br /&gt;        //Just making sure&lt;br /&gt;        if (target instanceof CheckoutAction) {&lt;br /&gt;            if (ctx.getMethod().getName().equals("submitOrder")) {&lt;br /&gt;                System.out&lt;br /&gt;                        .println("We will send the following completedOrder object to ESB");&lt;br /&gt;                Order completedOrder = ((CheckoutAction) target).currentOrder;&lt;br /&gt;                Customer customer = ((CheckoutAction) target).customer;&lt;br /&gt;                completedOrder.setCustomer(customer);&lt;br /&gt;                System.out.println("Completed Order= " + completedOrder);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        try {&lt;br /&gt;            return ctx.proceed();&lt;br /&gt;        } finally {&lt;br /&gt;            System.out.println("*** Exiting CheckoutInterceptor");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Figure 2. The CheckoutInterceptor Code&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And that is all there is to it. In the interceptor we check which method is called, and if it is the &lt;pre&gt;submitOrder&lt;/pre&gt; method we print out the order. In the demo we added code to serialize the order to XML, and then dropped in onto a gateway Queue, on its way to the ESB.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-6439185381183323517?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/6439185381183323517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=6439185381183323517' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6439185381183323517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6439185381183323517'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/03/ejb3-interceptor.html' title='Using an EJB3 Interceptor in Seam'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-4673055525442602876</id><published>2008-03-17T12:02:00.000-07:00</published><updated>2008-03-17T13:06:15.874-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBossESB'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>NEJUG on SOA - The SOA-P Store: Bed, Bath and Beyond (II)</title><content type='html'>I'm happy to say that the presentation went over well. We got some great questions and in general I think people really got it. Tom Cunningham compiled a list of the questions we got:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Is the registry different than UDDI?&lt;br /&gt;Is there portability across ESB implementations (Mule / Service Mix / JBoss)?&lt;br /&gt;Is there portability across different BPEL providers?&lt;br /&gt;When you are talking about components for ESB, are you talking about adapters?&lt;br /&gt;How gunshy should I be using JBoss ESB (are people using it in production)?&lt;br /&gt;What strategies can I use for portability between ESB providers?&lt;br /&gt;Is there any inherent security in the content based routing?    Are there plans on adding something in this area (ACEGI/Spring Security in particular)?&lt;br /&gt;What would you typically see in an actions block?&lt;br /&gt;Would an example of an action be something execuing a rule?&lt;br /&gt;When do you use a J2EE Servlet Filter approach and when would you use ESB?&lt;br /&gt;How would you roll back a transaction?&lt;br /&gt;How do you integrate with RESTful services?&lt;br /&gt;How tightly couple is the rules engine with the ESB?&lt;br /&gt;What monitoring tools exist to see what is going on inside the ESB?&lt;br /&gt;Is there a way inside the ESB to log payload in and out of the ESB?&lt;br /&gt;Is the ESB's state recoverable?   Will it maintain state?&lt;br /&gt;How do you track long transactions?&lt;br /&gt;What's the connection between Rules and the ESB?&lt;br /&gt;Will hot deploy consume all current requests before redeploying?&lt;br /&gt;Is load balancing simple round robin?&lt;br /&gt;Does JBPM compete with BPEL?&lt;br /&gt;Is there interactive debugging so that you can step through the JPDL flow?&lt;br /&gt;Are the enterprise design patterns (wiretap, splitter, aggregatore) available inside of a visual designer in JBDS?&lt;br /&gt;Is the JBPM plugin going to be available for NetBeans?&lt;br /&gt;Who is the jbpm-console intended for?&lt;br /&gt;What's the difference between SOA and ESB?&lt;br /&gt;How do you migrate to ESB? &lt;br /&gt;&lt;br /&gt;The most humorous question had to be the last one, where someone wanted to know if content based routing could be used as a method of escaping hardware licenses. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sorry, you had to be there for the answers, but maybe it can be a start for a JBossESB FAQ page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-4673055525442602876?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/4673055525442602876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=4673055525442602876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4673055525442602876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4673055525442602876'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/03/nejug-on-soa-soa-p-store-bed-bath-and_17.html' title='NEJUG on SOA - The SOA-P Store: Bed, Bath and Beyond (II)'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-4691159821152471511</id><published>2008-03-10T15:50:00.000-07:00</published><updated>2008-03-10T16:47:51.627-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>WhichJar Utility</title><content type='html'>Where oh where is that class? Setting up your classpath in Java is half the battle. And finding in which jar the class you are looking for lives can be a tedious task. Measured in software years it was ions ago that my friend Toby introduced me to a little shell script he wrote called &lt;span style="font-style: italic;"&gt;whichJar&lt;/span&gt;. I think I have been using it on a daily basis ever since. It may have changed a little over the years, but not too much, so here it goes:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;# nasty script to find a string in the contents of a jar file.&lt;br /&gt;# probably a better way to do this, but then again...&lt;br /&gt;&lt;br /&gt;if [ "$1foo" = "foo" ] ; then&lt;br /&gt;echo "$0 usage: `basename $0` string"&lt;br /&gt;echo "where string is the string to look for in the jar's contents"&lt;br /&gt;exit 1&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;for i in `find . -name \*.jar`&lt;br /&gt;do className=`(jar tvf $i | grep $1)`;&lt;br /&gt;if [ "$className" != "" ]; then&lt;br /&gt;   echo -e "$i\t$className";&lt;br /&gt;fi&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To use it save the above code of to a file called 'whichJar' in your bin directory, and make it executable &lt;br /&gt;&lt;pre&gt;chmod a+x whichJar&lt;/pre&gt;&lt;br /&gt;Then, for example to find the class 'javax.jms.Topic' in any of the jars in the current directory, or any of its subdirectories, simply type&lt;br /&gt;&lt;pre&gt;whichJar javax.jms.Topic&lt;/pre&gt;&lt;br /&gt;Thank you Toby.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-4691159821152471511?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/4691159821152471511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=4691159821152471511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4691159821152471511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4691159821152471511'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/03/whichjar-utility.html' title='WhichJar Utility'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-3723613742143595613</id><published>2008-03-10T07:56:00.000-07:00</published><updated>2008-03-10T08:06:55.771-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBossESB'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>NEJUG on SOA - The SOA-P Store: Bed, Bath and Beyond</title><content type='html'>This Thursday (March 13th) &lt;a href="http://www.nofluffjuststuff.com/speaker_view.jsp?speakerId=526"&gt;Burr Sutter&lt;/a&gt; and I will speak at the &lt;a href="http://www.nejug.org"&gt;NEJUG&lt;/a&gt; on SOA "&lt;a href="http://www.r3dsoftware.com/NejugSite/events/show/33"&gt;The SOA-P Store: Bed, Bath and Beyond&lt;/a&gt;". &lt;br /&gt;&lt;br /&gt;This will be a dynamic session focused on the demonstration of the customary capabilities and best practices associated with an Enterprise Service Bus for SOA-focused deployment. &lt;br /&gt;&lt;br /&gt;We will get people involved and empowered with real boots-on-the-ground knowledge of how to do SOA and not just pontificate on abstract theory and marketing-speak.  The live demonstrations will illustrate how typical Struts+Spring+Hibernate web applications can be liberated as services and enter the world of ESB &amp; SOA.&lt;br /&gt;&lt;br /&gt;See you there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-3723613742143595613?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/3723613742143595613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=3723613742143595613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3723613742143595613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3723613742143595613'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/03/nejug-on-soa-soa-p-store-bed-bath-and.html' title='NEJUG on SOA - The SOA-P Store: Bed, Bath and Beyond'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-4195472915200207439</id><published>2008-03-10T07:38:00.000-07:00</published><updated>2008-03-10T16:39:03.244-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBossESB'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><title type='text'>JBoss SOA Platform (SOA-P) Documentation</title><content type='html'>The SOA-P team incorporates  a team of technical writers who take the project specific documentation and turn it into documentation for the &lt;a href="http://www.jboss.org/products/platforms/soa"&gt;SOA Platform&lt;/a&gt;, which is the supported 'RHEL' version of &lt;a href="http://labs.jboss.com/jbossesb/"&gt;JBossESB&lt;/a&gt; (where JBossESB would be Fedora). In the true spirit of Open Source, this documentation is available for free, under the &lt;a href="http://www.redhat.com/docs/"&gt;support/documentation&lt;/a&gt; tab of the &lt;a href="http://www.redhat.com/"&gt;Red Hat&lt;/a&gt; homepage, or you can go directly to the &lt;a href="http://www.redhat.com/docs/en-US/JBoss_SOA_Platform/"&gt;SOA-P 4.2 docs&lt;/a&gt;. I was quite impressed with what they did to some of the docs I wrote! Thanks guys.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-4195472915200207439?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/4195472915200207439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=4195472915200207439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4195472915200207439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4195472915200207439'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/03/soa-platform-soa-p-documentation.html' title='JBoss SOA Platform (SOA-P) Documentation'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-3026207824420488126</id><published>2008-03-10T07:20:00.001-07:00</published><updated>2008-03-10T07:52:17.498-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBossESB'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='service orchestration'/><category scheme='http://www.blogger.com/atom/ns#' term='jBPM'/><title type='text'>Service Orchestration using jBPM</title><content type='html'>I recently wrote up am entry in the &lt;a href="http://jbossesb.blogspot.com/2008/01/service-orchestration-using-jbpm.html"&gt;JBossESB blog&lt;/a&gt;. This code is now available in the SOA Platform as well as on the trunk of the JBossESB project. For the full documentation in pdf format see the &lt;a href="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/docs/services/jBPMIntegrationGuide.pdf"&gt;jBPMIntegrationGuide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_fAUX2tnEInU/R9VFd_EjC6I/AAAAAAAAADc/RY7dQXeKzMw/s1600-h/orchestration.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_fAUX2tnEInU/R9VFd_EjC6I/AAAAAAAAADc/RY7dQXeKzMw/s400/orchestration.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5176119728181283746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Figure 1. Service Integration using jBPM.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-3026207824420488126?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/3026207824420488126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=3026207824420488126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3026207824420488126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3026207824420488126'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/03/service-orchestration-using-jbpm.html' title='Service Orchestration using jBPM'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_fAUX2tnEInU/R9VFd_EjC6I/AAAAAAAAADc/RY7dQXeKzMw/s72-c/orchestration.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-3829711393283857287</id><published>2008-02-15T07:19:00.001-08:00</published><updated>2008-03-10T06:59:36.552-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='generics'/><title type='text'>Java Generics</title><content type='html'>I just found a nice writeup on &lt;a href="http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html"&gt;Generics in Java&lt;/a&gt; with lots of code examples.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-3829711393283857287?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/3829711393283857287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=3829711393283857287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3829711393283857287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3829711393283857287'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/02/java-generics.html' title='Java Generics'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-6957595613746126587</id><published>2008-02-06T06:21:00.001-08:00</published><updated>2008-10-30T13:55:20.881-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JOSSO'/><category scheme='http://www.blogger.com/atom/ns#' term='Seam'/><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><category scheme='http://www.blogger.com/atom/ns#' term='single sign-on'/><title type='text'>Single SignOn (SSO) with Seam using JOSSO</title><content type='html'>I recently used seam_gen to create a josso_console application. If you want to use JOSSO, but you don't yet want to take the leap to hook it up to an LDAP or other industrial strength credential store, then this is the app may come in handly. Figure 1 shows the welcome screen of josso_console application.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_fAUX2tnEInU/R8rXgrlbd0I/AAAAAAAAADU/DB9oZvUD2K4/s1600-h/josso_console.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_fAUX2tnEInU/R8rXgrlbd0I/AAAAAAAAADU/DB9oZvUD2K4/s400/josso_console.jpg" alt="" id="BLOGGER_PHOTO_ID_5173184078443935554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Figure 1. The JOSSO console.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If your objective is simply to hook your Seam application up to JOSSO then you should keep reading too.&lt;br /&gt;&lt;br /&gt;1. Seam and JAAS&lt;br /&gt;&lt;a href="http://labs.jboss.com/jbossseam/"&gt;Seam&lt;/a&gt; comes with its own &lt;a href="http://docs.jboss.com/seam/2.0.1.GA/reference/en/html/security.html"&gt;security framework&lt;/a&gt; which is based on &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/security/jaas/JAASRefGuide.html"&gt;JAAS&lt;/a&gt;. The easiest way to hook Seam up to JOSSO is to first configure your Seam-based application the conventional JOSSO way and then hooking up Seam and JOSSO using a Seam authenticator. I worked on a &lt;a href="http://josso.svn.sourceforge.net/viewvc/josso/trunk/josso/src/josso_console/src/action/org/josso/seam/console/JossoAuthenticator.java?view=markup"&gt;jossoAuthenticator&lt;/a&gt; that will set the SSO user and roles information into Seam context, so that you can use all the Seam security features while using JOSSO.&lt;br /&gt;&lt;br /&gt;2. Configure JOSSO&lt;br /&gt;In your josso-agent-config.xml add the josso_console in as a partner app&lt;br /&gt;&lt;iframe src="http://www.osconsulting.org/code-fragments/josso-agent.html" class="source_code" style="width: 100%; height: 5em;" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Now your application will have access to the JOSSO cookie.&lt;br /&gt;&lt;br /&gt;3. Configure Seam&lt;br /&gt;Next we're going to protect our application using the standard security constraints to the &lt;a href="http://josso.svn.sourceforge.net/viewvc/josso/branches/JOSSO_1_7_0_B/josso/applications/josso_console/resources/WEB-INF/web.xml?revision=512&amp;amp;view=markup"&gt;web.xml&lt;/a&gt;. For instance if we only want users that have the admin role to access our console you would add&lt;br /&gt;&lt;iframe src="http://www.osconsulting.org/code-fragments/josso_console_web.xml.html" class="source_code" style="width: 100%; height: 40em;" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;This web.xml references the &lt;a href="http://josso.svn.sourceforge.net/viewvc/josso/branches/JOSSO_1_7_0_B/josso/applications/josso_console/view/login-redirect.jsp?view=markup"&gt;login-redirect.jsp&lt;/a&gt; which you will need to add to the root of your war file. Now, you will be redirected to the josso login screen when trying to access the web application.&lt;br /&gt;&lt;br /&gt;Next we have to propagate the authorization information into Seam context. For this we use the &lt;a href="http://josso.svn.sourceforge.net/viewvc/josso/branches/JOSSO_1_7_0_B/josso/applications/josso_console/src/action/org/josso/seam/console/JossoAuthenticator.java?view=markup"&gt;jossoAuthenticator&lt;/a&gt;.&lt;br /&gt;Next you need to reference this class in your &lt;a href="http://josso.svn.sourceforge.net/viewvc/josso/branches/JOSSO_1_7_0_B/josso/applications/josso_console/resources/WEB-INF/components.xml?revision=509&amp;amp;view=markup"&gt;pages.xml&lt;/a&gt;, by adding&lt;br /&gt;&lt;iframe src="http://www.osconsulting.org/code-fragments/components.xml.html" class="source_code" style="width: 100%; height: 4em;" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;and commenting out the default authenticator&lt;br /&gt;&lt;br /&gt;Finally we need to modify the &lt;a href="http://josso.svn.sourceforge.net/svnroot/josso/branches/JOSSO_1_7_0_B/josso/applications/josso_console/resources/WEB-INF/pages.xml?revision=512&amp;amp;view=markup"&gt;pages.xml&lt;/a&gt;, where we reference the jossoAuthenticator on our welcome page (index.xhtml) like&lt;br /&gt;&lt;iframe src="http://www.osconsulting.org/code-fragments/pages.xml.html" class="source_code" style="width: 100%; height: 4em;" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;which will cause the jossoAuthenticator.checkLogin to be called for this page, and in the exception class configuration we specify the index.xhtml page&lt;br /&gt;&lt;iframe src="http://www.osconsulting.org/code-fragments/not-logged-in.html" class="source_code" style="width: 100%; height: 8em;" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;All should now be working. If you want, you can obtain the &lt;a href="http://josso.svn.sourceforge.net/viewvc/josso/branches/JOSSO_1_7_0_B/josso/applications/josso_console/"&gt;full sources&lt;/a&gt; from the josso_console application to see the complete application.&lt;br /&gt;&lt;br /&gt;Some other resources in this context you may find useful are:&lt;br /&gt;&lt;a href="http://www.josso.org/confluence/display/JOSSO1/JBoss+4.2"&gt;http://www.josso.org/confluence/display/JOSSO1/JBoss+4.2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sdudzin.blogspot.com/2007/12/windows-sso-with-jboss-seam.html"&gt;http://sdudzin.blogspot.com/2007/12/windows-sso-with-jboss-seam.html&lt;/a&gt;, and&lt;br /&gt;&lt;a href="http://www.ja-sig.org/wiki/display/CASC/Seam+Identity+Integration+%28Seam+1.2.1+-+2.0.0%29"&gt;http://www.ja-sig.org/wiki/display/CASC/Seam+Identity+Integration+(Seam+1.2.1+-+2.0.0)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-6957595613746126587?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/6957595613746126587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=6957595613746126587' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6957595613746126587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6957595613746126587'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/02/single-signon-sso-with-seam-using-josso.html' title='Single SignOn (SSO) with Seam using JOSSO'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_fAUX2tnEInU/R8rXgrlbd0I/AAAAAAAAADU/DB9oZvUD2K4/s72-c/josso_console.jpg' height='72' width='72'/><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-8247441678628149072</id><published>2008-02-05T12:16:00.000-08:00</published><updated>2008-11-14T05:39:05.452-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='battery'/><title type='text'>Sony Vaio VGN-FS740/W Battery Problem</title><content type='html'>The battery on my wife's computer would no longer hold a charge and it was time to replace it. We replaced it with a generic brand battery (little more then $100). It charged fine, but then while it was running a message would suddenly pop up, saying that the battery was not inserted correctly and that it had to switch to hibernate mode. The battery light would flash rapidly after this, and it would never come back long or it would go hibernate again. Re-seating the battery had no effect. It turns out that Sony truly has turned evil. They are running a little service that checks whether the battery is a Sony battery ($300!), and if it is not then it kicks into action and sends your machine into hibernation!&lt;br /&gt;&lt;br /&gt;After some digging I found this &lt;a href="http://forum.notebookreview.com/showthread.php?t=20440"&gt;article&lt;/a&gt;, and the fix is easy, the service is called ISBMgr and to get rid of it permanently fire up msconfig like so&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_fAUX2tnEInU/R6jIXUqAB-I/AAAAAAAAACw/DHDqoPJ0tuk/s1600-h/msconfig.JPG"&gt;&lt;img style="cursor: pointer;" src="http://bp3.blogger.com/_fAUX2tnEInU/R6jIXUqAB-I/AAAAAAAAACw/DHDqoPJ0tuk/s320/msconfig.JPG" alt="" id="BLOGGER_PHOTO_ID_5163597275787692002" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;go to the startup tab and uncheck the ISBMgr.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_fAUX2tnEInU/R6jIm0qAB_I/AAAAAAAAAC4/sBGE_QzGX8Q/s1600-h/ISBMgr.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_fAUX2tnEInU/R6jIm0qAB_I/AAAAAAAAAC4/sBGE_QzGX8Q/s320/ISBMgr.jpg" alt="" id="BLOGGER_PHOTO_ID_5163597542075664370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now when you restart it will ask you if you knew that some services where changed, just say yes and it will never bother you again.&lt;br /&gt;&lt;br /&gt;Bad Sony. No more Sony for me..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-8247441678628149072?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/8247441678628149072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=8247441678628149072' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/8247441678628149072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/8247441678628149072'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/02/sony-vgn-fs740w-battery-problem.html' title='Sony Vaio VGN-FS740/W Battery Problem'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_fAUX2tnEInU/R6jIXUqAB-I/AAAAAAAAACw/DHDqoPJ0tuk/s72-c/msconfig.JPG' height='72' width='72'/><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-2096752826178697621</id><published>2008-01-31T07:14:00.001-08:00</published><updated>2008-01-31T08:02:54.112-08:00</updated><title type='text'>Compare two OpenOffice Documents</title><content type='html'>I received some feedback on a document I wrote and I wanted to know what the changes were. In Word you can track the changes, but where is this functionality in OpenOffice? I looked around a bit and found this really nice feature I had been missing - it is the 'compare document' feature, and it allows you to accept changes on a per diff level. Simply open the original document and then under Edit, select the 'Compare Document...'&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_fAUX2tnEInU/R6HmmuDrfCI/AAAAAAAAACI/nwoRBU-gdmc/s1600-h/compare.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_fAUX2tnEInU/R6HmmuDrfCI/AAAAAAAAACI/nwoRBU-gdmc/s400/compare.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5161660200816180258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;and browse to the edited version document. After that it will bring up a nice dialog box with all the diffs which you can accept or deny. I think it makes a lot of sense not to do this in the document itself like Word does.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-2096752826178697621?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/2096752826178697621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=2096752826178697621' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/2096752826178697621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/2096752826178697621'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/01/compare-two-openoffice-documents.html' title='Compare two OpenOffice Documents'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_fAUX2tnEInU/R6HmmuDrfCI/AAAAAAAAACI/nwoRBU-gdmc/s72-c/compare.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-4746436296734620007</id><published>2008-01-30T16:01:00.000-08:00</published><updated>2008-03-02T09:45:25.827-08:00</updated><title type='text'>Post XML code fragments</title><content type='html'>It turns out that it is not that straightforward to display XML fragments in a blog. Usually I use &lt;a href="http://qbnz.com/highlighter/demo.php"&gt;GeSHi&lt;/a&gt; to do the formatting for me. I then look at the source for the HTML page and grab the piece that I need, which I then host on my own site, and I reference it in an iframe like&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.osconsulting.org/code-fragments/iframe.html" class="source_code" style="width: 100%; height: 5em;" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-4746436296734620007?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/4746436296734620007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=4746436296734620007' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4746436296734620007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4746436296734620007'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/01/post-xml-code-fragments.html' title='Post XML code fragments'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-3813610288668064162</id><published>2008-01-30T13:12:00.000-08:00</published><updated>2008-03-10T07:55:19.888-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBossESB'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><category scheme='http://www.blogger.com/atom/ns#' term='jUDDI'/><title type='text'>Switch jUDDI on JBossESB over to Postgres</title><content type='html'>By default &lt;a href="http://labs.jboss.com/jbossesb/"&gt;JBossESB&lt;/a&gt; uses &lt;a href="http://hsqldb.org/"&gt;HSQL&lt;/a&gt; to handle persistence for jUDDI. For production it is recommended to switch it to for example &lt;a href="http://www.postgresql.org/"&gt;Postgres&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;1. First you will need to &lt;a href="http://jdbc.postgresql.org/download.html"&gt;download &lt;/a&gt;the Postgres JDBC driver. I selected the '8.2-507 JDBC 2EE' driver. You can copy it to either the jboss_home/server/default/lib directory, or to the jbossesb.sar/lib directory.&lt;br /&gt;&lt;br /&gt;2. Create the juddi database. Run the pgAdmin a shown in Figure 1.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_fAUX2tnEInU/R6D19ODrfAI/AAAAAAAAABw/uFyp_zTFYXM/s1600-h/juddi-postgres.jpg"&gt;&lt;img style="cursor: pointer;" src="http://bp1.blogger.com/_fAUX2tnEInU/R6D19ODrfAI/AAAAAAAAABw/uFyp_zTFYXM/s400/juddi-postgres.jpg" alt="" id="BLOGGER_PHOTO_ID_5161395605060942850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Figure 1. The Postgres Admin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;and create a juddi user, which has create rights to create tables, see Figure 2.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_fAUX2tnEInU/R6D2XeDrfBI/AAAAAAAAAB4/6n5F0PdgcFk/s1600-h/juddi-postgres-user.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_fAUX2tnEInU/R6D2XeDrfBI/AAAAAAAAAB4/6n5F0PdgcFk/s400/juddi-postgres-user.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5161396056032508946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Figure 2. Add a user called 'juddi'&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3. Next you should update the datasource for jUDDI, which is defined in the jbossesb.sar/juddi-ds.xml. Comment out the Hypersonic configuration and add the postgres datasource configuration like&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.osconsulting.org/code-fragments/juddi-postgres-ds.html" class="source_code" style="width: 100%; height: 55em;" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;4. Finally we have to tell jUDDI where it can find the DDL to create the juddi schema. For this we edit the jbossesb.sar/esb.juddi.xml. Modify the 'juddi.sqlFiles' setting by replacing the 'hsqldb' occurances to 'postgresql'.&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://www.osconsulting.org/code-fragments/esb.juddi.xml.html" class="source_code" style="width: 100%; height: 10em;" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Now on startup JBossESB will create the jUDDI tables in the Postgres juddi database.&lt;br /&gt;&lt;br /&gt;For an overview of jUDDI in JBossESB in pdf format see the &lt;a href="http://anonsvn.labs.jboss.com/labs/jbossesb/trunk/product/docs/services/Registry.pdf"&gt;Registry&lt;/a&gt; Guide.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-3813610288668064162?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/3813610288668064162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=3813610288668064162' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3813610288668064162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3813610288668064162'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/01/switch-juddi-on-jbossesb-to-postgres.html' title='Switch jUDDI on JBossESB over to Postgres'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_fAUX2tnEInU/R6D19ODrfAI/AAAAAAAAABw/uFyp_zTFYXM/s72-c/juddi-postgres.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-5035739307896033434</id><published>2008-01-25T06:16:00.001-08:00</published><updated>2009-02-10T11:36:25.564-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBossESB'/><category scheme='http://www.blogger.com/atom/ns#' term='Ant'/><category scheme='http://www.blogger.com/atom/ns#' term='jBPM'/><title type='text'>jBPM ant task to deploy a process definition to a running server</title><content type='html'>I've been working on &lt;a href="http://labs.jboss.com/jbossjbpm/"&gt;jBPM&lt;/a&gt; integration into &lt;a href="http://labs.jboss.com/jbossesb/"&gt;JBossESB&lt;/a&gt; to do &lt;a href="http://jbossesb.blogspot.com/2008/01/service-orchestration-using-jbpm.html"&gt;Service Orchestration&lt;/a&gt;, and I created a new ant task to deploy a process definition to a running instance of jBPM. When I say a running instance I mean an instance that deploys the jBPM-console. The jBPM-console ships with a DeployerServlet which is used by the jBPM eclipse plugin to deploy process definitions. The ant task is called "DeployProcessToServerTask" and it uses the very same servlet. The java code for the task has been attached to jira &lt;a href="http://jira.jboss.com/jira/browse/JBPM-1117"&gt;JBPM-1117&lt;/a&gt; so it should hopefully make it into SVN soon.&lt;br /&gt;&lt;br /&gt;To use the DeployProcessToServer Task you need to define a new task using the taskdef command&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;      &amp;lt;taskdef name="deployToServer" classname="org.jbpm.ant.DeployProcessToServerTask"&amp;gt;&lt;br /&gt;          &amp;lt;classpath refid="exec-classpath"/&amp;gt;&lt;br /&gt;      &amp;lt;/taskdef&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So here I defined a task called 'deployToServer', but you can call it whatever you want. The classpath should obviously point to the jar containing this class. The 'deployToServer' can either deploy a Process Archive (PAR), which is a zip file containing the files you want to deploy, or you can specify a set of files which it will zip up and deploy for you. You can use the following attributes and subelements:&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Attribute &lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Default value&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;process&lt;/td&gt;&lt;td&gt;The location of process archive&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;servername&lt;/td&gt;&lt;td&gt;The name of the server which is used to build the deployment url&lt;/td&gt;&lt;td&gt;localhost&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;serverport&lt;/td&gt;&lt;td&gt;The port to which the http protocol is bound&lt;/td&gt;&lt;td&gt;8080&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;serverdeployer&lt;/td&gt;&lt;td&gt;The address of the deployer servlet&lt;/td&gt;&lt;td&gt;/jbpm-console/upload&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;debug&lt;/td&gt;&lt;td&gt;Debug flag which, if set, writes out a debug.par zip file. This is especially useful if fileSet subelements are used, so you can check what gets loaded to the server&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;th&gt;SubElement &lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Default value&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://ant.apache.org/manual/CoreTypes/fileset.html"&gt;fileSet&lt;/a&gt;&lt;/td&gt;&lt;td&gt;A &lt;a href="http://ant.apache.org/manual/CoreTypes/fileset.html"&gt;fileSet&lt;/a&gt; element&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;The following xml fragment deploys all the files in the processDefinition directory to the server&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;&amp;lt;target name="deployProcess" description="deploys the process definition"&amp;gt;&lt;br /&gt; &amp;lt;echo&amp;gt;Deploy the process definition&amp;lt;/echo&amp;gt;&lt;br /&gt; &amp;lt;taskdef name="deployToServer" classname="org.jbpm.ant.DeployProcessToServerTask"&amp;gt;&lt;br /&gt;  &amp;lt;classpath refid="exec-classpath"/&amp;gt;&lt;br /&gt; &amp;lt;/taskdef&amp;gt;&lt;br /&gt; &amp;lt;deployToServer&amp;gt;&lt;br /&gt; &amp;lt;fileset dir="${basedir}/processDefinition" includes="*"/&amp;gt;&lt;br /&gt; &amp;lt;/deployToServer&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Or if you already have a par archive ready to go you could reference that&lt;br /&gt;&lt;pre class="XML" name="code"&gt;&lt;br /&gt;&amp;lt;target name="deployProcess" description="deploys the process definition"&amp;gt;&lt;br /&gt;    &amp;lt;echo&amp;gt;Deploy the process definition&amp;lt;/echo&amp;gt;&lt;br /&gt;    &amp;lt;taskdef name="deployToServer" classname="org.jbpm.ant.DeployProcessToServerTask"&amp;gt;&lt;br /&gt;        &amp;lt;classpath refid="exec-classpath"/&amp;gt;&lt;br /&gt;    &amp;lt;/taskdef&amp;gt;&lt;br /&gt;    &amp;lt;deployToServer process="${build}/process.par"/&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-5035739307896033434?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/5035739307896033434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=5035739307896033434' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/5035739307896033434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/5035739307896033434'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2008/01/jbpm-ant-task-to-deploy-process.html' title='jBPM ant task to deploy a process definition to a running server'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-8704755215785573176</id><published>2007-10-06T09:49:00.001-07:00</published><updated>2007-10-06T09:51:56.577-07:00</updated><title type='text'>WYSIWYM (What You See Is What You Mean) XHTML editor</title><content type='html'>Just came across &lt;a href="http://www.wymeditor.org/en/"&gt;this&lt;/a&gt; web-based editor. Looks very nice!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-8704755215785573176?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/8704755215785573176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=8704755215785573176' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/8704755215785573176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/8704755215785573176'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2007/10/wysiwym-what-you-see-is-what-you-mean_06.html' title='WYSIWYM (What You See Is What You Mean) XHTML editor'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-3691950542491724101</id><published>2007-10-04T19:56:00.001-07:00</published><updated>2007-10-04T20:03:58.614-07:00</updated><title type='text'>VI</title><content type='html'>You either are a VI guy or you're not. I am, and I found this cool &lt;a href="http://www.viemu.com/vi-vim-cheat-sheet.gif"&gt;cheat sheet&lt;/a&gt;. Now the thing that worries me a bit is that is it made on April 1st.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_fAUX2tnEInU/RwWpQqNO4cI/AAAAAAAAAAM/ZKAGlKcnbec/s1600-h/vi-vim-cheat-sheet.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_fAUX2tnEInU/RwWpQqNO4cI/AAAAAAAAAAM/ZKAGlKcnbec/s400/vi-vim-cheat-sheet.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5117682655249228226" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-3691950542491724101?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/3691950542491724101/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=3691950542491724101' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3691950542491724101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3691950542491724101'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2007/10/vi_04.html' title='VI'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_fAUX2tnEInU/RwWpQqNO4cI/AAAAAAAAAAM/ZKAGlKcnbec/s72-c/vi-vim-cheat-sheet.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-984735683587894150</id><published>2007-10-01T06:52:00.000-07:00</published><updated>2007-10-01T07:05:05.630-07:00</updated><title type='text'>YA virtualization flavor</title><content type='html'>I just came across a product call &lt;a href="http://www.colinux.org"&gt;coLinux&lt;/a&gt;.&lt;br /&gt;It describes itself as: "Virtualization with VmWare, Xen, and Kernel-based Virtual Machine (KVM) are all the rage these days. But did you know that you can run Linux® cooperatively with Microsoft® Windows®?". I guess the main difference is that it runs a  privileged process on Windows, so that if it crashes it will also take the Windows down. In other world it's not *really* a virtual machine! Sounds kinda scary, but it maybe cool for my development box, if it turns out that it takes up fewer resources to run.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-984735683587894150?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/984735683587894150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=984735683587894150' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/984735683587894150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/984735683587894150'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2007/10/ya-virtualization-flavor.html' title='YA virtualization flavor'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-3145924210459110122</id><published>2007-09-22T11:05:00.000-07:00</published><updated>2008-03-10T07:04:49.864-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Stuck on Java</title><content type='html'>If you hadn't guess by the title of this blog then you know now. I'm in a longterm relationship with Java. I get headaches when I don't drink it and I find it easier to write Java code then to write this blog. Back in high school we learned programming using Pascal, that was until we got actual computers; 5 &lt;a href="http://en.wikipedia.org/wiki/Apple_II"&gt;Apple II&lt;/a&gt;'s, which ran BASIC. My first program where a bunch of print lines to show the speed skating results of the speed skate world cup. Man it felt good to see the lines slowly being printed from left to right. No pauses necessary, the machines where slow enough all by themselves to get the desired effect. Next I was allowed to skip geography class to code &lt;a href="http://en.wikipedia.org/wiki/Population_pyramid"&gt;Population Pyramid&lt;/a&gt; graphs. You punched in the current age distributions, the birth and death rates and it would slowly redraw the graphs for each year going by, but I'm digressing.&lt;br /&gt;&lt;br /&gt;After BASIC, it was back to PASCAL, FORTRAN, C, C++ and finally Java. Java is just great. I've been doing Java for over 10 years now and it doesn't get old. I think part of it is the vast API combined with the enormous amount of Open Source code out there. That and the fact that I can write it once run it anywhere. Life in the Java world is good. I recently played with the &lt;a href="http://java.sun.com/javase/technologies/desktop/media/jai/"&gt;JAI API&lt;/a&gt;. It took me a while to catch on but after I discovered the &lt;a href="http://java.sun.com/products/java-media/jai/forDevelopers/jai-apidocs/"&gt;javadocs&lt;/a&gt; things got much easier. The &lt;a href="http://geotools.codehaus.org/"&gt;Geotools guys&lt;/a&gt; are using it too. Something tells me I'm going to spend some time with &lt;a href="http://jscience.org/"&gt;JScience&lt;/a&gt; soon. Java rocks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-3145924210459110122?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/3145924210459110122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=3145924210459110122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3145924210459110122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/3145924210459110122'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2007/09/stuck-on-java.html' title='Stuck on Java'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-6457197702197723559</id><published>2007-09-22T10:55:00.000-07:00</published><updated>2007-09-22T13:51:31.049-07:00</updated><title type='text'>How to clean your ipod?</title><content type='html'>I own a ipod shuffle, and I guess last week it was time to give it thorough cleaning; it ended up in the washing machine! So a few hours of washing, my Miele super-spinning-washer centrifuged the last drop out of my 'laundry' I finally got my ipod back. Nice and clean. I didn't think the dryer would be a good next step, as it was already unresponsive the way it was. So I just let it sit for a few days, and then stuck it in my PC to see what would happen. And yes ... it still worked just fine!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-6457197702197723559?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/6457197702197723559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=6457197702197723559' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6457197702197723559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/6457197702197723559'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2007/09/how-to-clean-your-ipod.html' title='How to clean your ipod?'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-2484100560727018545</id><published>2007-06-22T10:11:00.000-07:00</published><updated>2008-03-10T07:04:31.520-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><title type='text'>Maven sucks</title><content type='html'>I've been trying to like maven for over a year now, and it simply sucks. The problem is you get all this stuff you really don't need for free, plus it gets you there 90% of the way in no time. So you start off all happy. It's all based on conventions, so as long a you can follow them you are golden. SO now you're golden and in good spirits and then you get to the last 10% and now you're in trouble. The issue is that "The Best Tech Support in the World (Google) just does not index Maven well. Maybe Maven does to much with too little code. I love what Maven does for me, I love most of everything about Maven actually but "What Maven want Maven gets". No wonder Maven2 is a rewrite from Maven1, which -by the way- is making using Google even harder. Maybe in a few years it will suck less.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-2484100560727018545?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/2484100560727018545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=2484100560727018545' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/2484100560727018545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/2484100560727018545'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2007/06/maven-sucks.html' title='Maven sucks'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2424622516012859853.post-4178148345613887753</id><published>2007-06-15T17:09:00.001-07:00</published><updated>2007-06-15T19:30:35.336-07:00</updated><title type='text'>Karma</title><content type='html'>I got some more karma today. Apache is all about Karma, you may have comitter privileges but that is meaningless without karma. Today I found out I that I was left off the 'general comitter list', which was corrected. My Karma is fully restored. I can sleep well tonight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2424622516012859853-4178148345613887753?l=kurtstam.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kurtstam.blogspot.com/feeds/4178148345613887753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2424622516012859853&amp;postID=4178148345613887753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4178148345613887753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2424622516012859853/posts/default/4178148345613887753'/><link rel='alternate' type='text/html' href='http://kurtstam.blogspot.com/2007/06/my-first-post.html' title='Karma'/><author><name>Kurt Stam</name><uri>http://www.blogger.com/profile/07418191492358888029</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://3.bp.blogspot.com/_fAUX2tnEInU/SoGKASmOx3I/AAAAAAAAAGE/HGxLbl1Doro/S220/kurtstam.jpg'/></author><thr:total>0</thr:total></entry></feed>
