<?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-8881614386511851669</id><updated>2011-12-01T11:38:02.110-06:00</updated><category term='Book Reviews'/><category term='Productivity'/><category term='{L|W}AMP'/><category term='Java Code'/><category term='Agile'/><category term='Travel'/><category term='JBI'/><category term='Web Services'/><category term='Maven2'/><category term='Misc'/><category term='Certifications'/><category term='social'/><category term='Spring'/><category term='JEE'/><category term='Design Patterns'/><category term='Groovy'/><category term='Announcements'/><category term='Testing'/><title type='text'>Chad the Developer</title><subtitle type='html'>all things software</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>45</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-849421549525226396</id><published>2009-11-02T10:27:00.001-06:00</published><updated>2009-11-02T10:29:06.465-06:00</updated><title type='text'>Moving</title><content type='html'>I'm moving to a new site...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://chadsturtz.com"&gt;chadsturtz.com&lt;/a&gt;&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/8881614386511851669-849421549525226396?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/849421549525226396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=849421549525226396' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/849421549525226396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/849421549525226396'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2009/11/moving.html' title='Moving'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-5304955285030423743</id><published>2008-09-11T13:18:00.003-05:00</published><updated>2008-09-11T14:28:19.500-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Announcements'/><title type='text'>The Next Step</title><content type='html'>I know it's been 2 months since my last post, but things have been really busy for me, mostly because I've just made the next step in my career; joining a development team in Chesterfield, MO (just outside St Louis).  It's a move from the DoD Contracting world to Corporate Product Development, one that I'm excited to make.&lt;br /&gt;&lt;br /&gt;I haven't had experience yet shipping a product to a large number of end users.  That's probably the thing I'm looking forward to the most.  On top of that, I get to continue to work with Groovy and may have the opportunity to get some experience in the .Net world.&lt;br /&gt;&lt;br /&gt;I'm especially excited to be back in STL.  4 years away from friends and family has had it's pains and perils. My wife &amp; I got an apartment for the time being just a few minutes from work.  This area of STL is absolutely great; swarming with restaurants and parks, and clean and nice to look at.  &lt;br /&gt;&lt;br /&gt;I think that's it for this post.  Now that I'm settled in though, you should see my blogs pick back up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-5304955285030423743?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/5304955285030423743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=5304955285030423743' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/5304955285030423743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/5304955285030423743'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/09/next-step.html' title='The Next Step'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-7511459950952230555</id><published>2008-07-12T23:02:00.005-05:00</published><updated>2008-07-12T23:29:34.640-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social'/><title type='text'>Scour the Web</title><content type='html'>Thanks to &lt;a href="http://mashable.com/"&gt;Mashable&lt;/a&gt;, I found out about the up and coming search engine &lt;a href="http://www.scour.com/"&gt;Scour&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;Scour actually forwards your criteria to the giants you already know (Google, Yahoo, and MSN).  What you get is a combination of those results with some additional information and power.  &lt;br /&gt;&lt;br /&gt;Most importantly, the results are interactive.  You can vote and comment on each one.  Users' feedback provides Scour with an additional metric on each result in addition to the page rank it has with the 3 giants.  &lt;br /&gt;&lt;br /&gt;More over, as you participate, you earn points.  And yep, you guessed it, you can redeem your points once you've earned enough.  Right now, you'll be rewarded with Visa Gift Cards in values of $25, $50, or $100. &lt;br /&gt;&lt;br /&gt;Feel free to &lt;a href="http://scour.com/invite/csturtz"&gt;sign up&lt;/a&gt; and give it a try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-7511459950952230555?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/7511459950952230555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=7511459950952230555' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/7511459950952230555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/7511459950952230555'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/07/scour-web.html' title='Scour the Web'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-3140341836444467355</id><published>2008-06-16T10:31:00.003-05:00</published><updated>2008-06-16T13:30:46.456-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Announcements'/><title type='text'>DZone Refcardz</title><content type='html'>I haven't been spending as much time on &lt;a href="http://refcardz.dzone.com/"&gt;DZone&lt;/a&gt; as I used to (or want to), so I just read about this.  It's not breaking news, but I thought it was something worth sharing in case you haven't heard of these yet either.&lt;br /&gt;&lt;br /&gt;DZone has begun publishing &lt;a href="http://refcardz.dzone.com/"&gt;Refcardz&lt;/a&gt;.  These are cheat sheets for developers and other technical professionals on various technologies.  Refcardz cover things like IDEs or even patterns from the &lt;a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612"&gt;GoF book&lt;/a&gt;.  It appears they're being released at a rate of once a week, so I'm sure if there isn't one you're interested in yet, it won't be too long.  Just &lt;a href="http://feeds.dzone.com/zones/refcardz"&gt;subscribe&lt;/a&gt; to the feed and keep an eye out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-3140341836444467355?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/3140341836444467355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=3140341836444467355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3140341836444467355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3140341836444467355'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/06/dzone-refcardz.html' title='DZone Refcardz'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-4099785838052146202</id><published>2008-06-13T10:26:00.013-05:00</published><updated>2008-06-13T11:24:07.027-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JEE'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><title type='text'>CXF vs OC4J ... Round 2</title><content type='html'>Security is a big deal in our deployment environment and one thing being used is all HTTPS connections require Mutual Authentication.  This past sprint, one story I worked on involved reproducing the mutual authentication requirement on a mock service implementation in our local test environments (so we're as close as possible to the real deal).  This is the same service I talked about &lt;a href="http://chadthedeveloper.blogspot.com/2008/06/cxf-vs-oc4j-round-1.html"&gt;last time&lt;/a&gt;; one that we're using &lt;a href="http://cxf.apache.org/"&gt;CXF&lt;/a&gt; to create a mock implementation of and client for, from the provided WSDL.&lt;br /&gt;&lt;br /&gt;I began by enabling server authentication only, which went well and took no time at all.  However, enabling the client authentication threw a huge wrench into the mix.  Seriously, the stars had to align to hit us with this one.&lt;br /&gt;&lt;br /&gt;The error: Attempting to invoke the service returns a 405 Method Not Allowed and your Apache error log shows &lt;tt&gt;SSL Re-negotiation in conjunction with POST method not supported&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Condition 1:&lt;/span&gt; The service you're hitting requires client authentication via an SSL Certificate&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Condition 2:&lt;/span&gt; When using the CXF Client, you point it at the live WSDL &lt;br /&gt;&lt;ul&gt;&lt;li&gt;When generating client code from a WSDL, by default, the client's default constructor will use the path on the file system to the WSDL; alternatively, another constructor takes the WSDL location as a parameter&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Details &lt;a href="http://docs.huihoo.com/apache/cxf/2.0/developing-a-consumer.html#DevelopingaConsumer-ImplementingaCXFClient"&gt;here&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Condition 3:&lt;/span&gt; The service is invoked through Apache; a version lower than 2.2.0.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A common setup is Oracle Application Server with Oracle HTTP Server (Apache)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Condition 4:&lt;/span&gt; You're not in control of the box where the service is deployed&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Basically, CXF is initializing the connection with a GET request to retrieve the WSDL.  Following this GET, CXF makes a POST request to invoke the service.  Switching from a GET to a POST is causing the error.  We thought for a minute that if necessary, we could copy the WSDL to the file system (WEB-INF/wsdl/ maybe?) and therefore, CXF wouldn't perform the GET.  Then we realized, when CXF parses the WSDL, it retrieves any imports it finds.  If one of those is a resource (custom XSD for example), it must perform a GET to retrieve that from the server.... leaving you right back at square one.  &lt;br /&gt;&lt;br /&gt;We temporarily abandoned our effort here.  We need to be 100% sure that the Oracle HTTP Server in our deployment environment hasn't been patched.  We'll approach the group that owns the service we're integrating with and see what their thoughts are and whether or not they've had the same issue (this service is still in development).  Hopefully we can resolve this w/o moving WSDLs and XSDs to the file system and creating a maintenance nightmare.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Notes:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;I'm currently on CXF 2.0.6&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="https://issues.apache.org/bugzilla/show_bug.cgi?id=12355"&gt;Apache Issue&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-4099785838052146202?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/4099785838052146202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=4099785838052146202' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4099785838052146202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4099785838052146202'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/06/cxf-vs-oc4j-round-2.html' title='CXF vs OC4J ... Round 2'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-3495901329504706947</id><published>2008-06-13T08:56:00.014-05:00</published><updated>2008-06-13T17:09:25.023-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JEE'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><title type='text'>CXF vs OC4J ... Round 1</title><content type='html'>My deployment environment was recently switched to Oracle Application Server with Oracle Http Server (OC4J + OHS).  Currently, our primary focus is integration with some external SOAP Web Services and we've been using the &lt;a href="http://cxf.apache.org/"&gt;Apache CXF Project&lt;/a&gt; to generate a mock implementation of the service as well as a client from the WSDL.&lt;br /&gt;&lt;br /&gt;I'm well aware of common pains of switching between JEE Application Servers, having worked with WebLogic, GlassFish v2, JBoss, and now OC4J.  There's the initial learning curve for things like auto/hot-deployment directory, automated deployment w/in your build, getting to know the admin console, and log locations.  Unfortunately it's never just that easy.  You always end up running into issues around configuration differences and sometimes terrible class path and version nightmares.&lt;br /&gt;&lt;br /&gt;The worst part of porting our applications to OC4J was most definitely deploying our Mock Service Implementation and CXF Clients.  It's funny, after hitting the first CXF deployment issue I found myself at the &lt;a href="http://cwiki.apache.org/CXF20DOC/appserverguide.html"&gt;CXF App Server Guide&lt;/a&gt;.  A quick glance down the page indicates I'm in for quite the ride.&lt;br /&gt;&lt;br /&gt;I found that in the end, a little more than half of the information on this page was correct... but not everything.  Here are the differences I ran into.  (Note: I hope I'm capturing everything, I meant to write this a month ago, during the time I was running into these issues, but never got around to it)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Shared Libraries and Deployment&lt;/span&gt;&lt;br /&gt;I completely skipped the sections &lt;span style="font-style:italic;"&gt;Replace the Oracle XML parser with Xerces&lt;/span&gt; and &lt;span style="font-style:italic;"&gt;Deploying Applications Section&lt;/span&gt;.&lt;br /&gt;I ended up having to make a number of modifications to the &lt;tt&gt;-Xbootclasspath/p:&lt;/tt&gt; Java Option inside opmn.xml and by the time it was over and done with, managing shared libraries was unnecessary.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Setting System Properties&lt;/span&gt;&lt;br /&gt;No matter what I did, OC4J gave me an implementation of &lt;tt&gt;javax.xml.parsers.DocumentBuilderFactory&lt;/tt&gt; that would break CXF.  So, I did end up setting a System Property (I know, I know ...).  When using CXF to stand up a service, your &lt;tt&gt;web.xml&lt;/tt&gt; will need to identify a listener as such:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    &amp;lt;listener&amp;gt;&lt;br /&gt;        &amp;lt;listener-class&amp;gt;&lt;br /&gt;            org.springframework.web.context.ContextLoaderListener&lt;br /&gt;        &amp;lt;/listener-class&amp;gt;&lt;br /&gt;    &amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So, I wrote my own ContextLoadListener that extends this one (and modified the web.xml to point to mine).  It's just a pass-through, simply making a call to the same method on the listener I'm extending.  However, in the &lt;tt&gt;contextInitialized&lt;/tt&gt; method, I set the system property just before calling the super class.  &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    public void contextInitialized(ServletContextEvent event) {&lt;br /&gt;        System.setProperty("javax.xml.parsers.DocumentBuilderFactory",&lt;br /&gt;                "org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");&lt;br /&gt;        super.contextInitialized(event);&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;In the end...&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I &lt;span style="font-style:italic;"&gt;Followed&lt;/span&gt; these Sections from the &lt;a href="http://cwiki.apache.org/CXF20DOC/appserverguide.html"&gt;CXF App Server Guide&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Preparing stax-api&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Get rid of OC4J JAX-WS libraries&lt;/li&gt;&lt;br /&gt;&lt;li&gt;swapping Oracle wsdl.jar with wsdl4j.jar and jaxb.jar API with jaxb-api-2.0.jar&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I &lt;span style="font-style:italic;"&gt;Didn't Follow&lt;/span&gt; these Sections from the &lt;a href="http://cwiki.apache.org/CXF20DOC/appserverguide.html"&gt;CXF App Server Guide&lt;/a&gt;:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Replace the Oracle XML parser with Xerces&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Deploying Applications Section&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ended up with the following &lt;tt&gt;-XbootClasspath/p:&lt;/tt&gt; values:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-Xbootclasspath^/p:C:\stax-api-1.0.1.jar;C:\xercesImpl-2.8.1.jar;C:\xalan-2.7.0.jar;C:\xml-apis-1.3.02.jar;C:\webservices\wsdl4j-1_6_2\lib\wsdl4j.jar;C:\jaxb-api-2.0.jar&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Set one system property in a custom ContextLoaderListener (as shown above)&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Other Notes:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;These steps worked for me with CXF Versions 2.0.2-incubator &amp; 2.0.6&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If you're on CXF version 2.1, you'll need jaxb-api-2.1 instead of 2.0&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Download CXF &lt;a href="http://cxf.apache.org/download.html"&gt;here&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Download Xerces 2.8.1 &lt;a href="http://archive.apache.org/dist/xml/xerces-j/"&gt;here&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Download WSDL4J &lt;a href="http://sourceforge.net/projects/wsdl4j"&gt;here&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Make a directory to keep custom artifacts as you move through the process&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-3495901329504706947?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/3495901329504706947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=3495901329504706947' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3495901329504706947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3495901329504706947'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/06/cxf-vs-oc4j-round-1.html' title='CXF vs OC4J ... Round 1'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-4501573083677772989</id><published>2008-06-13T07:50:00.005-05:00</published><updated>2008-06-16T13:31:50.534-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Announcements'/><title type='text'>Firefox 3 - Help Set a New World Record</title><content type='html'>The release date for Firefox 3 has been set, &lt;span style="font-weight:bold;"&gt;June 17th, 2008&lt;/span&gt;.  &lt;br /&gt;&lt;br /&gt;On Download Day, we're going to shoot for the most software downloads in a 24-hour period and set an official Guinness World Record.&lt;br /&gt;&lt;br /&gt;Visit &lt;a href="http://www.spreadfirefox.com/worldrecord/"&gt;Spread Firefox&lt;/a&gt; and pledge your download!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.spreadfirefox.com/node&amp;id=0&amp;t=269"&gt;&lt;img alt="Download Day" title="Download Day" src="http://www.spreadfirefox.com/files/images/affiliates_banners/sns_badge1_en.png"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-4501573083677772989?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/4501573083677772989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=4501573083677772989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4501573083677772989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4501573083677772989'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/06/firefox-3-help-set-new-world-record.html' title='Firefox 3 - Help Set a New World Record'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-3186938450657702236</id><published>2008-05-28T08:00:00.000-05:00</published><updated>2008-05-28T08:00:00.620-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Productivity'/><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>Morning Daily Stand-ups</title><content type='html'>I've been on Scrum teams for the past 3 years.  Every team I've been on has decided to do its daily stand-up in the morning.  I've tried the lunch time thing before and it just didn't work.  People use their lunch hour to get things done; appointments, errands, etc.  I've never tried it as an end of the day meeting.  I've just always thought that by the next morning, I wouldn't recall important details.&lt;br /&gt;&lt;br /&gt;So, my problem is that my team really isn't doing it in the morning.  Our stand-up time is 9:30am.  After some thought, I'm pretty sure this is having a significant negative impact on my productivity.  I'm going to suggest we move to 8:15 or 8:30.  If that doesn't happen, I'm going to have to figure something out for myself.&lt;br /&gt;&lt;br /&gt;Here's a breakdown of why this isn't working for me.  I come in most days between 8 and 8:30.  I catch up on email that went out the night before; usually takes about 15 to 30 minutes.  Then I'm left with about 30-60 minutes before the meeting.  I spend about 15 minutes reviewing ScrumWorks, our project tracking tool.  I make sure I've updated my hours on tasks I'm working, ensure I'm working on the highest priority tasks, etc.  At that point I'm down to 15-45 minutes before our daily stand-up.&lt;br /&gt;&lt;br /&gt;How much can you really get done in that amount of time?  Maybe if you've got something small to finish up, but that isn't the case for me very often... ever.&lt;br /&gt;&lt;br /&gt;So, we go until 9:45 in our stand-up (ideally).  We talk about off-line things that came up until 10:00 or later.  Sometimes we schedule meetings for directly after our stand-up since we're already in a meeting room.  Most days, by the time I'm back to my desk and really starting to get something done, it's 11:00.  Yep, just 1 or 2 hours before I break to eat.&lt;br /&gt;&lt;br /&gt;The problem is, there's not much time to get up any real momentum.  Even if that's my only meeting in the day, it's just not in a good spot.  I don't hit any long stretches until after lunch.  &lt;br /&gt;&lt;br /&gt;Consider what I'm really saying here.  A single, 15-minute meeting is noticeably hindering my productivity due to the normal routine I follow and the meeting's placement in the day.  Maybe this is why I'm working so many nights on this project and always find myself saying, "Is it seriously noon already?!?!".&lt;br /&gt;&lt;br /&gt;I think that even if my team moves to an earlier daily stand-up, I need to re-evaluate my morning routine and see if I can make any improvements on it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-3186938450657702236?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/3186938450657702236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=3186938450657702236' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3186938450657702236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3186938450657702236'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/05/morning-daily-stand-ups.html' title='Morning Daily Stand-ups'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-6838920082177539831</id><published>2008-05-28T00:31:00.004-05:00</published><updated>2008-05-28T01:00:03.100-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>From 0 to VisualSVN in 90s</title><content type='html'>I've started working on a few little things from home and wanted to start managing the source with &lt;a href="http://subversion.tigris.org/"&gt;Subversion&lt;/a&gt;.  I've got a desktop at home running Windows XP and decided to put SVN there.  On the SVN site, on the &lt;a href="http://subversion.tigris.org/project_packages.html"&gt;downloads&lt;/a&gt; page, I found this excerpt:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;VisualSVN Server is a standard Windows Installer package that contains everything necessary to install, configure and manage Subversion server on Windows platform. It includes latest stable releases of Subversion, Apache plus a management console to perform most common Subversion administration tasks such as repository creation and access rights management.&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;I had this thing downloaded, installed, and configured in no time at all.  So, if you're installing SVN on Windows, I highly suggest &lt;a href="http://www.visualsvn.com/server/"&gt;VisualSVN Server&lt;/a&gt;.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;30 seconds to download&lt;/li&gt;&lt;br /&gt;&lt;li&gt;30 seconds to install&lt;/li&gt;&lt;br /&gt;&lt;li&gt;30 seconds to configure&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-6838920082177539831?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/6838920082177539831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=6838920082177539831' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6838920082177539831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6838920082177539831'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/05/from-0-to-visualsvn-in-90s.html' title='From 0 to VisualSVN in 90s'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-3164821938841623676</id><published>2008-05-27T00:08:00.004-05:00</published><updated>2008-05-27T00:35:35.738-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Productivity'/><title type='text'>Boo Office Noise</title><content type='html'>Last week I spent a full day working from home.  It's been a very long time since I've had that opportunity, and wow was it much needed.  I just didn't realize how distracted I am in my current setting.  &lt;br /&gt;&lt;br /&gt;I work in a room packed with 12 people; as many as it can fit.  As much as I understand and have experienced the benefit of working in an open area with your team, tight quarters with half of the conversations distracting you isn't the same thing.  On top of that, we have hardwood floors, bare walls, and no ceiling.  Everything from the area next door carries right in.  All of these things just make my office space a productivity inhibitor.  Unfortunately, we have no where else to go.&lt;br /&gt;&lt;br /&gt;If I am ever in the position to build spaces for software engineering teams, I think I'd do the following:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Open spaces for groups of up to 8 people&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cubicles in a designated 'quiet' area&lt;/li&gt;&lt;br /&gt;&lt;li&gt;No assigned seating.  Everyone has a rolling cart to take with them.  Mobile tables throughout with core supplies, an extra monitor, etc.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A couple of relaxation rooms&lt;/li&gt;&lt;br /&gt;&lt;li&gt;PLENTY of meeting rooms.  I forgot to mention earlier that sometimes we have to hold meetings or conferences at our desks&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-3164821938841623676?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/3164821938841623676/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=3164821938841623676' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3164821938841623676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3164821938841623676'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/05/boo-office-noise.html' title='Boo Office Noise'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-7479378956054473011</id><published>2008-05-15T09:02:00.009-05:00</published><updated>2008-05-15T10:07:29.262-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JEE'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven2'/><title type='text'>Automated Deployment to OC4J in Maven2</title><content type='html'>Below are example Maven2 Profiles that will deploy/undeploy a WAR to an OC4J Instance.  For information on exactly what each parameter does and everything else about working with the admin_client.jar, consult your Oracle Application Server documentation.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://scrambledtech.blogspot.com/"&gt;Phillip Anderson&lt;/a&gt; for this work.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        &amp;lt;!-- The base installation directory of OC4J --&amp;gt;&lt;br /&gt;        &amp;lt;oc4j.home&amp;gt;C:\JEE\AppServers\oc4j&amp;lt;/oc4j.home&amp;gt; &lt;br /&gt;&lt;br /&gt;        &amp;lt;!-- The string needed to deploy to an OC4J Instance; This would be different for a standalone oc4j instance --&amp;gt;&lt;br /&gt;        &amp;lt;oc4j.deployer&amp;gt;deployer:oc4j:opmn://localhost/home&amp;lt;/oc4j.deployer&amp;gt; &lt;br /&gt;        &lt;br /&gt;        &amp;lt;!-- The admin userid for OC4J --&amp;gt;&lt;br /&gt;        &amp;lt;oc4j.user&amp;gt;oc4jadmin&amp;lt;/oc4j.user&amp;gt; &lt;br /&gt;        &lt;br /&gt;        &amp;lt;!-- The password for the OC4J admin user --&amp;gt;&lt;br /&gt;        &amp;lt;oc4j.password&amp;gt;admin&amp;lt;/oc4j.password&amp;gt; &lt;br /&gt;&lt;br /&gt;        &amp;lt;profile&amp;gt;&lt;br /&gt;            &amp;lt;id&amp;gt;OC4JDeploy&amp;lt;/id&amp;gt;&lt;br /&gt;            &amp;lt;build&amp;gt;&lt;br /&gt;                &amp;lt;plugins&amp;gt;&lt;br /&gt;                    &amp;lt;plugin&amp;gt;&lt;br /&gt;                        &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;&lt;br /&gt;                        &amp;lt;artifactId&amp;gt;exec-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;                        &amp;lt;executions&amp;gt;&lt;br /&gt;                            &amp;lt;execution&amp;gt;&lt;br /&gt;                                &amp;lt;id&amp;gt;deploy&amp;lt;/id&amp;gt;&lt;br /&gt;                                &amp;lt;phase&amp;gt;install&amp;lt;/phase&amp;gt;&lt;br /&gt;                                &amp;lt;goals&amp;gt;&lt;br /&gt;                                    &amp;lt;goal&amp;gt;exec&amp;lt;/goal&amp;gt;&lt;br /&gt;                                &amp;lt;/goals&amp;gt;&lt;br /&gt;                                &amp;lt;configuration&amp;gt;&lt;br /&gt;                                    &amp;lt;executable&amp;gt;java&amp;lt;/executable&amp;gt;&lt;br /&gt;                                    &amp;lt;arguments&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;-jar&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;${oc4j.home}\j2ee\home\admin_client.jar&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;${oc4j.deployer}&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;${oc4j.user}&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;${oc4j.password}&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;-deploy&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;-file&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;${basedir}\target\${project.build.finalName}.${project.packaging}&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;-deploymentName&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;myWar&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;-bindAllWebApps&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;secure-web-site&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;-contextRoot&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;myWar&amp;lt;/argument&amp;gt;&lt;br /&gt;                                    &amp;lt;/arguments&amp;gt;&lt;br /&gt;                                &amp;lt;/configuration&amp;gt;&lt;br /&gt;                            &amp;lt;/execution&amp;gt;&lt;br /&gt;                        &amp;lt;/executions&amp;gt;&lt;br /&gt;                    &amp;lt;/plugin&amp;gt;&lt;br /&gt;                &amp;lt;/plugins&amp;gt;&lt;br /&gt;            &amp;lt;/build&amp;gt;&lt;br /&gt;        &amp;lt;/profile&amp;gt;&lt;br /&gt;        &amp;lt;profile&amp;gt;&lt;br /&gt;            &amp;lt;id&amp;gt;OC4JUndeploy&amp;lt;/id&amp;gt;&lt;br /&gt;            &amp;lt;build&amp;gt;&lt;br /&gt;                &amp;lt;plugins&amp;gt;&lt;br /&gt;                    &amp;lt;plugin&amp;gt;&lt;br /&gt;                        &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;&lt;br /&gt;                        &amp;lt;artifactId&amp;gt;exec-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;                        &amp;lt;executions&amp;gt;&lt;br /&gt;                            &amp;lt;execution&amp;gt;&lt;br /&gt;                                &amp;lt;id&amp;gt;deploy&amp;lt;/id&amp;gt;&lt;br /&gt;                                &amp;lt;phase&amp;gt;validate&amp;lt;/phase&amp;gt;&lt;br /&gt;                                &amp;lt;goals&amp;gt;&lt;br /&gt;                                    &amp;lt;goal&amp;gt;exec&amp;lt;/goal&amp;gt;&lt;br /&gt;                                &amp;lt;/goals&amp;gt;&lt;br /&gt;                                &amp;lt;configuration&amp;gt;&lt;br /&gt;                                    &amp;lt;executable&amp;gt;java&amp;lt;/executable&amp;gt;&lt;br /&gt;                                    &amp;lt;arguments&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;-jar&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;${oc4j.home}\j2ee\home\admin_client.jar&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;${oc4j.deployer}&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;${oc4j.user}&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;${oc4j.password}&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;-undeploy&amp;lt;/argument&amp;gt;&lt;br /&gt;                                        &amp;lt;argument&amp;gt;myWar&amp;lt;/argument&amp;gt;&lt;br /&gt;                                    &amp;lt;/arguments&amp;gt;&lt;br /&gt;                                &amp;lt;/configuration&amp;gt;&lt;br /&gt;                            &amp;lt;/execution&amp;gt;&lt;br /&gt;                        &amp;lt;/executions&amp;gt;&lt;br /&gt;                    &amp;lt;/plugin&amp;gt;&lt;br /&gt;                &amp;lt;/plugins&amp;gt;&lt;br /&gt;            &amp;lt;/build&amp;gt;&lt;br /&gt;        &amp;lt;/profile&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/8881614386511851669-7479378956054473011?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/7479378956054473011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=7479378956054473011' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/7479378956054473011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/7479378956054473011'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/05/automated-deployment-to-oc4j-in-maven2.html' title='Automated Deployment to OC4J in Maven2'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-2617280804022628238</id><published>2008-05-14T09:24:00.003-05:00</published><updated>2008-05-15T10:09:11.351-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JEE'/><title type='text'>Outgoing SSL Connections in OC4J</title><content type='html'>The project I'm working on is currently deployed to Oracle Application Server.  I spent most of the day yesterday trying to figure out 2 things.&lt;br /&gt;&lt;br /&gt;1. Why can't I set the java options &lt;tt&gt;javax.net.ssl.trustStore&lt;/tt&gt; and &lt;tt&gt;javax.net.ssl.trustStorePassword&lt;/tt&gt; in the opmn.xml file w/o the system spewing error messages on startup?&lt;br /&gt;&lt;br /&gt;2. How can I get my application to successfully make outgoing HTTPS connections if I can't set those system properties?&lt;br /&gt;&lt;br /&gt;I posted a message on the Oracle forms &lt;a href="http://forums.oracle.com/forums/thread.jspa?messageID=2523483&amp;#2523483"&gt;here&lt;/a&gt; with no response.  I spent hours searching online, only finding documentation on how to secure your deployed applications with SSL.&lt;br /&gt;&lt;br /&gt;I ended up finding an off-topic document that revealed the answer.  OC4J looks to a default trust store located at ${ORACLE_HOME}/jdk/jre/lib/security/cacerts.  So, after adding the certificate I needed to trust into this trust store, all was good.  &lt;br /&gt;&lt;br /&gt;I knew that java had a default trust store, but my goal was to point OC4J to a trust store of my choice, not edit the system default.  I did look for a way to configure OC4J through other means, but no luck.  And in this case, my whole goal was to point the system to a trust store of my choice, so I was ok with using the system properties.&lt;br /&gt;&lt;br /&gt;It still irks me that I can't set those system properties.  Oh well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-2617280804022628238?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/2617280804022628238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=2617280804022628238' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2617280804022628238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2617280804022628238'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/05/outgoing-ssl-connections-in-oc4j.html' title='Outgoing SSL Connections in OC4J'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-8434557581020729992</id><published>2008-05-07T00:27:00.001-05:00</published><updated>2008-06-13T08:18:27.553-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='{L|W}AMP'/><title type='text'>WAMP Hurdles</title><content type='html'>If you've read the last 2 of my &lt;a href="http://chadthedeveloper.blogspot.com/search/label/Book%20Reviews"&gt;book reviews&lt;/a&gt;, you're probably noticing a trend.  I'm attempting to expand my skill set horizontally, starting down the path of what I view as the skill set of a 'classical' web application developer.  I've brushed up on the essentials; HTML and CSS.  And followed that up with a poor introduction to JavaScript.  Now, I'm on my way to the exciting and powerful capabilities of PHP and MySQL.&lt;br /&gt;&lt;br /&gt;After some time of reading and coming up to speed on the basics of PHP development, I decided to take a head first dive (no, there's no Head First PHP book) into this and focus on finding tutorials that build (small) applications from start to finish.  Unfortunately, just getting my environment set up has been.... predictable.&lt;br /&gt;&lt;br /&gt;Yes, I'm on Windows.  I know, I know.  I could buy a cheap development box, use a VM can, etc.  Honestly, I'd rather just tough it out for now and worry about porting to LAMP (that made me laugh) when that bridge comes.&lt;br /&gt;&lt;br /&gt;So, my first hurdle...&lt;br /&gt;&lt;br /&gt;I downloaded PHP 5.2.5 and MySQL 5.0.51b, arriving at my first roadblock.  The instructions I was following simply asked me to uncomment the line "extension=php_mysqli.dll" from my php.ini file; easy enough.  Unfortunately, I found error logs reporting that the dynamic library could not be loaded and the specified module could not be found. &lt;br /&gt;&lt;br /&gt;Quickly I found some indications online that I needed to grab a new PHP/MySQL connector.  Following the provided &lt;a href="http://dev.mysql.com/downloads/connector/php-mysqlnd/"&gt;link&lt;/a&gt; to a page on the MySQL site took me to pretty much, the last thing I wanted to see.  Yeah, it was asking me to check out source code, overwrite some files, and build it myself.  No thanks.  &lt;br /&gt;&lt;br /&gt;15 minutes of dedicated investigation later, I found a connector (already built) that I could download and replace the dll that came with PHP to work with just a slightly older version of MySQL (5.0.19).&lt;br /&gt;&lt;br /&gt;Voila!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-8434557581020729992?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/8434557581020729992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=8434557581020729992' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/8434557581020729992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/8434557581020729992'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/05/wamp-hurdles.html' title='WAMP Hurdles'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-2011616148827216144</id><published>2008-05-06T22:05:00.007-05:00</published><updated>2008-05-06T22:29:31.302-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Review: Head First JavaScript</title><content type='html'>&lt;a href="http://www.amazon.com/Head-First-JavaScript/dp/0596527748/"&gt;Head First JavaScript&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This book teaches the reader the basics of JavaScript and explorers a few use cases and example applications.  In some ways, it does resemble the other Head First texts I've read.  For example, throughout this book the reader can progressively enhance a couple of example applications with what they're learning in the given chapter.  Unfortunately however, the best things about Head First books fail to present themselves here.  First off, this book does not keep you involved with the example code that corresponds to what you're learning.  The vast majority of the time it is up to you to follow along in the example source code as you work through the book.  Secondly, this book is too basic.  It does not reach a wide enough audience.  Essentially, if you have any type of development background, you'll get bored.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Audience:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Those interested in exploring JavaScript to enhance their web applications (with the exception of those with a development background).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pros:&lt;/span&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;li&gt;The reader doesn't have to be a developer to understand the book.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The reader gets to see a web site progress using the new skills he/she learns throughout the book.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Cons:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;It barely scratches the surface of JavaScript.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;It does not hold up to the reputation of other Head First texts.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Recommendation:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;If you're a regular Joe that experiments with some web development here and there, and really really prefers a text book to online tutorials and guides, this book might be for you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-2011616148827216144?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/2011616148827216144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=2011616148827216144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2011616148827216144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2011616148827216144'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/05/review-head-first-javascript.html' title='Review: Head First JavaScript'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-8073902649993731686</id><published>2008-04-18T14:31:00.011-05:00</published><updated>2008-04-18T16:26:15.712-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JEE'/><title type='text'>I love you OC4J</title><content type='html'>Recently our team found out that our deployment environment would use Oracle's OC4J App Server.  So, after getting it up and going, I finally started working with it locally; deploying and testing our application.&lt;br /&gt;&lt;br /&gt;One of the rest services in our application was returning a 500 response code.  To investigate, I navigated to this WAR's application log for a look.  I couldn't believe what I found....&lt;br /&gt;&lt;br /&gt;The 500 was a result of an everyday NoClassDefFoundError.  What blew me away was what OC4J had put in the log.  Check it out...&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-style: italic"&gt;&lt;br /&gt;08/04/18 13:41:16.484 10.1.3.1.0 Started&lt;br /&gt;08/04/18 13:41:16.828 safxc-test: 10.1.3.1.0 Started&lt;br /&gt;08/04/18 13:50:43.546 safxc-test: Servlet error&lt;br /&gt;oracle.classloader.util.AnnotatedNoClassDefFoundError: &lt;br /&gt;&lt;br /&gt;   Missing class: javax.xml.bind.annotation.XmlRootElement&lt;br /&gt;&lt;br /&gt; Dependent class: com.sun.ws.rest.impl.streaming.JAXBElementProvider&lt;br /&gt;          Loader: safxc-test.web.safxc-test:0.0.0&lt;br /&gt;     Code-Source: /C:/JEE/AppServers/oc4j/j2ee/home/applications/safxc-test/safxc-test/WEB-INF/lib/restbeans-impl-R2.jar&lt;br /&gt;   Configuration: WEB-INF/lib/ directory in C:\JEE\AppServers\oc4j\j2ee\home\applications\safxc-test\safxc-test\WEB-INF\lib&lt;br /&gt;&lt;br /&gt;The missing class is available from the following locations:&lt;br /&gt;&lt;br /&gt; 1. Code-Source: /C:/JEE/AppServers/oc4j/j2ee/home/applications/safxc/safxc/WEB-INF/lib/jaxb-api-2.0.jar (from WEB-INF/lib/ directory in C:\JEE\AppServers\oc4j\j2ee\home\applications\safxc\safxc\WEB-INF\lib)&lt;br /&gt;     This code-source is available in loader safxc.web.safxc:0.0.0. &lt;br /&gt;&lt;br /&gt; 2. Code-Source: /C:/JEE/AppServers/oc4j/j2ee/home/applications/dashboard/dashboard/WEB-INF/lib/jaxb-api-2.0.jar (from WEB-INF/lib/ directory in C:\JEE\AppServers\oc4j\j2ee\home\applications\dashboard\dashboard\WEB-INF\lib)&lt;br /&gt;     This code-source is available in loader dashboard.web.dashboard:0.0.0. &lt;br /&gt;&lt;br /&gt; 3. Code-Source: /C:/JEE/AppServers/oc4j/j2ee/home/applications/cop/cop/WEB-INF/lib/jaxb-api-2.0.jar (from WEB-INF/lib/ directory in C:\JEE\AppServers\oc4j\j2ee\home\applications\cop\cop\WEB-INF\lib)&lt;br /&gt;     This code-source is available in loader cop.web.cop:0.0.0. &lt;br /&gt;&lt;br /&gt; 4. Code-Source: /C:/JEE/AppServers/oc4j/j2ee/home/applications/resource-discovery-widget-service/resource-discovery-widget-service/WEB-INF/lib/jaxb-api-2.0.jar (from WEB-INF/lib/ directory in C:\JEE\AppServers\oc4j\j2ee\home\applications\resource-discovery-widget-service\resource-discovery-widget-service\WEB-INF\lib)&lt;br /&gt;     This code-source is available in loader resource-discovery-widget-service.web.resource-discovery-widget-service:0.0.0. &lt;br /&gt;&lt;br /&gt; at .... STACK TRACE WAS HERE ....&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's right!  Unreal!  In some beautiful, very readable output, it ... &lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Tells you the exact class that is missing (outside of the stack trace)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tells you the dependent class&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tells you what artifact contains the dependent class&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Tells you where you can go find the missing class !!!!&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;If I haven't said it already ... this is awesome.  I can't wait to see what else is in store for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-8073902649993731686?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/8073902649993731686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=8073902649993731686' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/8073902649993731686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/8073902649993731686'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/04/i-love-you-oc4j.html' title='I love you OC4J'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-8939942932028063300</id><published>2008-04-15T23:22:00.010-05:00</published><updated>2008-04-15T23:56:29.987-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Review: Head First HTML with CSS &amp; XHTML</title><content type='html'>&lt;a href="http://www.amazon.com/Head-First-HTML-CSS-XHTML/dp/059610197X"&gt;Head First HTML with CSS &amp; XHTML&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Topics (pretty obvious):&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;HTML&lt;/li&gt;&lt;li&gt;XHTML&lt;/li&gt;&lt;li&gt;CSS&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This book teaches the reader everything he/she needs to know to get up and going with HTML and CSS.  Throughout the book you build up a website for a coffee shop.  Each chapter improves the site just a little through new things being taught to the reader.  You'll learn everything from HTML history to HTML standards; from the most common HTML elements to the box model; from simple CSS rules to complex selectors and visual effects.  A reader of this book can go from Zero web development knowledge to the ability to quickly create simple, yet functional web sites.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Audience:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Anyone interested in learning web site development essentials.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pros:&lt;/span&gt;&lt;br /&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;li&gt;The reader doesn't have to be a developer to understand the book.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The reader gets to see a web site progress using the new skills he/she learns throughout the book.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;As with any Head First book, there is plenty of humor to keep the reader interested.&lt;/li&gt;&lt;li&gt;Suggestions on where to go after reading this book. (This is an invaluable part of every Head First book in my opinion)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;table style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Cons:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;???&lt;br /&gt;&lt;/span&gt;&lt;/table&gt;&lt;table style="color: rgb(0, 0, 0);"&gt;&lt;/table&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;&lt;br /&gt;Recommendation:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;No matter what your background is, if you're looking to learn the essentials of web development this is the book.  And as it goes for every Head First book I've read, you'll be entertained and enjoy the book from cover to cover.  If you're looking to get into web development, this book is a must.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-8939942932028063300?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/8939942932028063300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=8939942932028063300' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/8939942932028063300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/8939942932028063300'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/04/review-head-first-html-with-css-xhtml.html' title='Review: Head First HTML with CSS &amp; XHTML'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-5009079698076580761</id><published>2008-04-15T23:17:00.000-05:00</published><updated>2008-04-15T23:14:22.517-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>What you get for Over-Working your Product Owner</title><content type='html'>&lt;ol&gt;&lt;br /&gt;&lt;li&gt;No Roadmap (at least nothing outside of the PO's brain, or not until the week before it gets delivered to your client)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A backlog being prioritized/updated as you walk into/during your backlog selection meeting&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Stories that smell of implementation and architecture (why developers aren't good product owners)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Realization after 2-3 sprints that your Scrum Master owns the backlog&lt;/li&gt;&lt;br /&gt;&lt;li&gt;An over-worked Scrum Master&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-5009079698076580761?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/5009079698076580761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=5009079698076580761' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/5009079698076580761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/5009079698076580761'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/04/what-you-get-for-over-working-your.html' title='What you get for Over-Working your Product Owner'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-4817036039321721133</id><published>2008-03-13T17:05:00.001-05:00</published><updated>2008-03-13T16:20:51.302-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Dynamic Method Calls with Groovy</title><content type='html'>Thanks to some help from &lt;a href="http://jlorenzen.blogspot.com/"&gt;James Lorenzen&lt;/a&gt;, &lt;a href="http://gallemore.blogspot.com/"&gt;Chad Gallemore&lt;/a&gt; and &lt;a href="http://www.supercodepoet.com/"&gt;Travis Chase&lt;/a&gt;, ...&lt;br /&gt;&lt;br /&gt;A couple of days ago I found myself iterating through a set of key=value pairs, and for each one calling a setter method on another object.  In order to know which setter method to call, I had to examine the key.  That's when it hit me... What if I could use the key to generate the setter method to call.  Check this out.&lt;br /&gt;&lt;br /&gt;I've got a simple bean with 2 member variables: username and password.  There are corresponding setter methods: setUsername() and setPassword().&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   class UserBean {&lt;br /&gt;       private String username;&lt;br /&gt;       private String password;&lt;br /&gt;&lt;br /&gt;       void setUsername(String username) {&lt;br /&gt;           this.username = username&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       void setPassword(String password) {&lt;br /&gt;           this.password = password&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here I have a HashMap that I want to iterate through.  It just so happens the keys in the map entries correspond exactly to the member variables of my simple bean.  So, instead of examining each key to decide what setter method to call, I can do this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   import junit.framework.TestCase&lt;br /&gt;   public class DynamicMethodBuildingTest extends TestCase {&lt;br /&gt;&lt;br /&gt;       void testBuildMethodsBasedOnMapKeys() {&lt;br /&gt;&lt;br /&gt;           def testMap = new HashMap();&lt;br /&gt;           testMap.put("username","chad")&lt;br /&gt;           testMap.put("password","asdfasdf")&lt;br /&gt;&lt;br /&gt;           def userbean = new UserBean();&lt;br /&gt;&lt;br /&gt;           testMap.entrySet().each { entry -&gt;&lt;br /&gt;               userbean."$entry.key" = entry.value&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;At this point I'm not really building the method that is being called.  I'm building the property name.  So, let's look at actually building a method call.&lt;br /&gt;&lt;br /&gt;I've added 2 methods to my UserBean: login() and logoff().&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   void login() {&lt;br /&gt;       println username + " has Logged In"&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   void logoff() {&lt;br /&gt;       println username + " has Logged Off"&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Let's test calling these 2 methods dynamically.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   void testExecuteUserAction() {&lt;br /&gt;       def userActions = ["login", "logoff"];&lt;br /&gt;&lt;br /&gt;       def userbean = new UserBean()&lt;br /&gt;       userbean.username = "chad"&lt;br /&gt;&lt;br /&gt;       userActions.each { action -&gt;&lt;br /&gt;           userbean."$action"()&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here's the output:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   chad has Logged In&lt;br /&gt;   chad has Logged Off&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Well, that's all it takes.  And if you're asking, "What about a method that takes parameters?"... simply put your parameters inside the parenthesis.  It may look something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   userbean."$action"(username)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now I wonder, what would it take to accomplish this in Java?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-4817036039321721133?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/4817036039321721133/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=4817036039321721133' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4817036039321721133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4817036039321721133'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/03/dynamic-method-calls-with-groovy.html' title='Dynamic Method Calls with Groovy'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-8525838406415303734</id><published>2008-03-05T10:14:00.004-06:00</published><updated>2008-06-16T13:31:50.535-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Travel'/><category scheme='http://www.blogger.com/atom/ns#' term='Announcements'/><title type='text'>Free Travel to Java Symposium 08</title><content type='html'>Since travel budgets seem to hinder conference attendance quite often, The Server Side is offering a &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=48610"&gt;raffle&lt;/a&gt; to win free airfare and hotel for the conference.  And before you ask... No, you don't have to register for the conference to enter.  Just sign up for the raffle.  If you win, then worry about convincing your project manager to pay for the conference itself. &lt;br /&gt;&lt;br /&gt;And... it's in Vegas!&lt;br /&gt;&lt;br /&gt;Good Luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-8525838406415303734?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/8525838406415303734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=8525838406415303734' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/8525838406415303734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/8525838406415303734'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/03/free-travel-to-java-symposium-08.html' title='Free Travel to Java Symposium 08'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-6630099111461308535</id><published>2008-02-28T23:17:00.009-06:00</published><updated>2008-02-28T23:43:04.596-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>A small Gotcha using Groovy's StubFor or MockFor</title><content type='html'>I (literally) just &lt;a href="http://chadthedeveloper.blogspot.com/2008/02/my-first-groovy-experience.html"&gt;posted&lt;/a&gt; about my first experience with Groovy.  I forgot to mention one thing that I got hung up on when using the StubFor class (this applies to MockFor as well).&lt;br /&gt;&lt;br /&gt;I have a simple utility method that just reads from a file and returns the text.  I wrote the following unit test and it looked like this at first.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;1.    def void testReadFromFile() {&lt;br /&gt;2.        def expectedText = "&amp;lt;test&amp;gt;myXml&amp;lt;/test&amp;gt;"&lt;br /&gt;3.        def fileStub = new StubFor(File)&lt;br /&gt;4.        fileStub.demand.text {&lt;br /&gt;5.            return expectedText&lt;br /&gt;6.        }&lt;br /&gt;7.&lt;br /&gt;8.        fileStub.use {&lt;br /&gt;9.            def val = FileIO.readFromFile("x.xml")&lt;br /&gt;10.           println("val: " + val)&lt;br /&gt;11.           assertEquals("Expected Text not Found", expectedText, val)&lt;br /&gt;12.       }&lt;br /&gt;13.   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Do you see anything wrong here?  Check out line 4.  Still think it looks ok?  The problem is that there is no method "text".  There is however, a method "getText()".  That's right.  Even though the code I'm testing looks like this&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;   new File(fileName).text&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and works perfectly fine, under the covers the actually method being called is getText().  Running the unit test from above results in the following error:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;pre&gt;   junit.framework.AssertionFailedError: No more calls to 'getText' expected at this point. End of demands.&lt;br /&gt;   at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)&lt;br /&gt;   at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)&lt;br /&gt;   at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)&lt;br /&gt;   at java.lang.reflect.Constructor.newInstance(Constructor.java:494)&lt;br /&gt;   at org.codehaus.groovy.runtime.MetaClassHelper.doConstructorInvoke(MetaClassHelper.java:526)&lt;br /&gt;   at groovy.lang.MetaClassImpl.doConstructorInvoke(MetaClassImpl.java:2331)&lt;br /&gt;   at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1227)&lt;br /&gt;   at groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1157)&lt;br /&gt;   ...&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Line 4 in the unit test above should read like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;4.        fileStub.demand.getText {&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, remember that when using StubFor or MockFor your demands must specify the actual method that will be called.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-6630099111461308535?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/6630099111461308535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=6630099111461308535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6630099111461308535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6630099111461308535'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/02/small-gotcha-using-groovys-stubfor-or.html' title='A small Gotcha using Groovy&apos;s StubFor or MockFor'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-2558013914874162291</id><published>2008-02-28T21:33:00.006-06:00</published><updated>2008-02-28T23:07:33.225-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>My First Groovy Experience</title><content type='html'>For a while now, several people in my office have been diving head first into the Groovy experience (&lt;a href="http://jlorenzen.blogspot.com/"&gt;James Lorenzen&lt;/a&gt;, &lt;a href="http://gallemore.blogspot.com/"&gt;Chad Gallemore&lt;/a&gt;, &lt;a href="http://joe.kueser.com/"&gt;Joe Kueser&lt;/a&gt;, and &lt;a href="http://www.supercodepoet.com/"&gt;Travis Chase&lt;/a&gt;).  Thanks to these guys, my first Groovy experience went pretty well overall.&lt;br /&gt;&lt;br /&gt;I do all of my development in IntelliJ IDEA and with Maven2.  So, my first steps were to get the &lt;a href="http://groovy.codehaus.org/IntelliJ+IDEA+Plugin"&gt;JetGroovy plugin&lt;/a&gt;, install &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt;, and get my Maven2 project setup to handle Groovy source.  Other than a small hiccup getting the plugin, this all went relatively smoothly.&lt;br /&gt;&lt;br /&gt;During this experience, I jumped right in using the &lt;a href="http://gallemore.blogspot.com/2008/02/groovy-stubs.html"&gt;StubFor&lt;/a&gt; class for some unit testing and &lt;a href="http://groovy.codehaus.org/Reading+XML+using+Groovy%27s+XmlSlurper"&gt;XmlSlurper&lt;/a&gt; to parse through some XML.  Both of these proved extremely easy to use and much better than their alternatives in Java.&lt;br /&gt;&lt;br /&gt;So, now to what didn't go well.  First, when I'm working on an individual unit or integration test, I just run it in IDEA.  When I was writing my first Groovy class (and associated tests), I was having trouble with strange behavior with my unit test.  After a short time of extreme confusion, it hit me what was happening.  If I didn't make a change to the Groovy class between every test, IDEA would not actually use the class (if that makes any sense).  I wasn't seeing any exceptions regarding missing classes, but the code would actually not be run.  So, I had to make a change in the unit test class as well as the class under test if I wanted to run the test from IDEA.  Fortunately, I confirmed with my coworkers that this problem did not exist in IDEA version 7.0.2 (I was running 7.0).  A quick upgrade fixed my problem.&lt;br /&gt;&lt;br /&gt;The only other thing I have to complain about is the customization of colors in IDEA for Groovy source.  Unlike most, I use a very colorful scheme for development.  I happen to be terribly color blind and find it much easier when different things in the code stand out.  If you ever get the chance to see my screen, you'll see brown, blue, purple, yellow, red, white, grey, and shades of several of those.  So, unfortunately for me, there's not quite as much customization available for Groovy source.  Oh well.  I'm sure I'll live.&lt;br /&gt;&lt;br /&gt;At the end of the day, it was a good experience and gladly I'll continue use Groovy where it makes sense.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-2558013914874162291?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/2558013914874162291/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=2558013914874162291' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2558013914874162291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2558013914874162291'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/02/my-first-groovy-experience.html' title='My First Groovy Experience'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-3267926768533484419</id><published>2008-02-27T08:49:00.008-06:00</published><updated>2008-02-27T09:24:30.482-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maven2'/><title type='text'>A couple more Maven2 Plugins</title><content type='html'>Last week I wrote about using the Maven Build Helper Plugin and just started wandering how many other plugins were out there that could be very useful for me, but that I had not yet discovered.  So, after a little searching, I found two other plugins that I really wish I would have known about before this.  Note however that I have not tried using them to verify their capabilities.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Maven 2 License Plugin&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I really, really could have used in the past.  I work on about 5 Open Source projects on Java.Net.  Most of those started out being built internally. So right before that initial commit you've got to insert a header in every single file.  Additionally, I work on DoD contracts and when we deliver code at the end of each quarter, it must include a Government Purpose Rights header.  Yes, that includes replacing the open source headers with the GPR headers.&lt;br /&gt;&lt;br /&gt;Anyway, I'll list the features of the plugin so you can decide if you want to go check out the project site &lt;a href="http://code.google.com/p/maven-license-plugin/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Check&lt;/strong&gt;: check if header is missing in some source file &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Reformat&lt;/strong&gt;: add headers if missing &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Custom mappings&lt;/strong&gt;: enables easy support of new file extensions &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Variable replacement:&lt;/strong&gt; You can add some variable in your header, such as ${year}, ${owner} and they will be replaced by the corresponding values taken from the pom or system properties. &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;JMeter Maven Plugin&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;I'm not using JMeter on my current project, but I have used it on several previous projects.  And, there's nothing better than being able to automate a testing process into your build.  That's right, this plugin will run your JMeter tests during your build.  Unfortunately, it seems like there may be a lack of documentation.  However, I've located one additional &lt;/span&gt;&lt;span&gt;&lt;a href="http://technology.amis.nl/blog/?p=2364"&gt;resource&lt;/a&gt;&lt;/span&gt;&lt;span&gt; that even includes report generation in it's example of how to use this plugin.&lt;br /&gt;&lt;br /&gt;Check out the plugin's site &lt;a href="http://wiki.apache.org/jakarta-jmeter/JMeterMavenPlugin"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-3267926768533484419?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/3267926768533484419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=3267926768533484419' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3267926768533484419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3267926768533484419'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/02/couple-more-maven2-plugins.html' title='A couple more Maven2 Plugins'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-750240485370496616</id><published>2008-02-21T10:30:00.008-06:00</published><updated>2008-02-21T12:21:21.152-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maven2'/><title type='text'>Maven2, Multiple Source Directories, and the Build Helper Plugin</title><content type='html'>I'm currently working on a project dealing a lot with Web Services.  I'm using the &lt;a href="http://cwiki.apache.org/CXF20DOC/maven-integration-and-plugin.html"&gt;CXF Codegen Plugin&lt;/a&gt; to generate Java classes from an existing WSDL.  However, I need to write a few classes of my own to create a common client interface and a mock implementation in addition to the code generated by &lt;a href="http://incubator.apache.org/cxf/"&gt;CXF&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;My dilemma is that &lt;a href="http://maven.apache.org/"&gt;Maven2&lt;/a&gt; supports only using a single &amp;lt;sourceDirectory&amp;gt; in the pom.  I don't want to use a single source directory because of cluttering my code with the generated source or vice versa.  I'd rather not use two separate modules because ... well, I don't want 2 different artifacts exposing virtually the same capabilities. &lt;br /&gt;&lt;br /&gt;So, after a few Google &lt;a href="http://www.google.com/search?hl=en&amp;amp;rlz=1G1GGLQ_ENUS259&amp;amp;q=maven2+multiple+sourceDirectory&amp;amp;btnG=Search"&gt;searches&lt;/a&gt;, I found the &lt;a href="http://mojo.codehaus.org/build-helper-maven-plugin/index.html"&gt;Build Helper Maven Plugin&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;This plugin allows you to add additional source directories to your module.  See my example below.  I'm adding the directory of my generated source files, &lt;span style="font-weight: bold;"&gt;${basedir}/target/generated/src/main/java&lt;/span&gt; (in addition to the default source directory ${basedir}/src/main/java).&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;        &amp;lt;plugins&amp;gt;&lt;br /&gt;             &amp;lt;plugin&amp;gt;&lt;br /&gt;                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;&lt;br /&gt;                &amp;lt;artifactId&amp;gt;build-helper-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;                &amp;lt;executions&amp;gt;&lt;br /&gt;                  &amp;lt;execution&amp;gt;&lt;br /&gt;                    &amp;lt;id&amp;gt;add-source&amp;lt;/id&amp;gt;&lt;br /&gt;                    &amp;lt;phase&amp;gt;generate-sources&amp;lt;/phase&amp;gt;&lt;br /&gt;                    &amp;lt;goals&amp;gt;&lt;br /&gt;                      &amp;lt;goal&amp;gt;add-source&amp;lt;/goal&amp;gt;&lt;br /&gt;                    &amp;lt;/goals&amp;gt;&lt;br /&gt;                    &amp;lt;configuration&amp;gt;&lt;br /&gt;                      &amp;lt;sources&amp;gt;&lt;br /&gt;                          &amp;lt;source&amp;gt;&lt;span style="font-weight: bold;"&gt;${basedir}/target/generated/src/main/java&lt;/span&gt;&amp;lt;/source&amp;gt;&lt;br /&gt;                      &amp;lt;/sources&amp;gt;&lt;br /&gt;                    &amp;lt;/configuration&amp;gt;&lt;br /&gt;                  &amp;lt;/execution&amp;gt;&lt;br /&gt;                &amp;lt;/executions&amp;gt;&lt;br /&gt;            &amp;lt;/plugin&amp;gt;      &lt;br /&gt;            &amp;lt;plugin&amp;gt;&lt;br /&gt;                &amp;lt;groupId&amp;gt;org.apache.cxf&amp;lt;/groupId&amp;gt;&lt;br /&gt;                &amp;lt;artifactId&amp;gt;cxf-codegen-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;                &amp;lt;version&amp;gt;2.0.2-incubator&amp;lt;/version&amp;gt;&lt;br /&gt;                &amp;lt;executions&amp;gt;&lt;br /&gt;                    &amp;lt;execution&amp;gt;&lt;br /&gt;                        &amp;lt;id&amp;gt;generate-sources&amp;lt;/id&amp;gt;&lt;br /&gt;                        &amp;lt;phase&amp;gt;generate-sources&amp;lt;/phase&amp;gt;&lt;br /&gt;                        &amp;lt;configuration&amp;gt;&lt;br /&gt;                         &amp;lt;!-- This is where the generated source files will be placed --&amp;gt;&lt;br /&gt;                         &amp;lt;sourceRoot&amp;gt;&lt;span style="font-weight: bold;"&gt;${basedir}/target/generated/src/main/java&lt;/span&gt;&amp;lt;/sourceRoot&amp;gt;&lt;br /&gt;                            &amp;lt;wsdlOptions&amp;gt;&lt;br /&gt;                                &amp;lt;wsdlOption&amp;gt;&lt;br /&gt;                                    &amp;lt;wsdl&amp;gt;${basedir}/src/main/resources/wsdl/my.wsdl&amp;lt;/wsdl&amp;gt;&lt;br /&gt;                                &amp;lt;/wsdlOption&amp;gt;&lt;br /&gt;                            &amp;lt;/wsdlOptions&amp;gt;&lt;br /&gt;                        &amp;lt;/configuration&amp;gt;&lt;br /&gt;                        &amp;lt;goals&amp;gt;&lt;br /&gt;                            &amp;lt;goal&amp;gt;wsdl2java&amp;lt;/goal&amp;gt;&lt;br /&gt;                        &amp;lt;/goals&amp;gt;&lt;br /&gt;                    &amp;lt;/execution&amp;gt;&lt;br /&gt;                &amp;lt;/executions&amp;gt;&lt;br /&gt;            &amp;lt;/plugin&amp;gt;&lt;br /&gt;        &amp;lt;/plugins&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/8881614386511851669-750240485370496616?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/750240485370496616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=750240485370496616' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/750240485370496616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/750240485370496616'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/02/maven2-multiple-source-directories-and.html' title='Maven2, Multiple Source Directories, and the Build Helper Plugin'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-2557662177286379564</id><published>2008-02-18T00:23:00.005-06:00</published><updated>2008-02-18T01:11:36.598-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>To Dig or Not To Dig</title><content type='html'>Around the beginning of the year, I thought about writing a post about what I wanted to accomplish this year when it comes to this industry and my career.  Basically, a professional New Year's resolution list.  I never got around to coming up with an official list; however, there's been one item on my mind quite a bit that is my #1 'resolution'.&lt;br /&gt;&lt;br /&gt;It's quite often with my personal- and work-related projects that I have the chance to do something I haven't done before.  For example, work with a new open source framework, use a technology for the first time,  or play with language I haven't yet touched.  There have been some occasions where several weeks/months later I've said to my self, "I should have taken just a little more time to explore that in more detail; dig a little deeper".&lt;br /&gt;&lt;br /&gt;My #1 resolution is that whenever I get the opportunity to work on something new, I will take a step back and ask myself, "Is this something I should dig deeper on, or is just touching the surface enough?"&lt;br /&gt;&lt;br /&gt;Let me give you an example.  I am currently working on an IntelliJ IDEA plug-in during some of my spare time.  Part of that process has introduced me to Swing development.  I haven't once touched Swing or the java.awt package before this.  So, needless to say, I'm learning quite a bit.  I get to have fun with things like trying to get components to be certain sizes and figuring out how to enable drag and drop.  This is the point I need to stop and ask myself the question, "how far do I want to go?"  My point is that I need to figure out, do I simply find answers to my questions so that I can get by creating this plug-in?  Or, do I spend some time learning more about many aspects of Swing development; something that will last me much longer than this single engagement.&lt;br /&gt;&lt;br /&gt;In this case, I chose (for now) to simply find out the answers to my questions so that I can build the plug-in.  I'm doing no other Swing development.  Not on other personal projects.  Not on any work assignments.  Nor do I see myself doing any other Swing development in the near future.&lt;br /&gt;&lt;br /&gt;With this resolution, I'm trying to keep those moments of "I should have dug deeper" to an absolute minimum.  Maybe for you this is just a common sense example of thinking before you act, but for myself (unfortunately), there have been times I should have done more research to gain a solid understanding vs. just enough to produce what I want.  Hopefully at the end of this year I can look back and know that put the right amount of effort into learning new things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-2557662177286379564?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/2557662177286379564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=2557662177286379564' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2557662177286379564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2557662177286379564'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/02/to-dig-or-not-to-dig.html' title='To Dig or Not To Dig'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-1473802830508261386</id><published>2008-02-06T14:05:00.000-06:00</published><updated>2008-02-06T16:39:10.240-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Book Reviews'/><title type='text'>Review: Head First Design Patterns</title><content type='html'>&lt;table style="color: rgb(0, 0, 0);"&gt;&lt;a href="http://www.amazon.com/Head-First-Design-Patterns/dp/0596007124"&gt;Head First Design Patterns&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Topics:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Design Principles&lt;/li&gt;&lt;li&gt;Design Patterns&lt;/li&gt;&lt;li&gt;OOP&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Summary:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This books teaches the reader about basic concepts behind several common design principles and patterns.  Most chapters begin by creating a scenario that involves a development team being given a task to add functionality to an application.  It then walks the reader through implementation options by showing example code in Java, while pointing out pros and cons.  This ends up identifying a design principle and showing how a specific design pattern can be applied to the problem at hand.  The last couple of chapters transition the reader from working with simple, ideal situations to real world expectations of working with design patterns.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Audience:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Any level developer who has a grasp of OOP and is looking to improve their development skills through design principles and patterns.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pros:&lt;/span&gt;&lt;br /&gt;&lt;/table&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Perfect for an introduction to design patterns and principles (and more advanced literature, e.g. GoF text).&lt;/li&gt;&lt;li&gt;Examples do an excellent job of showing the benefits of applied principles and patterns.&lt;/li&gt;&lt;li&gt;Plenty of humor to keep the reader interested.&lt;/li&gt;&lt;li&gt;Suggestions on where to go after reading this book.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;table style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Cons:&lt;br /&gt;&lt;/span&gt;&lt;/table&gt;&lt;ul style="color: rgb(0, 0, 0);"&gt;&lt;li&gt;Goes off-topic to explain details of how RMI works during its discussion of the Proxy pattern, a waste of 10-20 pages.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;While additional patterns are briefly covered in an appendix, I'd like to see a few of those included in chapters of their own.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;table style="color: rgb(0, 0, 0);"&gt;&lt;/table&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;&lt;br /&gt;Recommendation:&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;If you've got a grasp on OO concepts, but don't really know much about design patterns, this is the perfect place to start.  This book is easy to read and does an excellent job of not just explaining the concepts, but proving them with examples as well.  &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;&lt;/span&gt;&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/8881614386511851669-1473802830508261386?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/1473802830508261386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=1473802830508261386' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/1473802830508261386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/1473802830508261386'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/02/review-head-first-design-patterns.html' title='Review: Head First Design Patterns'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-6191109187659149784</id><published>2008-01-30T12:53:00.000-06:00</published><updated>2008-01-30T13:40:28.517-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>BT in Software Engineering</title><content type='html'>Many people have the opinion that Computer Science graduates are not being well prepared for the road ahead, and I completely agree.  I don't want to repeat any of the arguments or my personal take on the exact problems with today's curriculum, but I do want to broadcast an idea of where the solution needs to come from.&lt;br /&gt;&lt;br /&gt;I think we need to separate Technology from Science and the Arts.  I want my (future) son to go to a 4-year University and get a Bachelor of Technology.  Science relates to facts, theories, and formulas.  Arts relates to creativity, culture, and individualism.  Neither of these describes technology related fields, and coming to that realization is what we need.&lt;br /&gt;&lt;br /&gt;We've seen the beginning of it.  New buildings on campus to house computer science and other engineering programs.  The equipment that students interact with has changed.  But did the way we teach change?&lt;br /&gt;&lt;br /&gt;Our world isn't built on formulas, theories, and laws like the traditional science programs.  Our world is built on best practices, innovation, collaboration, adaptability, and abstract concepts.  You can't learn best practices from a book.  You don't experience innovation through canned programming assignments.  Collaboration isn't taught by sitting in a classroom with 50 other students, staring at a projector screen.  The world has evolved and so should our teaching methods.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-6191109187659149784?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/6191109187659149784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=6191109187659149784' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6191109187659149784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6191109187659149784'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/01/bt-in-software-engineering.html' title='BT in Software Engineering'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-5275320933851851963</id><published>2008-01-30T00:16:00.000-06:00</published><updated>2008-01-30T00:18:45.643-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Agile'/><title type='text'>AgileTeams: What does it take to be Great?</title><content type='html'>It can take some time, but with the right guidance, an agile team can become good and solid relatively quickly.  It depends on many things like how much experience each individual has working on an agile team to the meshing of the best practices each has picked up along the way.  However, taking the team to the next level can be difficult.  In my experience, the items I've listed below can take a good agile team and turn it into a great agile team.  At a glance, they don't seem like anything difficult, yet for some reason I've seen teams struggle with these items over and over.  However, when a team does reach that point where all these items are coming naturally, you see a big difference in productivity, efficiency, communication, and sense of ownership. Let me know what you think.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;1. Use of the Project Tracking Tool&lt;/h3&gt;&lt;br /&gt;Whether you're using ScrumWorks, XPLanner, note cards, or another project tracking tool, here are a few things I've picked up that seem to really make a difference.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;1) Lump Sum Tasks&lt;/span&gt;&lt;br /&gt;Sometimes when you come out of backlog selection, you've got a thorough understanding of what it takes to complete a story, and sometimes you don't.  If you're not quite ready to break the tasks down completely, just enter a lump sum task.  As you identify individual tasks, remove hours from the lump sum and place them in your new task.  The goal here is to eliminate surprises.  You don't want your team thinking that you're almost done with a story, and then for the next 2 weeks you just continue to add new tasks out of the blue.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;2) Overhead&lt;/span&gt;&lt;br /&gt;Don't make the mistake of thinking your project tracking tool was only built to track user stories.  By leaving out overhead tasks that are going to take up your time, you're depriving the team of having a true understanding of what needs done.  For example, say your team has the responsibility of managing a small open source project.  When a support request comes in from the community, identify it in your project tracking tool.  You don't want to hide the fact it's something that needs done.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;3) Enforce Updating&lt;/span&gt;&lt;br /&gt;This is a big one.  As easy as it is to update your project tracking tool each day, it seems just as easy to forget.  This one is easy to address though.  Just show your project tracking tool during the daily stand-up.  When people give their reports, they should point out the exact tasks they're reporting against.  It becomes very apparent when the tool isn't being updated as it should be.  You get someone saying they've completed a task, but for some reason it isn't shown as completed in the tool.&lt;br /&gt;&lt;br /&gt;The point here is to maintain high visibility into the current progress of the sprint and its individual stories and tasks.  &lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h3&gt;2. Accountability&lt;/h3&gt;&lt;br /&gt;An Example:&lt;br /&gt;I report Monday that I'm going to commit to finishing tasks ABC and DEF, each taking approximately 4 hours.  Tuesday I give a report that I completed task ABC and that I'm going to commit to finishing task DEF today.&lt;br /&gt;&lt;br /&gt;This should immediately throw up a red flag for you.  8 hours of work just turned into 16 hours of work and everyone should be asking why.  What are some scenarios as to why this is now going to take me twice as long as I reported out yesterday?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;1) Task ABC did only take 4 hours, but I'm really stuck on task DEF.&lt;/span&gt;&lt;br /&gt;In this case, I'm saying that I think task DEF will take me 3x as long as I originally thought.  That's quite an increase in hours.  If this situation was exposed in the daily stand-up, the team could make the decision as to whether or not I should get some help instead of trying to tackle it on my own.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;2) Task ABC ended up taking me 8 hours, and I think the same will happen with DEF.&lt;/span&gt;&lt;br /&gt;This is a signal that I'm consistently underestimating the time it will take me to complete a task (or at least tasks of this nature).  Someone should point this out to me and encourage me to analyze the situation so that I may be able to improve my accuracy in estimation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;3) I've had something come up and was in meetings half the day Monday.  The same will happen again Tuesday.&lt;/span&gt;&lt;br /&gt;Apparently I didn't think it was a big deal that this work would take 2 days instead of one.  Maybe however, one of my other team members was expecting me to be available  this afternoon and needed my help.  In this case I failed to report an impediment that showed up and kept me from completing these 2 tasks on schedule.  In addition, I didn't relay to the team that I would be unavailable this afternoon.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;4) I felt like playing Solitaire for half the day and only got around to working on task ABC.&lt;/span&gt;&lt;br /&gt;In this case, you've got to expose me as a slacker.  I'm holding back the team by only giving about 50% effort.  The team could do much better with another resource in my place (&lt;a href="http://joshuahoover.com/2007/11/01/vote-em-off-the-island/"&gt;read this&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;h3&gt;3. Sprint Retrospective&lt;/h3&gt;&lt;br /&gt;The sprint retrospective, in my opinion, is one of the most overlooked tools for improving team performance.  Having the opportunity to sit down and reflect on the previous sprint(s) is priceless.  However, it's not good enough just to identify what went well, what didn't go well, and areas for improvement.  You MUST act on your findings.  &lt;br /&gt;&lt;br /&gt;If you've seen concerns or areas for improvement come up over and over again in your retros, someone should be waving giant red flags all over the place.  It's THE signal that you're not making the most of your retro.  It is crucial that your team takes the initiative to act on the items you've identified.  This doesn't mean just saying, "Lets all try to work on {&lt;span style="font-style:italic;"&gt;areaOfImprovement&lt;/span&gt;} this sprint."  Put in the extra effort and track these items.  This could be done in your project tracking tool, or maybe by revisiting your action items at a certain interval throughout the sprint.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-5275320933851851963?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/5275320933851851963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=5275320933851851963' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/5275320933851851963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/5275320933851851963'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/01/agileteams-what-does-it-take-to-be.html' title='AgileTeams: What does it take to be Great?'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-3035473093678415323</id><published>2008-01-23T20:25:00.000-06:00</published><updated>2008-01-29T15:24:22.832-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Code'/><title type='text'>Trust All Certificates</title><content type='html'>Need to establish an Https connection and don't care about validating the server's unsigned certificate?  Don't want to mess with importing the server's certificate into a local keystore?  This won't show you how to ignore those SSLHandshakeExceptions due to unsigned certs, but it &lt;span style="font-style:italic;"&gt;will&lt;/span&gt; show you how to get rid of them all together!&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Step 1:&lt;/h2&gt;&lt;br /&gt;Implement the X509TrustManager Interface as follows.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    public class TrustEverythingTrustManager implements X509TrustManager {&lt;br /&gt;        public java.security.cert.X509Certificate[] getAcceptedIssuers() {&lt;br /&gt;            return null;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {   }&lt;br /&gt;&lt;br /&gt;        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {   }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Step 2:&lt;/h2&gt;&lt;br /&gt;Implement the HostnameVerifier Interface as follows.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    public class VerifyEverythingHostnameVerifier implements HostnameVerifier {&lt;br /&gt;&lt;br /&gt;        public boolean verify(String string, SSLSession sslSession) {&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Step 3:&lt;/h2&gt;&lt;br /&gt;Initialize an SSLContext with your TrustEverythingTrustManager and set the context as the default SSL socket factory on the HttpsURLConnection class.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    TrustManager[] trustManager = new TrustManager[] {new TrustEverythingTrustManager()};&lt;br /&gt;&lt;br /&gt;    // Let us create the factory where we can set some parameters for the connection&lt;br /&gt;    SSLContext sslContext = null;&lt;br /&gt;    try {&lt;br /&gt;        sslContext = SSLContext.getInstance("SSL");&lt;br /&gt;        sslContext.init(null, trustManager, new java.security.SecureRandom());&lt;br /&gt;    } catch (NoSuchAlgorithmException e) {&lt;br /&gt;        // do nothing&lt;br /&gt;    }catch (KeyManagementException e) {&lt;br /&gt;        // do nothing&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Step 4:&lt;/h2&gt;&lt;br /&gt;Open the connection and set your VerifyEverythingHostnameVerifier as the HostnameVerifier.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();&lt;br /&gt;    conn.setHostnameVerifier(new VerifyEverythingHostnameVerifier());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;br /&gt;Thats it.  Done and Done!&lt;br /&gt;&lt;/h3&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-3035473093678415323?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/3035473093678415323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=3035473093678415323' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3035473093678415323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3035473093678415323'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2008/01/trust-all-certificates.html' title='Trust All Certificates'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-6380837021230524825</id><published>2007-12-07T22:34:00.000-06:00</published><updated>2008-01-29T15:24:50.107-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Use Google Reader to Find Number of Subscribers to a Feed</title><content type='html'>In &lt;a href="http://reader.google.com/"&gt;Google Reader&lt;/a&gt;, click on "Add Subscription".  Type in the name of the blog or part of the blog url and hit Enter.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_VD8UVD1OSH8/R1of9cgAHxI/AAAAAAAAACY/meaf3m90g_o/s1600-h/subscribers1.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_VD8UVD1OSH8/R1of9cgAHxI/AAAAAAAAACY/meaf3m90g_o/s320/subscribers1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5141457065079742226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;This is what you'll see in the search results.&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_VD8UVD1OSH8/R1ohWMgAH1I/AAAAAAAAAC4/A_B1WBbe9F0/s1600-h/subscribers3.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_VD8UVD1OSH8/R1ohWMgAH1I/AAAAAAAAAC4/A_B1WBbe9F0/s400/subscribers3.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5141458589793132370" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-6380837021230524825?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/6380837021230524825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=6380837021230524825' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6380837021230524825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6380837021230524825'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/12/use-google-reader-to-find-number-of.html' title='Use Google Reader to Find Number of Subscribers to a Feed'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_VD8UVD1OSH8/R1of9cgAHxI/AAAAAAAAACY/meaf3m90g_o/s72-c/subscribers1.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-7959929341019845806</id><published>2007-12-06T07:41:00.000-06:00</published><updated>2007-12-06T08:05:46.448-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Travel'/><title type='text'>Travel Tip</title><content type='html'>This is a little off-topic compared to what I'm normally blogging about, but it's definitely a useful tidbit of information.&lt;br /&gt;&lt;br /&gt;On my way home from a company event this weekend, my wife and I volunteered to take a later flight in exchange for free round-trip tickets and meal vouchers.  After receiving these items, we sat down for some food and drinks to pass the time before the next flight.  When it came time to leave, we found out the restaurant we were in doesn't accept meal vouchers from the airline we were flying.  Go figure....&lt;br /&gt;&lt;br /&gt;Travel Tip:  Always check with the vendor to make sure they'll take your meal voucher before hand.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-7959929341019845806?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/7959929341019845806/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=7959929341019845806' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/7959929341019845806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/7959929341019845806'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/12/travel-tip.html' title='Travel Tip'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-2588798465944888336</id><published>2007-11-05T19:00:00.000-06:00</published><updated>2008-01-29T15:25:16.570-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBI'/><title type='text'>Dynamic Partner Links and the UDDI BC</title><content type='html'>I recently posted a basic example of Dynamic Partner Links in OpenESB &lt;a href="http://chadthedeveloper.blogspot.com/2007/11/dynamic-partner-links-in-jbi.html"&gt;here&lt;/a&gt;.  In this post, I'll show how to use the UDDI BC to dynamically resolve a service URL at runtime and invoke it.&lt;br /&gt;&lt;br /&gt;Without dynamic partner links and the UDDI BC, what would you do if a service you're invoking from within your process was moved?  Well, you'd have to modify, rebuild, and re-deploy your Composite Application.  Using what I'm about to show you, your process can react to that change automatically.  &lt;br /&gt;&lt;br /&gt;Below is the tutorial (really just some high level steps).  I've also uploaded my NetBeans modules and a copy of the tutorial &lt;a href="https://uddi-bc.dev.java.net/servlets/ProjectDocumentList?folderID=8282&amp;expandFolder=8282&amp;folderID=8282"&gt;here&lt;/a&gt;.   &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Prerequisites:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://open-esb.dev.java.net/Downloads_OpenESB_Addons_NB6.html"&gt;OpenESB Installer&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://ws.apache.org/juddi/"&gt;jUDDI&lt;/a&gt; (additional install tips &lt;a href="https://uddi-bc.dev.java.net/juddi_install_tips.html"&gt;here&lt;/a&gt;)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Tutorial:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 1:&lt;/span&gt; Create a New BPEL Module&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 2:&lt;/span&gt; Create a New SOAP WSDL with one request-response operation, and a simple BPEL process for the backend .  We'll invoke this service dynamically later on.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_VD8UVD1OSH8/Ry6tJom35eI/AAAAAAAAABw/wgZTlj6YQ9c/s1600-h/step2_40.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_VD8UVD1OSH8/Ry6tJom35eI/AAAAAAAAABw/wgZTlj6YQ9c/s320/step2_40.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5129227406652466658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 3:&lt;/span&gt; Create a New UDDI WSDL with one request-resposne operation. (UDDI BC Demos can be found &lt;a href=""&gt;here&lt;/a&gt;)&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 4:&lt;/span&gt; Add an External WSDL File from http://schemas.xmlsoap.org/ws/2004/08/addressing. The WS-Addressing WSDL defines the EndpointReference element that we'll need.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GOTCHA: NetBeans may add a character to the beginning of the wsdl when it imports.  Make sure to remove this character.  In some cases, this may be a hidden character that will only show up in an editor like VI.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 5:&lt;/span&gt; Create another SOAP WSDL with one request-response operation.  This service will provide the dynamic partner link functionality.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 6:&lt;/span&gt; Create another BPEL Process.  This process should lookup a service endpoint in UDDI and invoke the service using a dynamic partner link.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_VD8UVD1OSH8/Ry6tjIm35fI/AAAAAAAAAB4/TUk-IcgNFHk/s1600-h/step6a_100.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_VD8UVD1OSH8/Ry6tjIm35fI/AAAAAAAAAB4/TUk-IcgNFHk/s320/step6a_100.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5129227844739130866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 7:&lt;/span&gt; Clean and Build the BPEL Module.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 8:&lt;/span&gt; Create a Composite Application and add your BPEL Module to it.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 9:&lt;/span&gt; Clean and Build the Composite Application.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 10:&lt;/span&gt; Correct the Composite Application's configuration using the CASA Editor.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Generated:&lt;br/&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_VD8UVD1OSH8/Ry6t5Ym35gI/AAAAAAAAACA/WAK9CfwzeoM/s1600-h/step10a_100.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_VD8UVD1OSH8/Ry6t5Ym35gI/AAAAAAAAACA/WAK9CfwzeoM/s320/step10a_100.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5129228226991220226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;li&gt;Corrected:&lt;br/&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_VD8UVD1OSH8/Ry-1PYm35iI/AAAAAAAAACQ/e4_7tg8AWOQ/s1600-h/step10b_100.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_VD8UVD1OSH8/Ry-1PYm35iI/AAAAAAAAACQ/e4_7tg8AWOQ/s320/step10b_100.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5129517776506447394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 11:&lt;/span&gt; Clean, Build, and Deploy the Composite Application Again&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 12:&lt;/span&gt; Create a test case to invoke the service we've created.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 13:&lt;/span&gt; Create another service to invoke, just as in Step 2.  Make the BPEL process do something a little different so we will be able to tell which service was invoked.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;This WSDL must have the same target namespace and operation to invoke as the WSDL in step 2.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 14:&lt;/span&gt; Update the service endpoint in UDDI to point to the new service you created.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 15:&lt;/span&gt; Run the testcase again.  The output will show the new service was invoked.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-2588798465944888336?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/2588798465944888336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=2588798465944888336' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2588798465944888336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2588798465944888336'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/11/dynamic-partner-links-and-uddi-bc.html' title='Dynamic Partner Links and the UDDI BC'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_VD8UVD1OSH8/Ry6tJom35eI/AAAAAAAAABw/wgZTlj6YQ9c/s72-c/step2_40.JPG' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-1991812241919683362</id><published>2007-11-04T10:24:00.000-06:00</published><updated>2008-01-29T15:25:30.645-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JBI'/><title type='text'>Dynamic Partner Links in JBI</title><content type='html'>I've put together an example of using a dynamic partner link in OpenESB.  This example shows the basics of assigning an &lt;a href="http://schemas.xmlsoap.org/ws/2004/08/addressing/"&gt;EndpointReference&lt;/a&gt; to a partner link at runtime, and then invoking that partner link.&lt;br /&gt;&lt;br /&gt;Below is the tutorial I've put together (really just some high level steps).  I've also uploaded the tutorial and NetBeans modules I've created &lt;a href="https://open-jbi-components.dev.java.net/servlets/ProjectDocumentList?folderID=8283&amp;expandFolder=8283&amp;folderID=8283"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Prerequisites:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://open-esb.dev.java.net/Downloads_OpenESB_Addons_NB6.html"&gt;OpenESB Installer&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Tutorial:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 1:&lt;/span&gt; Create a New BPEL Module&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 2:&lt;/span&gt; Create a New SOAP WSDL with one request-response operation, and a simple BPEL process for the backend .  We'll invoke this service dynamically later on.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 3:&lt;/span&gt; Add an External WSDL File from http://schemas.xmlsoap.org/ws/2004/08/addressing. The WS-Addressing WSDL defines the EndpointReference element that we'll need.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GOTCHA: NetBeans may add a character to the beginning of the wsdl when it imports.  Make sure to remove this character.  In some cases, this may be a hidden character that will only show up in an editor like VI.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 4:&lt;/span&gt; Create another SOAP WSDL with one request-response operation.  This service will provide the dynamic partner link functionality.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add a schema to the wsdl that defines an elment that accepts an &lt;a href="http://schemas.xmlsoap.org/ws/2004/08/addressing/"&gt;EndpointReference&lt;/a&gt; and xsd:anyType.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Modify the request message accordingly&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_VD8UVD1OSH8/Ry4Vi4m35WI/AAAAAAAAAAw/MZYUnsrnXl4/s1600-h/step4_60.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_VD8UVD1OSH8/Ry4Vi4m35WI/AAAAAAAAAAw/MZYUnsrnXl4/s320/step4_60.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5129060714676741474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 5:&lt;/span&gt; Create another BPEL Process.  This process should assign the EndpointReference to a PartnerLink and invoke it.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_VD8UVD1OSH8/Ry4WLYm35XI/AAAAAAAAAA4/hteB5buMFZE/s1600-h/step5a_100.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_VD8UVD1OSH8/Ry4WLYm35XI/AAAAAAAAAA4/hteB5buMFZE/s320/step5a_100.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5129061410461443442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_VD8UVD1OSH8/Ry4WWIm35YI/AAAAAAAAABA/TUAwrOtD5lc/s1600-h/step5b_50W60L.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_VD8UVD1OSH8/Ry4WWIm35YI/AAAAAAAAABA/TUAwrOtD5lc/s320/step5b_50W60L.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5129061595145037186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 6:&lt;/span&gt; Clean and Build the BPEL Module.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 7:&lt;/span&gt; Create a Composite Application and add your BPEL Module to it.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 8:&lt;/span&gt; Clean and Build the Composite Application.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 9:&lt;/span&gt; Correct the Composite Application's configuration using the CASA Editor.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Generated:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_VD8UVD1OSH8/Ry4Xrom35aI/AAAAAAAAABQ/LsaAhSb9g_k/s1600-h/step9a_75.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_VD8UVD1OSH8/Ry4Xrom35aI/AAAAAAAAABQ/LsaAhSb9g_k/s320/step9a_75.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5129063064023852450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Corrected:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_VD8UVD1OSH8/Ry4X2Ym35bI/AAAAAAAAABY/zGuke-SBmtY/s1600-h/step9b_75.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_VD8UVD1OSH8/Ry4X2Ym35bI/AAAAAAAAABY/zGuke-SBmtY/s320/step9b_75.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5129063248707446194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 10:&lt;/span&gt; Clean, Build, and Deploy the Composite Application Again&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 11:&lt;/span&gt; Create a test case to invoke the service we created in step 2.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp2.blogger.com/_VD8UVD1OSH8/Ry4YR4m35cI/AAAAAAAAABg/Ja5DEJq1lrQ/s1600-h/step11_50W60L.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_VD8UVD1OSH8/Ry4YR4m35cI/AAAAAAAAABg/Ja5DEJq1lrQ/s320/step11_50W60L.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5129063721153848770" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 12:&lt;/span&gt; Create another service to invoke, just as in Step 2.  Make the BPEL process do something a little different so we will be able to tell which service was invoked.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;This WSDL must have the same target namespace and operation to invoke as the WSDL in step 2.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Step 13:&lt;/span&gt; Create a second test case to invoke the new service you've created.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_VD8UVD1OSH8/Ry4Y1Im35dI/AAAAAAAAABo/M7Iw-0a11sE/s1600-h/step13_50W60L.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_VD8UVD1OSH8/Ry4Y1Im35dI/AAAAAAAAABo/M7Iw-0a11sE/s320/step13_50W60L.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5129064326744237522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-1991812241919683362?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/1991812241919683362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=1991812241919683362' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/1991812241919683362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/1991812241919683362'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/11/dynamic-partner-links-in-jbi.html' title='Dynamic Partner Links in JBI'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_VD8UVD1OSH8/Ry4Vi4m35WI/AAAAAAAAAAw/MZYUnsrnXl4/s72-c/step4_60.JPG' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-4356095371378834154</id><published>2007-11-02T12:08:00.000-05:00</published><updated>2008-01-29T15:25:44.989-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><title type='text'>Class Dependencies and the Factory Pattern</title><content type='html'>I listened to a Podcast this morning from &lt;a href="http://www.se-radio.net/"&gt;Software Engineering Radio&lt;/a&gt; on &lt;a href="http://www.se-radio.net/index.php?post_id=51696"&gt;Dependencies&lt;/a&gt;.  In the context of this podcast, dependencies refers to the relationship between objects.  The problem discussed was the lack of support for these object relationships in today's OO languages.&lt;br /&gt;&lt;br /&gt;I wanted to touch on one specific topic covered in the podcast; the negative effect on dependency visibility that can come from a... misguided?... use of the &lt;a href="http://en.wikipedia.org/wiki/Factory_method_pattern"&gt;Factory pattern&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Here's the problem&lt;/span&gt;:  &lt;br /&gt;&lt;br /&gt;Pretend you have a factory that exposes, lets say, 10 objects.  And you have a class that uses the factory to obtain 3 of those objects.  Without having intimate knowledge of the class or searching the class's implementation for "Factory.getXXXXXXX()", it's impossible to tell exactly what objects an instance of the class depends on.  What you end up with is a spider-web like architecture.  Many classes depend on the Factory which in turn depends on many classes itself.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;So, what's the solution?&lt;/span&gt;  &lt;br /&gt;&lt;br /&gt;One possibility is to enforce a 1:1 ratio between factories, and classes using a factory.  If Class A depends on instances of Class B and Class C, the factory Class, FactoryA must only expose instances of Class B and Class C.  Also, Class A must only use FactoryA.  Doing this provides confidence that all objects exposed by the factory are dependencies of the class.&lt;br /&gt;&lt;br /&gt;Another possibility would be implementing Dependency Injection.  If you go with constructor injection, class dependencies are visible as parameters to the constructor.  If you go with setter injection, all dependencies are visible via the setter methods.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Food for Thought&lt;/span&gt;&lt;br /&gt;1. Is Dependency Injection an alternative to Factory Pattern?&lt;br /&gt;2. Does this problem also arise in the use of Service Locator?&lt;br /&gt;3. What do you gain with clear dependency visibility?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-4356095371378834154?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/4356095371378834154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=4356095371378834154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4356095371378834154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4356095371378834154'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/11/class-dependencies-and-factory-pattern.html' title='Class Dependencies and the Factory Pattern'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-6604837765913959642</id><published>2007-10-11T14:36:00.000-05:00</published><updated>2008-01-29T15:26:05.719-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>TAR-ing ginormous amounts of data</title><content type='html'>James Lorenzen posted a quick how-to on his blog about compressing huge amounts of data.  His post can be found &lt;a href="http://jlorenzen.blogspot.com/2007/10/compressing-ginormous-files.html"&gt;here&lt;/a&gt;.    There's one small piece i'd like to add.&lt;br /&gt;&lt;br /&gt;If you're tar-ing up 10Gb of data, you need 10Gb of free space.  What if you don't have the free space?  Well, if you're moving the data (not wanting to keep the original files), here's a tip.&lt;br /&gt;&lt;br /&gt;Just add the --remove-files parameter to your tar command.  This will remove files as they're added to the archive.  So you can tar up the 10Gb of data w/o having 10Gb free!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;tar --remove-files -cf filename.tar directory/*&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-6604837765913959642?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/6604837765913959642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=6604837765913959642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6604837765913959642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6604837765913959642'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/10/tar-ing-ginormous-amounts-of-data.html' title='TAR-ing ginormous amounts of data'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-6962415795742672071</id><published>2007-10-02T11:02:00.000-05:00</published><updated>2008-01-29T15:26:19.212-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Misc'/><title type='text'>Looking for Podcasts</title><content type='html'>I finally got an iPod a couple months ago and recently started listening to Podcasts.  I've found some good podcasts from &lt;a href=""&gt;.NET Rocks!&lt;/a&gt;, &lt;a href=""&gt;Software Engineering Radio&lt;/a&gt;, and &lt;a href=""&gt;The Java Posse&lt;/a&gt;, but I'm sure there are others out there.  So, if you have any recommendations, please let me know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-6962415795742672071?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/6962415795742672071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=6962415795742672071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6962415795742672071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6962415795742672071'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/10/looking-for-podcasts.html' title='Looking for Podcasts'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-3984418747901751976</id><published>2007-09-17T13:09:00.000-05:00</published><updated>2008-01-29T15:26:33.763-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Code'/><title type='text'>Determine Local IP Addresses</title><content type='html'>Here's a quick how-to for determining the IP Addresses your local machine has.  &lt;br /&gt;&lt;br /&gt;NOTE: This version (i've edited the post a couple of times now), will return all IPs associated with any network interface on the machine.  Also, it's been tested on Windows and several flavors of linux.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;public ArrayList&lt;String&gt; getIPs() throws SocketException {&lt;br /&gt;    ArrayList&lt;String&gt; ips = new ArrayList&lt;String&gt;();&lt;br /&gt;    Enumeration&lt;NetworkInterface&gt; m = NetworkInterface.getNetworkInterfaces();&lt;br /&gt;    while(m.hasMoreElements()) {&lt;br /&gt;        NetworkInterface ni = m.nextElement();&lt;br /&gt;        Enumeration&lt;InetAddress&gt; addresses = ni.getInetAddresses();&lt;br /&gt;        while (addresses.hasMoreElements()) {&lt;br /&gt;            InetAddress address = addresses.nextElement();&lt;br /&gt;            String ip = address.getHostAddress();&lt;br /&gt;&lt;br /&gt;            // filter out Inet6 Addr Entries&lt;br /&gt;            if (ip.indexOf(":") == -1) {&lt;br /&gt;                ips.add(ip);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return ips;&lt;br /&gt;}&lt;br /&gt;&lt;/code&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/8881614386511851669-3984418747901751976?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/3984418747901751976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=3984418747901751976' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3984418747901751976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/3984418747901751976'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/09/determine-local-ip-addresses.html' title='Determine Local IP Addresses'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-1218678653367494009</id><published>2007-09-13T01:17:00.000-05:00</published><updated>2008-01-29T15:26:49.478-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Code'/><title type='text'>Generic toString()</title><content type='html'>Do you ever want a descriptive toString() of a class you just created, but don't feel like taking the time to write it?  Here's a generic toString() that uses the java.lang.reflect package and will work in any class.  &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Note:&lt;/span&gt;&lt;br /&gt;This isn't the end-all generic toString() method.  It does the bare minimum of printing out each field and its value with the added ability to handle null values and arrays.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;@Override&lt;br /&gt;public String toString() {&lt;br /&gt;    Field[] fields = getClass().getDeclaredFields();&lt;br /&gt;    AccessibleObject.setAccessible(fields,true);&lt;br /&gt;&lt;br /&gt;    StringBuffer sb = new StringBuffer();&lt;br /&gt;    sb.append("Class: " + this.getClass().getName() + "\n");&lt;br /&gt;&lt;br /&gt;    for (Field field : fields) {&lt;br /&gt;        Object value = null;&lt;br /&gt;        try {&lt;br /&gt;            value = field.get(this);&lt;br /&gt;        } catch (IllegalAccessException e) {continue;}&lt;br /&gt;&lt;br /&gt;        sb.append("\tField \"" + field.getName() + "\"\n");&lt;br /&gt;&lt;br /&gt;        Class fieldType = field.getType();&lt;br /&gt;        sb.append("\t\tType:  ");&lt;br /&gt;&lt;br /&gt;        if (fieldType.isArray()) {&lt;br /&gt;            Class subType = fieldType.getComponentType();&lt;br /&gt;            int length = Array.getLength(value);&lt;br /&gt;            sb.append(subType.getName() + "[" + length + "]" + "\n");&lt;br /&gt;&lt;br /&gt;            for (int i = 0; i &lt; length; i ++) {&lt;br /&gt;                Object obj = Array.get(value,i);&lt;br /&gt;                sb.append("\t\tValue " + i + ":  " + obj + "\n");&lt;br /&gt;            }&lt;br /&gt;        } else {&lt;br /&gt;            sb.append(fieldType.getName() + "\n");&lt;br /&gt;            sb.append("\t\tValue: ");&lt;br /&gt;            sb.append((value == null) ? "NULL" : value.toString());&lt;br /&gt;            sb.append("\n");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return sb.toString();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Example Output&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Class: GenericToString&lt;br /&gt;- Field "myint"&lt;br /&gt;    Type:  int&lt;br /&gt;    Value: 9&lt;br /&gt;- Field "myDouble"&lt;br /&gt;    Type:  java.lang.Double&lt;br /&gt;    Value: 999.095&lt;br /&gt;- Field "myString"&lt;br /&gt;    Type:  java.lang.String&lt;br /&gt;    Value: My String&lt;br /&gt;- Field "myNullObject"&lt;br /&gt;    Type:  java.lang.Object&lt;br /&gt;    Value: NULL&lt;br /&gt;- Field "myStringArray"&lt;br /&gt;    Type:  java.lang.String[2]&lt;br /&gt;    Value 0:  one&lt;br /&gt;    Value 1:  two&lt;br /&gt;- Field "myintArray"&lt;br /&gt;    Type:  int[3]&lt;br /&gt;    Value 0:  1&lt;br /&gt;    Value 1:  2&lt;br /&gt;    Value 2:  3&lt;br /&gt;- Field "myHashMap"&lt;br /&gt;    Type:  java.util.HashMap&lt;br /&gt;    Value: {val3=3, val1=val1, val2=val2}&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/8881614386511851669-1218678653367494009?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/1218678653367494009/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=1218678653367494009' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/1218678653367494009'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/1218678653367494009'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/09/generic-tostring.html' title='Generic toString()'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-4098469044111012244</id><published>2007-08-14T10:33:00.000-05:00</published><updated>2008-01-29T15:27:06.320-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maven2'/><title type='text'>Build a JAR of JARs with Maven2</title><content type='html'>If you want to create a ZIP or JAR made up of other artifacts, one option is using the &lt;a href="http://maven.apache.org/plugins/maven-dependency-plugin/"&gt;maven-dependency-plugin.&lt;/a&gt;  Here's a quick how-to:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Explicitly list the artifacts you want included.&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;javax.sip&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;jain-sip-ri&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;1.2-2007-07-25&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Configure the plugin as needed&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;plugins&amp;gt;&lt;br /&gt;  &amp;lt;plugin&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;maven-dependency-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;executions&amp;gt;&lt;br /&gt;      &amp;lt;execution&amp;gt;&lt;br /&gt;        &amp;lt;id&amp;gt;${project.artifactId}-fetch-deps&amp;lt;/id&amp;gt;&lt;br /&gt;        &amp;lt;phase&amp;gt;generate-sources&amp;lt;/phase&amp;gt;&lt;br /&gt;        &amp;lt;goals&amp;gt;&amp;lt;goal&amp;gt;copy-dependencies&amp;lt;/goal&amp;gt;&amp;lt;/goals&amp;gt;&lt;br /&gt;        &amp;lt;configuration&amp;gt;&lt;br /&gt;          &amp;lt;outputDirectory&amp;gt;${project.build.outputDirectory}&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;          &amp;lt;stripVersion&amp;gt;true&amp;lt;/stripVersion&amp;gt;&lt;br /&gt;          &amp;lt;excludeTransitive&amp;gt;true&amp;lt;/excludeTransitive&amp;gt;&lt;br /&gt;          &amp;lt;excludeArtifactIds&amp;gt;junit&amp;lt;/excludeArtifactIds&amp;gt;&lt;br /&gt;        &amp;lt;/configuration&amp;gt;&lt;br /&gt;      &amp;lt;/execution&amp;gt;&lt;br /&gt;    &amp;lt;/executions&amp;gt;&lt;br /&gt;  &amp;lt;/plugin&amp;gt;&lt;br /&gt;&amp;lt;/plugins&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-4098469044111012244?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/4098469044111012244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=4098469044111012244' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4098469044111012244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4098469044111012244'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/08/build-jar-of-jars-with-maven2.html' title='Build a JAR of JARs with Maven2'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-2345224576152134290</id><published>2007-08-14T01:01:00.000-05:00</published><updated>2008-01-29T15:27:21.460-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><title type='text'>Service Locator an alternative to Dependency Injection?</title><content type='html'>In my unending quest for knowledge, I read an &lt;a href="http://www.martinfowler.com/articles/injection.html"&gt;article&lt;/a&gt; explaining Dependency Injection as well as discussing Service Locator as an alternative.&lt;br /&gt;&lt;br /&gt;After taking some time to talk about each pattern individually (&lt;a href="http://chadthedeveloper.blogspot.com/2007/08/dependency-injection.html"&gt;DI&lt;/a&gt; &amp; &lt;a href="http://chadthedeveloper.blogspot.com/2007/08/service-locator.html"&gt;SL&lt;/a&gt;), it's finally time address the real question.  Is Service Locator an alternative to Dependency Injection? &lt;br /&gt;&lt;br /&gt;The most important aspect of DI is IoC (Inversion of Control).  Through DI, you pass control to the consumer of the class.  For the sake of argument, let's say you decide to implement Service Locator instead of DI.  Now a class gets its resources from the ServiceLocator class and is no longer coupled directly to the resource itself.  Assuming your primary goal was IoC, who now controls the resource?  Well, the SeriveLocator class.  So you've passed control from one class to another.  Does that accomplish IoC?  No.  A consumer of your class still has no control.  So what do you do?  You implement DI to inject the resource into the ServiceLocator; and what were we trying to accomplish by using Service Locator instead of DI in the first place?&lt;br /&gt;&lt;br /&gt;When it comes down to it, they only share one thing in common: the ability to decouple a class from its dependencies.  While &lt;a href="http://weblogs.java.net/blog/lancebyoung/archive/2004/01/achieving_the_3.html"&gt;technology independence&lt;/a&gt; is a noble cause, these two patterns offer much more.  &lt;br /&gt;&lt;br /&gt;Look at it this way.  Would you ever tell someone that's looking to buy a corvette that a mini van is an alternative?  No.  Now, if you're only concerned with getting  from point A to point B, the mini van would be a viable alternative.  But, who buys a corvette just to get from point A to point B ?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;DI offers decoupling with the benefit of IoC.  Service Locator should be used to manage services for multiple consumers and abstract away the pain of accessing that service.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-2345224576152134290?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/2345224576152134290/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=2345224576152134290' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2345224576152134290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2345224576152134290'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/08/service-locator-alternative-to.html' title='Service Locator an alternative to Dependency Injection?'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-4128230733486663013</id><published>2007-08-13T16:13:00.000-05:00</published><updated>2008-01-29T15:28:16.680-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven2'/><category scheme='http://www.blogger.com/atom/ns#' term='Spring'/><title type='text'>Inject a String with Spring 2.0.6 and Maven2</title><content type='html'>Here's a real quick how-to for injecting a simple String value with Spring 2.0.6.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Configuration File&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE beans PUBLIC &lt;br /&gt;  "-//SPRING//DTD BEAN//EN" &lt;br /&gt;  "http://www.springframework.org/dtd/spring-beans.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;beans&gt;&lt;br /&gt;    &amp;lt;bean id="proxyHost" class="java.lang.String"&amp;gt;&lt;br /&gt;        &amp;lt;constructor-arg&amp;gt;&lt;br /&gt;         &amp;lt;value&gt;10.9.5.120&amp;lt;/value&amp;gt;&lt;br /&gt;        &amp;lt;/constructor-arg&amp;gt;&lt;br /&gt;    &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Java Code&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public class stringInjectionExample {&lt;br /&gt;  private static final String SPRING_FILE = "sip.xml";&lt;br /&gt;  private static final String PROXY_HOST_BEAN_NAME = "proxyHost";  &lt;br /&gt;&lt;br /&gt;  public void init() {&lt;br /&gt;    Resource resource = new ClassPathResource(SPRING_FILE);&lt;br /&gt;    BeanFactory factory = new XmlBeanFactory(resource);&lt;br /&gt;    String proxyHost = (String) factory.getBean(PROXY_HOST_BEAN_NAME);&lt;br /&gt;&lt;br /&gt;    System.out.println("Using ProxyHost: " + proxyHost);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Output&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;Using ProxyHost: 10.9.5.120&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;pom.xml&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&amp;lt;dependencies&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;spring-core&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;2.0.6&amp;lt;/version&amp;gt;  &lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;spring-beans&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;2.0.6&amp;lt;/version&amp;gt;  &lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;repositories&amp;gt;&lt;br /&gt;  &amp;lt;repository&amp;gt;&lt;br /&gt;    &amp;lt;id&amp;gt;Ibiblio&amp;lt;/id&amp;gt;&lt;br /&gt;    &amp;lt;name&amp;gt;Maven2 Ibiblio Repository&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;url&amp;gt;http://mirrors.ibiblio.org/pub/mirrors/maven2&amp;lt;/url&amp;gt;&lt;br /&gt;    &amp;lt;layout&amp;gt;default&amp;lt;/layout&amp;gt;&lt;br /&gt;  &amp;lt;/repository&amp;gt;&lt;br /&gt;&amp;lt;/repositories&amp;gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-4128230733486663013?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/4128230733486663013/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=4128230733486663013' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4128230733486663013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/4128230733486663013'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/08/inject-simple-string-with-spring-206.html' title='Inject a String with Spring 2.0.6 and Maven2'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-5418696312604589392</id><published>2007-08-09T00:45:00.000-05:00</published><updated>2008-01-29T15:28:30.827-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><title type='text'>Service Locator</title><content type='html'>I mentioned in my &lt;a href="http://chadthedeveloper.blogspot.com/2007/08/dependency-injection.html"&gt;last blog entry&lt;/a&gt; that I want to discuss the idea of the Service Locator pattern as an alternative to Dependency Injection.  However, I first wanted to discuss each pattern individually.  So here's what I have to say about Service Locator.&lt;br /&gt;&lt;br /&gt;At the root of the Service Locator pattern, the idea is that a single object has access to all the services that your system/component needs.  It will handle acquiring, creating, or connecting to those services.  In a simpler environment, it may simply be holding references to objects (as compared to performing complex lookups for services in an enterprise environment).  With that in mind, how could the Service Locator pattern help us?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Benefit #1&lt;/span&gt;&lt;br /&gt;First, let's look at a very simple example.  Consider the following:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;class SimpleExample {&lt;br /&gt;  private MessageGenerator generator;&lt;br /&gt;&lt;br /&gt;  public  simpleExample() {&lt;br /&gt;    this.generator = new MessageGeneratorImpl();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void initiateSession() {&lt;br /&gt;    Message message = this.generator.createInvite();&lt;br /&gt;    this.generator.sendMessage(message);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;What benefit would we see from changing it to user a Service Locator like this?&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;class ServiceLocator {&lt;br /&gt;  private static Map services = new HashMap();&lt;br /&gt;&lt;br /&gt;  public static void addService(String name, Object service) {&lt;br /&gt;    map.put(name, service);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static Object getService(String name) {&lt;br /&gt;    return services.get(name);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class SimpleExample {&lt;br /&gt;  public  simpleExample() { }&lt;br /&gt;&lt;br /&gt;  public void initiateSession() {&lt;br /&gt;    MessageGenerator generator = ServiceLocator.getService("MessageGenerator");&lt;br /&gt;    Message message = generator.createInvite();&lt;br /&gt;    generator.sendMessage(message);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;The primary benefit here is that the SimpleExample class is no longer coupled to the implementation of MessageGenerator.  The SimpleExample class relies on the ServiceLocator to provide the correct implementation.  So, removing a direct dependency between a class and its needed service is one thing the ServiceLocator can accomplish.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Benefit #2&lt;/span&gt;&lt;br /&gt;Now, let's think bigger.  Consider having 10 classes, each needing to use several of 8 different services in your application.  Imagine how messy (and tightly coupled) things would be with each class having a direct dependency on each service it needed.  &lt;br /&gt;&lt;br /&gt;What would happen if instead we used ServiceLocator to manage access to those 8 services.  Well, none of the classes would require direct knowledge of any service.  They could simply use a public method on the Service Locator to acquire a service when necessary.  So, we've gone from 10 classes having 3,4,5, or more direct couplings to services; to simply interfacing through public methods on the Service Locator.  &lt;br /&gt;&lt;br /&gt;How much cleaner and readable would the code become?  So, organization and readability can be improved in this scenario by implementing Service Locator.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conclusion&lt;/span&gt;&lt;br /&gt;There is a &lt;span style="font-style:italic;"&gt;whole&lt;/span&gt; lot more to talk about when discussing the Service Locator pattern.  However, I think the two benefits I've show here are enough to discuss this pattern being an alternative to Dependency Injection.  So, I'm going to stop here for now.  Maybe I'll put up a more detailed discussion of Service Locator in the future.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Some Service Locator links:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.martinfowler.com/articles/injection.html#UsingAServiceLocator"&gt; Martin Fowler&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceLocator.html"&gt;Core J2EE Pattern Catalog on java.sun.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/blueprints/patterns/ServiceLocator.html"&gt;Another description on java.sun.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-5418696312604589392?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/5418696312604589392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=5418696312604589392' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/5418696312604589392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/5418696312604589392'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/08/service-locator.html' title='Service Locator'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-2509305979149022770</id><published>2007-08-06T23:50:00.002-05:00</published><updated>2008-02-28T21:16:59.797-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Design Patterns'/><title type='text'>Dependency Injection</title><content type='html'>I read an &lt;a href="http://www.martinfowler.com/articles/injection.html"&gt;article&lt;/a&gt; focused mainly on Dependency Injection.  However, what interested me even more was it's discussion around Service Locator as an alternative to DI.  In my opinion, Service Locator should only be considered as an alternative in some scenarios.  However, before I blog my opinions about Service Locator and Dependency Injection, I'm going to start by talking about each one individually.  I don't want to assume everyone reading this knows what both patterns are and really don't want to write one giant post.   So, read below for a summary of dependency injection or visit the article mentioned above for more detail.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Quick Explanation&lt;/span&gt;&lt;br /&gt;First of all, you may have been doing DI without knowing what it was.  But, to explain, Dependency Injection is exactly what it sounds like.  A class's dependencies are &lt;span style="font-weight: bold;"&gt;injected&lt;/span&gt; into the class rather than created inside it.  Probably best explained with an example.&lt;br /&gt;&lt;br /&gt;Instead of:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;class RequestHandler {&lt;br /&gt;private ResponseGenerator responseGenerator;&lt;br /&gt;&lt;br /&gt;public RequestHandler() {&lt;br /&gt;  this.responseGenerator = new ResponseGeneratorImpl();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Do this:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;class RequestHandler {&lt;br /&gt;private ResponseGenerator responseGenerator;&lt;br /&gt;&lt;br /&gt;public RequestHandler(ResponseGenerator responseGenerator) {&lt;br /&gt;  this.responseGenerator = responseGenerator;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;So, what does this do?  We've accomplished two things.  First we've created loose coupling between RequestHandler and ResponseGenerator.  The first method uses a specific implementation while the second doesn't.  Second, we've given control to the entity instantiating RequestHandler.  This says, "I don't want to limit you to a specific implementation of ResponseGenerator, so i'll give you control and allow you to provide me with the ResponseGenerator you'd like me to use."&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Types&lt;/span&gt;&lt;br /&gt;There are three (3) types of Dependency Injection: Constructor Injection, Setter Injection, and Interface Injection.  You've just seen an example of Constructor Injection.  I'm not going to talk about or show Interface Injection for several reasons.  (I've never used it and the other two are much more common.)  Setter Injection I'm sure you can picture, but just in case, see the example below.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public class RequestHandler {&lt;br /&gt;private ResponseGenerator responseGenerator;&lt;br /&gt;&lt;br /&gt;public void setResponseGenerator(ResponseGenerator responseGenerator) {&lt;br /&gt;  this.responseGenerator = responseGenerator;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Constructor vs Setter Injection&lt;/span&gt;&lt;br /&gt;The primary distinction is that Constructor Injection provides a usable object (presumably) immediately after construction.  This means no worries of running into exceptions because you instantiated an object but forgot to set one of its dependencies.  So what about when you're dealing with quite a few dependencies? Either your constructor gets long, or you're forcing many setter method calls to create a usable object.  Unless you have a good reason to use Setter Injection, I'd stick to Constructor Injection as a rule of thumb.  (And stay away from using a combination if at all possible !!!  My pet peeve.)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Pros&lt;/span&gt;&lt;br /&gt;Other than enabling loose coupling and increasing usability through inversion of control, the remaining major benefit is ease of testing.  DI allows you to simply inject mock objects to unit test the class under test.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cons&lt;/span&gt;&lt;br /&gt;When your class has lots of dependencies, it can get messy.  Even though this could be an indication your class should be separated out into multiple classes (cohesion), it doesn't necessarily.  So, from time to time, you will run into this.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;More to Come&lt;/span&gt;&lt;br /&gt;There are more DI pros and cons, but nothing really worth talking about unless you're comparing against an alternative.  Stay tuned and I'll be doing just that when I look at the idea of Service Locator as an alternative to Dependency Injection.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other DI Links:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Dependency_injection"&gt;Wikipedia&lt;/a&gt;&lt;br /&gt;&lt;a href="http://jlorenzen.blogspot.com/2007/07/new-way-of-hardcoding.html"&gt;James Lorenzen's Blog&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-2509305979149022770?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/2509305979149022770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=2509305979149022770' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2509305979149022770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/2509305979149022770'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/08/dependency-injection.html' title='Dependency Injection'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-1296682176012361217</id><published>2007-08-05T23:44:00.000-05:00</published><updated>2008-01-29T15:28:59.731-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Certifications'/><title type='text'>SCWCD: The Beginning</title><content type='html'>About a month ago, I got started studying for my WCD certification by reading the first two chapters of &lt;a href="http://www.amazon.com/Head-First-Servlets-JSP-Certified/dp/0596005407"&gt;this book&lt;/a&gt;.  I haven't had a chance to touch it since, so I just started from the beginning again and decided to talk a little about what I'm learning.&lt;br /&gt;&lt;br /&gt;In the very beginning there are a lot of web development basics discussed.  This includes an intro to HTML and HTTP, what a web server does, the basic life cycle of an HTTP request/response pair, how to go about creating a simple servlet.  So, here's a quick summary:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;HTTP &amp; HTML&lt;/span&gt;&lt;br /&gt;-- Most common HTTP requests are GET and POST&lt;br /&gt;-- GET request has a limited (character) length&lt;br /&gt;-- data sent with a GET is appended to the URL&lt;br /&gt;-- data sent with a POST is contained inside the reques&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Web Server&lt;/span&gt;&lt;br /&gt;-- a Web Server (by itself) can only serve static pages&lt;br /&gt;-- a 'helper application' is needed to serve dynamic content or save data&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;URL&lt;/span&gt;&lt;br /&gt;-- By default, port 80 is used(port of the web server application)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Servlets&lt;/span&gt;&lt;br /&gt;-- a simple servlet class extends HttpServlet and implements doGet() and doPost()&lt;br /&gt;-- a Deployment Descriptor maps a servlet class to a url pattern&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Simple Servlet&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;&lt;br /&gt;public class ChadServlet extends HttpServlet {&lt;br /&gt;    public void doGet(HttpServletRequest request, &lt;br /&gt;                      HttpServletResponse response) &lt;br /&gt;                      throws IOException {&lt;br /&gt;        // IMPLEMENT ME&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Simple Deployment Descriptor&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;web-app  ...&amp;gt;&lt;br /&gt;    &amp;lt;servlet&amp;gt;&lt;br /&gt;        &amp;lt;servlet-name&amp;gt;SimpleServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;        &amp;lt;servlet-class&amp;gt;ChadServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;    &amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;        &amp;lt;servlet-name&amp;gt;SimpleServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;        &amp;lt;url-pattern&amp;gt;/myservlet&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;    &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-1296682176012361217?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/1296682176012361217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=1296682176012361217' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/1296682176012361217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/1296682176012361217'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/08/scwcd-beginning.html' title='SCWCD: The Beginning'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-5695074676955264343</id><published>2007-07-21T03:45:00.000-05:00</published><updated>2008-01-29T15:29:16.044-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java Code'/><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><title type='text'>Unit Testing Private Methods</title><content type='html'>So I've always thought that when it comes to writing unit tests against private methods, you have two options; use reflection, or break encapsulation.  However, I just read an article that discusses this very topic in a good amount of detail.  It points out 4 options for testing private methods.  &lt;br /&gt;&lt;br /&gt;If you're just interested in a summary of those 4 options, keep reading.  Otherwise, &lt;a href="http://www.artima.com/suiterunner/private.html"&gt;here&lt;/a&gt; is the article I came across.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1. Don't Test Private Methods&lt;/span&gt;&lt;br /&gt;&lt;li&gt;If you're testing the class's non-private methods, then the private methods are being tested indirectly.  You can maintain a high confidence level in your code w/o unit testing those private methods.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Feeling the need to test private methods may indicate that those methods should be moved into their own class.  There they would become non-private (easily tested) and become reusable as well.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Break Encapsulation&lt;/span&gt;&lt;br /&gt;&lt;li&gt;Changing the method from private to package-access is probably the quickest and easiest solution to testing private methods.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Seeing a private methods tells you something.  When it's package-access, it doesn't speak so loudly.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. Use Reflection&lt;/span&gt;&lt;br /&gt;&lt;li&gt;Using reflection (java.lang.reflect), you can bypass encapsulation and gain access to the private method you'd like to test.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Your tests are more verbose.  You've got to gain access to the private method before you can test it.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4. Use an Inner Class&lt;/span&gt;&lt;br /&gt;&lt;li&gt;An inner class inside the class you're testing will have access to the private methods.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Your production class contains more than production code.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;My $.02&lt;/span&gt;&lt;br /&gt;I really don't like the idea of using a nested test class, but I'd love to hear arguments promoting this option.  Also, I don't like sacrificing encapsulation for the sake of testing.  If you want to test the private method, do it right and use reflection.  Other than that, I'm sure indirectly testing private methods has its time and place, but how often is determined by how you write your code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-5695074676955264343?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/5695074676955264343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=5695074676955264343' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/5695074676955264343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/5695074676955264343'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/07/unit-testing-private-methods.html' title='Unit Testing Private Methods'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8881614386511851669.post-6489879501940722734</id><published>2007-07-05T17:22:00.000-05:00</published><updated>2008-01-23T22:17:41.057-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Certifications'/><title type='text'>Sun Certified Java Programmer</title><content type='html'>So, I'm getting ready to start working on my 2nd Java Certification, Web Component Developer.  I can remember when I used to question whether or not getting a certification was even worth it.  I heard a lot about how certifications don't prove anything.  Anyone can memorize some material and pass a test.  &lt;br /&gt;&lt;br /&gt;I decided to work towards the Java Certified Programmer certification anyway.  I made up my mind that I would at least improve my Java skills, which at the time I had only been working with Java for 6 months or so.  After a few months reading &lt;a href="http://www.amazon.com/Certified-Programmer-310-055-Certification-Guides/dp/0072253606/ref=pd_bbs_sr_1/105-5259728-1903639?ie=UTF8&amp;s=books&amp;qid=1183681465&amp;sr=8-1"&gt; SCJP Sun Certified Programmer for Java 5 Study Guide&lt;/a&gt;, taking practice tests, and putting my newfound knowledge into practice at work, I became a Sun Certified Java Programmer.&lt;br /&gt;&lt;br /&gt;There was no question.  Taking the certification was with out a doubt, extremely beneficial.  The biggest factor was the amount I learned about the Java language.  This was especially helpful being a newcomer to Java.  Plus, it does take more than just memorizing material to pass this certification.  It takes an understanding of key Java concepts and OOP, in-depth knowledge of several Java 5 features, and the ability to put these things to work.  &lt;br /&gt;&lt;br /&gt;If you're new to OOP and working with Java, or just new to Java, I strongly recommend working towards the SCJP certification.  It will build your Java skills &lt;span style="font-style:italic;"&gt;and&lt;/span&gt; add to your resume.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8881614386511851669-6489879501940722734?l=chadthedeveloper.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chadthedeveloper.blogspot.com/feeds/6489879501940722734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8881614386511851669&amp;postID=6489879501940722734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6489879501940722734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8881614386511851669/posts/default/6489879501940722734'/><link rel='alternate' type='text/html' href='http://chadthedeveloper.blogspot.com/2007/07/sun-certified-java-programmer.html' title='Sun Certified Java Programmer'/><author><name>Chad Sturtz</name><uri>http://www.blogger.com/profile/01006373101241061379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://bp2.blogger.com/_VD8UVD1OSH8/RvNMJctgfmI/AAAAAAAAAAg/s9Riu9X77NU/s320/Copy+of+newme2.JPG'/></author><thr:total>0</thr:total></entry></feed>
