<?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-133898670336007031</id><updated>2011-12-06T22:56:16.449-08:00</updated><category term='Adobe'/><category term='Red Hat'/><category term='Service'/><category term='sqlite data browser'/><category term='Enterprise Java'/><category term='sqlite'/><category term='Strobe'/><category term='Load Balancing'/><category term='AJAX'/><category term='Java'/><category term='Community Choice'/><category term='RIA'/><category term='Google'/><category term='Groovy'/><category term='sqlite3'/><category term='Open Source'/><category term='Gant'/><category term='OSS'/><category term='Tomcat'/><category term='Flash'/><category term='Ivy'/><category term='Opinion'/><category term='android'/><category term='TDD'/><category term='Drools'/><category term='scrum'/><category term='Gradle'/><category term='software'/><category term='Grape'/><category term='Maven'/><category term='pattern lock'/><category term='Eclipse'/><category term='Clustering'/><category term='Collaboration'/><category term='Flex'/><category term='Grails'/><category term='quality'/><category term='Virtualization'/><category term='Sourceforge'/><category term='Training'/><title type='text'>Chrome for Open Source Software</title><subtitle type='html'>Idea sharing that promotes a pleasant Open Source experience</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-6778056725517233260</id><published>2010-05-23T06:51:00.000-07:00</published><updated>2010-05-23T09:16:51.584-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Enterprise Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Clustering'/><category scheme='http://www.blogger.com/atom/ns#' term='Virtualization'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='Load Balancing'/><title type='text'>Clustering in the Brave New Virtual World</title><content type='html'>&lt;div&gt;High Availability(HA) and Fault Tolerance(FT) in the Enterprise Java world is not the same as HA/FT in the VMware world, but the overarching goals are the same. HA in the Java world involves proper load balancing across more than one application server so that a single server failure does not take the entire application offline. The worst case scenario for the user is to get kicked out of the application and bounced back to the login page. The goal of FT is to eliminate the user kick out event and make the failover seamless. In the Java world, FT is usually delivered by using application server clustering. The biggest difference between Java and VMware FT is Java based clustering does not shadow copy at the VM(Virtual Machine) level. Instead only the "application state" is copied. On the HA side, Java applications will use either a hardware or software load balancer instead of vSphere and DRS(Distributed Resource Scheduler). Java based FT is painful. Does replication of just "application state" warrant the added complexity?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Clustering is a Cluster&lt;/b&gt;&lt;/div&gt;For years, clustering has been a hot button issue in the Enterprise Java world. Architects desire both High Availability(HA) and Fault Tolerance(FT) and there are two leading approaches to HA/FT. The first approach is to architect a purely stateless solution and the other is to "minimize the use of state". In a stateless application, there is no need to replicate state and the only thing required to deliver HA/FT is a load balanced set of application servers. The "minimize the use of state" part was not the original intent of J2EE but Stateful Session Beans(SFSBs) and vertical scaling delivered worst of breed results. Worst of breed in that the hardware and software was extremely expensive, yet a very profitable business for BEA and IBM. And, even the best SFSB based systems performed and scaled worse than a stateless architecture. Even JBoss, the low cost alternative to WebSphere/Weblogic, was unable to deliver adequate scalability and performance for applications that use a lot of state. Thankfully, smart architects altered software design such that either "stateless" or "minimized use of state" is used. And, that design decision made Tomcat and JBoss a better, cheaper platform for most enterprise Java applications.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Modern Enterprise Java&lt;/b&gt;&lt;/div&gt;&lt;div&gt;For a typical Java application there are only two major "state" components:&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;i&gt;HTTPSession&lt;/i&gt; - usually limited to user profile data or potentially "web conversations". Each user has an HTTPSession and that session remains available as long as the user is logged in to the application. HTTPSession is like a student's back pack. You can shove the back pack full of heavy books or go with an iPad. Spring Webflow, Grails and Seam provide a very nice way of "minimizing the use of state" just like an iPad minimizes a back pack's weight. More information about Spring Webflow based conversations can be found here: &lt;a href="http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch03s05.html"&gt;http://static.springsource.org/spring-webflow/docs/2.0.x/reference/html/ch03s05.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;Second level data cache&lt;/i&gt; - This state component sometimes violates the "minimized use of state" mantra but it is very common. Database intensive Java applications will store database query results in the cache so that future requests do not result in a subsequent round trip to the database. Most second level caches are not clustered, and a clustered second level cache is usually a bad sign unless a high end caching product like Terracotta or GemFire is used. For high end products, cache clustering is handled separate from application server clustering. A good cache will be "distributed" and "transactional", which is just a fancy way of saying that the cache product provides its own HA, FT and proper data synchronization with the underlying database.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;b&gt;Bottom Line&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Virtualized Java applications may benefit from VMware based FT/HA instead of traditional load balancing(HA) and clustering(FT). There are not enough vSphere/FT/HA based Java deployments to prove that traditional load balancing and clustering are obsolete but that may be the case. Right now, the best practice way to deliver HA/FT is to have a:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Properly configured hardware or software load balancer (F5, Cisco, Apache, ERS).&lt;/li&gt;&lt;li&gt;Properly architected application that minimizes the use of state and a lightweight application server that supports HTTPSession clustering (Tomcat, tcServer, JBoss).&lt;/li&gt;&lt;li&gt;Properly architected data cache that is either NOT clustered or relegate data caching to a high end data cache product. (Ehcache or JBossCache for non-clustered), (GemFire or Terracotta for a clustered cache).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  color: rgb(51, 51, 51); line-height: 16px; font-family:Verdana, Arial, sans-serif;font-size:13px;"&gt;&lt;i&gt;DISCLAIMER: I am employed by VMWare. The views expressed on this blog do not necessarily reflect the views of my employer. I am completely responsible for all content displayed here. Furthermore, no content of cfossguy.blogspot.com has ever been reviewed and/or endorsed by my employer.&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-6778056725517233260?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/6778056725517233260/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=6778056725517233260' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/6778056725517233260'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/6778056725517233260'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2010/05/clustering-in-brave-new-virtual-world.html' title='Clustering in the Brave New Virtual World'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-937162837691783437</id><published>2010-05-08T06:53:00.000-07:00</published><updated>2010-05-09T13:23:57.593-07:00</updated><title type='text'>Virtualized Java is the Real Deal</title><content type='html'>Lately, I've been talking to more and more &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;virtualization&lt;/span&gt; gurus and while most of my conversations are still with Java architect or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;middleware&lt;/span&gt; operations teams, change is coming. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;VMWare's&lt;/span&gt; acquisition of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;SpringSource&lt;/span&gt; has flung the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;virtualize&lt;/span&gt; Java door wide open. And, the biggest challenge we face is not technical. We need cross pollination of Java and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;virtualization&lt;/span&gt; talent. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Virtualization&lt;/span&gt; gurus need to ramp on Java, and Java gurus need to ramp up on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;virtualization&lt;/span&gt;. I realize that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;virtualization&lt;/span&gt; gurus should not concern themselves with programming in Java. But, they do need to understand the tools of the trade, the strengths/weaknesses of the platform and configuration optimization techniques. My next series of blogs will target the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;virtualization&lt;/span&gt; guru audience. Here is a little taste of what is coming:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Quick JVM Optimization Checklist&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;64-bit JVM&lt;/i&gt; - If you see 32-bit Windows/Linux, recommend a move to a 64-bit operating system(OS) and Java Virtual Machine(JVM). The 4GB limit on a 32-bit OS is problematic for large enterprise Java applications. And, since the 4GB limit is for the entire OS, the maximum JVM allocation will range from 2GB to 3.5GB, depending on the OS. In a future blog, I will go into more detail on why Java can consume a ridiculously large amount of memory and why that is not necessarily a bad thing.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Min/Max Heap&lt;/i&gt; - Min=minimum heap size of the JVM, Max=maximum heap size of the JVM. The JVM manages memory similar to a hypervisor and the JVM's memory consumption will balloon up/down based on application design and user load. If the max heap setting is too low, the JVM will spend an inordinate amount of time managing memory. Or, worse yet throw an OOME(Out of Memory Exception). If the max memory setting is too high, memory is wasted because the ESX hypervisor will not be able to reclaim it from the JVM. Right now, memory management for Java is Highlander style, "There can only be one". You cannot drop memory reservations down on VMs that are running Java. But, if you set reservations properly, Java application performance on VMs will be similar to physical. For a development system, max heap will often be 512MB or lower on a lightweight application server like Tomcat. On a production system, anything lower than 1024MB is cause for concern, but not necessarily wrong. Many Java gurus will insist on setting min/max to the same value, but that is no longer required for most deployments. Prior to JVM 1.5 or Java 5, setting min/max to the same value was a no-brainer.&lt;/li&gt;&lt;li&gt;&lt;i&gt;Permgen&lt;/i&gt; - The default permgen, if not specified, is 64MB and that is usually far too low. Permgen is the region of JVM memory that cannot be reclaimed. It is similar to the reservation in the hypervisor, but different. When you deploy an application to the JVM, the bytecode for all classes are loaded into the permgen region. If the application is large or uses a lot of framework JARs, it will require more permgen. Other memory may reside in permgen but this classloading activity is what causes most OOMEs that are permgen related. When the OOME is permgen related, you will see this message in the server log: "OutOfMemoryError: PermGen space". Application hot-deploys are usually the culprit. Most application servers support live deployment of a new application. There are JVM tricks to make hot-deploy work without killing permgen, but hot deploys should &lt;b&gt;NEVER HAPPEN IN PRODUCTION&lt;/b&gt;. I will go so far as to say they should never happen outside of a developer workstation.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;This is a small sliver of JVM optimization information but understanding how to properly configure min/max/perm will address a surprisingly large number of Java performance issues. More information about JVM tuning can be found here: &lt;a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html"&gt;http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I will continue my &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;virtualization&lt;/span&gt; ramp process by reading great blogs like: &lt;a href="http://www.virtualinsanity.com/"&gt;http://www.virtualinsanity.com&lt;/a&gt; and I believe that every Java guru needs to learn more about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;virtualization&lt;/span&gt;. Hopefully virtualization gurus will find this blog useful.&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;DISCLAIMER: I am employed by VMWare. The views expressed on this blog do not necessarily reflect the views of my employer.  I am completely responsible for all content displayed here.  Furthermore, no content of cfossguy.blogspot.com has ever been reviewed and/or endorsed by my employer.&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-937162837691783437?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/937162837691783437/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=937162837691783437' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/937162837691783437'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/937162837691783437'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2010/05/virtualized-java-is-real-deal.html' title='Virtualized Java is the Real Deal'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-1259616104196928322</id><published>2009-11-28T08:23:00.000-08:00</published><updated>2009-11-28T10:22:41.437-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sqlite3'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlite'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlite data browser'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='pattern lock'/><title type='text'>A Little SQLite Goodness for Android</title><content type='html'>I recently pattern locked my Sprint PCS HTC Hero and, somehow locked myself out of my phone completely. And, like many others, I found out that once you do this, there's no easy way to get back into your phone: &lt;a href="http://forum.xda-developers.com/showthread.php?t=485903"&gt;http://forum.xda-developers.com/showthread.php?t=485903&lt;/a&gt;. Instead of calling technical support, I decided to solve the problem on my own and here's what I did:&lt;br /&gt;&lt;br /&gt;I was lucky in that I had already enabled USB debugging on my phone. Otherwise, I would have been totally dead in the water. So, I highly recommend that you download the android development kit and turn USB debugging on before breaking your phone: &lt;a href="http://developer.android.com/sdk/" target="_blank"&gt;http://developer.android.com/sdk/&lt;/a&gt;. If you have the android SDK and you change your phone settings to: &lt;span style="font-style: italic;"&gt;Settings -&gt; Applications -&gt; Development -&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;USB&lt;/span&gt; Debugging&lt;/span&gt; = enabled, then you can hack at your phone from your computer.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Plug phone into computer via &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;USB&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Download &lt;a class="jive-link-external-small" href="http://zenthought.org/tmp/asroot2"&gt;http://zenthought.org/tmp/asroot2&lt;/a&gt;&lt;/li&gt;&lt;li style="font-style: italic;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;adb&lt;/span&gt; push &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;asroot&lt;/span&gt;2 /data/local/ &amp;amp;&amp;amp; ./&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;adb&lt;/span&gt; shell &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;chmod&lt;/span&gt; 0755 /data/local/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;asroot&lt;/span&gt;2&lt;/li&gt;&lt;li style="font-style: italic;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;adb&lt;/span&gt; shell&lt;/li&gt;&lt;li style="font-style: italic;"&gt;/data/local/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;asroot&lt;/span&gt;2 /system/bin/sh&lt;/li&gt;&lt;li style="font-style: italic;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;chmod&lt;/span&gt; 777 /data/data/com.android.providers.settings/databases/settings.db&lt;/li&gt;&lt;/ol&gt;Now, you have root access to your android phone and you have changed the permissions to the "settings.db" so that you can pull/push it from your computer back to the phone. Many thanks to "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;briankwest&lt;/span&gt;" and &lt;a href="http://community.sprint.com/baw/message/131093#131093"&gt;this&lt;/a&gt; post for that valuable &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;tid&lt;/span&gt;bit. Next, comes the hard part that I had to figure out on my own:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Pull the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;sqlite&lt;/span&gt; database file from your phone settings using this command:&lt;span style="font-style: italic;"&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;adb&lt;/span&gt; pull /data/data/com.android.providers.settings/databases/settings.db ./settings.db&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Make a copy of this file to make sure you can push the original settings back, if needed:&lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;cp&lt;/span&gt; settings.db settings.db.bak&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Download &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;SQLite&lt;/span&gt; database browser from here: &lt;a href="http://sourceforge.net/projects/sqlitebrowser/"&gt;http://sourceforge.net/projects/sqlitebrowser/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Open the "settings.db" file that you pulled in #1 in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;SQLite&lt;/span&gt; Database Browser&lt;/li&gt;&lt;li&gt;Browse data in the "system" table. You are looking for 2 rows: "lock_pattern_&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;autolock&lt;/span&gt;" and "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;lockscreen&lt;/span&gt;.&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;lockedoutpermanently&lt;/span&gt;"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Make sure both rows have a value of "0" instead of "1". You can use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;SQLite&lt;/span&gt; to modify this data once you've browsed to it&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Save the database file and close the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;SQLite browser&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Push the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;sqlite&lt;/span&gt; database file back to your phone using this command: &lt;span style="font-style: italic;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;adb&lt;/span&gt; push settings.db /data/data/com.android.providers.settings/databases/settings.db&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Turn your phone off/on and your phone will no longer be locked! And, you don't have to worry about fixing the permissions on settings.db. When your phone started, it reset the permissions on that file back to the default, which means you will have to root back in and re-&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;chmod&lt;/span&gt; if you didn't update the settings.db file properly.&lt;/li&gt;&lt;/ol&gt;This information kept me from calling Sprint PCS customer service, something I only do if absolutely necessary. Also, this is a nifty way to change pretty much any &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;SQLite&lt;/span&gt; data on your phone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-1259616104196928322?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/1259616104196928322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=1259616104196928322' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/1259616104196928322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/1259616104196928322'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/11/little-sqlite-goodness-for-android.html' title='A Little SQLite Goodness for Android'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-4990958696734696898</id><published>2009-09-20T08:00:00.000-07:00</published><updated>2009-09-20T14:10:45.900-07:00</updated><title type='text'>Excellent Blueprint for Startup Success</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.com/gp/product/0976470705?ie=UTF8&amp;amp;tag=chrforopesous-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0976470705"&gt;&lt;/a&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 240px;" src="http://1.bp.blogspot.com/__z-iCGo952g/Sq1Ez-cC5II/AAAAAAAAAD4/JzG4NQxRbQ8/s320/foursteps.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5381032789502256258" /&gt;If you work for a startup or if you take the plunge and create a startup, it is wise to learn more about proven principles for success. Often times, startup experience alone is not enough, because most startups fail and many of those failures are the result of repeating the same mistakes over and over. For those of us that started our career in large, well funded companies, the bare bones nature of a startup is unnerving. We will attempt to put proven "big company" processes/methodologies in place to ensure success, and we will be a key contributor to failure. Entrepreneurial superstars will revolt against any process/methodology and insist on constant change and micromanagement. And, those superstars will also be key contributors to failure. So, how much process should be present in sales, marketing, and product development? The answer is, it depends. Thankfully, this book explains, "it depends" and provides an invaluable blueprint for maximizing the chances of success. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are two things you should know about this book before purchasing. First, the author, &lt;a href="http://en.wikipedia.org/wiki/Steven_Gary_Blank"&gt;Steven Gary Blank&lt;/a&gt;, is a real-deal Silicon Valley VC veteran that teaches for both Stanford and Berkeley. This book is a great way to obtain MBA grade knowledge without quitting your day job. Secondly, the book is not cheap($40) but it is poorly edited. There are quite a few typos and the graphics are borderline bad, but if you look past the lack of editing polish, you'll realize that this information is easily worth ten times its cost. The book was released in 2005 and four years later most startups still ignore these proven principles. But, a new term for this type of startup has emerged, &lt;b&gt;The Lean Startup&lt;/b&gt;. Here are three good resources that will get you up to speed on lean startups:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.slideshare.net/venturehacks/the-lean-startup-2"&gt;http://www.slideshare.net/venturehacks/the-lean-startup-2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.startuplessonslearned.com/2008/09/lean-startup.html"&gt;http://www.startuplessonslearned.com/2008/09/lean-startup.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.slideshare.net/startuplessonslearned/eric-ries-lean-startup-presentation-for-web-20-expo-april-1-2009-a-disciplined-approach-to-imagining-designing-and-building-new-products"&gt;http://www.slideshare.net/startuplessonslearned/eric-ries-lean-startup-presentation-for-web-20-expo-april-1-2009-a-disciplined-approach-to-imagining-designing-and-building-new-products&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-4990958696734696898?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/4990958696734696898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=4990958696734696898' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/4990958696734696898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/4990958696734696898'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/09/excellent-blueprint-for-startup-success.html' title='Excellent Blueprint for Startup Success'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__z-iCGo952g/Sq1Ez-cC5II/AAAAAAAAAD4/JzG4NQxRbQ8/s72-c/foursteps.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-2441168592802112441</id><published>2009-09-13T06:46:00.000-07:00</published><updated>2009-09-20T14:24:36.828-07:00</updated><title type='text'>Books that Chronicle the Brave New IT World</title><content type='html'>&lt;div&gt;I recently finished reading an interesting book: What Would Google Do?, by Jeff Jarvis. While reading the book, I kept thinking about how this book builds upon many of the same ideas of another great book: The World is Flat, by Thomas L. Friedman. In fact, I believe that Jarvis' book chronicles the rise of a new breed of technology companies. And, Google is the poster child of what works in this Brave New IT World. Every enterprise developer should read both books. Moreover, after reading both books, you should be very concerned if the company you work for violates or ignores the laws that define this new age.  &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;The World is Flat&lt;/span&gt;&lt;/div&gt;I must admit that I've had my copy of &lt;a href="http://www.amazon.com/gp/product/B0012WXAAM?ie=UTF8&amp;amp;tag=chrforopesous-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=B0012WXAAM"&gt;The World is Flat: a Brief History of the Twenty-First Century&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=chrforopesous-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B0012WXAAM" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; for a couple years and I just recently read this excellent book. I was worried that the book would be outdated but I was surprised to find that the principles outlined in the book are dead on and will be applicable for several decades. Some aspects of the book scared me quite a bit. The most bothersome chapters are:&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://books.google.com/books?id=-mv_ryTuvo0C&amp;amp;lpg=PP1&amp;amp;dq=The%20World%20is%20Flat&amp;amp;pg=PA337#v=onepage&amp;amp;q=&amp;amp;f=false"&gt;Chapter 8: The Quiet Crisis&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://books.google.com/books?id=-mv_ryTuvo0C&amp;amp;lpg=PP1&amp;amp;dq=The%20World%20is%20Flat&amp;amp;pg=PA533#v=onepage&amp;amp;q=&amp;amp;f=false"&gt;Chapter 12: The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Unflat&lt;/span&gt; World&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;But, what makes this book timeless is the detailed review of the &lt;a href="http://books.google.com/books?id=-mv_ryTuvo0C&amp;amp;lpg=PP1&amp;amp;dq=The%20World%20is%20Flat&amp;amp;pg=PA51#v=onepage&amp;amp;q=&amp;amp;f=false"&gt;ten key &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;flatteners&lt;/span&gt;&lt;/a&gt; that have led to the current state of the Information Technology industry. None of the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;flatteners&lt;/span&gt; are earth shattering discoveries, but I was surprised by the significant societal impact of these &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;flatteners&lt;/span&gt;. &lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;What Would Google Do?&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I began reading &lt;a href="http://www.amazon.com/gp/product/0061709719?ie=UTF8&amp;amp;tag=chrforopesous-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0061709719"&gt;What Would Google Do?&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=chrforopesous-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=0061709719" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; immediately because I'm enamored with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;Google's&lt;/span&gt; technology and the way they are changing the world we live in. The following chapters describe the principles Google follows to dominate the search and advertising market and spread its dominance into other markets, like mobile(&lt;a href="http://www.android.com/"&gt;Android&lt;/a&gt;), and a wide array of &lt;a href="http://www.google.com/intl/en/options/"&gt;applications&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;New Relationship&lt;/li&gt;&lt;li&gt;New Architecture&lt;/li&gt;&lt;li&gt;New &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Publicness&lt;/span&gt;&lt;/li&gt;&lt;li&gt;New Society&lt;/li&gt;&lt;li&gt;New Economy&lt;/li&gt;&lt;li&gt;New Business Reality&lt;/li&gt;&lt;li&gt;New Attitude&lt;/li&gt;&lt;li&gt;New Ethic&lt;/li&gt;&lt;li&gt;New Speed&lt;/li&gt;&lt;li&gt;New Imperatives&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;This book explains how companies can embrace this Brave New World and re-use the ideas that led to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Google's&lt;/span&gt; success. I use the concepts in this book to question my company's product development/delivery strategy. And, I believe that going against these laws is a recipe for disaster. Ironically, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;WWGD&lt;/span&gt;? does not have  a preview on &lt;a href="http://books.google.com/"&gt;books.google.com&lt;/a&gt;, but a free Google like preview can be found &lt;a href="http://browseinside.harpercollins.com/index.aspx?isbn13=9780061709715"&gt;here&lt;/a&gt;. the author does blog heavily at &lt;a href="http://buzzmachine.com"&gt;buzzmachine.com&lt;/a&gt;, and a good synopsis of his book can be found &lt;a href="http://www.buzzmachine.com/what-would-google-do/"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The World is Flat describes how we arrived in this Brave New World. And, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;WWGD&lt;/span&gt;? provides survival tips for this Brave New World. Read them both and you will have a better understanding of the rules that dictate your fate as a technology professional.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-2441168592802112441?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/2441168592802112441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=2441168592802112441' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/2441168592802112441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/2441168592802112441'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/09/books-that-chronicle-brave-new-it-world.html' title='Books that Chronicle the Brave New IT World'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-5479770937179199506</id><published>2009-07-03T08:45:00.000-07:00</published><updated>2009-07-03T10:02:35.733-07:00</updated><title type='text'>HTML5 is a Big Deal for Enterprise Developers</title><content type='html'>I was recently made aware of HTML5's canvas element and I believe that this could render Silverlight, JavaFX and Flex obsolete.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;HTML5 Canvas Overview&lt;/span&gt;&lt;br /&gt;The "canvas" tag allows you to embed script based graphics, usually JavaScript, in your page. The Filamant Group blog has an excellent writeup and they also provide a jQuery based charting script: &lt;a href="http://www.filamentgroup.com/lab/creating_accessible_charts_using_canvas_and_jquery/"&gt;http://www.filamentgroup.com/lab/creating_accessible_charts_using_canvas_and_jquery/&lt;/a&gt;.&lt;br /&gt;For $80, the RGraph Beta is available: &lt;a href="http://www.rgraph.net/"&gt;http://www.rgraph.net/&lt;/a&gt;. For custom visualizations, Mozilla provides an excellent canvas tutorial: &lt;a href="https://developer.mozilla.org/en/Canvas_tutorial"&gt;https://developer.mozilla.org/en/Canvas_tutorial&lt;/a&gt;. For neat animations check out: &lt;a href="http://jeko.free.fr/megapong/"&gt;http://jeko.free.fr/megapong/&lt;/a&gt; and &lt;a href="http://code.google.com/p/cakejs/"&gt;http://code.google.com/p/cakejs/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Why this is a Big Deal&lt;/span&gt;&lt;br /&gt;HML5 is a big deal because it provides a standards based alternative to Silverlight, Flex and JavaFX. Expect the leading Ajax frameworks, like &lt;a href="http://jquery.com/"&gt;JQuery&lt;/a&gt; and &lt;a href="http://code.google.com/webtoolkit/"&gt;GWT&lt;/a&gt;, to provide programmer friendly APIs for common visualizations. I was unable to find a good canvas visualization designer, but I do believe that we will see several in the coming years.  Also, I expect canvas support on mobile devices even if Microsoft refuses to support it in IE. It looks like Firefox, Chrome, Safari and Opera already support canvas. And, I fully expect IE market share to continue to decline making it more likely for IE to suck it up and support HTML5 properly: &lt;a href="http://www.w3schools.com/browsers/browsers_stats.asp"&gt;http://www.w3schools.com/browsers/browsers_stats.asp&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Key Missing Ingredients&lt;/span&gt;&lt;br /&gt;The missing ingredients for a HTML5 revolution are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;IDE Tooling&lt;/span&gt; - A killer HTML5 IDE that rivals Adobe &lt;a href="http://labs.adobe.com/technologies/flashbuilder4/"&gt;FlashBuilder&lt;/a&gt; and Microsoft &lt;a href="http://www.microsoft.com/expression/products/Overview.aspx?key=studio"&gt;Expression&lt;/a&gt; is needed. Unfortunately, neither Microsoft or Adobe has an incentive to innovate here.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Framework Support&lt;/span&gt; - jQuery, GWT and other leading Ajax frameworks need to make it easy for programmers to build nice canvas based visualizations. I see significant movement here and I do believe that this will happen.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Blogs, Books and Success Stories &lt;/span&gt;- Programmers need to blog about HTML5, good books are needed on HTML5 for mobile/desktop and noteworthy success stories will round out the triple threat.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I hope HTML5 gains momentum and I will be keeping a close eye on this technology. Google has deep pockets and a lot to gain if this technology can replace plug-in based &lt;a href="http://en.wikipedia.org/wiki/Rich_Internet_application"&gt;RIA&lt;/a&gt;s.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-5479770937179199506?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/5479770937179199506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=5479770937179199506' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/5479770937179199506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/5479770937179199506'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/07/html5-is-big-deal-for-enterprise.html' title='HTML5 is a Big Deal for Enterprise Developers'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-6903072418235296262</id><published>2009-06-20T09:17:00.000-07:00</published><updated>2009-06-21T06:57:26.750-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='scrum'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Ideas for Improving Software Quality</title><content type='html'>Poor software quality is bad and should be avoided at all costs. Maintaining a high quality level is increasingly difficult as the project duration and team size increase, but it is not impossible. If you are using Scrum or another compatible agile methodology these ideas will help bring quality back.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;MVP and Wall of Shame&lt;/span&gt;&lt;br /&gt;At the end of every sprint, designate an &lt;span style="font-style: italic;"&gt;MVP&lt;/span&gt;(Most Valuable Player). This MVP is the developer that has the highest feature to defect ratio. If you have a sophisticated issue tracking system, it will be easy to get this information, otherwise you will have to use a more subjective determination process.&lt;br /&gt;&lt;br /&gt;It also helps to maintain a &lt;span style="font-style: italic;"&gt;Wall of Shame&lt;/span&gt; list that goes out to the entire R&amp;amp;D organization on a weekly basis. Developers get on the Wall of Shame list when they:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Break the build&lt;/li&gt;&lt;li&gt;Fail to provide adequate unit tests for code&lt;/li&gt;&lt;li&gt;Commit code that passes unit tests but fails a simple functional test&lt;/li&gt;&lt;/ol&gt;Be careful with the Wall of Shame. It should be easy for developers to get off the Wall of Shame list, and no developer should stay on the list for more than one week. If a developer stays on the Wall of Shame for more than two weeks or is a frequent Wall of Shame member, he needs to be kicked off the project. Conversely, if a developer drastically improves his performance after going on the Wall of Shame, you need to acknowledge it and let the team know that this member has more than made up for his mistakes. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Automated Functional Testing &lt;/span&gt;&lt;br /&gt;Unit tests are important but automated functional tests are also needed, especially if the project uses &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;RIA&lt;/span&gt;(Rich Internet Application) technologies like Flex/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;GWT&lt;/span&gt;. Flex is hard to unit test, but &lt;a href="http://riatest.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;RiaTest&lt;/span&gt;&lt;/a&gt; is a good tool. Resist the temptation to delegate functional test automation. The developer should maintain functional tests as part of normal code maintenance. This tenet is very hard to stay committed to, so expect less than ideal automated functional test coverage and fight hard for more each and every day.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Integration Test Cycle&lt;/span&gt;&lt;br /&gt;After a sprint, resist the temptation to immediately begin a new round of development. If you have a demo worthy product at the end of the sprint, spend up to a full week on integration testing. Every developer, lead and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;QA&lt;/span&gt; team member should be fully dedicated to this test effort. If a developer finds a defect in his code, that defect should NOT put him on the Wall of Shame list, no matter how inexcusable. The developer should be commended for finding and admitting the flaw.  The only "Get Out of Jail Free" time is in this short integration test period. Outside of this period, all defects are &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;candidates&lt;/span&gt; for the "Wall of Shame".&lt;br /&gt;&lt;br /&gt;These strategies can improve the quality of your software, but like all good ideas they are no silver bullet. As the size of a team and project duration grow, the likelihood of apathy increases. Team members assume that someone else will fix a problem, and a problem can explode into an impressive list of problems quickly. Your goal as a Leader is to keep this from happening, and if apathy creeps in, ruthlessly destroy it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-6903072418235296262?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/6903072418235296262/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=6903072418235296262' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/6903072418235296262'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/6903072418235296262'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/06/ideas-for-improving-software-quality.html' title='Ideas for Improving Software Quality'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-9032011769097068795</id><published>2009-05-31T06:13:00.000-07:00</published><updated>2009-05-31T10:37:23.214-07:00</updated><title type='text'>Blueprint for Getting Agile Embraced by the Enterprise</title><content type='html'>I have always been a strong proponent of Open Source, and I have had success in convincing others to adopt Open Source. But, when it comes to development methodology, I resisted the temptation to push agile practices, until recently. The good news is that my first foray into agile was highly successful. My path is as follows:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Added the &lt;a href="http://www.amazon.com/Agile-Software-Development-Ecosystems/dp/0201760436/ref=sr_1_2?ie=UTF8&amp;amp;s=books&amp;amp;qid=1243776190&amp;amp;sr=8-2"&gt;Agile Software Development Ecosystems&lt;/a&gt; book to my Safari book shelf and I actually read the book.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Selected the methodologies that I thought could best address our project development needs. In this case, I picked Scrum and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;XP&lt;/span&gt;(Extreme Programming).&lt;/li&gt;&lt;li&gt;Created a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;power point&lt;/span&gt; presentation and pitched it to the other lead architects and our managers. The &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;power point&lt;/span&gt; was essentially a short overview of Scrum, along with a list of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;XP&lt;/span&gt; principles that would be combined with Scrum. Controversial &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;XP&lt;/span&gt; practices like "pair programming" and strict "40 hour work week" were not included in this presentation. I will explain why a little later.&lt;/li&gt;&lt;li&gt;After receiving valuable feedback, I refined the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;power point&lt;/span&gt; and pitched it to the entire R&amp;amp;D organization. The interesting thing about doing #3 first is that this was no longer my idea. This pitch was now Management's idea. The end result was immediate acceptance, with a few intelligent, thoughtful concerns that were addressed in the meeting.&lt;/li&gt;&lt;li&gt;We began immediate implementation of Scrum and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;XP&lt;/span&gt;, but we modified both methodologies to fit our business and process needs.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Why I Eliminated Key Aspects of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;XP&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The number one reason is because I don't believe in pair programming or a strict 40 hour work week. But, even if I did, I was not willing to risk the whole, adoption of agile, for those two &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;XP&lt;/span&gt; principles. My goal was to get Scrum adopted as the product development and business requirements management process and gain acceptance of TDD(Test Driven Development), collective ownership, and CI(&lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;Continuous&lt;/span&gt; Integration). Accomplishing those goals and nothing more represented a quantum leap compared to what existed prior.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What I Would Have Done Differently&lt;/span&gt;&lt;br /&gt;I would have spent more time addressing the real process and software needs up front before presenting. I was fortunate to have strong Management backing and I was dealing with a group of engineers that were not staunch waterfall advocates. We had some growing pains with CI(&lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;, &lt;a href="http://nexus.sonatype.org/"&gt;Nexus&lt;/a&gt; and &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt;). TDD is still something that we are trying to get better at, and our issue tracking system was not paired up with Scrum properly for the first nine months of development.&lt;br /&gt;&lt;br /&gt;Despite the challenges, we are doing well. I think that is because I donated my idea early, allowed others to shape and mold that idea, turning it into a better idea, and in the process that idea became the domain of the collective group. The Open Source mindset is very powerful when it is applied in the Enterprise, and I attribute a large portion of our success to staying committed to key OSS principles.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-9032011769097068795?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/9032011769097068795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=9032011769097068795' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/9032011769097068795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/9032011769097068795'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/05/blueprint-for-getting-agile-embraced-by.html' title='Blueprint for Getting Agile Embraced by the Enterprise'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-8466577147918743793</id><published>2009-05-23T10:00:00.000-07:00</published><updated>2009-05-26T05:15:46.939-07:00</updated><title type='text'>Advice for Software Entrepreneurs</title><content type='html'>Of course you should take this advice for what it is. I am a Java Open Source guy that has been working on a new Flex based product for the past year. I am not an Adobe Flash guy and I have not done a lot of high end visualization work. My take on Flex is from a Java Architect perspective.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;You have an idea and you're sure you want to use Flex, right?&lt;/span&gt;&lt;br /&gt;Flex and Flash provide a great way of visualizing data via sophisticated chart views or 100% custom components. But, when it comes to standard application screens, often times you will be able to develop a system faster using other technologies. The hot RAD(rapid application development) framework for the web right now is &lt;a href="http://grails.org/" target="_blank"&gt;Grails&lt;/a&gt;. Google also has a very interesting platform for building and hosting prototype applications: &lt;a href="http://code.google.com/appengine/docs/whatisgoogleappengine.html" target="_blank"&gt;http://code.google.com/appengine/docs/whatisgoogleappengine.html&lt;/a&gt;. Flex can be mixed with either platform without a lot of effort. Most people refer to this type of application as a “web &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;mashup&lt;/span&gt;&lt;/span&gt;” architecture: &lt;a href="http://en.wikipedia.org/wiki/Mashup_%28web_application_hybrid%29" target="_blank"&gt;http://en.wikipedia.org/wiki/Mashup_(web_application_hybrid)&lt;/a&gt; and these two platforms are gaining attention because they automate build/test/deploy without the need to create formal software build infrastructure. If the application size is medium to large, I think it makes a lot of sense to use Flex for high quality visualizations, “hot fudge sundae with sprinkles screens” and a different technology for “steak and potato” screens. If the app is small, keeping everything Flex is probably the way to go, provided you have the need for high-end data visualization. Otherwise, Grails is the way to go.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;You need experienced Flex talent, right?&lt;/span&gt;&lt;br /&gt;This issue is a bit tougher because there’s still a shortage of Adobe Flex talent. I would avoid Flex gurus and focus my attention on Java developers that have a strong Open Source and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;UI&lt;/span&gt;&lt;/span&gt; design acumen. Key skills for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;UI&lt;/span&gt;&lt;/span&gt; design are: &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;GWT&lt;/span&gt;&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;jQuery&lt;/span&gt;&lt;/span&gt;, Prototype and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;JSF&lt;/span&gt;&lt;/span&gt;/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;JSP&lt;/span&gt;&lt;/span&gt;. Key skills for Java are Hibernate, Spring, Groovy, Grails, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;JUnit&lt;/span&gt;&lt;/span&gt;. If someone can talk intelligently about these technologies and has a desire to master Flex, they are a good candidate for Flex and the back-end code that will be needed. For Flex talent, key skills are &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Actionscript&lt;/span&gt;&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;MXML&lt;/span&gt;&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;AMF&lt;/span&gt;&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;remoting&lt;/span&gt;&lt;/span&gt; via &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;BlazeDS&lt;/span&gt;&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;GraniteDS&lt;/span&gt;&lt;/span&gt; and Web Services. There are a lot of Adobe Flash guys out there that may be a horrible fit for a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_14"&gt;start up&lt;/span&gt;. Designing a beautiful user interface usually involves significant server side code effort, and many Flash guys are not proficient in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;AMF&lt;/span&gt;&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;remoting&lt;/span&gt;&lt;/span&gt; or server side database programming. If I had an idea and funding, I would stay away from this type of programmer like the plague, and focus my attention on finding well rounded talent. If I needed high end graphic design work, I would use a contractor that’s well versed in Flash, for a very short engagement. Ideally, one month or less if I can negotiate it.&lt;br /&gt;&lt;br /&gt;In this tough market, it takes courage to create a new software product. I hope this helps and I wish you luck. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-8466577147918743793?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/8466577147918743793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=8466577147918743793' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/8466577147918743793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/8466577147918743793'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/05/advice-for-software-entrepreneurs.html' title='Advice for Software Entrepreneurs'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-7105455544750629850</id><published>2009-05-16T15:00:00.000-07:00</published><updated>2009-05-16T17:27:30.268-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Grape'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><category scheme='http://www.blogger.com/atom/ns#' term='Gant'/><category scheme='http://www.blogger.com/atom/ns#' term='Ivy'/><category scheme='http://www.blogger.com/atom/ns#' term='Gradle'/><title type='text'>Maven: Not Evil But Not Great, It's Just Good Enough</title><content type='html'>I am getting really tired of "I hate Maven" sentiment. &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt; is not great but it is not pure evil either. Maven is the dominant build system for enterprise Java applications because:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Maven provides one good way of structuring projects, and severely punishes deterrence from the Maven Way and rewards compliance with powerful build system automation.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Maven has a wide array of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;plugins&lt;/span&gt; for most build tasks and it is easy to find information on many Maven &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;plugins&lt;/span&gt;. &lt;/li&gt;&lt;li&gt;Maven is the default standard for dependency management in popular Open Source projects. &lt;a href="http://ant.apache.org/ivy"&gt;Ivy&lt;/a&gt; provides a good alternative, but it will not be compelling until more Open Source projects switch to Ivy from Maven for dependency management.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The &lt;a href="http://code.google.com/p/q4e/"&gt;Q4E Maven &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;plugin&lt;/span&gt;&lt;/a&gt; for Eclipse makes using Maven in Eclipse enjoyable.&lt;/li&gt;&lt;li&gt;Getting started is easy. &lt;a href="http://www.jboss.com/products/seam/"&gt;Seam&lt;/a&gt;, &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; and &lt;a href="http://code.google.com/appengine/"&gt;Google GAE&lt;/a&gt; contain noteworthy alternative build systems, but each has its own set of drawbacks.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;One reason many people dislike Maven is the forced project structure and sequence of build operations for common tasks like application build and deployment. I used to be one of these people, but then I took a look at what my mountain of ant work really is. It is the same thing done over and over, but ever so slightly different. And, my desire to do things different was often misguided and not needed. In my experience consistency, especially in R&amp;amp;D is grossly underrated, probably because most good developers are individualists and feel the need to constantly make things better. Often times, Maven will punish this individualism. I used to hate Maven for this but now I realize the error of my ways.&lt;br /&gt;&lt;br /&gt;A second reason to dislike Maven is build slowness. I have seen this first hand, but the culprit is not Maven, it is Flex. Flex compiles take forever, so the project build/deploy takes forever. I already blogged about my disdain for Flex in this area, so I will refrain from rehashing those thoughts.&lt;br /&gt;&lt;br /&gt;The third reason a lot of people dislike Maven is stability. While Maven is quite stable, many of its &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;plugins&lt;/span&gt; are not, and it is really hard to figure out where things went wrong when a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;plugin&lt;/span&gt; fails. I think this is the double edged sword of Maven. Yes, the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;plugins&lt;/span&gt; keep you from writing mountains of ant targets, but they also hide how your build system really works from you. It is something that can be overcome, but you have to get over your hatred of Maven and learn its internals. The interesting thing is, if the problem was in an ant target that a fired employee wrote two years ago, the challenge would be identical, but your position would be worse. With Maven, you have the advantage of being able to Google for a solution.&lt;br /&gt;&lt;br /&gt;I'm going to add a fourth issue that may not be common but I've had to deal with it. When you have Eclipse and in particular &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;FlexBuilder&lt;/span&gt;, compiling and deploying non Java artifacts to a test server, but Maven is used to deploy Java based artifacts, weird things can happen. I believe there are two common root causes. Either Windows has inappropriate file locks that cause problems for Maven or there is a Flex/Java code mismatch. Maybe this is only an issue for Flex/Java projects that use Flex AS code generation, but I suspect others have experienced weirdness between various Eclipse builders and Maven.&lt;br /&gt;&lt;br /&gt;The last popular argument that anti-Maven people make has to do with the belief that the Maven &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;repos&lt;/span&gt; in the Open Source community are of little value. I disagree with them. I think &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;SpringSource&lt;/span&gt;, Red Hat, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Codehaus&lt;/span&gt; and others do a good job managing dependencies for the entire enterprise Java community. The &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;repos&lt;/span&gt; are not always perfect but there is great and free software that enables selective adoption of external dependency trees. Adopt either &lt;a href="http://www.jfrog.org/products.php"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;Artifactory&lt;/span&gt;&lt;/a&gt; or &lt;a href="http://nexus.sonatype.org/"&gt;Nexus&lt;/a&gt; and get the best of both worlds.&lt;br /&gt;&lt;br /&gt;In the end, you can either stick with Maven or move to an alternative build system. I do not believe Ant+Ivy is compelling, it is just the "do it yourself" build system that has a different set of problems yet results in the same overall complexity level, with one huge drawback. You will be the sole developer and maintainer of your Frankenstein build system. I am not ready to ditch Maven but I am keeping a close eye on alternative build technologies like &lt;a href="http://groovy.codehaus.org/Grape"&gt;Groovy Grape&lt;/a&gt; and &lt;a href="http://www.gradle.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;Gradle&lt;/span&gt;&lt;/a&gt;. And, I have already embraced &lt;a href="http://gant.codehaus.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;Gant&lt;/span&gt;&lt;/a&gt; in place of vanilla Ant. I know how to make Maven work, and I'm well versed in alternative build strategies, even deceptively simple alternatives like Grails. Maybe my insistence on sticking with Maven means I am evil. But, I hope it means that I am pragmatic and that I focus my effort on what really matters, building great software not a great build system. Maintaining a good, Maven based build system is not trivial but the alternative is not a walk in the park either.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-7105455544750629850?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/7105455544750629850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=7105455544750629850' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/7105455544750629850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/7105455544750629850'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/05/maven-not-evil-but-not-great-its-just.html' title='Maven: Not Evil But Not Great, It&apos;s Just Good Enough'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-1366729256444276787</id><published>2009-05-09T11:00:00.000-07:00</published><updated>2009-05-11T10:51:25.459-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='RIA'/><category scheme='http://www.blogger.com/atom/ns#' term='Community Choice'/><category scheme='http://www.blogger.com/atom/ns#' term='Sourceforge'/><category scheme='http://www.blogger.com/atom/ns#' term='Opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='Grails'/><category scheme='http://www.blogger.com/atom/ns#' term='Drools'/><title type='text'>Drools and Grails Should Win Community Choice Awards</title><content type='html'>&lt;div&gt;I submitted two nominations for the &lt;a href="http://sourceforge.net/community/nominations-are-open-for-the-2009-community-choice-awards/"&gt;Sourceforge.net community choice awards&lt;/a&gt; this year. My decision criteria was based on three key tenets:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Enterprise grade, compelling project that can be used to solve a wide variety of problems.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Under utilized but rapidly gaining momentum in the enterprise software development realm. In 2004 great projects like &lt;a href="http://hibernate.org/"&gt;Hibernate&lt;/a&gt; and &lt;a href="http://springframework.org/"&gt;Spring&lt;/a&gt; would have matched this criteria but five years later Hibernate/Spring are enterprise stalwarts.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Availability of vendor support and consulting services.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Grails&lt;/span&gt;&lt;br /&gt;Many organizations should seriously consider building all prototypes and most real applications in Grails. &lt;a href="http://grails.org/"&gt;Grails&lt;/a&gt; significantly reduces the lines of code required for an enterprise applica&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://sourceforge.net/community/cca09/nominate/?project_name=Grails&amp;amp;project_url=http://www.grails.org/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 151px; height: 137px;" src="http://sourceforge.net/images/cca/cca_nominate.png" alt="" border="0" /&gt;&lt;/a&gt;tion without forcing Rails like database conventions. Grails runs on a standard &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;JVM&lt;/span&gt; and it integrates with other frameworks better than anything else out there, including Seam. If your project leverages Spring, Hibernate, &lt;a href="http://static.springsource.org/spring-security/site/index.html"&gt;Spring Security&lt;/a&gt;(AKA &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Acegi&lt;/span&gt;), AJAX including (&lt;a href="http://code.google.com/webtoolkit/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;GWT&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://jquery.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;JQuery&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.prototypejs.org/"&gt;Prototype&lt;/a&gt;), then Grails needs to be considered. The two things that really set Grails apart are its &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;plug in&lt;/span&gt; based architecture and Groovy. Grails &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_6"&gt;plug ins&lt;/span&gt; provide a nice way to pull in and upgrade other frameworks. And the use of Groovy as the programming language allows Grails to make mundane tasks, like data bootstrapping, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;MVC&lt;/span&gt;(Model View Controller), security, and CRUD(Create Read Update Delete) incredibly streamlined. The end result is rapid application development without compromise. I joined the Grails party late but the &lt;a href="http://www.springsource.com/g2one"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;Sp&lt;/span&gt;&lt;/a&gt;&lt;a href="http://www.springsource.com/g2one"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;ringSource&lt;/span&gt; &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;acquisition&lt;/span&gt;&lt;/a&gt;, subsequent surge in downloads, and good &lt;a href="http://www.netbeans.org/community/releases/67/index.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Netbeans&lt;/span&gt; tooling&lt;/a&gt; have won me over. Grails has been around &lt;a href="http://www.grails.org/Release+History"&gt;since 2006&lt;/a&gt; and it is ready for the big leagues.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Drools&lt;/span&gt;&lt;br /&gt;Having worked for &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;JBoss&lt;/span&gt; and then Red Hat, I feel compelled to pick the new &lt;a href="http://jboss.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;JBoss&lt;/span&gt;.org&lt;/a&gt; heavy hitter. &lt;a href="http://www.jboss.org/drools/"&gt;Drools&lt;/a&gt; is the best way to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;de&lt;/span&gt;-couple business rules from Java code. Drools is fast, the &lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://sourceforge.net/community/cca09/nominate/?project_name=Drools&amp;amp;project_url=http://jboss.org/drools/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 151px; height: 137px;" src="http://sourceforge.net/images/cca/cca_nominate.png" alt="" border="0" /&gt;&lt;/a&gt;Eclipse &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;IDE&lt;/span&gt; tooling is good, and the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;BRMS&lt;/span&gt;(Business Rules Management System) makes it a serious threat to the proprietary competitors. Drools has some cool features, like &lt;a href="http://downloads.jboss.com/drools/docs/4.0.7.19894.GA/html/ch06s08.html"&gt;rule flow&lt;/a&gt;, robust &lt;a href="http://downloads.jboss.com/drools/docs/4.0.7.19894.GA/html/ch06s05.html#d0e3024"&gt;rule attributes&lt;/a&gt;, and useful &lt;a href="http://downloads.jboss.com/drools/docs/4.0.7.19894.GA/html/ch06s05.html#RuleLanguage-ConditionalElements"&gt;conditional elements.&lt;/a&gt; Drools is the Hibernate of the rules engine space. It is the best Open Source framework in its category, it is full featured enough to displace proprietary alternatives, and it fits nicely in any Java project. I think Drools will evolve into a full featured rules engine with &lt;a href="http://en.wikipedia.org/wiki/Complex_Event_Processing_%28CEP%29"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;CEP&lt;/span&gt;(Complex Event Processing)&lt;/a&gt; plus &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;BPM&lt;/span&gt;(Business Process Management). Drools has been around &lt;a href="http://en.wikipedia.org/wiki/Drools"&gt;since 2001&lt;/a&gt;, and it should used in all business rules intensive applications. If your project uses a proprietary rules engine, be on high alert. You might need to learn Drools or face being replaced.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;What projects are you voting for and why?&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-1366729256444276787?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/1366729256444276787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=1366729256444276787' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/1366729256444276787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/1366729256444276787'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/05/drools-and-grails-should-win-community.html' title='Drools and Grails Should Win Community Choice Awards'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-356526761705803235</id><published>2009-05-02T09:00:00.000-07:00</published><updated>2009-05-02T06:05:17.742-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Red Hat'/><category scheme='http://www.blogger.com/atom/ns#' term='OSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Service'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Will the Terrible Economy Help OSS Businesses Flourish?</title><content type='html'>Many still question the viability of the OSS(Open Source Software) business model, despite the fact that Red Hat has been profitable for quite some time. Maybe that is because there are no other profitable, publicly traded OSS companies. And, many people do not believe that Red Hat is a pure OSS company, and I agree with them. But, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;RHN&lt;/span&gt;(Red Hat Network) is a valuable &lt;span style="font-weight: bold;"&gt;service&lt;/span&gt; that warrants proprietary underpinnings. And, since Red Hat contributes the vast majority of its engineering resources to pure OSS development and maintenance, it deserves to be recognized as an OSS company.&lt;br /&gt;&lt;br /&gt;I bold the word &lt;span style="font-weight: bold;"&gt;service&lt;/span&gt; because that is how many OSS based companies will flourish, especially in down economies. Service is not about auditing customers to increase licensing revenue and gouging them into an operating loss. Service is about solving your customers' problems by bringing highly specialized knowledge and process to them. Companies like &lt;a href="http://www.blackducksoftware.com/"&gt;Black Duck Software&lt;/a&gt; get it and seem to be doing well, &lt;a href="http://news.google.com/news/url?sa=t&amp;amp;ct2=us%2F0_0_s_0_0_t&amp;amp;usg=AFQjCNHaOu5Nd37xUOpCQjaZukplRIzQqA&amp;amp;sig2=0tF2kVUC3f8bcqCoWo1ntQ&amp;amp;cid=1342456872&amp;amp;ei=R0L4SfCHDdywmAfX7-7MAg&amp;amp;rt=SEARCH&amp;amp;vm=STANDARD&amp;amp;url=http%3A%2F%2Fasterisk.tmcnet.com%2Ftopics%2Fopen-source%2Farticles%2F55115-black-duck-reckons-open-source-popularity-helped-its.htm"&gt;recent news post&lt;/a&gt;. Black Duck also contributes to the OSS community by providing &lt;a href="http://koders.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Koders&lt;/span&gt;.com&lt;/a&gt;, a useful source code search tool, to all.&lt;br /&gt;&lt;br /&gt;Other companies will follow this model, and they will succeed. And, one very large and profitable publicly traded company should be considered an OSS organization. Many will disagree with me on this but I believe Google is poster child for the next phase of OSS. I know they are one of the most secretive and proprietary companies in the world, but no one can deny that they are contributing an impressive amount of engineering effort to OSS. My running list includes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://code.google.com/"&gt;http://code.google.com/&lt;/a&gt; - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Sourceforge&lt;/span&gt; alternative, but far better.&lt;/li&gt;&lt;li&gt;&lt;a href="http://developer.android.com/"&gt;http://developer.android.com/&lt;/a&gt; - Pure OSS mobile platform, and soon to be the dominant mobile platform.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/webtoolkit/"&gt;http://code.google.com/webtoolkit/&lt;/a&gt; - AJAX framework for Java developers with Eclipse based tooling.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/apis/visualization/"&gt;http://code.google.com/apis/visualization/&lt;/a&gt; - Interesting OSS visualization &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;API&lt;/span&gt; for fancy charts and dashboards.&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/appengine/"&gt;http://code.google.com/appengine/&lt;/a&gt; - A free platform for building and hosting Python/Java applications with free access to their highly proprietary database technology.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/"&gt;http://www.blogger.com&lt;/a&gt; - Free blogger service that I use.&lt;/li&gt;&lt;li&gt;&lt;a href="http://docs.google.com/"&gt;http://docs.google.com&lt;/a&gt; - Free, hosted Microsoft Office alternative&lt;/li&gt;&lt;li&gt;&lt;a href="http://mail.google.com/"&gt;http://mail.google.com&lt;/a&gt; - Free email service&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.google.com/analytics/index.html"&gt;http://www.google.com/analytics/index.html&lt;/a&gt; - A free web site analysis service.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;All of the projects/services listed above help foster and promote the &lt;a href="http://www.dreamsongs.com/IHE/IHE-27.html"&gt;key tenets of the OSS movement&lt;/a&gt;.  But, I do not think &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt; is providing all of this free stuff out of the kindness of their hearts. Google understands that a strong OSS community increases its profit and reduces cost. That is great for &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt; and even better for the OSS community.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;Full Disclosure:&lt;/span&gt; I'm a former &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;JBoss&lt;/span&gt;/Red Hat employee, a &lt;a href="http://www.google.com/finance?client=ob&amp;amp;q=NASDAQ:GOOG"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;GOOG&lt;/span&gt;&lt;/a&gt; shareholder, and a loyal Google technology consumer. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-356526761705803235?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/356526761705803235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=356526761705803235' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/356526761705803235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/356526761705803235'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/04/will-terrible-economy-help-oss.html' title='Will the Terrible Economy Help OSS Businesses Flourish?'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-7434248333262516344</id><published>2009-04-24T16:33:00.000-07:00</published><updated>2009-04-25T11:39:45.166-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Training'/><category scheme='http://www.blogger.com/atom/ns#' term='RIA'/><category scheme='http://www.blogger.com/atom/ns#' term='Adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Strobe'/><category scheme='http://www.blogger.com/atom/ns#' term='Collaboration'/><title type='text'>What Will Strobe Mean For Enterprise Developers?</title><content type='html'>I just stumbled upon the news &lt;a href="http://www.rttnews.com/ArticleView.aspx?Id=916093&amp;amp;SMap=1"&gt;release&lt;/a&gt; of Adobe's new &lt;a href="http://www.adobe.com/products/strobe/"&gt;Strobe&lt;/a&gt; technology and I can't help but wonder what I will do with this technology. After thinking about it for a few minutes I came up with the following ideas:&lt;div&gt;&lt;ol&gt;&lt;li&gt;I receive a daily video feed of offshore work completed the day prior and have the ability to quickly record and publish a video myself. All videos are catalogued, and easily searched via a fancy Flex front-end.&lt;/li&gt;&lt;li&gt;Create training/mentoring material using a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;JIT&lt;/span&gt;(Just In Time) model. When I find that the same people continually get stuck &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_1"&gt;grokking&lt;/span&gt; the same problem, and that knowledge is hard to &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;disseminate&lt;/span&gt; via wiki, I record/publish/share my knowledge in video format.&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Not for me, but great for managers that like to talk but not listen! &lt;/span&gt;Record a "State of the Union" message that delivers information employees need to know, but Management is not quite ready to answer any questions around that information. Add content viewed confirmation hooks so that Management is informed when all employees have viewed the video.&lt;/li&gt;&lt;li&gt;Record and publish a high quality technology deep dive on my Mac in half a day or less. Post a link to my video on dzone, and charge a small $1 to view that content. I make $100 bucks and I have indisputable tech guru bragging rights.&lt;/li&gt;&lt;li&gt;Same as #4 but this time record a product demo and give the content away for free. My company makes more money, and I get to keep my job.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;I just hope our CTO doesn't hear about this technology because he'll come up with fifty different ideas, all deceptively straightforward until it's time to write some code.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-7434248333262516344?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/7434248333262516344/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=7434248333262516344' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/7434248333262516344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/7434248333262516344'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/04/what-will-strobe-mean-for-enterprise.html' title='What Will Strobe Mean For Enterprise Developers?'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-2095170757223699575</id><published>2009-04-18T06:03:00.000-07:00</published><updated>2009-04-19T08:06:27.777-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='RIA'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Flex Candy is Sweet, but it'll Make Your Tummy Hurt</title><content type='html'>I've been working on a flex project over a year. I started out enamored with the super sweet eye candy that's easily produced in Flex. And, although most of my contribution to the project has been  via back-end code and CI implementation, I've participated in the creation of some really cool stuff. But, just like the real thing, too much Flex candy will cause an upset stomach. I'm a little sick of Flex, and here's why:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Slow compile time &lt;/span&gt;- This gripe is pretty much a known fact to anyone working on a decent size Flex project. To make matters worse alternatives like Grails + &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;GWT&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;jQuery&lt;/span&gt; or &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;ExtJS&lt;/span&gt; shine in this area. I know slow compile time will be addressed in Flex 4, but I think it's a shame that Adobe hasn't made it better for Flex 3 developers. I feel like I've traveled back in time to my &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;WebSphere&lt;/span&gt; 4 days. Waiting 2+ minutes for a code round trip should be long gone by now but Adobe has brought it back.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Unit test challenged&lt;/span&gt; - We found &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Flexunit&lt;/span&gt; to be an inadequate way to test our Flex code. So, we turned our attention to &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;HP's&lt;/span&gt; Quick Test Professional (too expensive to even consider) and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Borland's&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;SilkTest&lt;/span&gt;(doesn't work). We did find a good tool, &lt;a href="http://riatest.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;RIATest&lt;/span&gt;&lt;/a&gt;, but we had to wait for it to mature. We also had issues testing some custom components but we were able to make our code test tool friendly. Our latest unit test challenge involves a Flex component vendor that is not compatible with functional test tools. Our workaround is to limit the use of the vendor components to a small number of screens and test around that area of the application.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Load test challenged&lt;/span&gt; - &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;JMeter&lt;/span&gt; kind of works, but it doesn't help you pinpoint &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;AMF&lt;/span&gt; bottlenecks and it doesn't provide an easy way to interrogate or view the AMF requests/responses in plain text. &lt;a href="http://www.radview.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;WebLOAD&lt;/span&gt;&lt;/a&gt; and &lt;a href="http://www.neotys.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;NeoLoad&lt;/span&gt;&lt;/a&gt; both work. Neither tool is cheap, but if you are committed to Flex, pick one and use it. I prefer &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;NeoLoad&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;Remoting&lt;/span&gt; challenged without some custom &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;mojo&lt;/span&gt;&lt;/span&gt; - I can't share a lot about how we addressed the challenge of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;remoting&lt;/span&gt; to a large set of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;POJOs&lt;/span&gt;, but I can tell you that you will want to either create custom code to reduce the Flex XML boilerplate code, or go with &lt;a href="http://www.graniteds.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;GraniteDS&lt;/span&gt;&lt;/a&gt;'s new Tide stuff. If you want to support both HTTP and &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;HTTPS&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;remoting&lt;/span&gt; for the same objects without 2 sets of configuration files, you're going to need some custom AS code. Lastly, if you want strongly typed AS objects, you have to use AS code generators. AJAX isn't any better here, but if Adobe can deliver strong typing to POJOs without code generation, it'll be very nice. Right now, it's barely acceptable to some and totally out of the question for anti-code generator folks. I know that FlexBuilder has some nice stuff for SOAP, but we're not interested in webservices based remoting.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Maven challenged &lt;/span&gt;- We were able to integrate flex compilation into our maven scripts but it wasn't easy. And, we've had issues with Maven and Flex from Day 1. I think most of the issues are centered around our desire to compile/deploy Flex code using FlexBuilder. We need this to keep developers productive. But, command line oriented developers and our CI tool need to use Maven to compile and deploy both Flex and Java projects. FlexBuilder and Maven can step on each other, especially on Windows Vista, resulting in weird file write issues. I can't tell you how many times I've had a shouting contest over this simple statement, "Did you do a clean build?". The answer's always 'yes', but often times a real clean build resolves all issues. That's easier said &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;than&lt;/span&gt; done when Windows lets Maven believe that a file has been deleted, when it really has not.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Custom components screw up &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;FlexBuilder&lt;/span&gt; design view&lt;/span&gt; - This is one of my personal gripes, mainly because I'm not a hard core AS/&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;MXML&lt;/span&gt; guy. I like to see what the screen's going to look like in design view. Unfortunately, when you create custom &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;MXML&lt;/span&gt; controls, the design view breaks. Maybe, we didn't write our controls correctly. Or, maybe I have to do something special in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;FlexBuilder&lt;/span&gt; for those controls to be recognized. But, I don't think either is the case. It's just the way things are when you go custom in Flex. You still have code completion for both &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;MXML&lt;/span&gt; and AS, so real Flex studs remain highly productive. It's the GUI challenged guys that suffer. And, that suffering would be greatly reduced if my #1 complaint was resolved.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;If Adobe can resolve gripe #1, Flex adoption will increase, otherwise RIA teams will migrate to other options. The Open Source community is doing a good job addressing #4 and #5 but a little more help from Adobe wouldn't hurt. I like Flex but I'm very happy that it's not the only viable RIA option. Adobe has stiff competition and I believe the next big battle ground is mobile. Will Flash be the preferred RIA platform for mobile devices? It's too early to tell, but my vote is, "No".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-2095170757223699575?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/2095170757223699575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=2095170757223699575' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/2095170757223699575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/2095170757223699575'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2009/04/flex-candy-is-sweet-but-itll-make-your.html' title='Flex Candy is Sweet, but it&apos;ll Make Your Tummy Hurt'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-6824007783087483519</id><published>2008-09-26T18:17:00.000-07:00</published><updated>2008-09-26T19:35:57.117-07:00</updated><title type='text'>My Artifactory Versus Nexus Experience</title><content type='html'>Like many software development teams, my team needed a decent internal maven repository. So, one of my trusted colleagues who just happens to be the smartest Java guy I know setup &lt;a href="http://www.jfrog.org/sites/artifactory/latest/"&gt;Artifactory&lt;/a&gt; 1.2.5. For those of you that haven't taken the time to setup an internal Maven repository, just know that you can get up and running with very little effort.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Some of the benefits of an internal maven repository&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Proxy and cache JARs from 3rd party repos. This will usually decrease maven build time for first time builders. Of course, subsequent builds usually pull jars locally from the developer's .m2 cache.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Turn off proxies once all needed 3rd party JARs are available in your repo. This will reduce the risk of introducing broken dependencies, corrupt JARs or unwanted dependencies.&lt;/li&gt;&lt;li&gt;Deploy internally developed artifacts to a repository. Those artifacts can be downloaded by other internal development teams, but unavailable to the general public. Obviously, this is desirable for software companies and corporate internal IT teams.&lt;/li&gt;&lt;/ol&gt;There are other benefits, but these are the big three that motivated our team to setup a maven repository. We chose Artifactory 1.2.5 with default settings.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Some key aspects to Artifactory&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Jetty based unzip and go solution. But a WAR is available that can be deployed to Tomcat if desired.&lt;/li&gt;&lt;li style="font-style: italic;"&gt;Artifactory uses a JCR based repository called JackRabbit. I really don't like this design choice.&lt;/li&gt;&lt;li&gt;Artifactory is user friendly and relatively straightforward to setup, assuming you are comfortable hand editing a single XML file for configuration.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;If you want to run Artifactory as a windows service, you must create your own JavaService wrapper.&lt;/li&gt;&lt;li&gt;There is adequate security and user/role management.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Artifactory would still be in place right now if it weren't for one serious problem. Once our WAR became rather large (45MB), we started experiencing 500 errors that appeared to be caused by JCR node lock issues that made it impossible to deploy new internal artifacts. This crippled our development team in the middle of a very important sprint. In all fairness to the Artifactory guys, I didn't reach out to them for help. I googled for 1.2.5 issues and a common fix suggestion was to upgrade to 1.3.0-Beta. After googling for 1.3.0 upgrade suggestions, it became apparent to me that I would have to re-install and re-configure Artifactory. Since my manager, the second smartest Java guy I know sent me a link to &lt;a href="http://nexus.sonatype.org/"&gt;Nexus&lt;/a&gt; a couple weeks earlier, I felt compelled to give it a go.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Here's my take on Nexus&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Nexus is a Jetty unzip and go only offering. There is no easy way to run it in Tomcat.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is no need to hand edit a XML config file. All of the setup can be done through the GUI. The GUI is ExtJS based and prettier than Artifactory, although I don't give a hoot about that.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Nexus provides a JavaService wrapper for Windows.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Nexus has a really nice feature that allows you to merge several repositories and publish them via a single URL. There is no need to have multiple URL entries in your pom.xml file or conduct tedious repository administration.&lt;/li&gt;&lt;li&gt;Nexus stores artifacts on the file system. It is easy to browse/fix these files outside of the GUI if something goes wrong.&lt;/li&gt;&lt;li&gt;Nexus time stamps all deployed artifacts. I'm not a huge fan of this because it makes the disk consumption higher than artifactory, but you can setup a scheduled task or cron job to clean up old JARs.&lt;/li&gt;&lt;li&gt;Nexus URLs for the latest version of an artifact are redirect URLs. Artifactory URLs don't ue re-directs and are easier to embed in scripts.&lt;/li&gt;&lt;li&gt;There is adequate security and user/role management.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Verdict&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The Artifactory deploy issue confirmed my hatred of Jackrabbit. There are times when a JCR repository makes sense, however I don't believe a maven repository warrants a JCR backend. I think a vanilla fileystem based repository makes more sense and is easier to manage and fix. I think both projects are very good choices, but I believe Nexus 1.0.0 is better than Artifactory 1.2.5. Since both projects are in active development it is important for you to assess the latest stable offering of both projects and pick the one you like the best.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-6824007783087483519?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/6824007783087483519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=6824007783087483519' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/6824007783087483519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/6824007783087483519'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2008/09/my-artifactory-versus-nexus-experience.html' title='My Artifactory Versus Nexus Experience'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-2961867073130511151</id><published>2008-09-01T16:03:00.000-07:00</published><updated>2008-09-02T04:31:06.420-07:00</updated><title type='text'>Extend Your Favorite Framework with Custom Annotations</title><content type='html'>&lt;strong&gt;&lt;br /&gt;Introduction&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Java annotations have replaced a great deal of XML wiring in enterprise applications. Hibernate, Seam Spring and EJB3 all provide annotation alternatives to XML wiring. The end result is faster development with IDE code assist and a significant reduction in the lines of code required to annotate versus XML wire. Now, that annotations are widely used as a alternative to XML wiring, it is important for developers to take annotations to the next level. When your favorite framework lacks a specific annotation, don't panic. When you see that a @Whatever seems to magically provide something special, don't get intimidated by its mysticism. Java annotation chrome isn't hard to do. Just follow a few simple steps, and you'll have everyone using your @Whatever voodoo magic.&lt;/p&gt;&lt;strong&gt;Write the Custom Annotation&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;To keep things simple, the custom annotation for this blog is going to be a simple audit annotation. The audit annotation will write output to the console, but we will create a few annotation parameters that affect auditor behavior:&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;i&gt;Audit.java&lt;/i&gt;&lt;br /&gt;&lt;pre class="blog-pre"&gt;@Target(ElementType.METHOD)&lt;br /&gt;@Retention(RetentionPolicy.RUNTIME)&lt;br /&gt;@Documented&lt;br /&gt;public @interface Audit {&lt;br /&gt;&lt;br /&gt;   AuditLevel auditLevel() default AuditLevel.MEDIUM;&lt;br /&gt;   String message() default "Audit Message";&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;i&gt;AuditLevel.java&lt;/i&gt;&lt;br /&gt;&lt;pre class="blog-pre"&gt;public enum AuditLevel {&lt;br /&gt;&lt;br /&gt;   LOW,&lt;br /&gt;   MEDIUM,&lt;br /&gt;   HIGH&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;This is a standard runtime annotation that can be added to any method declaration. Notice that the annotation does not actually do anything. It is just a marker with meta-data. I added an enumeration because a lot of annotations take enumerations as arguments.&lt;br /&gt;&lt;/p&gt;&lt;strong&gt;Find a Interception Point&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;Intercepters are common in frameworks and the major frameworks have at least one good way to attach custom annotations. How you intercept will depend on the type of application and annotation but the most common options are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;Spring AOP Interceptor&lt;/i&gt; - This approach is pretty much a catch all, and can be applied when request listeners or framework specific extensions are not desired. More information about Spring AOP can be found &lt;a href="http://static.springframework.org/spring/docs/2.5.x/reference/aop.html"&gt;here&lt;/a&gt;. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i&gt;Framework Specific Extension Points&lt;/i&gt; - Hibernate Validator is the poster child for excellence in providing interception hooks for custom annotation processing. More documentation on this approach can ben found &lt;a href="http://www.hibernate.org/hib_docs/validator/reference/en/html/validator-defineconstraints.html#validator-defineconstraints-own"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;i&gt;Request listeners (often configured in web.xml)&lt;/i&gt; - If you're building a web application, this approach is the most straightforward way to intercept and attach custom annotation processing. However, testability, flexibility and elegance are compromised quite a bit. This isn't the best option for all annotations, especially annotations that are not request centric, but if you want to avoid AOP or framework extension points, this approach will work. Here are a few common listeners that can be sub-classed:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Granite/Spring - &lt;i&gt;org.springframework.web.context.request.RequestContextListener&lt;/i&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Spring MVC - &lt;i&gt;org.springframework.web.servlet.DispatcherServlet&lt;/i&gt;&lt;/li&gt;&lt;br /&gt;   &lt;li&gt;Seam - &lt;i&gt;org.jboss.seam.servlet.SeamListener&lt;/i&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Struts - &lt;i&gt;org.apache.struts.action.ActionServlet&lt;/i&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;i&gt;EJB3 Interceptors&lt;/i&gt; - EJB3 interceptors behave like Spring AOP interceptors, but they are less flexible. I'm not a fan of EJB3 interceptors, but they do work and can be used in EJB3 based applications. More information on EJB3 interceptors can be found &lt;a href="http://docs.jboss.org/ejb3/app-server/tutorial/interceptor/interceptor.html"&gt;here&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Once, you've made a decision on the proper interception point, it's time to attach your custom annotation processing logic. This article will demonstrate a Spring AOP Interceptor that can intercept pretty much any call. This example can be converted to a Request Listener or EJB3 based implementation, but why bother when Spring AOP gets the job done?&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;i&gt;SystemArchitecture.java&lt;/i&gt;&lt;br /&gt;&lt;pre class="blog-pre"&gt;import org.aspectj.lang.annotation.Aspect;&lt;br /&gt;import org.aspectj.lang.annotation.Pointcut;&lt;br /&gt;&lt;br /&gt;@Aspect&lt;br /&gt;public class SystemArchitecture {&lt;br /&gt;&lt;br /&gt;   @Pointcut("bean(*Service)")&lt;br /&gt;   public void inServiceLayer() {}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;This class defines our point cut. The point cut is just a fancy way of saying, "Spring bean services with a name that ends in 'Service' are going to be inspected for interception." It does not mean that every method will be intercepted, just inspected.&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;i&gt;ServiceInterceptor.java&lt;/i&gt;&lt;br /&gt;&lt;pre class="blog-pre"&gt;import org.aspectj.lang.JoinPoint;&lt;br /&gt;import org.aspectj.lang.annotation.Aspect;&lt;br /&gt;import org.aspectj.lang.annotation.Before;&lt;br /&gt;&lt;br /&gt;@Aspect&lt;br /&gt;public class ServiceInterceptor {&lt;br /&gt;@Before(value="cfossguy.examples.annotation.SystemArchitecture.inServiceLayer()" +&lt;br /&gt;           "&amp;amp;&amp;amp; target(bean) " +&lt;br /&gt;           "&amp;amp;&amp;amp; @annotation(cfossguy.examples.annotation.Audit)" +&lt;br /&gt;           "&amp;amp;&amp;amp; @annotation(auditable)",&lt;br /&gt;     argNames="bean,auditable")&lt;br /&gt;&lt;br /&gt;   public void performAudit(JoinPoint jp, Object bean, Audit auditable) {&lt;br /&gt;&lt;br /&gt;      System.out.println(String.format("Audit Level: %s",auditable.auditLevel()));&lt;br /&gt;      System.out.println(String.format("Audit Message: %s",auditable.message()));&lt;br /&gt;      System.out.println(String.format("Bean Called: %s", bean.getClass().getName()));&lt;br /&gt;      System.out.println(String.format("Method Called: %s", jp.getSignature().getName()));&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;ServiceInterceptor.java is where the real magic happens:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;There is a @Before annotation declaration that starts with a reference to the SystemArchitecture point cut&lt;/li&gt;&lt;li&gt;If the point cut contains a spring bean, it'll be passed as a argument named "bean"&lt;/li&gt;&lt;li&gt;If the cfossguy.examples.annotation.Audit annotation is present, it'll be passed as a argument named "auditable"&lt;/li&gt;&lt;li&gt;The performAudit() will use the annotation meta-data and target bean instance to display console output&lt;/li&gt;&lt;/ol&gt;It is important to note that the SystemArchitecture.java can contain several point cuts. If there are data access centric methods another declaration like this can be added:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;SystemArchitecture.java&lt;/i&gt;&lt;br /&gt;&lt;pre class="blog-pre"&gt;@Pointcut("bean(*Dao)")&lt;br /&gt;void inDataAccessLayer() {}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;The same rules apply for ServiceInterceptor.java. Additional @Before, @After or @AroundInvoke interceptors can be defined.&lt;br /&gt;Lastly, here's the XML wiring required to make all of the annotation magic:&lt;br /&gt;&lt;blockquote&gt;&lt;i&gt;application-context.xml&lt;/i&gt;&lt;br /&gt;&lt;pre class="blog-pre"&gt;&amp;#060;beans xmlns="http://www.springframework.org/schema/beans"&lt;br /&gt;  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" &lt;br /&gt;  xmlns:context="http://www.springframework.org/schema/context"&lt;br /&gt;  xmlns:aop="http://www.springframework.org/schema/aop" &lt;br /&gt;  xsi:schemaLocation="http://www.springframework.org/schema/beans &lt;br /&gt;           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd&lt;br /&gt;           http://www.springframework.org/schema/context &lt;br /&gt;           http://www.springframework.org/schema/context/spring-context-2.5.xsd&lt;br /&gt;           http://www.springframework.org/schema/aop &lt;br /&gt;           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"&amp;#062;&lt;br /&gt; &lt;br /&gt; &amp;#060;aop:aspectj-autoproxy /&amp;#062;&lt;br /&gt; &amp;#060;context:component-scan base-package="cfossguy.examples.service"  /&amp;#062;&lt;br /&gt; &amp;#060;bean id="pointcutMgr" class="cfossguy.examples.annotation.SystemArchitecture"/&amp;#062;&lt;br /&gt; &amp;#060;bean id="serviceInterceptor" class="cfossguy.examples.annotation.ServiceInterceptor"/&amp;#062;&lt;br /&gt;&amp;#060;/beans&amp;#062;&lt;/pre&gt;&lt;/blockquote&gt;There are only four real lines of code here:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Tell Spring that we want to enable AOP&lt;/li&gt;&lt;li&gt;A component scanner that will process any spring annotations for classes in our business service package&lt;/li&gt;&lt;li&gt;A bean declaration for the point cut manager&lt;/li&gt;&lt;li&gt;A bean declaration for the service interceptor&lt;/li&gt;&lt;/ol&gt;&lt;strong&gt;Use The Annotation in your Code&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;This spring bean service has 2 methods. One method has our custom annotation, while the other does not. &lt;/p&gt;&lt;blockquote&gt;&lt;i&gt;BizService.java&lt;/i&gt;&lt;br /&gt;&lt;pre class="blog-pre"&gt;package cfossguy.examples.service;&lt;br /&gt;@Service(value = "BizService")&lt;br /&gt;public class BizService {&lt;br /&gt;&lt;br /&gt;@Audit(message = "Something Important Happened")&lt;br /&gt;public void doSomethingImportant() {&lt;br /&gt;   System.out.println("Important Business Service Pre-pended by a audit message");&lt;br /&gt;   System.out.println("------------------------------------");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void doSomethingStupid() {&lt;br /&gt;   System.out.println("Stupid Business Service With No audit message");&lt;br /&gt;   System.out.println("------------------------------------");&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;There are a few things worth mentioning here:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The package declaration matches the component scan entry in application-context.xml.&lt;/li&gt;   &lt;li&gt;Configuration by exception is leveraged. Since the default AuditLevel is "MEDIUM", it does not need to be declared in the annotation, if that's the proper audit level for this method.&lt;/li&gt;   &lt;li&gt;The method missing @Audit annotation will not have an audit message.&lt;/li&gt; &lt;/ul&gt;And here's the console output:&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="blog-pre"&gt;Audit Level: MEDIUM&lt;br /&gt;Audit Message: Something Important Happened&lt;br /&gt;Bean Called: cfossguy.examples.service.BizService&lt;br /&gt;Method Called: doSomethingImportant&lt;br /&gt;Important Business Service Pre-pended by a audit message&lt;br /&gt;------------------------------------&lt;br /&gt;Stupid Business Service With No audit message&lt;br /&gt;------------------------------------&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;It appears that the annotation is behaving correctly. The audit level, message and target bean details are displayed. And, the "Stupid" business service method didn't get intercepted or audited.&lt;/p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br /&gt;&lt;p&gt;There isn't a lot of work involved in creating custom annotations. Most of the effort involves runtime interception so that the annotation declaration actually changes the behavior of your code. Hopefully this reference implementation will help you find a way to "chrome" up your code. If you are interested in the source for this article, email me at: &lt;a href="mailto:cfossguy@gmail.com"&gt;cfossguy@gmail.com&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-2961867073130511151?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/2961867073130511151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=2961867073130511151' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/2961867073130511151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/2961867073130511151'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2008/09/extend-your-favorite-framework-with.html' title='Extend Your Favorite Framework with Custom Annotations'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-7497334732540770657</id><published>2007-09-11T06:15:00.000-07:00</published><updated>2008-08-24T14:12:26.414-07:00</updated><title type='text'>Getting Seam, Seam-gen and Tomcat to Work Well</title><content type='html'>I recently presented on &lt;a href="http://www.redhat.com/developers/rhds/index.html"&gt;Red Hat Developer Studio&lt;/a&gt; at the &lt;a href="http://www.therichwebexperience.com/speaker_topic_view.jsp?topicId=436"&gt;Rich Web Experience&lt;/a&gt; conference in San Jose CA and the following question was asked:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;What steps are involved in getting seam-gen to work with Tomcat?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;My answer to this question was pretty lame. I said, it should work. When pressed for a more specific answer as to whether seam-gen would work well with Tomcat, I said that it should work with maybe a tweak or two to the seam-gen scripts. Then, I admitted that I had not actually tried to run seam-gen with standalone Tomcat, but I still didn't think it would be hard to get working. After a few restless nights, I decided to bite the bullet and get Tomcat 6, Seam 2.0.0-Beta1 and seam-gen to play nice together. It turns out that it's not all that hard to get everything working, but there are a few noteworthy things that must be done:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Configuration Steps&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;It's best to install the embedded ejb3 container in Tomcat 6. Instructions for doing that can be found in the Seam reference guide located &lt;a href="http://docs.jboss.com/seam/2.0.0.B1/reference/en/html/configuration.html#config.install.embedded"&gt;here&lt;/a&gt;. The embedded ejb3 container will provide datasource management, JTA and full support for EJB3. While Seam applications can be run without using the embedded ejb3 container, I took the path of least resistance and installed embedded ejb3.&lt;/li&gt;&lt;li&gt;This step is not documented as far as I can tell, but it was required for me to get JSF working properly in Tomcat. Copy the following JSF JAR files into the &lt;span style="font-style: italic;"&gt;$TOMCAT_HOME/lib&lt;/span&gt; directory: &lt;span style="font-style: italic;"&gt;jsf-api.jar, jsf-facelets.jar&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;jsf-impl.jar.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;The seam-gen project build script needs to be changed so that the "deploy", "explode" and "restart" targets work correctly. This can be accomplished by overwriting the project build.xml template in seam-gen. The file is located at &lt;span style="font-style: italic;"&gt;$SEAM_HOME/seam-gen/build-scripts/build-war.xml&lt;/span&gt;. If you're an ant guru, the changed lines will be of interest. Otherwise, just give the attached &lt;a href="http://wiki.jboss.org/wiki/attach?page=JBossSeamGenAndTomcat%2Fbuild-war.xml"&gt;build-war.xml&lt;/a&gt; file the benefit of the doubt.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Using seam-gen from the Command Line&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;cd to &lt;span style="font-style: italic;"&gt;$SEAM_HOME&lt;/span&gt;&lt;/li&gt;&lt;li&gt;type: &lt;span style="font-style: italic;"&gt;./seam setup &lt;/span&gt;(behaves exactly the same as it would without our tweaks)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Make sure the &lt;span style="font-style: italic;"&gt;"Deploy as an EAR or WAR"&lt;/span&gt; value is: &lt;span style="font-style: italic;"&gt;"war"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;type: &lt;span style="font-style: italic;"&gt;./seam new-project &lt;/span&gt;(behaves exactly the same as it would without our tweaks)&lt;/li&gt;&lt;li&gt;edit the project's &lt;span style="font-style: italic;"&gt;build.properties&lt;/span&gt; file:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Add a "tomcat.home" entry&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;type: &lt;span style="font-style: italic;"&gt;./seam explode &lt;/span&gt;(custom build script logic is executed, and the Seam WAR file and it's datasource are deployed properly)&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;WAR gets copied to: &lt;span style="font-style: italic;"&gt;$TOMCAT_HOME/webapps&lt;/span&gt;&lt;/li&gt;&lt;li&gt;datasource gets copied to&lt;span style="font-style: italic;"&gt;: $TOMCAT_HOME/lib/deploy&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;Using seam-gen in Red Hat Developer Studio&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li style="font-style: italic;"&gt;Start RHDS&lt;br /&gt;&lt;/li&gt;&lt;li style="font-style: italic;"&gt;click: Run -&gt; Seam Gen -&gt; Setup/Configuration -&gt; Setup&lt;/li&gt;&lt;li&gt;make sure the &lt;span style="font-style: italic;"&gt;"Deploy as an EAR or WAR"&lt;/span&gt; value is: &lt;span style="font-style: italic;"&gt;"war"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;let RHDS create a new project. But, once the project is created, just know that it didn't get deployed properly.&lt;/li&gt;&lt;li&gt;edit the project's &lt;span style="font-style: italic;"&gt;build.properties&lt;/span&gt; file&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Add a "tomcat.home" entry&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;select the project folder and type "F5"&lt;/li&gt;&lt;li&gt;now, the exploded WAR and datasource will be deployed to the right place&lt;/li&gt;&lt;/ol&gt;Of course, it's easier to just use RHDS with JBossAS, but if you feel the need to use standalone Tomcat, these instructions should get you up and running.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-7497334732540770657?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/7497334732540770657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=7497334732540770657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/7497334732540770657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/7497334732540770657'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2007/09/how-to-get-seam-and-tomcat-to-working.html' title='Getting Seam, Seam-gen and Tomcat to Work Well'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-4142219301276430648</id><published>2007-07-09T09:14:00.000-07:00</published><updated>2007-07-09T09:22:17.842-07:00</updated><title type='text'>Looks like a good JBoss Host Provider</title><content type='html'>Plan pricing is as low as $20/per month with simple plans ranging from 256MB RAM, 10GB storage, 100GB bandwidth ($20/month) to 2GB RAM, 80GB storage, 800GB bandwidth ($140/month). Not the cheapest I've seen, but looks to be a good choice for the power hoster that just wants root on a decent linux box!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.slicehost.com/"&gt;http://www.slicehost.com/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-4142219301276430648?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/4142219301276430648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=4142219301276430648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/4142219301276430648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/4142219301276430648'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2007/07/looks-like-good-jboss-host-provider.html' title='Looks like a good JBoss Host Provider'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-133898670336007031.post-8078620859646158230</id><published>2007-07-09T05:00:00.000-07:00</published><updated>2007-07-12T11:17:18.707-07:00</updated><title type='text'>Java Client to native ESB Listener</title><content type='html'>&lt;span style=";font-family:verdana;font-size:100%;"  &gt;Their are 2 ways to talk directly to a JBoss ESB 4.2 listener via a Java client. This comes in handy when you want to communicate directly with an internal ESB listener, bypassing the gateway listener:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;&lt;span style="font-family:arial;"&gt;Approach #1 &lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:85%;" &gt;&lt;span style="font-family:arial;"&gt;- Quickstart/Unit Tests Only (Closes JMS connection pools)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote  style="font-style: italic;font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;//Setting the ConnectionFactory such that it will use scout&lt;/span&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;System.setProperty("javax.xml.registry.ConnectionFactoryClass",&lt;br /&gt;               "org.apache.ws.scout.registry.ConnectionFactoryImpl");&lt;br /&gt;&lt;br /&gt;Message esbMessage = MessageFactory.getInstance().getMessage();&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;   Call    call = new Call();&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;   call.setMessageID(new URI(UUID.randomUUID().toString()));&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;   esbMessage.getHeader().setCall(call);&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;        &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;   // set body contents with args[2], and send&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;   esbMessage.getBody().setByteArray(args[2].getBytes());&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;        &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;span style="font-size:85%;"&gt;ListenerUtil.tryToDeliver(esbMessage, args[0], args[1]);&lt;/span&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;font-family:verdana;font-size:85%;"  &gt;Approach #2 - Recommended for Most direct EPR calls&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;blockquote  style="font-style: italic;font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;//Setting the ConnectionFactory such that it will use scout&lt;br /&gt;System.setProperty("javax.xml.registry.ConnectionFactoryClass",&lt;br /&gt;               "org.apache.ws.scout.registry.ConnectionFactoryImpl");&lt;br /&gt;MessageDeliveryAdapter deliveryAdapter;&lt;br /&gt;Message requestMessage;&lt;br /&gt;Message replyMessage = null;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;         &lt;span style=";font-family:verdana;font-size:85%;"  &gt; // Create the delivery adapter for the target service (cache it)&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;    deliveryAdapter = new &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;MessageDeliveryAdapter("MyServiceCategory", "MyService");&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=";font-family:verdana;font-size:85%;"  &gt;&lt;br /&gt;// Create and populate the request message...&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=";font-family:verdana;font-size:85%;"  &gt;   requestMessage =  &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;MessageFactory.getInstance().getMessage(MessageType.JBOSS_XML);&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;   &lt;span style=";font-family:verdana;font-size:85%;"  &gt;requestMessage.getBody().setByteArray(toWhom.getBytes()); //&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;   &lt;span style=";font-family:verdana;font-size:85%;"  &gt;inject the value from the WS client&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=";font-family:verdana;font-size:85%;"  &gt;&lt;br /&gt;// Deliver the request message synchronously - timeout after 20 &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;seconds... &lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;   &lt;span style=";font-family:verdana;font-size:85%;"  &gt;replyMessage = deliveryAdapter.deliverSync(requestMessage,&lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;20000);&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;   &lt;span style=";font-family:verdana;font-size:85%;"  &gt;if (replyMessage != null) {&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;results = new String(replyMessage.getBody().getContents());&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=";font-family:verdana;font-size:85%;"  &gt;   }&lt;br /&gt;else {&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;results = "Hello World: " + toWhom + " on " + new &lt;/span&gt;&lt;span style=";font-family:verdana;font-size:85%;"  &gt;java.util.Date();&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;   &lt;span style=";font-family:verdana;font-size:85%;"  &gt;}&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/133898670336007031-8078620859646158230?l=cfossguy.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cfossguy.blogspot.com/feeds/8078620859646158230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=133898670336007031&amp;postID=8078620859646158230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/8078620859646158230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/133898670336007031/posts/default/8078620859646158230'/><link rel='alternate' type='text/html' href='http://cfossguy.blogspot.com/2007/07/java-client-to-native-esb-listener.html' title='Java Client to native ESB Listener'/><author><name>James Williams</name><uri>http://www.blogger.com/profile/15267080015777583054</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://3.bp.blogspot.com/__z-iCGo952g/SLKd_gzMt0I/AAAAAAAAABw/ne7x6TZcOJU/S220/1717_williams_medium.jpg'/></author><thr:total>0</thr:total></entry></feed>
