<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;DEEDQX04eCp7ImA9WhBaE0Q.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031</id><updated>2013-05-24T04:57:50.330-07:00</updated><category term="OpenShift Development" /><category term="Spring Java Development" /><category term="OpenShift" /><category term="JBoss" /><category term="Google App Engine Development" /><category term="Java EE" /><category term="Scala Development" /><category term="Event Notification" /><category term="Spring Development" /><category term="Apache Karaf" /><category term="Programmer's Hacks" /><category term="Java Web Development" /><category term="Java Tips and Tricks" /><category term="Java EE Development" /><category term="Facebook" /><category term="Domain-Driven Development" /><category term="Enterprise OSGi" /><title>Spring vs Java EE Web Dev</title><subtitle type="html">Unleashing the Enterprise &amp;amp; Mobile Java ecosystem</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>140</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/springjavaee" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="springjavaee" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">springjavaee</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;C0YAQH05fCp7ImA9WhNUFk4.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-7648667104878006172</id><published>2012-12-29T19:12:00.002-08:00</published><updated>2013-01-07T23:45:41.324-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-01-07T23:45:41.324-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Enterprise OSGi" /><category scheme="http://www.blogger.com/atom/ns#" term="Apache Karaf" /><title>Setting Up logentries for OSGi Applications in Apache Karaf</title><content type="html">&lt;h2&gt;


 
 
 
 What You'll Get
&lt;/h2&gt;
&lt;style type="text/css"&gt;
 &lt;!--
  @page { margin: 0.79in }
  PRE { color: #008000 }
  PRE.western { font-family: "Liberation Mono", monospace; font-size: 9pt }
  PRE.cjk { font-family: "DejaVu Sans", monospace }
  H1 { margin-bottom: 0.08in }
  H1.western { font-family: "Liberation Sans", sans-serif; font-size: 16pt }
  H1.cjk { font-family: "DejaVu Sans"; font-size: 16pt }
  H1.ctl { font-family: "Lohit Hindi"; font-size: 16pt }
  P { margin-bottom: 0.08in; line-height: 120% }
  P.western { font-family: "Liberation Serif", serif; font-size: 11pt }
  P.cjk { font-size: 10pt }
  CODE { color: #008000 }
  CODE.western { font-family: "Liberation Mono", monospace }
  CODE.cjk { font-family: "DejaVu Sans", monospace; font-size: 10pt }
  A:link { so-language: zxx }
 &lt;/style&gt;--&amp;gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-4AjG1_tpsCY/UN-wOZ_L5HI/AAAAAAAAAuw/T3dUlzjojgc/s1600/logentries-karaf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="462" src="http://2.bp.blogspot.com/-4AjG1_tpsCY/UN-wOZ_L5HI/AAAAAAAAAuw/T3dUlzjojgc/s640/logentries-karaf.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="western"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h2 class="western"&gt;
How To&lt;/h2&gt;
&lt;div class="western"&gt;
Get an account at &lt;a href="http://logentries.com/" target="_blank"&gt;&lt;b&gt;logentries&lt;/b&gt;&lt;/a&gt;. For a start, you'll get free forever account for 1 GB of logs per month, which is cool. :-)&lt;/div&gt;
&lt;div class="western"&gt;
We need to patch &lt;b&gt;leappender-1-1.5.jar&lt;/b&gt; by
adding OSGi manifest headers and attach it as fragment to
pax-logging-service. (in CentOS/Amazon Linux, &lt;code class="western"&gt;jar&lt;/code&gt;
requires &lt;code class="western"&gt;java-1.7.0-openjdk-devel&lt;/code&gt; yum
package)&lt;/div&gt;
&lt;div class="western"&gt;
&lt;code class="western"&gt;wget
&lt;/code&gt;&lt;code class="western"&gt;'&lt;a href="https://github.com/downloads/logentries/le_java/leappender-1.1.5.jar"&gt;https://github.com/downloads/logentries/le_java/leappender-1.1.5.jar&lt;/a&gt;&lt;a href="https://github.com/downloads/logentries/le_java/leappender-1.1.5.jar"&gt;'&lt;/a&gt;&lt;/code&gt;&lt;code class="western"&gt;unzip
-d leappender leappender-1.1.5.jar&lt;/code&gt;&lt;code class="western"&gt;mkdir
-vp leappender/META-INF&lt;/code&gt;&lt;code class="western"&gt;&lt;br /&gt;nano
leappender/META-INF/MANIFEST.MF&lt;/code&gt;&lt;/div&gt;
&lt;div class="western"&gt;
Replace with:&lt;/div&gt;
&lt;pre class="western"&gt;&lt;code class="western"&gt;Manifest-Version: 1.0&lt;/code&gt;
&lt;code class="western"&gt;Bundle-ManifestVersion: 2&lt;/code&gt;
&lt;code class="western"&gt;Bundle-Name: com.logentries.leappender&lt;/code&gt;
&lt;code class="western"&gt;Bundle-SymbolicName: com.logentries.leappender&lt;/code&gt;
&lt;code class="western"&gt;Bundle-Version: 1.1.5&lt;/code&gt;
&lt;code class="western"&gt;Created-By: 1.7.0_09-icedtea (Oracle Corporation)&lt;/code&gt;
&lt;code class="western"&gt;Export-Package: com.logentries.log4j;&lt;/code&gt;&lt;code class="western"&gt;uses:="org.apache.log4j.spi";&lt;/code&gt;&lt;code class="western"&gt;version="1.1.5"&lt;/code&gt;&lt;code class="western"&gt;
&lt;/code&gt;&lt;code class="western"&gt;Import-Package: org.apache.log4j,org.apache.log4j.spi&lt;/code&gt;
&lt;code class="western"&gt;Fragment-Host: &lt;/code&gt;&lt;code class="western"&gt;org.ops4j.pax.logging.pax-logging-service&lt;/code&gt;
&lt;/pre&gt;
&lt;div class="western"&gt;
&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;rm &lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;-v&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;leappender&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;-1.1.5&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;.bar;
&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;jar
-c&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;vf&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;m&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;leappender&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;-1.1.5&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;.bar&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;
leappender/META-INF/MANIFEST.MF&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;
-&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;C&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="text-decoration: none;"&gt;leappender
.&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;div class="western"&gt;
&lt;code class="western"&gt;&lt;strike&gt;# Wrap it first
using &lt;/strike&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;strike&gt;bnd&lt;br /&gt;wget -O
bnd.jar
'&lt;a href="http://search.maven.org/remotecontent?filepath=biz/aQute/bnd/1.50.0/bnd-1.50.0.jar"&gt;http://search.maven.org/remotecontent?filepath=biz/aQute/bnd/1.50.0/bnd-1.50.0.jar&lt;/a&gt;'&lt;br /&gt;java
-jar bnd.jar wrap leappender-1.1.5.jar&lt;/strike&gt;&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="western"&gt;
our appender bundle should be present in the
system folder and defined in etc/startup.properties.&lt;/div&gt;
&lt;div class="western"&gt;
The system folder has a “Maven repo like”
structure. So you have to copy with:&lt;/div&gt;
&lt;div class="western"&gt;
&lt;code class="western"&gt;&lt;br /&gt;system/groupId/artifactId/version/artifactId-version.jar&lt;/code&gt;&lt;/div&gt;
&lt;div class="western"&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="western"&gt;
In our example, it means:&lt;/div&gt;
&lt;div class="western"&gt;
&lt;code class="western"&gt;mkdir -&lt;/code&gt;&lt;code class="western"&gt;v&lt;/code&gt;&lt;code class="western"&gt;p
system/&lt;/code&gt;&lt;code class="western"&gt;com/logentries/leappender/1.1.&lt;/code&gt;&lt;code class="western"&gt;5&lt;/code&gt;&lt;code class="western"&gt;/&lt;/code&gt;&lt;code class="western"&gt;cp&lt;/code&gt;&lt;code class="western"&gt;
-v&lt;/code&gt;&lt;code class="western"&gt; &lt;/code&gt;&lt;code class="western"&gt;leappender-1.1.&lt;/code&gt;&lt;code class="western"&gt;5&lt;/code&gt;&lt;code class="western"&gt;.&lt;/code&gt;&lt;code class="western"&gt;b&lt;/code&gt;&lt;code class="western"&gt;ar
system/com/logentries/leappender/1.1.&lt;/code&gt;&lt;code class="western"&gt;5&lt;/code&gt;&lt;code class="western"&gt;/&lt;/code&gt;&lt;code class="western"&gt;leappender-1.1.5.jar&lt;/code&gt;&lt;/div&gt;
&lt;div class="western"&gt;
and in &lt;code class="western"&gt;etc/startup.properties&lt;/code&gt;,
we define the appender bundle just &lt;b&gt;before&lt;/b&gt; the
pax-logging-service bundle:&lt;/div&gt;
&lt;div class="western"&gt;
&lt;code class="western"&gt;...&lt;br /&gt;org/ops4j/pax/logging/pax-logging-api/1.&lt;/code&gt;&lt;code class="western"&gt;7.0&lt;/code&gt;&lt;code class="western"&gt;/pax-logging-api-1.&lt;/code&gt;&lt;code class="western"&gt;7.0&lt;/code&gt;&lt;code class="western"&gt;.jar=8&lt;/code&gt;&lt;code class="western"&gt;com/logentries/leappender/1.1.&lt;/code&gt;&lt;code class="western"&gt;5&lt;/code&gt;&lt;code class="western"&gt;/&lt;/code&gt;&lt;code class="western"&gt;leappender-1.1.&lt;/code&gt;&lt;code class="western"&gt;5&lt;/code&gt;&lt;code class="western"&gt;.jar&lt;/code&gt;&lt;code class="western"&gt;=8
org/ops4j/pax/logging/pax-logging-service/1.&lt;/code&gt;&lt;code class="western"&gt;7&lt;/code&gt;&lt;code class="western"&gt;.&lt;/code&gt;&lt;code class="western"&gt;0&lt;/code&gt;&lt;code class="western"&gt;/pax-logging-service-1.&lt;/code&gt;&lt;code class="western"&gt;7.0&lt;/code&gt;&lt;code class="western"&gt;.jar=8&lt;br /&gt;...&lt;/code&gt;&lt;/div&gt;
&lt;div class="western"&gt;
Edit Karaf's &lt;code class="western"&gt;etc/org.ops4j.pax.logging.cfg&lt;/code&gt;
:&lt;/div&gt;
&lt;div class="western"&gt;
&lt;code class="western"&gt;log4j.rootLogger = INFO,
out, &lt;/code&gt;&lt;code class="western"&gt;&lt;span style="background: #ffff00;"&gt;le&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;,
osgi:*&lt;br /&gt;...&lt;/code&gt;&lt;code class="western"&gt;# Logentries
appender&lt;/code&gt;&lt;code class="western"&gt;&lt;br /&gt;log4j.appender.&lt;/code&gt;&lt;code class="western"&gt;le&lt;/code&gt;&lt;code class="western"&gt;=com.logentries.log4j.LeAppender&lt;br /&gt;log4j.appender.&lt;/code&gt;&lt;code class="western"&gt;le&lt;/code&gt;&lt;code class="western"&gt;.&lt;/code&gt;&lt;code class="western"&gt;Token=&lt;/code&gt;&lt;code class="western"&gt;&lt;span style="background: #ffff00;"&gt;LOGENTRIES_TOKEN&lt;/span&gt;&lt;/code&gt;&lt;code class="western"&gt;&lt;br /&gt;log4j.appender.&lt;/code&gt;&lt;code class="western"&gt;le&lt;/code&gt;&lt;code class="western"&gt;.&lt;/code&gt;&lt;code class="western"&gt;Debug&lt;/code&gt;&lt;code class="western"&gt;=&lt;/code&gt;&lt;code class="western"&gt;true&lt;/code&gt;&lt;code class="western"&gt;&lt;br /&gt;log4j.appender.&lt;/code&gt;&lt;code class="western"&gt;le&lt;/code&gt;&lt;code class="western"&gt;.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.&lt;/code&gt;&lt;code class="western"&gt;le&lt;/code&gt;&lt;code class="western"&gt;.layout.&lt;/code&gt;&lt;code class="western"&gt;ConversionPattern&lt;/code&gt;&lt;code class="western"&gt;=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %-32.32C %4L | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n&lt;/code&gt;&lt;code class="western"&gt;&lt;br /&gt;#&lt;/code&gt;&lt;code class="western"&gt;log4j.appender.&lt;/code&gt;&lt;code class="western"&gt;le&lt;/code&gt;&lt;code class="western"&gt;.layout.&lt;/code&gt;&lt;code class="western"&gt;ConversionPattern&lt;/code&gt;&lt;code class="western"&gt;=&lt;/code&gt;&lt;code class="western"&gt;%d{yyyy-MM-dd
HH:mm:ss ZZZ} %-5p: %F:%L  %m&lt;/code&gt;&lt;/div&gt;
&lt;div class="western"&gt;
Note: The &lt;b&gt;LOGENTRIES_TOKEN&lt;/b&gt; parameter can be
found beside the logfile which we created earlier.&lt;/div&gt;
&lt;div class="western"&gt;
I can't get this to work automatically, so on
first Karaf launch you'll get ClassNotFoundException, then you'll
need to install it:&lt;/div&gt;
&lt;div class="western"&gt;
&lt;code class="western"&gt;install
mvn:com.logentries/leappender/1.1.5&lt;br /&gt;bundle-level &amp;lt;id&amp;gt; 8&lt;/code&gt;&lt;/div&gt;
&lt;div class="western" style="text-decoration: none;"&gt;
Now it should work.&lt;/div&gt;
&lt;div class="western"&gt;
&lt;strike&gt;At first launch you'll get a ClassNotFound
exception. Shutdown Karaf and relaunch, it should work.&lt;/strike&gt;
(this was due to the leappender-1.1.5.jar in deploy/ folder, the
system one still doesn't work automatically)&lt;/div&gt;
&lt;div class="western"&gt;
Happy logging! :-) &lt;/div&gt;
&lt;div class="western"&gt;
References:&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;div class="western"&gt;
&lt;a href="https://logentries.com/doc/java/"&gt;https://logentries.com/doc/java/&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class="western"&gt;
&lt;a href="http://blog.nanthrax.net/2012/12/create-custom-log4j-appender-for-karaf-and-pax-logging/"&gt;http://blog.nanthrax.net/2012/12/create-custom-log4j-appender-for-karaf-and-pax-logging/&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;div class="western"&gt;
&lt;a href="http://karaf.922171.n3.nabble.com/Using-custom-log4j-appenders-under-Karaf-2-1-4-td2781811.html"&gt;http://karaf.922171.n3.nabble.com/Using-custom-log4j-appenders-under-Karaf-2-1-4-td2781811.html&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/7648667104878006172/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/12/setting-up-logentries-for-osgi.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/7648667104878006172?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/7648667104878006172?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/12/setting-up-logentries-for-osgi.html" title="Setting Up logentries for OSGi Applications in Apache Karaf" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-4AjG1_tpsCY/UN-wOZ_L5HI/AAAAAAAAAuw/T3dUlzjojgc/s72-c/logentries-karaf.png" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DE8CQXo-fyp7ImA9WhJRE0U.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-1125593022128632965</id><published>2012-07-15T14:14:00.001-07:00</published><updated>2012-07-15T14:14:20.457-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-15T14:14:20.457-07:00</app:edited><title>Using Javassist to Create a Karaf/GoGo Shell Command Dynamically</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;b&gt;Karaf OSGi runtime&lt;/b&gt; provides an excellent &lt;b&gt;shell&lt;/b&gt; &lt;b&gt;console&lt;/b&gt; functionality called &lt;b&gt;Felix GoGo&lt;/b&gt; that can be extended easily using &lt;b&gt;Blueprint XML&lt;/b&gt; :&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;command-bundle xmlns=&amp;quot;&lt;a href="http://karaf.apache.org/xmlns/shell/v1.0.0"&gt;http://karaf.apache.org/xmlns/shell/v1.0.0&lt;/a&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;command name=&amp;quot;process/run&amp;quot;&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;action class=&amp;quot;com.soluvas.process.shell.ProcessRunCommand&amp;quot;&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;argument ref=&amp;quot;processContainer&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;argument ref=&amp;quot;ksession&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;argument ref=&amp;quot;dependencyLookup&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;/action&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;/command&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;command name=&amp;quot;process/ls&amp;quot;&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;action class=&amp;quot;com.soluvas.process.shell.ProcessLsCommand&amp;quot;&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;argument ref=&amp;quot;processContainer&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;/action&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;/command&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;command name=&amp;quot;process/class&amp;quot;&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;action class=&amp;quot;com.soluvas.process.shell.MakeClassCommand&amp;quot;&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;argument ref=&amp;quot;blueprintBundleContext&amp;quot;/&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;/action&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;/command&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;/command-bundle&amp;gt;&lt;/span&gt;&lt;p /&gt; A Karaf Shell Blueprint command element is equivalent to:&lt;br /&gt; 	 	 	 	 &lt;p style="margin-bottom: 0cm;"&gt;&amp;lt;bean id=&lt;i&gt;&amp;quot;processLsCommand&amp;quot;&lt;/i&gt; scope=&lt;i&gt;&amp;quot;prototype&amp;quot;&lt;/i&gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;	class=&lt;i&gt;&amp;quot;com.soluvas.process.shell.ProcessLsCommand&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;	&amp;lt;argument ref=&lt;i&gt;&amp;quot;processContainer&amp;quot;&lt;/i&gt;/&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;&amp;lt;/bean&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;&amp;lt;service auto-export=&lt;i&gt;&amp;quot;interfaces&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;	&amp;lt;service-properties&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;		&amp;lt;entry key=&lt;i&gt;&amp;quot;osgi.command.scope&amp;quot;&lt;/i&gt; value=&lt;i&gt;&amp;quot;test&amp;quot;&lt;/i&gt;/&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;		&amp;lt;entry key=&lt;i&gt;&amp;quot;osgi.command.function&amp;quot;&lt;/i&gt; value=&lt;i&gt;&amp;quot;ls&amp;quot;&lt;/i&gt;/&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;	&amp;lt;/service-properties&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;	&amp;lt;bean class=&lt;i&gt;&amp;quot;org.apache.karaf.shell.console.commands.BlueprintCommand&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;		&amp;lt;property name=&lt;i&gt;&amp;quot;blueprintContainer&amp;quot;&lt;/i&gt; ref=&lt;i&gt;&amp;quot;blueprintContainer&amp;quot;&lt;/i&gt;/&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;		&amp;lt;property name=&lt;i&gt;&amp;quot;blueprintConverter&amp;quot;&lt;/i&gt; ref=&lt;i&gt;&amp;quot;blueprintConverter&amp;quot;&lt;/i&gt;/&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;		&amp;lt;property name=&lt;i&gt;&amp;quot;actionId&amp;quot;&lt;/i&gt;&amp;gt;&amp;lt;idref component-id=&lt;i&gt;&amp;quot;processLsCommand&amp;quot;&lt;/i&gt;/&amp;gt;&amp;lt;/property&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;	&amp;lt;/bean&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm;"&gt;&amp;lt;/service&amp;gt;&lt;/p&gt; &lt;br /&gt;Using the bytecode tooling library &lt;b&gt;Javassist,&lt;/b&gt; it&amp;#39;s possible (and almost quite practical) to create GoGo commands dynamically at runtime :&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;ClassPool pool = new ClassPool();&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;pool.appendClassPath(new LoaderClassPath(getClass().getClassLoader()));&lt;/span&gt;&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: courier new,monospace;"&gt;CtClass helloClass = pool.makeClass(&amp;quot;cc.HelloCommand&amp;quot;);&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;helloClass.setSuperclass(pool.get(&amp;quot;org.apache.karaf.shell.console.OsgiCommandSupport&amp;quot;));&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;helloClass.addInterface(pool.get(&amp;quot;org.apache.karaf.shell.console.CompletableFunction&amp;quot;));&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;helloClass.addInterface(pool.get(&amp;quot;org.apache.felix.service.command.Function&amp;quot;));&lt;/span&gt;&lt;p /&gt; &lt;span style="font-family: courier new,monospace;"&gt;ClassFile cf = helloClass.getClassFile();&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;AnnotationsAttribute attr = new AnnotationsAttribute(cf.getConstPool(), AnnotationsAttribute.visibleTag);&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;Annotation annotation = new Annotation(&amp;quot;org.apache.felix.gogo.commands.Command&amp;quot;, cf.getConstPool());&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;annotation.addMemberValue(&amp;quot;scope&amp;quot;, new StringMemberValue(&amp;quot;test&amp;quot;, cf.getConstPool()));&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;annotation.addMemberValue(&amp;quot;name&amp;quot;, new StringMemberValue(&amp;quot;hello&amp;quot;, cf.getConstPool()));&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;annotation.addMemberValue(&amp;quot;description&amp;quot;, new StringMemberValue(&amp;quot;Hello!&amp;quot;, cf.getConstPool()));&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;attr.addAnnotation(annotation);&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;cf.addAttribute(attr);&lt;/span&gt;&lt;p /&gt; &lt;span style="font-family: courier new,monospace;"&gt;CtMethod doExecuteMethod = CtMethod.make(&amp;quot;protected Object doExecute() throws Exception { System.out.println(\&amp;quot;OMG!\&amp;quot;); return \&amp;quot;Hello!\&amp;quot;; }&amp;quot;, helloClass);&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;helloClass.addMethod(doExecuteMethod);&lt;/span&gt;&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;System.out.println(&amp;quot;Class: &amp;quot; + helloClass);&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;Class clazz = helloClass.toClass(getClass().getClassLoader(), getClass().getProtectionDomain());&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;System.out.println(&amp;quot;Created &amp;quot; + clazz);&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;final Object obj = clazz.newInstance();&lt;/span&gt;&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;BlueprintCommand cmd = new BlueprintCommand() {&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    @Override&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    public Action createNewAction() {&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;        return (Action)obj;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    }&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;};&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;Hashtable&amp;lt;String, String&amp;gt; props = new Hashtable&amp;lt;String, String&amp;gt;();&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;props.put(CommandProcessor.COMMAND_SCOPE, &amp;quot;test&amp;quot;);&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;props.put(CommandProcessor.COMMAND_FUNCTION, &amp;quot;hello&amp;quot;);&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;bundleContext.registerService(new String[] { CompletableFunction.class.getName(),&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;                Function.class.getName() }, cmd, props);&lt;/span&gt;&lt;p /&gt; &lt;span style="font-family: courier new,monospace;"&gt;return null;&lt;/span&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/1125593022128632965/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/07/using-javassist-to-create-karafgogo.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/1125593022128632965?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/1125593022128632965?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/07/using-javassist-to-create-karafgogo.html" title="Using Javassist to Create a Karaf/GoGo Shell Command Dynamically" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DU4DRXo5fSp7ImA9WhVXE0Q.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-6011986764801273233</id><published>2012-04-14T03:06:00.001-07:00</published><updated>2012-04-14T03:06:14.425-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-14T03:06:14.425-07:00</app:edited><title>Just found out @neo4j built-in webadmin graph visualization supports custom labels and *icons* (!!!) How come nobody told me before about this? ;-) AWESOME!</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;div class='p_embed p_image_embed'&gt; &lt;img alt="Neo4j-webadmin-visualization" height="268" src="http://getfile6.posterous.com/getfile/files.posterous.com/spring-java-ee/dNGad9xob4nEkEjEkfoepPDBt9GLrNlUTQcuhxrhbPf75rnvvaUwbqhH7VVk/neo4j-webadmin-visualization.png" width="465" /&gt; &lt;/div&gt; &lt;p&gt;Just found out @neo4j built-in webadmin graph visualization supports custom labels and *icons* (!!!) How come nobody told me before about this? ;-) AWESOME!&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/6011986764801273233/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/04/just-found-out-neo4j-built-in-webadmin.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/6011986764801273233?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/6011986764801273233?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/04/just-found-out-neo4j-built-in-webadmin.html" title="Just found out @neo4j built-in webadmin graph visualization supports custom labels and *icons* (!!!) How come nobody told me before about this? ;-) AWESOME!" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;A0cHQX84eyp7ImA9WhVQEEs.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-8399402284124007859</id><published>2012-03-29T17:57:00.001-07:00</published><updated>2012-03-29T17:57:10.133-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-29T17:57:10.133-07:00</app:edited><title>Workaround for Compilation Errors when Implementing Authenticator in Seam Security and PicketLink IDM</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p&gt;Due to&lt;b&gt; &lt;a href="https://issues.jboss.org/browse/SEAMSECURITY-66"&gt;SEAMSECURITY-66 bug&lt;/a&gt;,&lt;/b&gt; &lt;b&gt;compiling Authenticator&lt;/b&gt; &lt;b&gt;implementation&lt;/b&gt; will result in &lt;b&gt;compilation errors,&lt;/b&gt; as of &lt;b&gt;Seam Security 3.1.0.Final&lt;/b&gt; and &lt;b&gt;PicketLink IDM 1.5.0.Alpha2&lt;/b&gt;:&lt;/p&gt; &lt;div class="code panel" style="border-width: 1px;"&gt;&lt;div class="codeContent panelContent"&gt; &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;[INFO] Compiling 22 source files to /home/ceefour/git/aksimata-web/target/classes [INFO] ------------------------------------------------------------- [ERROR] COMPILATION ERROR : [INFO] ------------------------------------------------------------- [ERROR] LdapAuthenticator.java:[10,30] cannot find symbol symbol : class BaseAuthenticator location: package org.jboss.seam.security [ERROR] LdapAuthenticator.java:[12,34] package org.picketlink.idm.impl.api does not exist [ERROR] LdapAuthenticator.java:[13,40] package org.picketlink.idm.impl.api.model does not exist [ERROR] LdapAuthenticator.java:[23,39] cannot find symbol symbol: class BaseAuthenticator public class LdapAuthenticator extends BaseAuthenticator { [ERROR] LdapAuthenticator.java:[35,22] cannot find symbol symbol : class PasswordCredential location: class org.soluvas.ldap.LdapAuthenticator [ERROR] LdapAuthenticator.java:[46,4] cannot find symbol symbol : class SimpleUser location: class org.soluvas.ldap.LdapAuthenticator [ERROR] LdapAuthenticator.java:[46,26] cannot find symbol symbol : class SimpleUser location: class org.soluvas.ldap.LdapAuthenticator [ERROR] LdapAuthenticator.java:[48,14] cannot find symbol symbol : variable AuthenticationStatus location: class org.soluvas.ldap.LdapAuthenticator [ERROR] LdapAuthenticator.java:[51,14] cannot find symbol symbol : variable AuthenticationStatus location: class org.soluvas.ldap.LdapAuthenticator [ERROR] LdapAuthenticator.java:[52,4] cannot find symbol symbol : method setUser(&amp;lt;nulltype&amp;gt;) location: class org.soluvas.ldap.LdapAuthenticator [ERROR] LdapAuthenticator.java:[56,13] cannot find symbol symbol : variable AuthenticationStatus location: class org.soluvas.ldap.LdapAuthenticator [ERROR] LdapAuthenticator.java:[57,3] cannot find symbol symbol : method setUser(&amp;lt;nulltype&amp;gt;) location: class org.soluvas.ldap.LdapAuthenticator [ERROR] LdapAuthenticator.java:[30,1] method does not override or implement a method from a supertype&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/div&gt; &lt;p&gt;Workaround and the &amp;quot;proper&amp;quot; way to include Seam Security is as follows:&lt;/p&gt; &lt;div class="code panel" style="border-width: 1px;"&gt;&lt;div class="codeContent panelContent"&gt; &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;&amp;lt;properties&amp;gt;         &amp;lt;seam.version&amp;gt;3.1.0.Final&amp;lt;/seam.version&amp;gt; &amp;lt;/properties&amp;gt; &amp;lt;dependencyManagement&amp;gt; &amp;lt;dependencies&amp;gt;         &amp;lt;dependency&amp;gt;                 &amp;lt;groupId&amp;gt;org.jboss.seam&amp;lt;/groupId&amp;gt;                 &amp;lt;artifactId&amp;gt;seam-bom&amp;lt;/artifactId&amp;gt;                 &amp;lt;version&amp;gt;${seam.version}&amp;lt;/version&amp;gt;                 &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;                 &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;         &amp;lt;/dependency&amp;gt;         &amp;lt;dependency&amp;gt;                 &amp;lt;groupId&amp;gt;org.jboss.seam.security&amp;lt;/groupId&amp;gt;                 &amp;lt;artifactId&amp;gt;seam-security&amp;lt;/artifactId&amp;gt;                 &amp;lt;version&amp;gt;${seam.version}&amp;lt;/version&amp;gt;                 &amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;         &amp;lt;/dependency&amp;gt;         &amp;lt;dependency&amp;gt;                 &amp;lt;groupId&amp;gt;org.picketlink.idm&amp;lt;/groupId&amp;gt;                 &amp;lt;artifactId&amp;gt;picketlink-idm-core&amp;lt;/artifactId&amp;gt;                 &amp;lt;version&amp;gt;1.5.0.Alpha02&amp;lt;/version&amp;gt;                 &amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;         &amp;lt;/dependency&amp;gt; &amp;lt;/dependencies&amp;gt; &amp;lt;/dependencyManagement&amp;gt;&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/div&gt; &lt;p&gt;In addition to the actual dependency:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;groupId&amp;gt;org.jboss.seam.security&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;artifactId&amp;gt;seam-security&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;To learn more about &lt;b&gt;Java Web Development&lt;/b&gt; using &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt; (Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;.&lt;/p&gt; &lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/8399402284124007859/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/workaround-for-compilation-errors-when.html#comment-form" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/8399402284124007859?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/8399402284124007859?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/workaround-for-compilation-errors-when.html" title="Workaround for Compilation Errors when Implementing Authenticator in Seam Security and PicketLink IDM" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>5</thr:total></entry><entry gd:etag="W/&quot;AkAARH49eCp7ImA9WhVQEEs.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-5268613225404469394</id><published>2012-03-29T17:52:00.001-07:00</published><updated>2012-03-29T17:52:25.060-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-29T17:52:25.060-07:00</app:edited><title>How to Deploy Maven Artifacts to WebDAV Repository</title><content type="html">&lt;div class='posterous_autopost'&gt;  &lt;p class="western"&gt;Either the DAV wagon is great or DreamHost&amp;#39;s Svn+WebDAV integration is great, or both. POM Configuration is straightforward:&lt;/p&gt; &lt;p class="western"&gt;&amp;lt;distributionManagement&amp;gt;&lt;br /&gt;&amp;lt;snapshotRepository&amp;gt;&lt;br /&gt;&amp;lt;id&amp;gt;soluvas.org.snapshots.tmp&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;url&amp;gt;dav:&lt;a href="http://maven.soluvas.org/snapshots%3C/url%3E"&gt;http://maven.soluvas.org/snapshots&amp;lt;/url&amp;gt;&lt;/a&gt;&lt;br /&gt; &amp;lt;/snapshotRepository&amp;gt;&lt;br /&gt;&amp;lt;/distributionManagement&amp;gt;&lt;p /&gt;It &amp;quot;works&amp;quot; in Eclipse sometimes, but when the artifact has not yet been uploaded (huh?!?!) it fails with: &lt;br /&gt;[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.5:deploy (default-deploy) on project soluvas-apacheds: Failed to deploy artifacts: Could not find artifact org.soluvas.apacheds:soluvas-apacheds:jar:1.0.0-20120329.222133-1 in soluvas.org.snapshots.tmp (dav:&lt;a href="http://maven.soluvas.org/snapshots%29"&gt;http://maven.soluvas.org/snapshots)&lt;/a&gt; -&amp;gt; [Help 1]&lt;p /&gt;In mvn CLI, it simply fails: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.5:deploy (default-deploy) on project soluvas-apacheds: Failed to deploy artifacts/metadata: No connector available to access repository soluvas.org.snapshots.tmp (dav:&lt;a href="http://maven.soluvas.org/snapshots%29"&gt;http://maven.soluvas.org/snapshots)&lt;/a&gt; of type default using the available factories WagonRepositoryConnectorFactory -&amp;gt; [Help 1]&lt;p /&gt;Anyway, to properly do this you need a wagon config, which works well with DreamHost&amp;#39;s subversion+webDAV (haven&amp;#39;t tried with plain Webdav repository yet, but should work):&lt;br /&gt;&amp;lt;build&amp;gt;&lt;br /&gt;&amp;lt;extensions&amp;gt;&lt;br /&gt;&amp;lt;extension&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;wagon-webdav-jackrabbit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.maven.wagon&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.2&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;/extension&amp;gt;&lt;br /&gt;&amp;lt;/extensions&amp;gt;&lt;br /&gt;&amp;lt;/build&amp;gt;&lt;br /&gt; &lt;/p&gt; &lt;p class="western"&gt;then you add your credentials in ~/.m2/settings.xml :&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;settings xmlns=&amp;quot;&lt;a href="http://maven.apache.org/POM/4.0.0"&gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt;&amp;quot; xmlns:xsi=&amp;quot;&lt;a href="http://www.w3.org/2001/XMLSchema-instance"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/a&gt;&amp;quot;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	xsi:schemaLocation=&amp;quot;&lt;a href="http://maven.apache.org/POM/4.0.0"&gt;http://maven.apache.org/POM/4.0.0&lt;/a&gt; &lt;a href="http://maven.apache.org/xsd/settings-1.0.0.xsd"&gt;http://maven.apache.org/xsd/settings-1.0.0.xsd&lt;/a&gt;&amp;quot;&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &lt;br /&gt; &lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt;  	&amp;lt;servers&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;server&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;id&amp;gt;soluvas.org.snapshots.tmp&amp;lt;/id&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;username&amp;gt;youruser&amp;lt;/username&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;password&amp;gt;yourpass&amp;lt;/password&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;/server&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;/servers&amp;gt;&lt;p /&gt;...&lt;p /&gt; &lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;/settings&amp;gt;&lt;/p&gt; &lt;p class="western"&gt;Now you can deploy your Maven project by:&lt;/p&gt; &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;mvn source:jar javadoc:jar install deploy&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt; &lt;p class="western"&gt;&lt;br /&gt;To learn more about &lt;b&gt;Java Web Development&lt;/b&gt; using &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt; (Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/5268613225404469394/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/how-to-deploy-maven-artifacts-to-webdav.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/5268613225404469394?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/5268613225404469394?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/how-to-deploy-maven-artifacts-to-webdav.html" title="How to Deploy Maven Artifacts to WebDAV Repository" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;AkUASXsyeSp7ImA9WhVQEEs.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-7138105196134067514</id><published>2012-03-29T17:44:00.001-07:00</published><updated>2012-03-29T17:44:08.591-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-29T17:44:08.591-07:00</app:edited><title>How to Enable Gzip HTTP Compression in JBoss AS 7.1.1</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;b&gt;JBoss AS 7.1.1&lt;/b&gt; has finally returned the powerful &lt;b&gt;&lt;a href="https://issues.jboss.org/browse/AS7-2991"&gt;Gzip HTTP Compression support (AS7-2991)&lt;/a&gt;&lt;/b&gt; that was missing since 7.0.0.&lt;br /&gt; 	 	 	 	 &lt;p class="western"&gt;Edit standalone/configuration/standalone.xml and add &amp;lt;system-properties&amp;gt; after the &amp;lt;/extensions&amp;gt; :&lt;/p&gt; &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;... &amp;lt;extension module=&amp;quot;org.jboss.as.weld&amp;quot;/&amp;gt; &amp;lt;/extensions&amp;gt; &amp;lt;system-properties&amp;gt; &amp;lt;property name=&amp;quot;org.apache.coyote.http11.Http11Protocol.COMPRESSION&amp;quot; value=&amp;quot;on&amp;quot;/&amp;gt; &amp;lt;/system-properties&amp;gt;&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt; &lt;br /&gt;Proof :&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;$ curl --head --compressed &lt;a href="http://localhost:9080/"&gt;http://localhost:9080/&lt;/a&gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;HTTP/1.1 200 OK&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;Server: Apache-Coyote/1.1&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;Accept-Ranges: bytes&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;ETag: W/&amp;quot;2432-1331360042000&amp;quot;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;Last-Modified: Sat, 10 Mar 2012 06:14:02 GMT&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;Content-Type: text/html&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;Transfer-Encoding: chunked&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;b&gt;&lt;span style="font-family: courier new,monospace;"&gt;Content-Encoding: gzip&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;/b&gt;&lt;span style="font-family: courier new,monospace;"&gt;Vary: Accept-Encoding&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;Date: Fri, 30 Mar 2012 00:40:36 GMT&lt;/span&gt;&lt;p /&gt;If you&amp;#39;re running your app on OpenShift, it doesn&amp;#39;t hurt to enable this switch now. That way, when OpenShift upgrades to JBoss AS 7.1.1 or later, your app will get HTTP Compression automatically. :-)&lt;b&gt;&lt;p /&gt; Alternative:&lt;/b&gt; You can also enable it by adding to the server launch params : &lt;div class="code panel" style="border-width: 1px;"&gt;&lt;div class="codeContent panelContent"&gt; &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;-Dorg.apache.coyote.http11.Http11Protocol.COMPRESSION=on&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;&lt;/div&gt; &lt;p&gt;Enables HTTP compression on JBoss 7.1.1 &lt;img class="emoticon" src="https://issues.jboss.org/images/icons/emoticons/smile.gif" border="0" height="20" align="absmiddle" alt="" width="20" /&gt;&lt;/p&gt; &lt;br /&gt;To learn more about &lt;b&gt;Java Web Development&lt;/b&gt; using &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt; (Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/7138105196134067514/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/how-to-enable-gzip-http-compression-in.html#comment-form" title="21 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/7138105196134067514?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/7138105196134067514?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/how-to-enable-gzip-http-compression-in.html" title="How to Enable Gzip HTTP Compression in JBoss AS 7.1.1" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>21</thr:total></entry><entry gd:etag="W/&quot;CEMMR3o6eip7ImA9WhVQEE4.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-265083119450659859</id><published>2012-03-29T07:48:00.001-07:00</published><updated>2012-03-29T07:48:06.412-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-29T07:48:06.412-07:00</app:edited><title>Optimal Java EE Webapp Logging Configuration for JBoss AS7 Deployment</title><content type="html">&lt;div class='posterous_autopost'&gt;I used to &lt;b&gt;configure&lt;/b&gt; &lt;b&gt;logging&lt;/b&gt; (via &lt;b&gt;SLF4J&lt;/b&gt;) in my &lt;b&gt;Java EE web applications&lt;/b&gt; like this:&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;properties&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;slf4j.version&amp;gt;1.6.4&amp;lt;/slf4j.version&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;/properties&amp;gt;&lt;/span&gt;&lt;p /&gt; &lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;dependencyManagement&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;dependencies&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;groupId&amp;gt;commons-logging&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;artifactId&amp;gt;commons-logging&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;version&amp;gt;1.1.1&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;version&amp;gt;${slf4j.version}&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;version&amp;gt;${slf4j.version}&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;artifactId&amp;gt;slf4j-jdk14&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;version&amp;gt;${slf4j.version}&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;            &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;/dependencyManagement&amp;gt;&lt;/span&gt;&lt;p /&gt; &lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;        &amp;lt;artifactId&amp;gt;slf4j-jdk14&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;p /&gt; Although in practice this works well, it&amp;#39;s not efficient because I&amp;#39;m bundling my own SLF4J libraries with my webapp, and direct them to JDK Logging, which is handled properly by JBoss AS 7.1.&lt;p /&gt; Note that there&amp;#39;s nothing wrong with the above configuration, because makes the webapp very portable across Application Servers (even servlet containers like Tomcat).&lt;p /&gt;&lt;b&gt;&lt;a href="http://shrubbery.mynetgear.net/c/display/W/JBoss+AS+7"&gt;Thanks to Joshua Davis&lt;/a&gt;, I got the perfect logging configuration for JBoss AS7:&lt;/b&gt;&lt;p /&gt;  	 	 	 	 &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;&amp;lt;properties&amp;gt;        &amp;lt;slf4j.version&amp;gt;1.6.4&amp;lt;/slf4j.version&amp;gt;&amp;lt;/properties&amp;gt;&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;dependencyManagement&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;dependencies&amp;gt;&lt;/p&gt;&amp;lt;dependency&amp;gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;groupId&amp;gt;commons-logging&amp;lt;/groupId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;artifactId&amp;gt;commons-logging&amp;lt;/artifactId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;version&amp;gt;1.1.1&amp;lt;/version&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;/dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;version&amp;gt;${slf4j.version}&amp;lt;/version&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;/dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;version&amp;gt;${slf4j.version}&amp;lt;/version&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;/dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;artifactId&amp;gt;slf4j-jdk14&amp;lt;/artifactId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;version&amp;gt;${slf4j.version}&amp;lt;/version&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;/dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;/dependencies&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;/dependencyManagement&amp;gt;&lt;/p&gt; &lt;p class="western"&gt; Dependencies:&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;artifactId&amp;gt;slf4j-api&amp;lt;/artifactId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;/dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;artifactId&amp;gt;jcl-over-slf4j&amp;lt;/artifactId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;/dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;dependency&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;groupId&amp;gt;org.slf4j&amp;lt;/groupId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;artifactId&amp;gt;slf4j-jdk14&amp;lt;/artifactId&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;/dependency&amp;gt;&lt;/p&gt; &lt;br /&gt; 	 	 	 	 &lt;p class="western" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; Since SLF4J is already defined as a JBoss &amp;#39;module&amp;#39;, then all that we need to do is to reference the module from the WAR file.&lt;a name="sdfootnote1anc" href="#sdfootnote1sym" class="sdfootnoteanc"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; The simplest way is to get &lt;a href="http://shrubbery.mynetgear.net/c/display/W/Maven"&gt;Maven&lt;/a&gt; to list the dependency in &lt;code class="western"&gt;META-INF/MANIFEST.MF&lt;/code&gt;:&lt;/p&gt; &lt;p&gt;&lt;code class="western"&gt;&amp;lt;plugin&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class="western"&gt;  &lt;/code&gt;&lt;code class="western"&gt;&amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class="western"&gt;  &lt;/code&gt;&lt;code class="western"&gt;&amp;lt;artifactId&amp;gt;maven-war-plugin&amp;lt;/artifactId&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class="western"&gt;  &lt;/code&gt;&lt;code class="western"&gt;&amp;lt;version&amp;gt;2.2&amp;lt;/version&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class="western"&gt;  &lt;/code&gt;&lt;code class="western"&gt;&amp;lt;configuration&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class="western"&gt;    &lt;/code&gt;&lt;code class="western"&gt;&amp;lt;archive&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class="western"&gt;      &lt;/code&gt;&lt;code class="western"&gt;&amp;lt;manifestEntries&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class="western"&gt;        &lt;/code&gt;&lt;code class="western"&gt;&amp;lt;Dependencies&amp;gt;org.slf4j, org.apache.commons.logging&amp;lt;/Dependencies&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class="western"&gt;      &lt;/code&gt;&lt;code class="western"&gt;&amp;lt;/manifestEntries&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class="western"&gt;    &lt;/code&gt;&lt;code class="western"&gt;&amp;lt;/archive&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class="western"&gt;  &lt;/code&gt;&lt;code class="western"&gt;&amp;lt;/configuration&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p style="border: none; padding: 0cm;"&gt;&lt;code class="western"&gt;&amp;lt;/plugin&amp;gt;&lt;/code&gt;&lt;/p&gt; &lt;p /&gt; &lt;p class="western"&gt;This will generate a &lt;code class="western"&gt;META-INF/MANIFEST.MF&lt;/code&gt; file that has this line in it:&lt;/p&gt; &lt;p style="border: none; padding: 0cm;"&gt;&lt;code class="western"&gt;Dependencies: org.slf4j&lt;/code&gt;&lt;code class="western"&gt;, org.apache.commons.logging&lt;/code&gt;&lt;/p&gt;&lt;br /&gt;This tweak saves space, RAM, and probably increases webapp performance a bit too. :-)&lt;p /&gt;&lt;br /&gt;To learn more about &lt;b&gt;Java Web Development&lt;/b&gt; using &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt; (Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/265083119450659859/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/optimal-java-ee-webapp-logging.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/265083119450659859?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/265083119450659859?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/optimal-java-ee-webapp-logging.html" title="Optimal Java EE Webapp Logging Configuration for JBoss AS7 Deployment" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUUDR30zfyp7ImA9WhVREUg.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-8859643171214069080</id><published>2012-03-19T03:34:00.001-07:00</published><updated>2012-03-19T03:34:36.387-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-19T03:34:36.387-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OpenShift" /><category scheme="http://www.blogger.com/atom/ns#" term="Facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="JBoss" /><category scheme="http://www.blogger.com/atom/ns#" term="Java EE" /><title>How to Develop an OpenShift Cloud App with Facebook OAuth Support [Tutorial]</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p&gt;How to Develop a &lt;strong&gt;Facebook App&lt;/strong&gt; with &lt;strong&gt;OAuth 2.0 authorization&lt;/strong&gt; to publish activities to the social network. Technologies:&lt;/p&gt;  &lt;ul&gt;  &lt;li&gt;&lt;strong&gt;Java EE 6&lt;/strong&gt; standards including CDI (JSR-299 Dependency Injection) and JSF 2.0&lt;/li&gt;  &lt;li&gt;Twitter's excellent CSS framework &lt;strong&gt;Bootstrap&lt;/strong&gt;&lt;/li&gt;  &lt;li&gt;Easily test and rapidly iterate your app in your local development computer with &lt;strong&gt;JBoss AS 7&lt;/strong&gt;.1.1&lt;/li&gt;  &lt;li&gt;Deploy to the cloud in seconds to &lt;a href="https://openshift.redhat.com/app/" target="_blank"&gt;&lt;strong&gt;RedHat OpenShift Express&lt;/strong&gt;&lt;/a&gt;, for &lt;em&gt;free&lt;/em&gt;!&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;&lt;span style="font-size: large;"&gt;What Will You Get?&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;div class='p_embed p_image_embed'&gt; &lt;a href="http://getfile8.posterous.com/getfile/files.posterous.com/temp-2012-03-19/zrDCCczdvEldyppCnJoshwkrlBImdIdecpmcacandDHsAkvuIqFyAzkardIg/fbstatus_openshift_java-ee-6_webapp.png.scaled1000.png"&gt;&lt;img alt="Fbstatus_openshift_java-ee-6_webapp" height="255" src="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-03-19/zrDCCczdvEldyppCnJoshwkrlBImdIdecpmcacandDHsAkvuIqFyAzkardIg/fbstatus_openshift_java-ee-6_webapp.png.scaled500.png" width="500" /&gt;&lt;/a&gt; &lt;/div&gt; &lt;/p&gt;  &lt;p&gt;This app's interface and purpose is actually simple :&lt;/p&gt;  &lt;ul&gt;  &lt;li&gt;&lt;strong&gt;Login with Facebook&lt;/strong&gt; and allow the app. The app requires the &lt;strong&gt;publish_stream&lt;/strong&gt; privilege.&lt;/li&gt;  &lt;li&gt;Put a message, click Post and the app will update your Facebook status.&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;You check out the live app at &lt;a href="http://fbstatus-soluvas.rhcloud.com/" target="_blank"&gt;fbstatus-soluvas.rhcloud.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: large;"&gt;Preparation&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Before you start, you'll need to get some basics ready :&lt;/p&gt;  &lt;ol&gt;  &lt;li&gt;&lt;strong&gt;Get the &lt;a href="https://devstudio.jboss.com/earlyaccess/"&gt;latest JBoss Developer Studio 5.0.0.Beta1&lt;/a&gt;.&lt;/strong&gt;&lt;br /&gt;Simply   the quickest way to get started. This contains Eclipse IDE, JBoss   Tools, JBoss AS, JBoss Forge, OpenShift plug-in and several other handy   tools at your command.&lt;br /&gt;If you want, you can install these separately:&lt;br /&gt;- &lt;a href="http://www.eclipse.org/downloads/"&gt;Eclipse IDE, Java EE Developer edition&lt;/a&gt; (3.7.2 or later)&lt;br /&gt;- &lt;a href="http://www.jboss.org/tools/download"&gt;JBoss Tools&lt;/a&gt; (get 3.3.0.Beta1 or later)&lt;br /&gt;- &lt;a href="http://www.jboss.org/jbossas/"&gt;JBoss AS 7.1.1 or later&lt;/a&gt;&lt;br /&gt;- &lt;a href="https://docs.jboss.org/author/display/FORGE/Home"&gt;JBoss Forge&lt;/a&gt; 1.0.Final or later&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;While downloading the things above, signup for &lt;a href="https://openshift.redhat.com/app/"&gt;&lt;strong&gt;RedHat OpenShift Express&lt;/strong&gt;&lt;/a&gt;.&lt;br /&gt;Set   up your SSH keys so you're good to go. You can try creating a test app   yourself, but&amp;nbsp; we'll create another app for this tutorial. (OpenShift   allows multiple applications in one account).&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;You'll also need to have a Facebook app. Go to &lt;a href="https://www.facebook.com/developers/apps.php"&gt;&lt;strong&gt;Facebook Developers&lt;/strong&gt;&lt;/a&gt; and create an app. Any test app will do. We'll need to generate an access token for your Facebook profile (later on).&lt;/li&gt;  &lt;/ol&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;ol&gt; &lt;/ol&gt;  &lt;p&gt;&lt;span style="font-size: large;"&gt;Prepare the Project: Some Boilerplate Stuff&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;  &lt;ol&gt;  &lt;li&gt;&lt;strong&gt;Create a new jbossas-7 OpenShift application.&lt;/strong&gt;&lt;br /&gt;In JBoss Developer Studio / Eclipse IDE, create a new OpenShift application :&lt;br /&gt;File &amp;gt; New &amp;gt; Other... &amp;gt; choose OpenShift Application.&lt;br /&gt;Name it anything you want, in my case it's fbstatus.&lt;br /&gt;Pick the &lt;strong&gt;jbossas-7&lt;/strong&gt; cartridge.&lt;br /&gt;Other fancy options are not needed for this purpose.&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Cleanup the OpenShift scaffold project.&lt;/strong&gt;&lt;br /&gt;Delete everything in src/main/webapp except WEB-INF.&lt;br /&gt;Also delete src/main/webapp/WEB-INF/faces-config.xml first (JBoss Tools may automatically create it for you).&lt;br /&gt; We delete this so Forge's faces setup (below) runs well.&lt;p /&gt; &lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Add SLF4J Logging dependency&lt;/strong&gt;.&lt;br /&gt;JDK Logging is   okay, but SLF4J is much nicer. We'll configure SLF4J to log using JDK   Logger, which is handled properly by JBoss AS.&lt;br /&gt;Using Forge Console, run:&lt;p /&gt;project add-dependency org.slf4j:slf4j-api:1.6.4&lt;br /&gt;project add-dependency org.slf4j:slf4j-jdk14:1.6.4:runtime&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Setup JSF and CDI.&lt;/strong&gt;&lt;br /&gt;Using Forge Console, run:&lt;p /&gt; faces setup&lt;p /&gt; When asked for CDI, enter "Y".&lt;br /&gt; For Faces servlet and mapping, enter "N" because it's not required for Servlet 3.0 and beyond.&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Make sure Maven project configuration is up-to-date.&lt;/strong&gt;&lt;br /&gt;Right click project &amp;gt; Maven &amp;gt; Update Project&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Get Icons&lt;/strong&gt;&lt;br /&gt;Some people think is an "extraneous" step, but I think initial appearance is very important as it sets your mood. ;-)&lt;br /&gt;Get a "normal" size icon (~64px) e.g. from &lt;a href="http://www.iconfinder.com/" target="_blank"&gt;IconFinder&lt;/a&gt;, and save it as src/main/webapp/resources/fbstatus/fbstatus_64p.png&lt;br /&gt;Grab or resize the icon to 16x16 (for navbar, buttons, etc.), save it as src/main/webapp/resources/fbstatus/fbstatus_16p.png&lt;br /&gt;Also save the 16x16 version as an ICO file at src/main/webapp/favicon.ico&lt;p /&gt;Find your favorite "Login with Facebook" icon, and save it as src/mian/webapp/resources/fbstatus/facebook-login.png&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Grab Twitter's Bootstrap HTML5 Framework&lt;/strong&gt;&lt;br /&gt;Like   the icons above, this is not really "necessary" for the functionality   of the apps, but it seems the mood since initially the app will look   "acceptable" instead of "plain HTML".&lt;br /&gt;Download &lt;a href="http://twitter.github.com/bootstrap/" target="_blank"&gt;Bootstrap dist&lt;/a&gt; and extract it as src/main/webapp/resources/bootstrap&lt;br /&gt;Also get the jQuery plugins from &lt;a href="https://github.com/twitter/bootstrap/" target="_blank"&gt;Bootstrap sources&lt;/a&gt;, put the bootstrap-*.js plugins from js/ folder into src/main/webapp/resources/bootstrap/js&lt;br /&gt;You also need &lt;a href="http://jquery.com/" target="_blank"&gt;jQuery library litself&lt;/a&gt; and put this file as src/main/webapp/resources/jquery.js&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Create a JSF template&lt;/strong&gt; in src/main/webapp/WEB-INF/templates/basic.xhtml :&lt;p /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html lang="en" xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:f="http://java.sun.com/jsf/core"&amp;gt;&lt;br /&gt;&amp;lt;f:view&amp;gt;&lt;br /&gt;&amp;lt;h:head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta charset="utf-8" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;&amp;lt;ui:insert name="pageTitle"&amp;gt;Post status to Facebook&amp;lt;/ui:insert&amp;gt; | FBStatus&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta name="description" content="Post status to Facebook." /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta name="author" content="FBStatus" /&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Le styles --&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Workaround for JSF resource URLs and css URLs:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if URL appended with ?ln=bootstrap, glyph URL is wrong:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://localhost:9080/fbstatus/faces/javax.faces.resource/img/glyphicons-halflings.png"&gt;http://localhost:9080/fbstatus/faces/javax.faces.resource/img/glyphicons-half...&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; should be:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://localhost:9080/fbstatus/faces/javax.faces.resource/bootstrap/img/glyphicons-halflings.png"&gt;http://localhost:9080/fbstatus/faces/javax.faces.resource/bootstrap/img/glyph...&lt;/a&gt; --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputStylesheet name="bootstrap/css/bootstrap.css"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;body {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding-top: 60px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding-bottom: 40px;&lt;br /&gt;}&lt;p /&gt;.sidebar-nav {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding: 9px 0;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputStylesheet name="bootstrap/css/bootstrap-responsive.css"/&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Le HTML5 shim, for IE6-8 support of HTML5 elements --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--[if lt IE 9]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src="http://html5shim.googlecode.com/svn/trunk/html5.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![endif]--&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Le fav and touch icons --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="shortcut icon" href="#{request.contextPath}/favicon.ico" /&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &amp;lt;!--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="apple-touch-icon-precomposed"  sizes="114x114"    href="#{request.contextPath}/resources/bootstrap/ico/apple-touch-icon-114-precomposed.png"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &amp;lt;link rel="apple-touch-icon-precomposed" sizes="72x72"   href="#{request.contextPath}/resources/bootstrap/ico/apple-touch-icon-72-precomposed.png"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   &amp;lt;link rel="apple-touch-icon-precomposed"   href="#{request.contextPath}/resources/bootstrap/ico/apple-touch-icon-57-precomposed.png"&amp;gt;   --&amp;gt;&lt;br /&gt;&amp;lt;/h:head&amp;gt;&lt;p /&gt;&amp;lt;h:body&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="navbar navbar-fixed-top"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="navbar-inner"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="container"&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a class="btn btn-navbar" data-toggle="collapse"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; data-target=".nav-collapse"&amp;gt; &amp;lt;span class="icon-bar"&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; class="icon-bar"&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class="icon-bar"&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/a&amp;gt; &lt;a href="#" class="brand"&gt;FBStatus&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="nav-collapse"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ul class="nav"&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&lt;a href="#{request.contextPath}/"&gt;Home&lt;/a&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&lt;a href="#{request.contextPath}/post"&gt;Post Status&lt;/a&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&lt;a href="#{request.contextPath}/about"&gt;About&lt;/a&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&lt;a href="#{request.contextPath}/contact"&gt;Contact&lt;/a&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p class="navbar-text pull-right"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="#"&gt;Login&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--/.nav-collapse --&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="container"&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="row"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="span12"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:messages/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ui:insert name="content"/&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;hr /&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;footer&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&amp;amp;copy; Hendy Irawan 2012&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/footer&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--/.container--&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Le javascript&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ================================================== --&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Placed at the end of the document so the pages load faster --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript name="jquery.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-transition.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-alert.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-modal.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-dropdown.js"/&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-scrollspy.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-tab.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-tooltip.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-popover.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-button.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-collapse.js"/&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-carousel.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-typeahead.js"/&amp;gt;&lt;p /&gt;&amp;lt;/h:body&amp;gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Create a JSF page&lt;/strong&gt; named src/main/webapp/front.xhtml :&lt;p /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:h="http://java.sun.com/jsf/html"&amp;gt;&lt;p /&gt;&amp;lt;ui:composition template="/WEB-INF/templates/basic.xhtml"&amp;gt;&lt;p /&gt;&amp;lt;ui:define name="pageTitle"&amp;gt;Post status to Facebook&amp;lt;/ui:define&amp;gt;&lt;p /&gt;&amp;lt;ui:define name="content"&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;Hello&amp;lt;/p&amp;gt;&lt;p /&gt;&amp;lt;/ui:define&amp;gt;&lt;p /&gt;&amp;lt;/ui:composition&amp;gt;&lt;p /&gt;&amp;lt;/html&amp;gt;&lt;p /&gt;Launch   the web app using JBoss AS server, you should be able to access the   front page using &lt;a href="http://localhost:8080/fbstatus/faces/front.xhtml"&gt;http://localhost:8080/fbstatus/faces/front.xhtml&lt;/a&gt;&lt;p /&gt;You   can also deploy to OpenShift by Git committing the entire project and   Git push it to OpenShift. It should be accessible at   &lt;a href="http://yourapp-yourdomain.rhcloud.com/faces/front.xhtml"&gt;http://yourapp-yourdomain.rhcloud.com/faces/front.xhtml&lt;/a&gt;&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Add PrettyFaces&lt;/strong&gt;&lt;br /&gt;For more SEO-friendly URLs PrettyFaces is a must. Use Forge Console to run:&lt;p /&gt;project add-dependency com.ocpsoft:prettyfaces-jsf2:3.3.3&lt;p /&gt;Note: For automatic PrettyFaces configuration, Servlet version in web.xml must be at least 3.0.&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Enable PrettyFaces development mode&lt;/strong&gt;&lt;br /&gt;This can be turned off in production setting but for now, addd in web.xml as follows :&lt;p /&gt;&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;com.ocpsoft.pretty.DEVELOPMENT&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;p /&gt;This will allow PrettyFaces mapping to be changed anytime without reloading the webapp.&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Create PrettyFaces mapping&lt;/strong&gt;&lt;br /&gt;Create src/main/webapp/WEB-INF/pretty-config.xml :&lt;p /&gt;&amp;lt;pretty-config xmlns="http://ocpsoft.com/prettyfaces/3.3.3"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="http://ocpsoft.com/prettyfaces/3.3.3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://ocpsoft.com/xml/ns/prettyfaces/ocpsoft-pretty-faces-3.3.3.xsd"&gt;http://ocpsoft.com/xml/ns/prettyfaces/ocpsoft-pretty-faces-3.3.3.xsd&lt;/a&gt;"&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;url-mapping id="home"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;pattern value="/" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;view-id value="/faces/front.xhtml" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/url-mapping&amp;gt;&lt;p /&gt;&amp;lt;/pretty-config&amp;gt;&lt;p /&gt;The above maps the context root path to /faces/front.xhtml.&lt;br /&gt;Deploy   the webapp in JBoss AS or OpenShift and you should be able to access   the front page at webapp root, e.g. in JBoss would be:   &lt;a href="http://localhost:8080/fbstatus/"&gt;http://localhost:8080/fbstatus/&lt;/a&gt;&lt;/li&gt;  &lt;/ol&gt;  &lt;p&gt;Note that these steps that we've done above are all simply &lt;em&gt;boilerplate&lt;/em&gt;.&lt;br /&gt;You    can save the project at this point and put it somewhere or on Git to    get started with a new OpenShift-JSF-Bootstrap project rapidly.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: large;"&gt;A Cloud-Ready Facebook App in Java EE in 5 Minutes*&lt;/span&gt;&lt;/p&gt;  &lt;ol&gt;  &lt;li&gt;&lt;strong&gt;Add RestFB&lt;/strong&gt;&lt;br /&gt;Now let's get to business, I will use &lt;a href="http://restfb.com/" target="_blank"&gt;RestFB Facebook API library for Java&lt;/a&gt;. Using JBoss Forge Console :&lt;p /&gt;project add-dependency com.restfb:restfb:1.6.9&lt;p /&gt;There are other alternative libraries for accessing Facebook:&lt;br /&gt;- &lt;a href="http://www.springsource.org/spring-social" target="_blank"&gt;Spring Social&lt;/a&gt;.   It's easy to use and works well. However it drags quite some   dependencies (especially the whole Spring Framework), which makes sense,   but RestFB serves the purpose of this tutorial quite well.&lt;br /&gt;- &lt;a href="https://github.com/seam/social" target="_blank"&gt;Seam Social&lt;/a&gt;. A CDI oriented Facebook client library.&lt;br /&gt;- &lt;a href="https://code.google.com/p/facebook-java-api/" target="_blank"&gt;facebook-java-api&lt;/a&gt;.   Actually I tried it before RestFB, but it throws an error regarding   invalid session key. I'm using access tokens not session IDs so either   it's using an outdated Facebook API version or I didn't read the manual   correctly.&lt;p /&gt;At this point I should have added Seam Faces and Seam   International too, to make working with JSF and FacesMessages more   convenient. Too bad, &lt;a href="http://spring-java-ee.blogspot.com/2012/03/jboss-seam-310final-maven-artifacts-not.html" target="_blank"&gt;Seam artifacts aren't available yet in OpenShift Maven repository&lt;/a&gt;. So, plain JSF API for now.&lt;p /&gt;But in case you're curious how to add Seam Faces and Seam International, here's the needed Maven POM dependencies :&lt;p /&gt;&amp;nbsp; &amp;lt;properties&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;seam.version&amp;gt;3.1.0.Final&amp;lt;/seam.version&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/properties&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;dependencyManagement&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.jboss.seam&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;seam-bom&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;${seam.version}&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/dependencyManagement&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.jboss.seam.international&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;seam-international&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;joda-time&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;joda-time&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;1.6.2&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.jboss.seam.faces&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;seam-faces&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;p /&gt;I'd love to use Seam Security as well, but due to the similar reason as above, well... let's stick to the raw basics. :-D&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Add Apache Commons HttpClient&lt;/strong&gt;&lt;br /&gt;project add-dependency org.apache.httpcomponents:httpclient:4.1.3&lt;p /&gt;We need it because we'll be creating HTTP requests soon.&lt;p /&gt;Tip: You may also want to add Apache Commons IO because it's very useful in many situations: (but it's not required in this tutorial)&lt;p /&gt;project add-dependency commons-io:commons-io:2.1&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Create FacebookAuthenticator application-scoped bean&lt;/strong&gt;&lt;br /&gt;This class forms the bulk of the Facebook authentication logic, and here I implement the entire logic using HTTP operations. For some reason, RestFB does not provide a utility to get an access token (or probably I didn't read the docs well). You can also use an OAuth library. However, this shows actually how simple OAuth 2.0 is in practice.&lt;p /&gt;Put in src/main/java/org/soluvas/fbstatus/FacebookAuthenticator.java&lt;p /&gt;package org.soluvas.fbstatus;&lt;p /&gt;import java.io.FileNotFoundException;&lt;br /&gt;import java.io.FileReader;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.net.URI;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Properties;&lt;p /&gt;import javax.annotation.PostConstruct;&lt;br /&gt;import javax.enterprise.context.ApplicationScoped;&lt;br /&gt;import javax.faces.context.ExternalContext;&lt;br /&gt;import javax.faces.context.FacesContext;&lt;br /&gt;import javax.inject.Named;&lt;br /&gt;import javax.ws.rs.core.UriBuilder;&lt;p /&gt;import org.apache.commons.io.IOUtils;&lt;br /&gt;import org.apache.http.HttpResponse;&lt;br /&gt;import org.apache.http.NameValuePair;&lt;br /&gt;import org.apache.http.client.ClientProtocolException;&lt;br /&gt;import org.apache.http.client.methods.HttpGet;&lt;br /&gt;import org.apache.http.client.utils.URLEncodedUtils;&lt;br /&gt;import org.apache.http.impl.client.DefaultHttpClient;&lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;p /&gt;/**&lt;br /&gt;&amp;nbsp;* @author ceefour&lt;br /&gt;&amp;nbsp;* Handles Facebook OAuth authentication.&lt;br /&gt;&amp;nbsp;*/&lt;br /&gt;@Named @ApplicationScoped&lt;br /&gt;public class FacebookAuthenticator {&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private transient Logger log = LoggerFactory.getLogger(FacebookAuthenticator.class);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String appId = "";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String appSecret = "";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private URI redirectUri;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; @PostConstruct public void init() throws IOException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Load Facebook App credentials from ${OPENSHIFT_DATA_DIR}/fbstatus.properties if exists,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // otherwise load from WEB-INF/fbstatus.properties&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String dataDir = System.getenv("OPENSHIFT_DATA_DIR");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Properties props = new Properties();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (dataDir != null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String propsFile = dataDir + "/fbstatus.properties";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; log.info("Loading credentials from file: {}", propsFile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FileReader fileReader = new FileReader(propsFile);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; props.load(fileReader);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; log.info("Loading credentials from resource: {}", "/WEB-INF/fbstatus.properties");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; InputStream stream = FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/WEB-INF/fbstatus.properties");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (stream == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; throw new FileNotFoundException("Either ${OPENSHIFT_DATA_DIR}/fbstatus.properties or /WEB-INF/fbstatus.properties must exist.");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; props.load(stream);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; appId = props.getProperty("facebook.app.id");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; appSecret = props.getProperty("facebook.app.secret");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; log.info("App ID: {}", appId);&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; // Generate redirect URI&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; final ExternalContext external = FacesContext.getCurrentInstance()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .getExternalContext();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; redirectUri = UriBuilder.fromPath(external.encodeActionURL("/faces/fb_auth.xhtml"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .scheme(external.getRequestScheme())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .host(external.getRequestServerName())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .port(external.getRequestServerPort()).build();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public URI getRedirectUri() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return redirectUri;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public URI getAuthorizeUri() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return UriBuilder.fromUri("https://graph.facebook.com/oauth/authorize").queryParam("client_id", appId)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .queryParam("redirect_uri", getRedirectUri())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .queryParam("scope", "publish_stream").build();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public URI getAccessTokenUri(String authCode) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return UriBuilder&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .fromUri("https://graph.facebook.com/oauth/access_token")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .queryParam("client_id", appId)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .queryParam("redirect_uri", getRedirectUri())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .queryParam("client_secret", appSecret)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .queryParam("code", authCode).build();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Sets the authCode received from Facebook and exchanges it with the access token.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param authCode&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws IOException &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws ClientProtocolException &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String fetchAccessToken(String authCode) throws ClientProtocolException, IOException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;log.info("Retrieving access token using authCode {}", authCode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;URI accessTokenUri = getAccessTokenUri(authCode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;DefaultHttpClient client = new DefaultHttpClient();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;HttpGet accessTokenReq = new HttpGet(accessTokenUri);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;HttpResponse response = client.execute(accessTokenReq);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;if (response.getStatusLine().getStatusCode() != 200)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;throw new IOException(String.format("GET %s throws HTTP Error %d: %s",&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;accessTokenUri, response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase()));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Scanner scanner = new Scanner(response.getEntity().getContent());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;ArrayList&amp;lt;NameValuePair&amp;gt; data = new ArrayList&amp;lt;NameValuePair&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;URLEncodedUtils.parse(data, scanner, "UTF-8");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;// Probably due to non-existing Content-Encoding, this one is not working:&lt;br /&gt;//&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;List&amp;lt;NameValuePair&amp;gt; data = URLEncodedUtils.parse(response.getEntity());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;// see: &lt;a href="https://issues.apache.org/jira/browse/HTTPCLIENT-1175"&gt;https://issues.apache.org/jira/browse/HTTPCLIENT-1175&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;String accessToken = data.get(0).getValue();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;//log.debug("Access token = {}", fbAccessToken); // security risk?&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;return accessToken;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Create the UserSession session-bean&lt;/strong&gt;&lt;br /&gt;This bean handles the OAuth code that provided by Facebook, asks the FacebookAuthenticator to exchange it with an access token, then stores the access token in the session.&lt;p /&gt;Put in src/main/java/org/soluvas/fbstatus/UserSession.java :&lt;p /&gt;package org.soluvas.fbstatus;&lt;p /&gt;import java.io.IOException;&lt;br /&gt;import java.io.Serializable;&lt;p /&gt;import javax.enterprise.context.SessionScoped;&lt;br /&gt;import javax.faces.context.ExternalContext;&lt;br /&gt;import javax.faces.context.FacesContext;&lt;br /&gt;import javax.inject.Inject;&lt;br /&gt;import javax.inject.Named;&lt;p /&gt;import org.apache.http.client.ClientProtocolException;&lt;br /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;p /&gt;@Named @SessionScoped&lt;br /&gt;public class UserSession implements Serializable {&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final long serialVersionUID = 1L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private transient Logger log = LoggerFactory.getLogger(UserSession.class);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Inject FacebookAuthenticator facebookAuth;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String fbAccessToken;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public String getFacebookAuthCode() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; /**&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* Sets the authCode received from Facebook and exchanges it with the access token.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @param authCode&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws IOException &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;* @throws ClientProtocolException &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setFacebookAuthCode(String authCode) throws ClientProtocolException, IOException {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String accessToken = facebookAuth.fetchAccessToken(authCode);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; setFbAccessToken(accessToken);&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; log.info("Access token received, redirecting to Post Status page");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ExternalContext external = FacesContext.getCurrentInstance().getExternalContext();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; external.redirect(external.encodeActionURL("/faces/post.xhtml"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getFbAccessToken() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return fbAccessToken;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setFbAccessToken(String fbAccessToken) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.fbAccessToken = fbAccessToken;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Create the "login button"&lt;/strong&gt;&lt;br /&gt;The login "button" is actually a normal link to a Facebook URL with special parameters.&lt;p /&gt;Edit the basic.xhtml template as follows:&lt;p /&gt;&amp;lt;p class="navbar-text pull-right"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="#{facebookAuthenticator.authorizeUri}"&gt;&lt;/a&gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;p /&gt;Also edit the contents of the ui:define name="content" in front.xhtml page as follows:&lt;p /&gt;&amp;lt;div class="row"&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="span12"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="hero-unit"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:graphicImage library="fbstatus" name="fbstatus_64p.png"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; style="float: right;" alt="FBStatus" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h1&amp;gt;FBStatus&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;Post status to Facebook...&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;Easy!&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="#{facebookAuthenticator.authorizeUri}" class="btn btn-primary btn-large"&gt;Login with Facebook &amp;raquo;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&amp;lt;!--/span--&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&amp;lt;!--/row--&amp;gt;&lt;p /&gt;The login button/link uses the URI given by "FacebookAuthenticator.authorizeUri" bean, which is implemented like this:&lt;p /&gt;public URI getAuthorizeUri() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return UriBuilder.fromUri("https://graph.facebook.com/oauth/authorize").queryParam("client_id", appId)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .queryParam("redirect_uri", getRedirectUri())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; .queryParam("scope", "publish_stream").build();&lt;br /&gt;}&lt;p /&gt;As you can see, the Facebook authorization URL has 3 query parameters:&lt;br /&gt;- client_id: Your Facebook App ID&lt;br /&gt;- redirect_uri: the destination URL after authorization complete&lt;br /&gt;- scope: Requested permissions, hardcoded to "publish_stream" in this case. You can see the &lt;a href="https://developers.facebook.com/docs/reference/api/permissions/" target="_blank"&gt;complete list of permissions in Facebook Graph API documentation&lt;/a&gt;.&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Create the Facebook Authentication Receiver&lt;/strong&gt;&lt;br /&gt;We need a page that handles the OAuth verifier code given by Facebook.&lt;br /&gt;Put in src/main/webapp/fb_auth.xhtml :&lt;p /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:h="http://java.sun.com/jsf/html"&amp;gt;&lt;p /&gt;&amp;lt;f:metadata&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;f:viewParam name="code" value="#{userSession.facebookAuthCode}"/&amp;gt;&lt;br /&gt;&amp;lt;/f:metadata&amp;gt;&lt;p /&gt;&amp;lt;h:head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Facebook Authentication&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/h:head&amp;gt;&lt;br /&gt;&amp;lt;h:body&amp;gt;&lt;br /&gt;&amp;lt;/h:body&amp;gt;&lt;p /&gt;&amp;lt;/html&amp;gt;&lt;p /&gt;Also add the mapping in pretty-config.xml :&lt;p /&gt;&amp;lt;url-mapping id="fb_auth"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;pattern value="/fb_auth" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;view-id value="/faces/fb_auth.xhtml" /&amp;gt;&lt;br /&gt;&amp;lt;/url-mapping&amp;gt;&lt;p /&gt;The page code is very simple because it simply calls UserSession.setFacebookAuthCode(), which in turn delegates the real work to FacebookAuthenticator bean.&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Create the Post Status form&lt;/strong&gt;&lt;br /&gt;UserSession redirects to /faces/post.xhtml, however we haven't created this page.&lt;br /&gt;Put this in /src/main/webapp/post.xhtml :&lt;p /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:h="http://java.sun.com/jsf/html"&amp;gt;&lt;p /&gt;&amp;lt;ui:composition template="/WEB-INF/templates/basic.xhtml"&amp;gt;&lt;p /&gt;&amp;lt;ui:define name="pageTitle"&amp;gt;Post status to Facebook&amp;lt;/ui:define&amp;gt;&lt;p /&gt;&amp;lt;ui:define name="content"&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="row"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="span12"&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:form&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h2&amp;gt;Post Status&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&amp;lt;h:inputTextarea value="#{postView.message}" style="width: 30em;" rows="4"/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&amp;lt;h:commandLink action="#{postView.manualPost}" value="Post" styleClass="btn"/&amp;gt;&amp;lt;/p&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:panelGroup rendered="#{not empty postView.lastStatusId}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;Last status ID: &lt;a href="#{postView.lastStatusUrl}" target="_blank"&gt;#{postView.lastStatusId}&lt;/a&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/h:panelGroup&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&amp;lt;small&amp;gt;Access token: #{userSession.fbAccessToken}&amp;lt;/small&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/h:form&amp;gt;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt; &amp;lt;!--/span--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt; &amp;lt;!--/row--&amp;gt;&lt;p /&gt;&amp;lt;/ui:define&amp;gt;&lt;p /&gt;&amp;lt;/ui:composition&amp;gt;&lt;p /&gt;&amp;lt;/html&amp;gt;&lt;p /&gt;The   JSF page above simply presents text boxes to input the desired message, and a button to call the    PostView.manualPost() method.&lt;p /&gt;Also displayed is the link to the last status so you can see it in Facebook website.&lt;/li&gt;  &lt;li&gt;&lt;strong&gt;Create the bean which posts status to Facebook using RestFB&lt;/strong&gt;&lt;br /&gt;This is the backing bean that powers the post.xhtml form above.&lt;p /&gt;Put in src/main/java/org/soluvas/fbstatus/PostView.java :&lt;p /&gt;package org.soluvas.fbstatus;&lt;p /&gt;import java.io.Serializable;&lt;br /&gt;import java.util.regex.Matcher;&lt;br /&gt;import java.util.regex.Pattern;&lt;p /&gt;import javax.enterprise.context.SessionScoped;&lt;br /&gt;import javax.faces.application.FacesMessage;&lt;br /&gt;import javax.faces.context.FacesContext;&lt;br /&gt;import javax.inject.Inject;&lt;br /&gt;import javax.inject.Named;&lt;p /&gt;import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;p /&gt;import com.restfb.DefaultFacebookClient;&lt;br /&gt;import com.restfb.Parameter;&lt;br /&gt;import com.restfb.types.FacebookType;&lt;p /&gt;@SessionScoped @Named&lt;br /&gt;public class PostView implements Serializable {&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; static final long serialVersionUID = 1L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private transient Logger log = LoggerFactory.getLogger(PostView.class);&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; @Inject Messages messages;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Inject UserSession userSession;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String message;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String lastStatusId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String lastStatusUrl;&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public void manualPost() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FacesContext faces = FacesContext.getCurrentInstance();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DefaultFacebookClient client = new DefaultFacebookClient(userSession.getFbAccessToken());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FacebookType response = client.publish("me/feed", FacebookType.class, Parameter.with("message", message));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; lastStatusId = response.getId();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; log.info("Got Post ID: {}", lastStatusId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Matcher matcher = Pattern.compile("(\\d+)_(\\d+)").matcher(lastStatusId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (matcher.matches()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String userId = matcher.group(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String postId = matcher.group(2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; lastStatusUrl = "http://www.facebook.com/" + userId + "/posts/" + postId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; log.info("Post URL is {}", lastStatusUrl);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; faces.addMessage(null, new FacesMessage(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Status posted to Facebook with ID: " + lastStatusId, ""));&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; messages.info("Status posted to Facebook with ID: {0}", lastStatusId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; message = "";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; log.error("Cannot parse Post ID: {}", lastStatusId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; faces.addMessage(null, new FacesMessage(faces.getMaximumSeverity(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Cannot parse Post ID: " + lastStatusId, ""));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public String getMessage() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return message;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setMessage(String message) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.message = message;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getLastStatusUrl() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return lastStatusUrl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setLastStatusUrl(String lastStatusUrl) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.lastStatusUrl = lastStatusUrl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getLastStatusId() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return lastStatusId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setLastStatusId(String lastStatusId) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.lastStatusId = lastStatusId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;p /&gt;This   is the core meat of this tutorial. As you can see the real code is not   very complicated. :-) In Java EE 6, you use managed beans and annotate   it with @Named to make it accessible from JSF page (below). By   annotating with @SessionScoped the bean's property values are preserved   within the same browser session. Different visitors or different   browsers will have its own instance of the session-scoped bean.&lt;p /&gt;If you want to perform unit testing, you need to supply the (probably mock) UserSession object, set message property then call manualPost().&lt;/li&gt;  &lt;/ol&gt;  &lt;p&gt;And that's it!&lt;/p&gt;  &lt;p&gt;As you can see only a few steps are unique to this web  application. Which  highlights the necessity to create some form of  project template or  prototype where you can easily construct the basic  JSF webapp  necessities quickly.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: large;"&gt;Deploying to OpenShift&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Deploying the app is easy, simply do a "git push".&lt;/p&gt;  &lt;p&gt;The app requires a one-time setup. The Facebook App credentials are not stored in the application, but must be configured separately (typically by the sysadmin aka DevOps guy).&lt;/p&gt;  &lt;p&gt;You need to create a file in your OpenShift data directory (environment value OPENSHIFT_DATA_DIR) named fbstatus.properties .&lt;/p&gt;  &lt;p&gt;There are several ways to create this file, but here I'll show you how to do it with SSH.&lt;/p&gt;  &lt;p&gt;Use the rhc app show command to find out the Git / SSH URL:&lt;/p&gt;  &lt;p&gt;$ rhc app show -a fbstatus&lt;p /&gt;Application Info&lt;br /&gt;================&lt;br /&gt;fbstatus&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Framework: jbossas-7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Creation: 2012-03-15T00:22:35-04:00&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UUID: 7652c51ac0b84512b5edef59f00***&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Git URL: ssh://7652c51ac0b84512b5edef59f00***@fbstatus-soluvas.rhcloud.com/~/git/fbstatus.git/&lt;br /&gt;&amp;nbsp;&amp;nbsp; Public URL: &lt;a href="http://fbstatus-soluvas.rhcloud.com/"&gt;http://fbstatus-soluvas.rhcloud.com/&lt;/a&gt;&lt;p /&gt;&amp;nbsp;Embedded: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mongodb-2.0 - Connection URL: mongodb://127.13.155.1:27017/&lt;/p&gt;  &lt;p&gt;Now you should be able to connect via SSH by using the depicted username and hostname:&lt;/p&gt;  &lt;p&gt;ssh 7652c51ac0b84512b5edef59f00***@fbstatus-soluvas.rhcloud.com&lt;/p&gt;  &lt;p&gt;Once logged in, go to the fbstatus/data directory and create the fbstatus.properties file using cat :&lt;p /&gt;cd fbstatus/data&lt;br /&gt;cat &amp;gt; fbstatus.properties&lt;br /&gt;facebook.app.id=YOUR_APP_ID&lt;br /&gt;facebook.app.secret=YOUR_APP_SECRET&lt;br /&gt;( press Ctrl+D )&lt;/p&gt;  &lt;p&gt;Now it should look like this:&lt;/p&gt;  &lt;p&gt;[fbstatus-soluvas.rhcloud.com data]\&amp;gt; ls -l&lt;br /&gt;total 4&lt;br /&gt;-rw-r--r--. 1 86 Mar 19 04:32 fbstatus.properties&lt;/p&gt;  &lt;p&gt;Reload your app (using rhc app reload) and the app should work fine.&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: large;"&gt;How to Use the App&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;This app's interface and purpose is actually simple. After deploying the app:&lt;/p&gt;  &lt;ul&gt;  &lt;li&gt;Click &lt;strong&gt;Login with Facebook&lt;/strong&gt; button. The user will be shown a series of Facebook authorization screens before being redirected back to the site:&lt;p /&gt;&lt;div class='p_embed p_image_embed'&gt; &lt;a href="http://getfile5.posterous.com/getfile/files.posterous.com/temp-2012-03-19/mCtmoInokzrIocnsjCbmludnjozgzoljGrkfCIIJnbfrpJcHyGeasuwcAIdB/fbstatus_openshift_java-ee-6_allow.png.scaled1000.png"&gt;&lt;img alt="Fbstatus_openshift_java-ee-6_allow" height="187" src="http://getfile3.posterous.com/getfile/files.posterous.com/temp-2012-03-19/mCtmoInokzrIocnsjCbmludnjozgzoljGrkfCIIJnbfrpJcHyGeasuwcAIdB/fbstatus_openshift_java-ee-6_allow.png.scaled500.png" width="500" /&gt;&lt;/a&gt; &lt;/div&gt; &lt;div class='p_embed p_image_embed'&gt; &lt;a href="http://getfile6.posterous.com/getfile/files.posterous.com/temp-2012-03-19/uABvdccGbzCbbfrtCwBvmelIEBaopzlECHzAwtIsHAriDdJCoguzgjbAwHIe/fbstatus_openshift_java-ee-6_authorize.png.scaled1000.png"&gt;&lt;img alt="Fbstatus_openshift_java-ee-6_authorize" height="168" src="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-03-19/uABvdccGbzCbbfrtCwBvmelIEBaopzlECHzAwtIsHAriDdJCoguzgjbAwHIe/fbstatus_openshift_java-ee-6_authorize.png.scaled500.png" width="500" /&gt;&lt;/a&gt; &lt;/div&gt; &lt;/li&gt;  &lt;li&gt;Put a message, click Post and the app will update your Facebook status.&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;You check out the live app at &lt;a href="http://fbstatus-soluvas.rhcloud.com/" target="_blank"&gt;fbstatus-soluvas.rhcloud.com&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;This is an example of the status generated by the app :&lt;p /&gt;&lt;div class='p_embed p_image_embed'&gt; &lt;img alt="Fbstatus_openshift_java-ee-6_status" height="149" src="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-03-19/puDakvBaikGaabDnkBtJIbppsbhDcuvAydzFkyiyCaoqlJGvieouhwCsmlhl/fbstatus_openshift_java-ee-6_status.png.scaled500.png" width="445" /&gt; &lt;/div&gt; &lt;/p&gt;  &lt;p&gt;You can see the status update at &lt;a href="http://www.facebook.com/ceefour/posts/10150732341781672" target="_blank"&gt;http://www.facebook.com/ceefour/posts/10150732341781672&lt;/a&gt; . Oh and by the way, you're welcome to add me on Facebook :-)&lt;/p&gt;  &lt;p&gt;To make it even more convenient for you, the entire project for this tutorial is available as &lt;a href="https://github.com/soluvas/fbstatus" target="_blank"&gt;open source soluvas/fbstatus project at GitHub&lt;/a&gt;. It's directly deployable to OpenShift too!&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size: large;"&gt;How to Test the App Locally using JBoss AS&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;Testing the app locally very similar with OpenShift, but you need to use JBoss AS.&lt;/p&gt;  &lt;p&gt;To provide the fbstatus.properties configuration file, you can either:&lt;/p&gt;  &lt;ul&gt;  &lt;li&gt;Set the OPENSHIFT_DATA_DIR environment yourself. This way mirrors how OpenShift environment works. Or:&lt;p /&gt;&lt;/li&gt;  &lt;li&gt;Put the fbstatus.properties file in src/main/webapp/WEB-INF folder. This is an additional&amp;nbsp; logic I provided to make it more in-line with "traditional" Java EE apps.&lt;/li&gt;  &lt;/ul&gt;  &lt;p&gt;For application settings in Facebook developer site, you need to put "http://localhost/" as your website URL. So that Facebook will allow your app to redirect to "localhost" address (your development machine).&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;To learn more about &lt;strong&gt;Java Web Development&lt;/strong&gt; using &lt;strong&gt;Java EE 6&lt;/strong&gt;, I highly recommend&amp;nbsp;&lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;strong&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/strong&gt;&amp;nbsp;(Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;* (to be honest, no, I didn't write this article in 5 minutes. but &lt;strong&gt;you&lt;/strong&gt; could ;-)&lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/8859643171214069080/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/how-to-develop-openshift-cloud-app-with.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/8859643171214069080?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/8859643171214069080?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/how-to-develop-openshift-cloud-app-with.html" title="How to Develop an OpenShift Cloud App with Facebook OAuth Support [Tutorial]" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CUMNRnk-cCp7ImA9WhVREk4.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-8284572913053802757</id><published>2012-03-16T10:04:00.001-07:00</published><updated>2012-03-20T01:51:37.758-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-20T01:51:37.758-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="OpenShift" /><category scheme="http://www.blogger.com/atom/ns#" term="Facebook" /><category scheme="http://www.blogger.com/atom/ns#" term="JBoss" /><category scheme="http://www.blogger.com/atom/ns#" term="Java EE" /><title>How to Create a Facebook App using Java EE 6 and Easily Deploy to RedHat OpenShift Cloud [Tutorial]</title><content type="html">&lt;div class="posterous_autopost"&gt;
&lt;b&gt;UPDATE:&lt;/b&gt; Please see the &lt;a href="http://spring-java-ee.blogspot.com/2012/03/how-to-develop-openshift-cloud-app-with.html"&gt;&lt;b&gt;updated Facebook App Tutorial with OAuth Support&lt;/b&gt;&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
________________________________________________________ &lt;br /&gt;
&lt;br /&gt;
How to Develop a &lt;b&gt;Facebook App&lt;/b&gt; using:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Java EE 6&lt;/b&gt; standards including CDI (JSR-299 Dependency Injection) and JSF 2.0&lt;/li&gt;
&lt;li&gt;Twitter's excellent CSS framework &lt;b&gt;Bootstrap&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Easily test and rapidly iterate your app in your local development computer with &lt;b&gt;JBoss AS 7&lt;/b&gt;.1.1&lt;/li&gt;
&lt;li&gt;Deploy to the cloud in seconds to &lt;a href="https://openshift.redhat.com/app/" target="_blank"&gt;&lt;b&gt;RedHat OpenShift Express&lt;/b&gt;&lt;/a&gt;, for &lt;i&gt;free&lt;/i&gt;!&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="font-size: large;"&gt;What Will You Get?&lt;/span&gt;&lt;br /&gt;
&lt;div class="p_embed p_image_embed"&gt;
&lt;a href="http://getfile4.posterous.com/getfile/files.posterous.com/temp-2012-03-15/pvbbCbpyAhvxfHFEqdmqmoivbmwheaIlltHesnJxvGyFGvCcoJmJvquCgwAt/fbstatus_openshift_java-ee-6-tutorial_Post_status_to_Facebook.png.scaled1000.png"&gt;&lt;img alt="Fbstatus_openshift_java-ee-6-tutorial_post_status_to_facebook" height="318" src="http://getfile9.posterous.com/getfile/files.posterous.com/temp-2012-03-15/pvbbCbpyAhvxfHFEqdmqmoivbmwheaIlltHesnJxvGyFGvCcoJmJvquCgwAt/fbstatus_openshift_java-ee-6-tutorial_Post_status_to_Facebook.png.scaled500.png" width="500" /&gt;&lt;/a&gt; &lt;/div&gt;
This app's interface and purpose is actually simple :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Put your &lt;b&gt;Facebook access token&lt;/b&gt; in it. You can use the Facebook Graph Explorer and your own app to generate an access token. You need to allow the &lt;b&gt;publish_stream&lt;/b&gt; privilege.&lt;/li&gt;
&lt;li&gt;Put a message, click Post and the app will update your Facebook status.&lt;/li&gt;
&lt;/ul&gt;
You check out the live app at &lt;a href="http://fbstatus-soluvas.rhcloud.com/" target="_blank"&gt;fbstatus-soluvas.rhcloud.com&lt;/a&gt;.&lt;br /&gt;
&lt;span style="font-size: large;"&gt;Preparation&lt;/span&gt;&lt;br /&gt;
Before you start, you'll need to get some basics ready :&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Get the &lt;a href="https://devstudio.jboss.com/earlyaccess/"&gt;latest JBoss Developer Studio 5.0.0.Beta1&lt;/a&gt;.&lt;/b&gt;&lt;br /&gt;Simply  the quickest way to get started. This contains Eclipse IDE, JBoss  Tools, JBoss AS, JBoss Forge, OpenShift plug-in and several other handy  tools at your command.&lt;br /&gt;If you want, you can install these separately:&lt;br /&gt;- &lt;a href="http://www.eclipse.org/downloads/"&gt;Eclipse IDE, Java EE Developer edition&lt;/a&gt; (3.7.2 or later)&lt;br /&gt;- &lt;a href="http://www.jboss.org/tools/download"&gt;JBoss Tools&lt;/a&gt; (get 3.3.0.Beta1 or later)&lt;br /&gt;- &lt;a href="http://www.jboss.org/jbossas/"&gt;JBoss AS 7.1.1 or later&lt;/a&gt;&lt;br /&gt;- &lt;a href="https://docs.jboss.org/author/display/FORGE/Home"&gt;JBoss Forge&lt;/a&gt; 1.0.Final or later&lt;/li&gt;
&lt;li&gt;While downloading the things above, signup for &lt;a href="https://openshift.redhat.com/app/"&gt;&lt;b&gt;RedHat OpenShift Express&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;Set  up your SSH keys so you're good to go. You can try creating a test app  yourself, but&amp;nbsp; we'll create another app for this tutorial. (OpenShift  allows multiple applications in one account).&lt;/li&gt;
&lt;li&gt;You'll also need to have a Facebook app. Go to &lt;a href="https://www.facebook.com/developers/apps.php"&gt;&lt;b&gt;Facebook Developers&lt;/b&gt;&lt;/a&gt; and create an app. Any test app will do. We'll need to generate an access token for your Facebook profile (later on).&lt;/li&gt;
&lt;/ol&gt;
&lt;span style="font-size: large;"&gt;A Cloud-Ready Facebook App in Java EE in 5 Minutes*&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;Create a new jbossas-7 OpenShift application.&lt;/b&gt;&lt;br /&gt;In JBoss Developer Studio / Eclipse IDE, create a new OpenShift application :&lt;br /&gt;File &amp;gt; New &amp;gt; Other... &amp;gt; choose OpenShift Application.&lt;br /&gt;Name it anything you want, in my case it's fbstatus.&lt;br /&gt;Pick the &lt;b&gt;jbossas-7&lt;/b&gt; cartridge.&lt;br /&gt;Other fancy options are not needed for this purpose.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Cleanup the OpenShift scaffold project.&lt;/b&gt;&lt;br /&gt;Delete everything in src/main/webapp except WEB-INF.&lt;br /&gt;Also delete src/main/webapp/WEB-INF/faces-config.xml first (JBoss Tools may automatically create it for you).&lt;br /&gt; We delete this so Forge's faces setup (below) runs well.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Add SLF4J Logging dependency&lt;/b&gt;.&lt;br /&gt;JDK Logging is  okay, but SLF4J is much nicer. We'll configure SLF4J to log using JDK  Logger, which is handled properly by JBoss AS.&lt;br /&gt;Using Forge Console, run:project add-dependency org.slf4j:slf4j-api:1.6.4&lt;br /&gt;project add-dependency org.slf4j:slf4j-jdk14:1.6.4:runtime&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Setup JSF and CDI.&lt;/b&gt;&lt;br /&gt;Using Forge Console, run:faces setup&lt;br /&gt;
When asked for CDI, enter "Y".&lt;br /&gt; For Faces servlet and mapping, enter "N" because it's not required for Servlet 3.0 and beyond.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Make sure Maven project configuration is up-to-date.&lt;/b&gt;&lt;br /&gt;Right click project &amp;gt; Maven &amp;gt; Update Project&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Get Icons&lt;/b&gt;&lt;br /&gt;Some people think is an "extraneous" step, but I think initial appearance is very important as it sets your mood. ;-)&lt;br /&gt;Get a "normal" size icon (~64px) e.g. from &lt;a href="http://www.iconfinder.com/" target="_blank"&gt;IconFinder&lt;/a&gt;, and save it as src/main/webapp/resources/fbstatus/fbstatus_64p.png&lt;br /&gt;Grab or resize the icon to 16x16 (for navbar, buttons, etc.), save it in src/main/webapp/resources/fbstatus/fbstatus_16p.png&lt;br /&gt;Also save the 16x16 version as an ICO file at src/main/webapp/favicon.ico&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Grab Twitter's Bootstrap HTML5 Framework&lt;/b&gt;&lt;br /&gt;Like  the icons above, this is not really "necessary" for the functionality  of the apps, but it seems the mood since initially the app will look  "acceptable" instead of "plain HTML".&lt;br /&gt;Download &lt;a href="http://twitter.github.com/bootstrap/" target="_blank"&gt;Bootstrap dist&lt;/a&gt; and extract it as src/main/webapp/resources/bootstrap&lt;br /&gt;Also get the jQuery plugins from &lt;a href="https://github.com/twitter/bootstrap/" target="_blank"&gt;Bootstrap sources&lt;/a&gt;, put the bootstrap-*.js plugins from js/ folder into src/main/webapp/resources/bootstrap/js&lt;br /&gt;You also need &lt;a href="http://jquery.com/" target="_blank"&gt;jQuery library litself&lt;/a&gt; and put this file as src/main/webapp/resources/jquery.js&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Create a JSF template&lt;/b&gt; in src/main/webapp/templates/basic.xhtml :&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html lang="en" xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:h="http://java.sun.com/jsf/html"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:f="http://java.sun.com/jsf/core"&amp;gt;&lt;br /&gt;&amp;lt;f:view&amp;gt;&lt;br /&gt;&amp;lt;h:head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta charset="utf-8" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;&amp;lt;ui:insert name="pageTitle"&amp;gt;Post status to Facebook&amp;lt;/ui:insert&amp;gt; | FBStatus&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta name="description" content="Post status to Facebook." /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta name="author" content="FBStatus" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Le styles --&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Workaround for JSF resource URLs and css URLs:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if URL appended with ?ln=bootstrap, glyph URL is wrong:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://localhost:9080/fbstatus/faces/javax.faces.resource/img/glyphicons-halflings.png"&gt;http://localhost:9080/fbstatus/faces/javax.faces.resource/img/glyphicons-half...&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; should be:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://localhost:9080/fbstatus/faces/javax.faces.resource/bootstrap/img/glyphicons-halflings.png"&gt;http://localhost:9080/fbstatus/faces/javax.faces.resource/bootstrap/img/glyph...&lt;/a&gt; --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputStylesheet name="bootstrap/css/bootstrap.css"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;body {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding-top: 60px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding-bottom: 40px;&lt;br /&gt;}&lt;br /&gt;
.sidebar-nav {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding: 9px 0;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputStylesheet name="bootstrap/css/bootstrap-responsive.css"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Le HTML5 shim, for IE6-8 support of HTML5 elements --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--[if lt IE 9]&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src="http://html5shim.googlecode.com/svn/trunk/html5.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;![endif]--&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Le fav and touch icons --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="shortcut icon" href="#{request.contextPath}/favicon.ico" /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;  &amp;lt;!--&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;link rel="apple-touch-icon-precomposed" sizes="114x114"   href="#{request.contextPath}/resources/bootstrap/ico/apple-touch-icon-114-precomposed.png"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &amp;lt;link rel="apple-touch-icon-precomposed" sizes="72x72"  href="#{request.contextPath}/resources/bootstrap/ico/apple-touch-icon-72-precomposed.png"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &amp;lt;link rel="apple-touch-icon-precomposed"  href="#{request.contextPath}/resources/bootstrap/ico/apple-touch-icon-57-precomposed.png"&amp;gt;  --&amp;gt;&lt;br /&gt;&amp;lt;/h:head&amp;gt;&lt;br /&gt;
&amp;lt;h:body&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="navbar navbar-fixed-top"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="navbar-inner"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="container"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a class="btn btn-navbar" data-toggle="collapse"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; data-target=".nav-collapse"&amp;gt; &amp;lt;span class="icon-bar"&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; class="icon-bar"&amp;gt;&amp;lt;/span&amp;gt; &amp;lt;span class="icon-bar"&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/a&amp;gt; &lt;a class="brand" href="http://draft.blogger.com/blogger.g?blogID=5686544298279829031#"&gt;FBStatus&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="nav-collapse"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ul class="nav"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=5686544298279829031#%7Brequest.contextPath%7D/"&gt;Home&lt;/a&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=5686544298279829031#%7Brequest.contextPath%7D/post"&gt;Post Status&lt;/a&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=5686544298279829031#%7Brequest.contextPath%7D/about"&gt;About&lt;/a&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&lt;a href="http://draft.blogger.com/blogger.g?blogID=5686544298279829031#%7Brequest.contextPath%7D/contact"&gt;Contact&lt;/a&gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p class="navbar-text pull-right"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://draft.blogger.com/blogger.g?blogID=5686544298279829031#"&gt;Login&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--/.nav-collapse --&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="container"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="row"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="span12"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:messages/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ui:insert name="content"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;hr /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;footer&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&amp;amp;copy; Hendy Irawan 2012&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/footer&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--/.container--&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Le javascript&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ================================================== --&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Placed at the end of the document so the pages load faster --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript name="jquery.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-transition.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-alert.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-modal.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-dropdown.js"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-scrollspy.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-tab.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-tooltip.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-popover.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-button.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-collapse.js"/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-carousel.js"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:outputScript library="bootstrap" name="js/bootstrap-typeahead.js"/&amp;gt;&lt;br /&gt;
&amp;lt;/h:body&amp;gt;&lt;br /&gt;&amp;lt;/f:view&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Create a JSF page&lt;/b&gt; named src/main/webapp/front.xhtml :&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:h="http://java.sun.com/jsf/html"&amp;gt;&lt;br /&gt;
&amp;lt;h:head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;FBStatus&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/h:head&amp;gt;&lt;br /&gt;
&amp;lt;h:body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;Hello&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;/h:body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
Launch  the web app using JBoss AS server, you should be able to access the  front page using &lt;a href="http://localhost:8080/fbstatus/faces/front.xhtml"&gt;http://localhost:8080/fbstatus/faces/front.xhtml&lt;/a&gt;&lt;br /&gt;
You  can also deploy to OpenShift by Git committing the entire project and  Git push it to OpenShift. It should be accessible at  &lt;a href="http://yourapp-yourdomain.rhcloud.com/faces/front.xhtml"&gt;http://yourapp-yourdomain.rhcloud.com/faces/front.xhtml&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Add PrettyFaces&lt;/b&gt;&lt;br /&gt;For more SEO-friendly URLs PrettyFaces is a must. Use Forge Console to run:project add-dependency com.ocpsoft:prettyfaces-jsf2:3.3.3&lt;br /&gt;
Note: For automatic PrettyFaces configuration, Servlet version in web.xml must be at least 3.0.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Enable PrettyFaces development mode&lt;/b&gt;&lt;br /&gt;This can be turned off in production setting but for now, addd in web.xml as follows :&amp;lt;context-param&amp;gt;&lt;br /&gt;&amp;lt;param-name&amp;gt;com.ocpsoft.pretty.DEVELOPMENT&amp;lt;/param-name&amp;gt;&lt;br /&gt;&amp;lt;param-value&amp;gt;true&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/context-param&amp;gt;&lt;br /&gt;
This will allow PrettyFaces mapping to be changed anytime without reloading the webapp.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Create PrettyFaces mapping&lt;/b&gt;&lt;br /&gt;Create src/main/webapp/WEB-INF/pretty-config.xml :&amp;lt;pretty-config xmlns="http://ocpsoft.com/prettyfaces/3.3.3"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xsi:schemaLocation="http://ocpsoft.com/prettyfaces/3.3.3&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://ocpsoft.com/xml/ns/prettyfaces/ocpsoft-pretty-faces-3.3.3.xsd"&gt;http://ocpsoft.com/xml/ns/prettyfaces/ocpsoft-pretty-faces-3.3.3.xsd&lt;/a&gt;"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;url-mapping id="home"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;pattern value="/" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;view-id value="/faces/front.xhtml" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/url-mapping&amp;gt;&lt;br /&gt;
&amp;lt;/pretty-config&amp;gt;&lt;br /&gt;
The above maps the context root path to /faces/front.xhtml.&lt;br /&gt;Deploy  the webapp in JBoss AS or OpenShift and you should be able to access  the front page at webapp root, e.g. in JBoss would be:  &lt;a href="http://localhost:8080/fbstatus/"&gt;http://localhost:8080/fbstatus/&lt;/a&gt;&lt;br /&gt;
Note that these steps that we've done above are all simply &lt;i&gt;boilerplate&lt;/i&gt;.&lt;br /&gt;You  can save the project at this point and put it somewhere or on Git to  get started with a new OpenShift-JSF-Bootstrap project rapidly.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Add RestFB&lt;/b&gt;&lt;br /&gt;Now let's get to business, I will use &lt;a href="http://restfb.com/" target="_blank"&gt;RestFB Facebook API library for Java&lt;/a&gt;. Using JBoss Forge Console :project add-dependency com.restfb:restfb:1.6.9&lt;br /&gt;
There are other alternative libraries for accessing Facebook:&lt;br /&gt;- &lt;a href="http://www.springsource.org/spring-social" target="_blank"&gt;Spring Social&lt;/a&gt;.  It's easy to use and works well. However it drags quite some  dependencies (especially the whole Spring Framework), which makes sense,  but RestFB serves the purpose of this tutorial quite well.&lt;br /&gt;- &lt;a href="https://github.com/seam/social" target="_blank"&gt;Seam Social&lt;/a&gt;. A CDI oriented Facebook client library.&lt;br /&gt;- &lt;a href="https://code.google.com/p/facebook-java-api/" target="_blank"&gt;facebook-java-api&lt;/a&gt;.  Actually I tried it before RestFB, but it throws an error regarding  invalid session key. I'm using access tokens not session IDs so either  it's using an outdated Facebook API version or I didn't read the manual  correctly.&lt;br /&gt;
At this point I should have added Seam Faces and Seam  International too, to make working with JSF and FacesMessages more  convenient. Too bad, &lt;a href="http://spring-java-ee.blogspot.com/2012/03/jboss-seam-310final-maven-artifacts-not.html" target="_blank"&gt;Seam artifacts aren't available yet in OpenShift Maven repository&lt;/a&gt;. So, plain JSF API for now.&lt;br /&gt;
But in case you're curious how to add Seam Faces and Seam International, here's the needed Maven POM dependencies :&lt;br /&gt;
&amp;nbsp; &amp;lt;properties&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;seam.version&amp;gt;3.1.0.Final&amp;lt;/seam.version&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/properties&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;lt;dependencyManagement&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependencies&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.jboss.seam&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;seam-bom&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;${seam.version}&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/dependencyManagement&amp;gt;&lt;br /&gt;...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.jboss.seam.international&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;seam-international&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;joda-time&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;joda-time&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;version&amp;gt;1.6.2&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;dependency&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;groupId&amp;gt;org.jboss.seam.faces&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;artifactId&amp;gt;seam-faces&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/dependency&amp;gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Create the bean src/main/java/org/soluvas/fbstatus/PostView.java&lt;/b&gt; :Most  of the things below, like always, is Java verbose cruft. (How I wish  Scala would prevail over Java the language.) Anyway, here's the code:&lt;br /&gt;
package org.soluvas.fbstatus;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;import java.util.regex.Matcher;&lt;br /&gt;import java.util.regex.Pattern;&lt;br /&gt;
import javax.enterprise.context.SessionScoped;&lt;br /&gt;import javax.faces.application.FacesMessage;&lt;br /&gt;import javax.faces.application.FacesMessage.Severity;&lt;br /&gt;import javax.faces.context.FacesContext;&lt;br /&gt;import javax.inject.Named;&lt;br /&gt;
import org.slf4j.Logger;&lt;br /&gt;import org.slf4j.LoggerFactory;&lt;br /&gt;
import com.restfb.DefaultFacebookClient;&lt;br /&gt;import com.restfb.Parameter;&lt;br /&gt;import com.restfb.types.FacebookType;&lt;br /&gt;
@SessionScoped @Named&lt;br /&gt;public class PostView implements Serializable {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; static final long serialVersionUID = 1L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private transient Logger log = LoggerFactory.getLogger(PostView.class);&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; @Inject Messages messages;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String accessToken;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String message;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String lastStatusId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; String lastStatusUrl;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public void manualPost() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FacesContext faces = FacesContext.getCurrentInstance();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DefaultFacebookClient client = new DefaultFacebookClient(accessToken);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; FacebookType response = client.publish("me/feed", FacebookType.class, Parameter.with("message", message));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; lastStatusId = response.getId();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; log.info("Got Post ID: {}", lastStatusId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Matcher matcher = Pattern.compile("(\\d+)_(\\d+)").matcher(lastStatusId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (matcher.matches()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String userId = matcher.group(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; String postId = matcher.group(2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; lastStatusUrl = "http://www.facebook.com/" + userId + "/posts/" + postId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; log.info("Post URL is {}", lastStatusUrl);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; faces.addMessage(null, new FacesMessage(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Status posted to Facebook with ID: " + lastStatusId, ""));&lt;br /&gt;//&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; messages.info("Status posted to Facebook with ID: {0}", lastStatusId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; message = "";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; log.error("Cannot parse Post ID: {}", lastStatusId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; faces.addMessage(null, new FacesMessage(faces.getMaximumSeverity(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; "Cannot parse Post ID: " + lastStatusId, ""));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; public String getAccessToken() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return accessToken;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setAccessToken(String accessToken) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.accessToken = accessToken;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getMessage() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return message;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setMessage(String message) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.message = message;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getLastStatusUrl() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return lastStatusUrl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setLastStatusUrl(String lastStatusUrl) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.lastStatusUrl = lastStatusUrl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getLastStatusId() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return lastStatusId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setLastStatusId(String lastStatusId) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; this.lastStatusId = lastStatusId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
This  is the core meat of this tutorial. As you can see the real code is not  very complicated. :-) In Java EE 6, you use managed beans and annotate  it with @Named to make it accessible from JSF page (below). By  annotating with @SessionScoped the bean's property values are preserved  within the same browser session. Different visitors or different  browsers will have its own instance of the session-scoped bean.&lt;br /&gt;
By  setting accessToken and message properties then calling manualPost(),  you should be able to perform some unit testing on the above code if you  want.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Create JSF page for Post Status form&lt;/b&gt;&lt;br /&gt;This page will display the form and call the postView.manualPost() method above.&lt;br /&gt;Put in src/main/webapp/post.xhtml :&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:h="http://java.sun.com/jsf/html"&amp;gt;&lt;br /&gt;
&amp;lt;ui:composition template="/templates/basic.xhtml"&amp;gt;&lt;br /&gt;
&amp;lt;ui:define name="pageTitle"&amp;gt;Post status to Facebook via access token&amp;lt;/ui:define&amp;gt;&lt;br /&gt;
&amp;lt;ui:define name="content"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="row"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="span12"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="row"&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:form&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div class="span12"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h2&amp;gt;Post Status Manually&amp;lt;/h2&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;Access token: &amp;lt;h:inputText value="#{postView.accessToken}"/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;Message: &amp;lt;h:inputText value="#{postView.message}"/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;&amp;lt;h:commandLink action="#{postView.manualPost}" value="Post" styleClass="btn"/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h:panelGroup rendered="#{not empty postView.lastStatusId}"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;Last status ID: &lt;a href="http://draft.blogger.com/blogger.g?blogID=5686544298279829031#%7BpostView.lastStatusUrl%7D" target="_blank"&gt;#{postView.lastStatusId}&lt;/a&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/h:panelGroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/h:form&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--/row--&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--/span--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--/row--&amp;gt;&lt;br /&gt;
&amp;lt;/ui:define&amp;gt;&lt;br /&gt;
&amp;lt;/ui:composition&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
The  JSF page above simply presents text boxes to input the Facebook access  token and the desired message, and a button to call the  PostView.manualPost() method.&lt;br /&gt;
Also displayed is the link to the last status so you can see it in Facebook.&lt;/li&gt;
&lt;/ol&gt;
And that's it!&lt;br /&gt;
Steps 1-12 are actually pure boilerplate for  most JSF apps. Only steps 13, 14, 15 which is unique to this web  application. Which highlights the necessity to create some form of  project template or prototype where you can easily construct the basic  JSF webapp necessities quickly.&lt;br /&gt;
&lt;span style="font-size: large;"&gt;How to Use the App&lt;/span&gt;&lt;br /&gt;
This app's interface and purpose is actually simple. Deploy the webapp to JBoss AS or to OpenShift (using git push) and :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Put your &lt;b&gt;Facebook access token&lt;/b&gt; in it. You can use the Facebook Graph Explorer and your own app to generate an access token. You need to allow the &lt;b&gt;publish_stream&lt;/b&gt; privilege.&lt;/li&gt;
&lt;li&gt;Put a message, click Post and the app will update your Facebook status.&lt;/li&gt;
&lt;/ul&gt;
You check out the live app at &lt;a href="http://fbstatus-soluvas.rhcloud.com/" target="_blank"&gt;fbstatus-soluvas.rhcloud.com&lt;/a&gt;.&lt;br /&gt;
This is an example of the status generated by the app :&lt;br /&gt;
&lt;div class="p_embed p_image_embed"&gt;
&lt;img alt="Fbstatus_openshift_java-ee-6-tutorial_facebook_status_result" height="169" src="http://getfile1.posterous.com/getfile/files.posterous.com/temp-2012-03-16/ktcvEmfytsnxwusuywErjeJahoJmtooyJgpthGqqBwcxJDqeEmwmvyrwnddf/fbstatus_openshift_java-ee-6-tutorial_Facebook_status_result.png.scaled500.png" width="328" /&gt; &lt;/div&gt;
You can check it out here: &lt;a href="http://www.facebook.com/ceefour/posts/10150732341781672" target="_blank"&gt;http://www.facebook.com/ceefour/posts/10150732341781672&lt;/a&gt; . Oh and by the way, you're welcome to add me on Facebook :-)&lt;br /&gt;
&lt;div style="font-style: normal; font-weight: normal; margin-bottom: 0cm;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;To learn more about &lt;b&gt;Java Web Development&lt;/b&gt; using &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend&amp;nbsp;&lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt;&amp;nbsp;(Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
* (to be honest, no, I didn't write this article in 5 minutes. but &lt;b&gt;you&lt;/b&gt; could ;-)&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/8284572913053802757/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/how-to-create-facebook-app-using-java.html#comment-form" title="11 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/8284572913053802757?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/8284572913053802757?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/how-to-create-facebook-app-using-java.html" title="How to Create a Facebook App using Java EE 6 and Easily Deploy to RedHat OpenShift Cloud [Tutorial]" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>11</thr:total></entry><entry gd:etag="W/&quot;DUMNSXk-fCp7ImA9WhVSGEk.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-1980011800698145859</id><published>2012-03-15T03:59:00.001-07:00</published><updated>2012-03-15T14:38:18.754-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-15T14:38:18.754-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java EE Development" /><category scheme="http://www.blogger.com/atom/ns#" term="OpenShift Development" /><title>JBoss Seam 3.1.0.Final Maven artifacts not available RedHat OpenShift Nexus repository?</title><content type="html">&lt;div class="posterous_autopost"&gt;
&lt;span style="font-family: courier new,monospace;"&gt;remote: [ERROR] The build could not read 1 project -&amp;gt; [Help 1]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;remote: [ERROR]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;remote: [ERROR]&amp;nbsp;&amp;nbsp; The project fbstatus:fbstatus:1.0 (/var/lib/libra/7652c51ac0b84512b5edef5*****/fbstatus/runtime/repo/pom.xml) has 3 errors&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;remote: [ERROR]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Non-resolvable import POM: Could not find artifact org.jboss.seam:seam-bom:pom:3.1.0.Final in nexus (&lt;a href="http://mirror1.prod.rhcloud.com/nexus/content/groups/public"&gt;http://mirror1.prod.rhcloud.com:80/nexus/content/groups/public&lt;/a&gt;) @ line 18, column 19 -&amp;gt; [Help 2]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;remote: [ERROR]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'dependencies.dependency.version' for org.jboss.seam.faces:seam-faces:jar is missing. @ line 40, column 17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: courier new,monospace;"&gt;remote: [ERROR]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'dependencies.dependency.version' for org.jboss.seam.international:seam-international:jar is missing. @ line 44, column 17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Please don't tell me this is actually what I think it is .... :-(&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UPDATE:&lt;/b&gt;&amp;nbsp;

&lt;br /&gt;
Right now pretty much the only way to work around this problem is to add the library JARs manually in WEB-INF/lib.&lt;br /&gt;
&lt;br /&gt;
I've started an OpenShift forum thread on this, please show your support: &lt;a href="https://www.redhat.com/openshift/community/forums/express/please-add-jboss-public-maven-repositories"&gt;https://www.redhat.com/openshift/community/forums/express/please-add-jboss-public-maven-repositories&lt;/a&gt; &lt;br /&gt;
 &lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/1980011800698145859/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/jboss-seam-310final-maven-artifacts-not.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/1980011800698145859?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/1980011800698145859?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/03/jboss-seam-310final-maven-artifacts-not.html" title="JBoss Seam 3.1.0.Final Maven artifacts not available RedHat OpenShift Nexus repository?" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DE8DRX08eip7ImA9WhVTEkk.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-7041693157691406140</id><published>2012-02-25T14:28:00.001-08:00</published><updated>2012-02-26T01:01:14.372-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-26T01:01:14.372-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Programmer's Hacks" /><title>XMPP/GTalk Shell Connector for Apache Karaf / Felix GoGo</title><content type="html">&lt;div class="posterous_autopost"&gt;
&lt;div class="p_embed p_image_embed"&gt;
&lt;a href="http://getfile1.posterous.com/getfile/files.posterous.com/spring-java-ee/Hpk2G16Cy9G4F2iqyFYExIja1Fo5xy5G0at0zHQUrk05RlGiY8Kbiu02B236/karaf-felix-gogo-xmpp-shell.png"&gt;&lt;img alt="Karaf-felix-gogo-xmpp-shell" height="510" src="http://getfile2.posterous.com/getfile/files.posterous.com/spring-java-ee/s69uY5U0SsGLbbtoTCC8RsnfFy9BUaTELZzQbsgoiHlalsVsRqTFPUe4GJkP/karaf-felix-gogo-xmpp-shell.png.scaled.500.jpg" width="500" /&gt;&lt;/a&gt; &lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Connecting&amp;nbsp;&lt;b&gt;Felix GoGo Shell through XMPP / Google Talk&lt;/b&gt;&amp;nbsp;?&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;
I did a pretty interesting experiment (and will be useful at least to myself) connecting the Felix GoGo Shell in Apache Karaf/ServiceMix to XMPP/Google Talk Instant Messaging Protocol via Smack library. I spent almost 24 hours just for this. The results is pretty amazing though. :-)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
I also spent quite some time to make ANSI colors sort of "working". It's not strictly correct, but at least it's not entirely boring.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
What do you think ?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;UPDATE&lt;/b&gt;: The OSGi Blueprint-compatible XMPP Shell connector is available as open source with Apache License 2.0 at&amp;nbsp;&lt;a href="https://github.com/soluvas/com.soluvas.shell.xmpp"&gt;https://github.com/soluvas/com.soluvas.shell.xmpp&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Recommended Resources&lt;/b&gt;&lt;br /&gt;
For more in-depth explanation on OSGi, I highly recommend&amp;nbsp;&lt;a href="http://www.amazon.com/gp/product/1933988916/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=eclipsedriven-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399349&amp;amp;creativeASIN=1933988916"&gt;OSGi in Action: Creating Modular Applications in Java&lt;/a&gt;.&lt;br /&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/7041693157691406140/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/02/xmppgtalk-shell-connector-for-apache.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/7041693157691406140?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/7041693157691406140?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/02/xmppgtalk-shell-connector-for-apache.html" title="XMPP/GTalk Shell Connector for Apache Karaf / Felix GoGo" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkUCRHY6eip7ImA9WhRaFEg.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-438859270798805674</id><published>2012-02-16T19:46:00.001-08:00</published><updated>2012-02-16T21:57:45.812-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-16T21:57:45.812-08:00</app:edited><title>Puppet Module for JBoss AS 7.1 "Thunder"</title><content type="html">&lt;div class="posterous_autopost"&gt;
We at &lt;a class="jive-link-external-small" href="http://www.bippo.co/"&gt;&lt;b&gt;Bippo Indonesia&lt;/b&gt;&lt;/a&gt; and &lt;a class="jive-link-external-small" href="http://www.soluvas.com/"&gt;&lt;b&gt;Soluvas&lt;/b&gt;&lt;/a&gt; love &lt;a class="jive-link-external-small" href="http://www.jboss.org/jbossas/"&gt;&lt;b&gt;JBoss AS&lt;/b&gt;&lt;/a&gt;. Especially with the shiny &lt;b&gt;new release 7.1.0.Final aka "Thunder"&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
And we love &lt;i&gt;DevOps&lt;/i&gt; with &lt;a href="http://www.puppetlabs.com/"&gt;&lt;b&gt;Puppet&lt;/b&gt;&lt;/a&gt; too!&lt;br /&gt;
&lt;br /&gt;
As the least contribution we could provide, our &lt;a class="jive-link-external-small" href="https://github.com/soluvas/puppet-jbossas"&gt;&lt;b&gt;Puppet Module for JBoss AS on GitHub&lt;/b&gt;&lt;/a&gt; is available as an open source project. &lt;br /&gt;
&lt;br /&gt;
It's currently a &lt;i&gt;work in progress&lt;/i&gt;, but as time goes we hope to make it flexible with Puppet's parameterized class feature and hopefully able to do deploy/redeploy/undeploy operations, change logging features, user management, etc. Especially that JBoss has an excellent CLI tool, we hope the integration with Puppet will be relatively easy.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Thank you JBoss! &lt;img height="16px" src="https://community.jboss.org/4.5.6/images/emoticons/love.gif" width="16px" /&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Reblogged from &lt;a href="https://community.jboss.org/blogs/beyondjavaee/2012/02/16/puppet-module-for-jboss-as-71-thunder"&gt;https://community.jboss.org/blogs/beyondjavaee/2012/02/16/puppet-module-for-jboss-as-71-thunder&lt;/a&gt;&lt;br /&gt;
&lt;b&gt;&lt;/b&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/438859270798805674/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/02/puppet-module-for-jboss-as-71.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/438859270798805674?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/438859270798805674?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/02/puppet-module-for-jboss-as-71.html" title="Puppet Module for JBoss AS 7.1 &amp;quot;Thunder&amp;quot;" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DkINSH8yfip7ImA9WhRaE08.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-6886711620698737185</id><published>2012-02-15T08:49:00.001-08:00</published><updated>2012-02-15T08:49:59.196-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-15T08:49:59.196-08:00</app:edited><title>UnproxyableResolutionException Workaround when using Scala Closures and javax.inject CDI Beans Together</title><content type="html">&lt;div class='posterous_autopost'&gt;Some powerful &lt;b&gt;Scala programming language&lt;/b&gt; features like &lt;b&gt;closures&lt;/b&gt;, &lt;b&gt;pattern matching&lt;/b&gt;, and &lt;b&gt;lazy vals&lt;/b&gt; don&amp;#39;t work well with &lt;b&gt;dependency injection frameworks&lt;/b&gt; like &lt;b&gt;javax.inject&lt;/b&gt; aka &lt;b&gt;CDI&lt;/b&gt;. This is due to stricter class structure requirements to enable proxying.&lt;p /&gt; For example, this &amp;quot;innocent&amp;quot; code will not work:&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  @Inject private var fbPhotoImporterFactory: Instance[FacebookPhotoImporter] = _ &lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;  @Produces @Named(&amp;quot;facebookPhotoImporter&amp;quot;) private var fbPhotoImporter: ActorRef = _&lt;/span&gt;&lt;p /&gt; &lt;span style="font-family: courier new,monospace;"&gt;  @PostConstruct&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  def init() {&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    logger.debug(&amp;quot;Starting FacebookPhotoImporter actor&amp;quot;)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    fbPhotoImporter = Actor.actorOf(fbPhotoImporterFactory.get())&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    fbPhotoImporter.start()&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  }&lt;/span&gt;&lt;p /&gt;It will throw:&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;Caused by: org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001437 Normal scoped bean class com.satukancinta.web.Persistence is not proxyable because the type is final or it contains a final method public final javax.enterprise.inject.Instance &lt;a href="http://com.satukancinta.web.Persistence.com"&gt;com.satukancinta.web.Persistence.com&lt;/a&gt;$satukancinta$web$Persistence$$fbPhotoImporterFactory() - Managed Bean [class com.satukancinta.web.Persistence] with qualifiers [@Any @Default].&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    at org.jboss.weld.util.Proxies.getUnproxyableClassException(Proxies.java:225)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    at org.jboss.weld.util.Proxies.getUnproxyableTypeException(Proxies.java:178)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    at org.jboss.weld.util.Proxies.getUnproxyableTypesExceptionInt(Proxies.java:193)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    at org.jboss.weld.util.Proxies.getUnproxyableTypesException(Proxies.java:167)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.java:110)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.java:126)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.java:345)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.java:330)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.java:366)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    at org.jboss.as.weld.WeldContainer.start(WeldContainer.java:82)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    at org.jboss.as.weld.services.WeldService.start(WeldService.java:89)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    ... 5 more&lt;/span&gt;&lt;p /&gt; As you can see, my use code isn&amp;#39;t exactly &amp;quot;edge cases&amp;quot;.&lt;p /&gt;It&amp;#39;s actually a pretty common use case: create a Akka actor and pass a factory function to it, as a closure.&lt;br /&gt;The code above doesn&amp;#39;t look like it&amp;#39;s using a closure, but it actually is when written like this: (same functionality, but still breaks CDI)&lt;p /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    fbPhotoImporter = Actor.actorOf { fbPhotoImporterFactory.get() }&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;I can see why CDI has a strict requirement, and I can also understand why Scala implements it the way it is (Scala developers definitely already has a lot of problems working around powerful Scala features into a very restrictive JVM bytecode requirements). This is the price we pay for having a somewhat inferior language (Java, please don&amp;#39;t get offended) in the first place.&lt;p /&gt; But I as an application developer want to have a quick fix for this issue. Re-coding the class in plain Java is one option, but it turns I don&amp;#39;t need to. There is a workaround, by creating a helper method then using it:&lt;p /&gt; &lt;span style="font-family: courier new,monospace;"&gt;  @Inject private var fbPhotoImporterFactory: Instance[FacebookPhotoImporter] = _ &lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  @Produces @Named(&amp;quot;facebookPhotoImporter&amp;quot;) private var fbPhotoImporter: ActorRef = _&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;  &lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  def createFbPhotoImporter() = fbPhotoImporterFactory.get() &lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;  &lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  @PostConstruct&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  def init() {&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    logger.debug(&amp;quot;Starting FacebookPhotoImporter actor&amp;quot;)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    fbPhotoImporter = Actor.actorOf(createFbPhotoImporter)&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    fbPhotoImporter.start()&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  }&lt;/span&gt;&lt;p /&gt; Now Scala is happy and CDI is also happy. Yes it&amp;#39;s a bit more verbose but not too bad. And I guess the code is now somewhat more understandable for Java guys. :)&lt;p /&gt; &lt;b&gt;Tip:&lt;/b&gt; To &lt;b&gt;learn&lt;/b&gt; more about &lt;b&gt;Scala programming&lt;/b&gt;, I recommend &lt;b&gt;&lt;a href="http://www.amazon.com/gp/product/0981531644/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=eclipsedriven-20&amp;amp;linkCode=as2&amp;amp;camp=217145&amp;amp;creative=399349&amp;amp;creativeASIN=0981531644"&gt;Programming in Scala: A Comprehensive Step-by-Step Guide, 2nd Edition&lt;/a&gt;&lt;/b&gt;.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/6886711620698737185/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/02/unproxyableresolutionexception.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/6886711620698737185?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/6886711620698737185?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/02/unproxyableresolutionexception.html" title="UnproxyableResolutionException Workaround when using Scala Closures and javax.inject CDI Beans Together" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0MNRHszfip7ImA9WhRVF0o.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-5862979522906556742</id><published>2012-01-16T20:44:00.001-08:00</published><updated>2012-01-16T20:44:55.586-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-16T20:44:55.586-08:00</app:edited><title>Pentaho Data Integration Transformation and Step Architecture</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;div class='p_embed p_image_embed'&gt; &lt;a href="http://getfile1.posterous.com/getfile/files.posterous.com/spring-java-ee/tAAJP9ZHkdPb6d99nIjMi7bkRHUmDDqEH9Cjavm3iWzQT4XDgbUQbTTJntIb/Pentaho-Data-Integration-trans.png"&gt;&lt;img alt="Pentaho-data-integration-trans" height="212" src="http://getfile2.posterous.com/getfile/files.posterous.com/spring-java-ee/kocV66GUmJ2RmFjbehH7jZ71MVTV6GGHw6c2QQqNUabVIBQPJG1c1gwfz8bg/Pentaho-Data-Integration-trans.png.scaled.500.jpg" width="500" /&gt;&lt;/a&gt; &lt;/div&gt; &lt;p&gt;After doing some &lt;a href="http://kettle.pentaho.com/"&gt;&lt;b&gt;Pentaho Data Integration (Kettle)&lt;/b&gt;&lt;/a&gt; work especially with &lt;a href="http://spring-java-ee.blogspot.com/2011/12/i-don-json-output-in-pentaho-data.html"&gt;&lt;b&gt;JSON Output Step&lt;/b&gt;&lt;/a&gt; in &lt;a href="http://jira.pentaho.com/browse/PDI-7197"&gt;PDI-7195 bug&lt;/a&gt;, I guess it&amp;#39;s a good thing to describe visually how I see the PDI &lt;b&gt;transformations &lt;/b&gt;and &lt;b&gt;steps &lt;/b&gt;architecture.&lt;p /&gt; Hopefully this is helpful for you and also to remind me when I&amp;#39;m confused because which Kettle step framework classes/interfaces relate to which ones is sometimes easy to forget. :-)&lt;p /&gt;Learn how to &lt;i&gt;process&lt;/i&gt; and &lt;i&gt;integrate enterprise databases &amp;amp; data warehouses&lt;/i&gt; easily with &lt;a href="http://www.amazon.com/gp/product/1849515247/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=1849515247"&gt;&lt;b&gt;Pentaho Data Integration 4 Cookbook&lt;/b&gt;&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/5862979522906556742/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/01/pentaho-data-integration-transformation.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/5862979522906556742?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/5862979522906556742?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/01/pentaho-data-integration-transformation.html" title="Pentaho Data Integration Transformation and Step Architecture" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;C04MSXo5fCp7ImA9WhRVFU8.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-1525850800139306240</id><published>2012-01-13T22:19:00.003-08:00</published><updated>2012-01-13T22:19:48.424-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-13T22:19:48.424-08:00</app:edited><title>When do work in Enterprise Application Integration field...</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p&gt;...be prepared to get ClassNotFoundException, ClassCastException,&lt;/p&gt; &lt;p&gt;and loads of other classpath and classloading problems often. :-)&lt;/p&gt; &lt;p&gt;(if you don&amp;#39;t use OSGi, that is...)&lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/1525850800139306240/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/01/when-do-work-in-enterprise-application_13.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/1525850800139306240?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/1525850800139306240?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/01/when-do-work-in-enterprise-application_13.html" title="When do work in Enterprise Application Integration field..." /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C04MRng5fyp7ImA9WhRVFU8.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-465456852282680095</id><published>2012-01-13T22:19:00.001-08:00</published><updated>2012-01-13T22:19:47.627-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-13T22:19:47.627-08:00</app:edited><title>When do work in Enterprise Application Integration field...</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p&gt;...be prepared to get ClassNotFoundException, ClassCastException,&lt;/p&gt; &lt;p&gt;and loads of other classpath and classloading problems often. :-)&lt;/p&gt; &lt;p&gt;(if you don&amp;#39;t use OSGi, that is...)&lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/465456852282680095/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/01/when-do-work-in-enterprise-application.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/465456852282680095?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/465456852282680095?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/01/when-do-work-in-enterprise-application.html" title="When do work in Enterprise Application Integration field..." /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;Ck4ASXw9cCp7ImA9WhRVE00.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-4459363537028747961</id><published>2012-01-11T08:55:00.001-08:00</published><updated>2012-01-11T08:55:48.268-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-11T08:55:48.268-08:00</app:edited><title>Making JSF 2.0 Composite Components Ajax render-capable</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;div class='p_embed p_image_embed'&gt; &lt;a href="http://getfile1.posterous.com/getfile/files.posterous.com/spring-java-ee/XleobDSs5L6q2B5mpO9wxOdLFgfRIvneYrxINGeVjJpomLRjt13GKogCm9xm/satukancinta-user-follow-jsf-a.png"&gt;&lt;img alt="Satukancinta-user-follow-jsf-a" height="284" src="http://getfile2.posterous.com/getfile/files.posterous.com/spring-java-ee/vEaq2auI1VdQv4Uxgfb6J5ms4o5UDxBZbZgZXiNM8eHbuaDKDiiKwDjoG1oG/satukancinta-user-follow-jsf-a.png.scaled.500.jpg" width="500" /&gt;&lt;/a&gt; &lt;/div&gt; &lt;p&gt;If you for example have the following &lt;b&gt;composite component&lt;/b&gt; in a &lt;b&gt;JSF 2.0 Facelets XHTML template&lt;/b&gt;: &lt;/p&gt;&lt;div class="gmail_quote"&gt;&lt;p style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;sc:block title=&lt;i&gt;&amp;quot;Followers&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;h:panelGroup rendered=&lt;i&gt;&amp;quot;#{not empty userShow.user.followedByUsers}&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;ul&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt;  	&amp;lt;ui:repeat var=&lt;i&gt;&amp;quot;user&amp;quot;&lt;/i&gt; value=&lt;i&gt;&amp;quot;#{userShow.user.followedByUsers}&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt;  		&amp;lt;li&amp;gt;&amp;lt;sc:user_link user=&lt;i&gt;&amp;quot;#{user}&amp;quot;&lt;/i&gt;/&amp;gt;&amp;lt;/li&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt;  	&amp;lt;/ui:repeat&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt;  	&amp;lt;/ul&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt;  &amp;lt;/h:panelGroup&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;h:panelGroup rendered=&lt;i&gt;&amp;quot;#{empty usefollowedByUsers}&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		#{&lt;a href="http://userShow.user.name" target="_blank"&gt;userShow.user.name&lt;/a&gt;} has no followers.&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;/h:panelGroup&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;/sc:block&amp;gt;&lt;/p&gt; &lt;p&gt;and try do ajax render:&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;a4j:commandButton value=&lt;i&gt;&amp;quot;Follow&amp;quot;&lt;/i&gt; action=&lt;i&gt;&amp;quot;#{userBean.follow(currentUser, userShow.user)}&amp;quot;&lt;/i&gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	 			render=&lt;i&gt;&amp;quot;followPanel followers&amp;quot;&lt;/i&gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	 			rendered=&lt;i&gt;&amp;quot;#{not currentUser.isFollowing(userShow.user)}&amp;quot;&lt;/i&gt;/&amp;gt;&lt;/p&gt; &lt;p&gt;This won&amp;#39;t work for some reason. &lt;b&gt;Wrong&lt;/b&gt; &lt;i&gt;workaround&lt;/i&gt; is using a &lt;b&gt;h:panelGroup&lt;/b&gt; and moving the &lt;b&gt;id&lt;/b&gt; for &lt;b&gt;ajax render&lt;/b&gt; there:&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;sc:block title=&lt;i&gt;&amp;quot;Followers&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;h:panelGroup id=&lt;i&gt;&amp;quot;followers&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;h:panelGroup rendered=&lt;i&gt;&amp;quot;#{not empty userShow.user.followedByUsers}&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;ul&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	 	&amp;lt;ui:repeat var=&lt;i&gt;&amp;quot;user&amp;quot;&lt;/i&gt; value=&lt;i&gt;&amp;quot;#{userShow.user.followedByUsers}&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	 		&amp;lt;li&amp;gt;&amp;lt;sc:user_link user=&lt;i&gt;&amp;quot;#{user}&amp;quot;&lt;/i&gt;/&amp;gt;&amp;lt;/li&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	 	&amp;lt;/ui:repeat&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	 	&amp;lt;/ul&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt;  	&amp;lt;/h:panelGroup&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;h:panelGroup rendered=&lt;i&gt;&amp;quot;#{empty us.followedByUsers}&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			#{&lt;a href="http://userShow.user.name" target="_blank"&gt;userShow.user.name&lt;/a&gt;} has no followers.&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;/h:panelGroup&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;/h:panelGroup&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;/sc:block&amp;gt;&lt;/p&gt; &lt;p&gt;The &lt;b&gt;correct solution&lt;/b&gt; is to put a &lt;b&gt;#{cc.clientId}&lt;/b&gt; like below in the composite implementation:&lt;/p&gt; &lt;p style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;composite:implementation&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;section &lt;span style="background: #ffff00;"&gt;id&lt;/span&gt;&lt;span style="background: #ffff00;"&gt;=&lt;/span&gt;&lt;i&gt;&lt;span style="background: #ffff00;"&gt;&amp;quot;#{cc.clientId}&amp;quot;&lt;/span&gt;&lt;/i&gt; class=&lt;i&gt;&amp;quot;block&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;div class=&lt;i&gt;&amp;quot;block-inner clearfix&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;h2 class=&lt;i&gt;&amp;quot;block-title&amp;quot;&lt;/i&gt;&amp;gt;#{cc.attrs.title}&amp;lt;/h2&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;div class=&lt;i&gt;&amp;quot;block-content content&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 				&amp;lt;composite:insertChildren/&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;/div&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;/div&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;/section&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;/composite:implementation&amp;gt;&lt;/p&gt; &lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt;&lt;/p&gt;&lt;p align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;To learn more about &lt;b&gt;Java Web Development&lt;/b&gt; using &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt; (Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;.&lt;/p&gt; &lt;/div&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/4459363537028747961/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2012/01/making-jsf-20-composite-components-ajax.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/4459363537028747961?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/4459363537028747961?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2012/01/making-jsf-20-composite-components-ajax.html" title="Making JSF 2.0 Composite Components Ajax render-capable" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;A0QBRH8_fCp7ImA9WhRXFUg.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-821054473879135593</id><published>2011-12-22T05:09:00.001-08:00</published><updated>2011-12-22T05:09:15.144-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-22T05:09:15.144-08:00</app:edited><title>Fix Jackson/JAXB JSON Serialization Problem with Spring Data Neo4j @NodeEntity Objects</title><content type="html">&lt;div class='posterous_autopost'&gt;  &lt;p class="western"&gt;&lt;b&gt;Spring Data Neo4j @NodeEntity&lt;/b&gt;-&lt;b&gt;annotated objects&lt;/b&gt; are &lt;i&gt;proxy&lt;/i&gt;-enriched by Spring Data Neo4j &lt;b&gt;aspects &lt;/b&gt;using &lt;b&gt;AspectJ&lt;/b&gt;&lt;span style="font-weight: normal;"&gt;. There are times we want to expose these objects via &lt;/span&gt;&lt;b&gt;JAX-RS REST API &lt;/b&gt;&lt;span style="font-weight: normal;"&gt;or &lt;/span&gt;&lt;b&gt;JAX-WS / SOAP web services &lt;/b&gt;&lt;span style="font-weight: normal;"&gt;and then (by default) we will have problems.&lt;/span&gt;&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-weight: normal;"&gt;The &lt;/span&gt;&lt;b&gt;error stacktrace messages&lt;/b&gt;&lt;span style="font-weight: normal;"&gt; (here using &lt;/span&gt;&lt;b&gt;JBoss AS 7.0.2&lt;/b&gt;&lt;span style="font-weight: normal;"&gt;) are along the lines of:&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-left: 1.27cm;"&gt;&lt;span style="font-weight: normal;"&gt;HTTP Status 500 - org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.neo4j.graphdb.DynamicRelationshipType and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: com.satukancinta.domain.User[&amp;quot;enjoyActivities&amp;quot;]-&amp;gt;org.springframework.data.neo4j.fieldaccess.ManagedFieldAccessorSet[0]-&amp;gt;com.satukancinta.domain.Activity[&amp;quot;persistentState&amp;quot;]-&amp;gt;org.neo4j.rest.graphdb.entity.RestNode[&amp;quot;relationships&amp;quot;]-&amp;gt;org.neo4j.rest.graphdb.entity.RestRelationship[&amp;quot;type&amp;quot;])&lt;/span&gt;&lt;/p&gt; &lt;hr size="1" align="RIGHT" width="632" /&gt; &lt;p class="western" style="margin-left: 1.27cm;"&gt;&lt;b&gt;type&lt;/b&gt; Status report&lt;/p&gt; &lt;p class="western" style="margin-left: 1.27cm;"&gt;&lt;b&gt;message&lt;/b&gt; org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.neo4j.graphdb.DynamicRelationshipType and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: com.satukancinta.domain.User[&amp;quot;enjoyActivities&amp;quot;]-&amp;gt;org.springframework.data.neo4j.fieldaccess.ManagedFieldAccessorSet[0]-&amp;gt;com.satukancinta.domain.Activity[&amp;quot;persistentState&amp;quot;]-&amp;gt;org.neo4j.rest.graphdb.entity.RestNode[&amp;quot;relationships&amp;quot;]-&amp;gt;org.neo4j.rest.graphdb.entity.RestRelationship[&amp;quot;type&amp;quot;])&lt;/p&gt; &lt;p class="western" style="margin-left: 1.27cm;"&gt;&lt;b&gt;description&lt;/b&gt; The server encountered an internal error (org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.neo4j.graphdb.DynamicRelationshipType and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: com.satukancinta.domain.User[&amp;quot;enjoyActivities&amp;quot;]-&amp;gt;org.springframework.data.neo4j.fieldaccess.ManagedFieldAccessorSet[0]-&amp;gt;com.satukancinta.domain.Activity[&amp;quot;persistentState&amp;quot;]-&amp;gt;org.neo4j.rest.graphdb.entity.RestNode[&amp;quot;relationships&amp;quot;]-&amp;gt;org.neo4j.rest.graphdb.entity.RestRelationship[&amp;quot;type&amp;quot;])) that prevented it from fulfilling this request.&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-weight: normal;"&gt;To solve this problem, annotate your entity class with &lt;/span&gt;&lt;span style="font-weight: normal;"&gt;@JsonAutoDetect&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;(JsonMethod.&lt;/span&gt;&lt;i&gt;&lt;span style="font-weight: normal;"&gt;NONE&lt;/span&gt;&lt;/i&gt;&lt;span style="font-weight: normal;"&gt;) :&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &lt;b&gt;import&lt;/b&gt;&lt;span style="font-weight: normal;"&gt; org.codehaus.jackson.annotate.JsonAutoDetect;&lt;/span&gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &lt;b&gt;import&lt;/b&gt; org.codehaus.jackson.annotate.JsonMethod;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &lt;b&gt;import&lt;/b&gt; org.codehaus.jackson.annotate.JsonProperty;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &lt;br /&gt; &lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; @NodeEntity @JsonAutoDetect(JsonMethod.&lt;i&gt;NONE&lt;/i&gt;)&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &lt;b&gt;public&lt;/b&gt; &lt;b&gt;class&lt;/b&gt; User &lt;b&gt;implements&lt;/b&gt; NodeBacked {&lt;/p&gt; &lt;p class="western"&gt;&lt;p /&gt; &lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-weight: normal;"&gt;then manually annotate each property you want to serialize with @JsonProperty :&lt;/span&gt;&lt;/p&gt; &lt;p class="western" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &lt;span style="font-weight: normal;"&gt;	&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;@JsonProperty&lt;/span&gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&lt;b&gt;public&lt;/b&gt; String getName() {&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&lt;b&gt;return&lt;/b&gt; name;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	}&lt;/p&gt; &lt;p class="western"&gt;&lt;span style="font-weight: normal;"&gt;Now the &lt;/span&gt;&lt;b&gt;JAX-RS Application&lt;/b&gt; 	 	 	 	&lt;span style="font-weight: normal;"&gt; works as intended and everybody is happy. :-) There&amp;#39;s also a &lt;a href="http://stackoverflow.com/questions/4362104/strange-jackson-exception-being-thrown-when-serializing-hibernate-object"&gt;StackOverflow thread&lt;/a&gt; that discusses this problem.&lt;/span&gt;&lt;/p&gt;&lt;p class="wikiPara"&gt;To learn more about &lt;b&gt;Java Web Development&lt;/b&gt; using &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt; (Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/821054473879135593/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2011/12/fix-jacksonjaxb-json-serialization.html#comment-form" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/821054473879135593?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/821054473879135593?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2011/12/fix-jacksonjaxb-json-serialization.html" title="Fix Jackson/JAXB JSON Serialization Problem with Spring Data Neo4j @NodeEntity Objects" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;CUUFRHkycCp7ImA9WhRXFUg.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-6397557817442920702</id><published>2011-12-22T03:26:00.001-08:00</published><updated>2011-12-22T03:26:55.798-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-22T03:26:55.798-08:00</app:edited><title>How to Resolve Spring Data Neo4j / Jersey / Jackson Conflict with JBoss AS 7 RESTEasy</title><content type="html">&lt;div class='posterous_autopost'&gt;  &lt;p class="western" style="font-weight: normal;"&gt;I&amp;#39;m using &lt;b&gt;Spring Data Neo4j REST Client&lt;/b&gt; which uses &lt;b&gt;Jersey JAX-RS Client&lt;/b&gt;. Unfortunately when deployed to &lt;b&gt;JBoss AS 7.0.2&lt;/b&gt;, it&lt;b&gt; conflicts&lt;/b&gt; with the built-in &lt;b&gt;RESTEasy&lt;/b&gt; deployer (&lt;a href="https://jira.springsource.org/browse/DATAGRAPH-159"&gt;bug DATAGRAPH-159&lt;/a&gt;).&lt;/p&gt; &lt;p class="western" style="font-weight: normal;"&gt;In order to run the application, jersey-server must be excluded :&lt;/p&gt; &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.springframework.data&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;spring-data-neo4j-rest&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;${spring-data-neo4j.version}&amp;lt;/version&amp;gt; &amp;lt;exclusions&amp;gt; ... &amp;lt;exclusion&amp;gt; &amp;lt;artifactId&amp;gt;jersey-server&amp;lt;/artifactId&amp;gt; &amp;lt;groupId&amp;gt;com.sun.jersey&amp;lt;/groupId&amp;gt; &amp;lt;/exclusion&amp;gt; &amp;lt;/exclusions&amp;gt; &amp;lt;/dependency&amp;gt;&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt; &lt;p class="western" style="font-weight: normal;"&gt;Another issue I came across is my web application is also a &lt;b&gt;JAX-RS Service Application&lt;/b&gt;, therefore it requires &lt;b&gt;JBoss RESTEasy&lt;/b&gt;. Unfortunately Jackson JSON Provider which is a dependency of Neo4j REST Client and Jersey JAX-RS Client conflicts with RESTEasy&amp;#39;s Jackson Provider, with the following exception stacktrace message:&lt;/p&gt; &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;java.lang.RuntimeException: Unable to instantiate MessageBodyReader  org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:760)  org.jboss.resteasy.spi.ResteasyProviderFactory.registerProvider(ResteasyProviderFactory.java:742)  org.jboss.resteasy.spi.ResteasyDeployment.registerProvider(ResteasyDeployment.java:505)  org.jboss.resteasy.spi.ResteasyDeployment.registration(ResteasyDeployment.java:305)  org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:225)  org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:67)  org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:36)  org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139)  org.jboss.as.web.NamingValve.invoke(NamingValve.java:57)  org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)  org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362)  org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:897)  org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:626)  org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:2054)  java.lang.Thread.run(Thread.java:722)&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt; &lt;p class="western" style="background: #ffffff; font-style: normal;"&gt; &lt;b&gt;&lt;span style="background: #525d76;"&gt;root cause&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;java.lang.RuntimeException: Illegal to inject a message body into a singleton into public org.codehaus.jackson.jaxrs.JacksonJsonProvider(org.codehaus.jackson.map.ObjectMapper,org.codehaus.jackson.jaxrs.Annotations[])  org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:209)  org.jboss.resteasy.core.ConstructorInjectorImpl.injectableArguments(ConstructorInjectorImpl.java:63)  org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:129)  org.jboss.resteasy.spi.ResteasyProviderFactory.getProviderInstance(ResteasyProviderFactory.java:1038)&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt; &lt;p class="western"&gt; I thought this was issue &lt;a href="https://issues.jboss.org/browse/RESTEASY-503"&gt;RESTEASY-503&lt;/a&gt;, because JBoss AS 7.0.2 happened to use the somewhat buggy RESTEasy &lt;a href="http://2.2.1.GA"&gt;2.2.1.GA&lt;/a&gt;. But it turns out there is an easy fix to this problem, thanks to &lt;a href="https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7"&gt;Configuring Module Classloading in JBoss AS 7&lt;/a&gt;.&lt;/p&gt; &lt;p class="western"&gt;Edit src/main/webapp/WEB-INF/jboss-deployment-structure.xml as follows:&lt;/p&gt; &lt;p class="western"&gt;&lt;br /&gt;&amp;lt;jboss-deployment-structure xmlns=&lt;i&gt;&amp;quot;urn:jboss:deployment-structure:1.0&amp;quot;&lt;/i&gt;&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;deployment&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;dependencies&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;module name=&lt;i&gt;&amp;quot;org.codehaus.jackson.jackson-jaxrs&amp;quot;&lt;/i&gt;/&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;module name=&lt;i&gt;&amp;quot;org.codehaus.jackson.jackson-core-asl&amp;quot;&lt;/i&gt;/&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 			&amp;lt;module name=&lt;i&gt;&amp;quot;org.codehaus.jackson.jackson-mapper-asl&amp;quot;&lt;/i&gt;/&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 		&amp;lt;/dependencies&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; 	&amp;lt;/deployment&amp;gt;&lt;/p&gt; &lt;p class="western" align="LEFT" style="margin-bottom: 0cm; font-style: normal; font-weight: normal;"&gt; &amp;lt;/jboss-deployment-structure&amp;gt;&lt;/p&gt; &lt;p class="western"&gt;Now Spring Data Neo4j, Jersey Client with JSON Jackson Provider, and my JAX-RS Application served by RESTEasy, all can coexist in the same web application WAR. :-)&lt;/p&gt;&lt;p class="western"&gt;&lt;/p&gt;&lt;p class="wikiPara"&gt;To learn more about &lt;b&gt;Java Web Development&lt;/b&gt; using &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt; (Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/6397557817442920702/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2011/12/how-to-resolve-spring-data-neo4j-jersey.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/6397557817442920702?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/6397557817442920702?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2011/12/how-to-resolve-spring-data-neo4j-jersey.html" title="How to Resolve Spring Data Neo4j / Jersey / Jackson Conflict with JBoss AS 7 RESTEasy" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;CUMGQ344fCp7ImA9WhRQEkg.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-213690938424748479</id><published>2011-12-07T02:23:00.001-08:00</published><updated>2011-12-07T02:23:42.034-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-07T02:23:42.034-08:00</app:edited><title>I don't "get" JSON Output in Pentaho Data Integration (PDI) / Kettle</title><content type="html">&lt;div class='posterous_autopost'&gt;I don&amp;#39;t understand how to use the &lt;b&gt;JSON Output step&lt;/b&gt; properly in &lt;b&gt;Kettle&lt;/b&gt; aka &lt;b&gt;Pentaho Data Integration (PDI)&lt;/b&gt;.&lt;p /&gt;With &amp;quot;Nr of rows in a bloc&amp;quot; set to 0 or 3, I got:&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;{&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;  &amp;quot;categories&amp;quot;: [&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    {&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;      &amp;quot;code&amp;quot;: &amp;quot;WORKAHOLIC-CHIC&amp;quot;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    },&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    {&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;      &amp;quot;name&amp;quot;: &amp;quot;Workaholic Chic&amp;quot;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    },&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    {&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;      &amp;quot;description&amp;quot;: &amp;quot;Move ! Move ! move...!!\nLight Up Your Day... with a perfect match, \nPadanan busana kerja Professsional look, Powerfull &amp;amp; Fashionable,\nwhich got several design for different mood,  multifunction,\nMemorable style!\nLetâ€™s be and stay Tuneeca...\n&amp;quot;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    }&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  ]&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;}&lt;/span&gt;&lt;p /&gt; which is basically only the last record.&lt;p /&gt;With &amp;quot;Nr of rows in a bloc&amp;quot; set to 1, I got:&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;{&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  &amp;quot;categories&amp;quot;: [&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    {&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;      &amp;quot;code&amp;quot;: &amp;quot;AKSESORI-LIGHT-UP-YOUR-DAY&amp;quot;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    },&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    {&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;      &amp;quot;name&amp;quot;: &amp;quot;Aksesori Light Up Your Day&amp;quot;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    },&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    {&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;      &amp;quot;description&amp;quot;: &amp;quot;-&amp;quot;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    },&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    {&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;      &amp;quot;code&amp;quot;: &amp;quot;AKSESORIS-APRIL-2009&amp;quot;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    },&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;...&lt;/span&gt;&lt;p /&gt;What I&amp;#39;m trying to get is:&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;{ &amp;quot;categories&amp;quot;: [&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;  { &amp;quot;code&amp;quot;: &amp;quot;AKSESORI-LIGHT-UP-YOUR-DAY&amp;quot;,&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;     &amp;quot;name&amp;quot;: &amp;quot;Aksesori Light Up Your Day&amp;quot;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;      &amp;quot;description&amp;quot;: &amp;quot;Very cool&amp;quot; },&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  { &amp;quot;code&amp;quot;: .........&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;Contrast this with the &lt;b&gt;XML Output&lt;/b&gt;, which I get the following correct output right from first try:&lt;p /&gt;&lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;&amp;lt;categories&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  &amp;lt;category&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;code&amp;gt;AKSESORI-LIGHT-UP-YOUR-DAY&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;name&amp;gt;Aksesori Light Up Your Day&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;description&amp;gt;-&amp;lt;/description&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;  &amp;lt;/category&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;  &amp;lt;category&amp;gt;&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    &amp;lt;code&amp;gt;AKSESORIS-APRIL-2009&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;br /&gt; ...&lt;p /&gt;An additional plus is that &lt;b&gt;XML Output&lt;/b&gt; already performs a bit of &lt;i&gt;output pretty formatting&lt;/i&gt;, which I appreciate very much. (JSON Output outputs everything in a single line)&lt;p /&gt; Those two &lt;b&gt;Output steps&lt;/b&gt; gets the same &lt;b&gt;input data&lt;/b&gt;.&lt;p /&gt;Any ideas ?&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/213690938424748479/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2011/12/i-don-json-output-in-pentaho-data.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/213690938424748479?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/213690938424748479?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2011/12/i-don-json-output-in-pentaho-data.html" title="I don&amp;#39;t &amp;quot;get&amp;quot; JSON Output in Pentaho Data Integration (PDI) / Kettle" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;CUYFSXs6fSp7ImA9WhdaFk4.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-1977874726078051983</id><published>2011-10-26T05:45:00.001-07:00</published><updated>2011-10-26T05:45:18.515-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-26T05:45:18.515-07:00</app:edited><title>Seam Framework Java EE Library version 3.1.0.Beta4 Released</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p class="wikiPara"&gt; As per usual, let&amp;#39;s get the links out of the way first: &lt;/p&gt; &lt;p class="wikiPara"&gt; &lt;a href="https://sourceforge.net/projects/jboss/files/Seam/3/3.1.0.Beta4/" class="regularLink" target=""&gt;Download &lt;b&gt;Seam 3.1.0.Beta4&lt;/b&gt;&lt;/a&gt; &lt;/p&gt; &lt;p class="wikiPara"&gt; &lt;a href="http://docs.jboss.org/seam/3/latest/reference/en-US/html/" class="regularLink" target=""&gt;Reference Documentation&lt;/a&gt; &lt;/p&gt; &lt;p class="wikiPara"&gt; &lt;a href="http://docs.jboss.org/seam/3/latest/api/" class="regularLink" target=""&gt;API Documentation&lt;/a&gt; &lt;/p&gt; &lt;p class="wikiPara"&gt; &lt;a href="http://issues.jboss.org/browse/SEAM" class="regularLink" target=""&gt;Report Issues&lt;/a&gt; &lt;/p&gt; &lt;p class="wikiPara"&gt; For Maven users, there is a new version of the Seam Bill of Materials: &lt;/p&gt; &lt;div class="CodeRay"&gt; &lt;div class="code"&gt;&lt;pre&gt;&amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;org.jboss.seam&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;seam-bom&amp;lt;/artifactId&amp;gt; &amp;lt;version&amp;gt;3.1.0.Beta4&amp;lt;/version&amp;gt; &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt; &amp;lt;scope&amp;gt;import&amp;lt;/scope&amp;gt; &amp;lt;/dependency&amp;gt;&lt;/pre&gt;&lt;/div&gt; &lt;/div&gt; &lt;p class="wikiPara"&gt; I know that we promised a CR1 release for Seam 3.1 at about this time, however the Seam QA team have done their jobs a little too well and identified a number of issues with the Beta3 release which we wanted to get fixed before we go to a candidate release. The great news for this release is that we&amp;#39;ve fixed 68 issues - you can view the issue list here: &lt;/p&gt; &lt;p class="wikiPara"&gt; &lt;a href="https://issues.jboss.org/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=12315988" class="regularLink" target=""&gt;https://issues.jboss.org/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=12315988&lt;/a&gt; &lt;/p&gt; &lt;p class="wikiPara"&gt; Included in this release is a number of new features, improved documentation and a brand new Arquillian-based structure for our test suites to make it easier to test each module on multiple containers. We&amp;#39;ve also squashed a great deal of bugs, improved stability, plus made a number of other minor improvements. &lt;/p&gt; &lt;p class="wikiPara"&gt; As we still have quite a few open issues remaining for the Seam 3.1 release, we will likely release another beta in the next couple of weeks. We want this release to be rock solid, so please try out the beta and let us know if you find any problems.&lt;/p&gt;&lt;p class="wikiPara"&gt;&lt;i&gt;(Article copied verbatim from &lt;a href="http://in.relation.to/Bloggers/Seam31Beta4Released"&gt;in.relation.to&lt;/a&gt;)&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="wikiPara"&gt;To learn more about &lt;b&gt;Java Web Development&lt;/b&gt; using &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt; (Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/1977874726078051983/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2011/10/seam-framework-java-ee-library-version.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/1977874726078051983?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/1977874726078051983?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2011/10/seam-framework-java-ee-library-version.html" title="Seam Framework Java EE Library version 3.1.0.Beta4 Released" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;C0ADSXo6fCp7ImA9WhdbFEo.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-2021023723891641436</id><published>2011-09-30T04:43:00.000-07:00</published><updated>2011-10-12T19:09:38.414-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-12T19:09:38.414-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java Web Development" /><title>m2e/m2eclipse-wtp 0.14.0 Released: Eclipse IDE Integration for Java EE 6 / Web Application Maven projects</title><content type="html">&lt;div class="jive-rendered-content"&gt;
&lt;b&gt;Maven
 Integration for Eclipse WTP 0.14.0, a.k.a m2eclipse-wtp, a.k.a m2e-wtp&lt;/b&gt; 
is out the door. This new release brings its share of new features and 
enhancements, as well as a bunch of bug fixes. The complete release 
notes are available &lt;a class="jive-link-external-small" href="https://issues.sonatype.org/secure/ReleaseNote.jspa?projectId=10310&amp;amp;version=11250"&gt;here&lt;/a&gt;. &lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
m2e-wtp
 0.14.0 works with Eclipse Helios and Indigo, requires at least m2e 1.0 
and mavenarchiver plugin &amp;gt; 0.14.0 (0.15.0 should be automatically 
installed). As usual, m2e-wtp can be installed from :&lt;br /&gt;
&lt;ul&gt;
&lt;li style="text-align: start;"&gt; the Maven Discovery mechanism : Window &amp;gt; Preferences &amp;gt; Maven &amp;gt; Discovery &amp;gt; Open catalog&lt;/li&gt;
&lt;li style="text-align: start;"&gt; the &lt;a class="jive-link-external-small" href="http://marketplace.eclipse.org/content/maven-integration-eclipse-wtp"&gt;Eclipse Marketplace&lt;/a&gt; : Help &amp;gt; Eclipse Marketplace&lt;/li&gt;
&lt;li style="text-align: start;"&gt; the update site : &lt;b&gt;&lt;a class="jive-link-external-small" href="http://download.jboss.org/jbosstools/updates/m2eclipse-wtp/"&gt;http://download.jboss.org/jbosstools/updates/m2eclipse-wtp/&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
So &lt;span id="internal-source-marker_0.6966659519821405"&gt;what's new and noteworthy in 0.14.0? Let's see :&lt;/span&gt;&lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;

&lt;span style="color: #666699;"&gt;New support for Application Client projects&lt;/span&gt;&lt;/h3&gt;
Application Client packaging has been introduced with the new &lt;a class="jive-link-external-small" href="http://maven.apache.org/plugins/maven-acr-plugin/"&gt;maven-acr-plugin&lt;/a&gt;. Support for app-client type dependencies has been &lt;a class="jive-link-external-small" href="http://jira.codehaus.org/browse/MEAR-137"&gt;added in maven-ear-plugin 2.6&lt;/a&gt;.
 Since Application Client projects are natively supported in WTP, we 
added a new configurator for app-client projects. When an app-client 
project is imported / configured via m2e, the Application Client Facet 
will be automatically installed, its version inferred from the contents 
of META-INF/application-client.xml. Filtering of the deployment 
descriptor is supported.&lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-xml"&gt;&lt;span class="jive-xml-tag"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="jive-xml-tag"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-acr-plugin&lt;span class="jive-xml-tag"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.0&lt;span class="jive-xml-tag"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;extensions&amp;gt;&lt;/span&gt;true&lt;span class="jive-xml-tag"&gt;&amp;lt;/extensions&amp;gt;&lt;/span&gt;
&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;archive&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;manifest&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;mainClass&amp;gt;&lt;/span&gt;foo.bar.appclient.Main&lt;span class="jive-xml-tag"&gt;&amp;lt;/mainClass&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;/manifest&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;/archive&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;filterDeploymentDescriptor&amp;gt;&lt;/span&gt;true&lt;span class="jive-xml-tag"&gt;&amp;lt;/filterDeploymentDescriptor&amp;gt;&lt;/span&gt;
&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;span class="jive-xml-tag"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;a href="http://community.jboss.org/servlet/JiveServlet/showImage/38-4192-17064/appclient.png"&gt;&lt;img alt="appclient.png" class="jive-image-thumbnail jive-image" height="252" src="http://community.jboss.org/servlet/JiveServlet/downloadImage/38-4192-17064/450-252/appclient.png" width="450" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;

&lt;span style="color: #666699;"&gt;New support for Web Fragment projects&lt;/span&gt;&lt;/h3&gt;
If
 a project contains a META-INF/web-fragment.xml in it's compilation 
output folder, the Web Fragment Facet is automatically installed upon 
maven project configuration (the Utility Facet is removed if necessary).
 Note that, as per the Java EE6 spec - and WTP is very picky about it-, 
Web Fragment projects *must* use Java 1.6. Failure to comply will fail 
the configuration and an error marker will be displayed.&lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;a href="http://community.jboss.org/servlet/JiveServlet/showImage/38-4192-17065/webfragment.png"&gt;&lt;img alt="webfragment.png" class="jive-image-thumbnail jive-image" height="252" src="http://community.jboss.org/servlet/JiveServlet/downloadImage/38-4192-17065/450-252/webfragment.png" width="450" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;

&lt;span style="color: #666699;"&gt;The use of target/m2e-wtp/web-resources is now optional&lt;/span&gt;&lt;/h3&gt;
&lt;div id="wiki-content"&gt;
Remember, &lt;code&gt;target/m2e-wtp/web-resources/&lt;/code&gt;&lt;a class="jive-link-external-small" href="https://github.com/sonatype/m2eclipse-wtp/wiki/What-is-this-web-resources-folder%3F"&gt; is used to allow the deployment of automatically generated web resources with WTP&lt;/a&gt;.&lt;/div&gt;
&lt;div id="template"&gt;
On some occasions however, having &lt;code&gt;target/m2e-wtp/web-resources/&lt;/code&gt; might cause some troubles (incompatibilities with WTP editors, &lt;a class="jive-link-external-small" href="https://issues.sonatype.org/browse/MECLIPSEWTP-136"&gt;IBM RAD&lt;/a&gt;, &lt;a class="jive-link-external-small" href="https://issues.sonatype.org/browse/MECLIPSEWTP-180"&gt;using Servlet.getRealPath(...)&lt;/a&gt; in your code). &lt;br /&gt;
As a workaround, you can choose to not use &lt;code&gt;target/m2e-wtp/web-resources/&lt;/code&gt;
 and generate the pom.properties and MANIFEST.MF files in your source 
directory instead (It'll be your responsibility to add these files to 
your SCM ignore list).&lt;br /&gt;
In order to remove &lt;code&gt;target/m2e-wtp/web-resources/&lt;/code&gt; from the list of deployed folders, you need to change some preferences :&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;on
 your project only : right-click on the project &amp;gt; Properties &amp;gt; 
Maven &amp;gt; WTP : check "Enable Project Specific Settings" and uncheck 
"Maven Archiver generates files under the build directory"&lt;/li&gt;
&lt;li&gt;on 
the whole workspace : Window &amp;gt; Preferences &amp;gt; Maven &amp;gt; WTP : 
uncheck "Maven Archiver generates files under the build directory"&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;a href="http://community.jboss.org/servlet/JiveServlet/showImage/38-4192-17067/war-preferences.png"&gt;&lt;img alt="war-preferences.png" class="jive-image-thumbnail jive-image" height="400" src="http://community.jboss.org/servlet/JiveServlet/downloadImage/38-4192-17067/450-400/war-preferences.png" width="450" /&gt;&lt;/a&gt;&lt;br /&gt;
Please note that &lt;b&gt;this setting will be overridden if web resource filtering is in use&lt;/b&gt;, that is if the maven-war-plugin &lt;a class="jive-link-external-small" href="http://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html"&gt;configuration&lt;/a&gt; declares &lt;code&gt;&amp;lt;webResources&amp;gt;&lt;/code&gt; or sets &lt;code&gt;&amp;lt;filterDeploymentDescriptor&amp;gt;&lt;/code&gt;
 to true. The reason is simple : you don't want to see your source files
 overwritten by the filtering mechanism (and it would also lead to some 
not-so-funny build loops). &lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;

&lt;span style="color: #666699;"&gt;Custom file name mapping for web project dependencies&lt;/span&gt;&lt;/h3&gt;
Since the maven-war-plugin allows file name customization for librairies and TLDs, based on patterns (&lt;a class="jive-link-external-small" href="http://maven.apache.org/plugins/maven-war-plugin/examples/file-name-mapping.html"&gt;http://maven.apache.org/plugins/maven-war-plugin/examples/file-name-mapping.html)&lt;/a&gt;, we added the the same feature in m2e-wtp. That will allow you to use a version-less name mapping for dependencies, like :&lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre ___default_attr="xml" class="jive_text_macro jive_macro_code"&gt;&lt;div class="line" id="LC16"&gt;
&lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC17"&gt;
&amp;nbsp; &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.apache.maven.plugins&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC18"&gt;
&amp;nbsp; &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-war-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC19"&gt;
&amp;nbsp; &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.1.1&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC20"&gt;
&amp;nbsp; &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC21"&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="nt"&gt;&amp;lt;outputFileNameMapping&amp;gt;&lt;/span&gt;@{groupId}@-@{artifactId}@.@{extension}@&lt;span class="nt"&gt;&amp;lt;/outputFileNameMapping&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC22"&gt;
&lt;span class="nt"&gt;&amp;nbsp; &amp;lt;/configuration&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class="line" id="LC23"&gt;
&lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;/pre&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
The
 trick here is, in order to support non default filename mappings of 
dependencies listed in the Maven Library, the artifact is copied to the 
build directory (the target/ folder by default) under its new name. So 
if you happen to run a clean build of your project, wiping out that 
directory, you will need to manually run "Maven &amp;gt; Update Project 
configuration" on your project.&lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;

&lt;span style="color: #666699;"&gt;Option to not publish overlay changes automatically&lt;/span&gt;&lt;/h3&gt;
In
 order to support publishing of overlay changes automatically, m2e-wtp 
aggressively cleared the cache of the servers your application is 
deployed to. However, The overlay feature still being in an experimental
 state, we decided to be more conservative with regard to server 
publishing, so a new "Automatically republish servers on overlay 
modification" preference has been added to &lt;b&gt;Window &amp;gt; Preferences &amp;gt; Server &amp;gt; Overlays&lt;/b&gt;. &lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;a href="http://community.jboss.org/servlet/JiveServlet/showImage/38-4192-17066/overlay-republishing-preference.png"&gt;&lt;img alt="overlay-republishing-preference.png" class="jive-image-thumbnail jive-image" height="394" src="http://community.jboss.org/servlet/JiveServlet/downloadImage/38-4192-17066/450-394/overlay-republishing-preference.png" width="450" /&gt;&lt;/a&gt;&lt;br /&gt;
Overlays support is not bound to Maven, that's why it's under the Server preferences.&lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;

&lt;span style="color: #666699;"&gt;Support for the new tag="defaultRootSource" introduced in WTP 3.3.1&lt;/span&gt;&lt;/h3&gt;
When
 several source folders are declared in the 
.settings/org.eclipse.wst.common.component file, WTP prior to 3.3.1 
(Indigo SR1) tended to generate files (web.xml, faces-config.xml, ...) 
in the first folder it found. Since web projects define &lt;i&gt;target/m2e-wtp/web-resources&lt;/i&gt; as the first source folder (&lt;i&gt;target/m2e-wtp/ear-resources/&lt;/i&gt;
 for EAR projects), that would cause some issues. In WTP 3.3.1, a new 
tag has been introduced, designed to indicate which source folder should
 be used by default, when files need to be looked for / generated. 
m2e-wtp now adds this tag when WTP 3.3.1 is installed : &lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;pre class="jive-pre"&gt;&lt;code class="jive-code jive-xml"&gt;&lt;span class="jive-xml-tag"&gt;&amp;lt;project-modules id="moduleCoreId" project-version="1.5.0"&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;wb-module deploy-name="web-0.0.1-SNAPSHOT"&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;property name="context-root" value="multi-web"/&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;property name="java-output-path" value="/multi-web/target/classes"/&amp;gt;&lt;/span&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span class="jive-xml-tag"&gt;&amp;lt;/wb-module&amp;gt;&lt;/span&gt;
&lt;span class="jive-xml-tag"&gt;&amp;lt;/project-modules&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;h3&gt;

&lt;span style="color: #666699;"&gt;A bit of documentation&lt;/span&gt;&lt;/h3&gt;
As many projects, unfortunately, m2e-wtp doesn't shine in the documentation area. I've been using the github Wiki (&lt;a class="jive-link-external-small" href="https://github.com/sonatype/m2eclipse-wtp/wiki" target="_blank"&gt;https://github.com/sonatype/m2eclipse-wtp/wiki&lt;/a&gt;)
 to start a relatively modest FAQ. I'm planning on adding more content 
in the near future, but I'm also hoping the community at large will want
 to contribute some docs of its own. You just need a github account to 
be able to edit the Wiki.&lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
As always, if you find any issue, please open a bug report at &lt;a class="jive-link-external-small" href="https://issues.sonatype.org/browse/MECLIPSEWTP"&gt;https://issues.sonatype.org/browse/MECLIPSEWTP&lt;/a&gt; (and don't forget to attach some test projects). &lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
Happy coding.&lt;br /&gt;
&lt;div style="height: 8pt; min-height: 8pt; padding: 0px;"&gt;
&lt;br /&gt;&lt;/div&gt;
Fred.&lt;br /&gt;
&lt;a class="jive-link-external-small" href="https://twitter.com/#%21/fbricon"&gt;https://twitter.com/#!/fbricon&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
(the article above is copied verbatim from &lt;a href="http://planet.jboss.org/post/m2e_clipse_wtp_0_14_0_new_noteworthy"&gt;Planet JBoss&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
Hendy's personal note:&lt;br /&gt;To learn more about &lt;b&gt;Java Web Development&lt;/b&gt; using &lt;b&gt;Eclipse&lt;/b&gt; &lt;b&gt;IDE&lt;/b&gt; and &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend&amp;nbsp;&lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt;&amp;nbsp;(Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;.&lt;/blockquote&gt;
&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/2021023723891641436/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2011/09/m2em2eclipse-wtp-0140-released-eclipse.html#comment-form" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/2021023723891641436?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/2021023723891641436?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2011/09/m2em2eclipse-wtp-0140-released-eclipse.html" title="m2e/m2eclipse-wtp 0.14.0 Released: Eclipse IDE Integration for Java EE 6 / Web Application Maven projects" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>4</thr:total></entry><entry gd:etag="W/&quot;C0ENQXgycSp7ImA9WhdbFEo.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-3080773582456808088</id><published>2011-09-19T09:15:00.001-07:00</published><updated>2011-10-12T19:08:10.699-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-12T19:08:10.699-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java EE Development" /><title>JBoss Tools 3.3.0.M3 Released: Eclipse Plug-ins for Java EE 6 + JSF 2.0 Web Development</title><content type="html">&lt;div class='posterous_autopost'&gt;&lt;p&gt;It&amp;#39;s time for a new fresh milestone update of JBoss Tools:&lt;/p&gt;&lt;p&gt;&lt;a href="http://community.jboss.org/servlet/JiveServlet/showImage/38-4159-17004/grease_jboss_tools.png"&gt;&lt;img class="jive-image" src="http://community.jboss.org/servlet/JiveServlet/downloadImage/38-4159-17004/450-165/grease_jboss_tools.png" height="165" alt="grease_jboss_tools.png" width="450" style="display: block; margin-left: auto; margin-right: auto;" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;h4 style="color: #333333; font-weight: bold; padding-top: 10px; padding-right: 0pt; padding-bottom: 4px; padding-left: 0pt; font-size: 13pt; text-align: center; margin: 0pt;"&gt;3.3 M3 (Greased Lightning)&lt;/h4&gt;&lt;p style="text-align: center; padding: 0pt; margin: 0pt;"&gt; [&lt;a href="http://www.jboss.org/tools/download/dev" class="jive-link-external-small" target="_top"&gt;Download&lt;/a&gt;] [&lt;a href="http://download.jboss.org/jbosstools/updates/development/indigo/" class="jive-link-external-small"&gt;Update Site&lt;/a&gt;] [&lt;a href="http://docs.jboss.org/tools/whatsnew" class="jive-link-external-small" target="_top"&gt;What&amp;#39;s New&lt;/a&gt;] [&lt;a href="http://www.jboss.com/index.html?module=bb&amp;amp;op=viewforum&amp;amp;f=201" class="jive-link-external-small" target="_top"&gt;Forums&lt;/a&gt;] [&lt;a href="http://jira.jboss.com/jira/browse/JBIDE" class="jive-link-external-small" target="_top"&gt;JIRA&lt;/a&gt;] [&lt;a href="http://twitter.com/jbosstools" class="jive-link-external-small" target="_top"&gt;Twitter&lt;/a&gt;]&lt;/p&gt; &lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;&lt;b&gt;JBoss Tools&lt;/b&gt; is a set of &lt;b&gt;plugins for Eclipse Java IDE&lt;/b&gt; that complements, enhances and goes beyond the support that exist for JBoss and related technologies in the default Eclipse distribution. For this release we continue to move &lt;b&gt;Maven, CDI, Java EE 6&lt;/b&gt; support forward and also add in a few new &amp;quot;surprise&amp;quot; features. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;To know more about &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt; (Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;&lt;br /&gt; &lt;/p&gt; &lt;h2&gt;Installation&lt;/h2&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;As always, get and install &lt;a href="http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/indigor" class="jive-link-external-small"&gt;&lt;span class="jive-link-external-small"&gt;Eclipse 3.7 (Indigo) JEE bundle&lt;/span&gt;&lt;/a&gt; - with the JEE bundle you majority of the dependencies letting you save bandwidth:&lt;/p&gt; &lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;Once you have installed Eclipse, you either find us on&lt;a href="http://marketplace.eclipse.org/content/jboss-tools-indigo" class="jive-link-external-small"&gt; Eclipse Marketplace under &amp;quot;JBoss Tools (Indigo)&amp;quot;&lt;/a&gt; or use our update site directly.&lt;/p&gt; &lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;The updatesite URL to use from Help &amp;gt; Install New Software... is:&lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p /&gt; &lt;p&gt;&lt;a href="http://download.jboss.org/jbosstools/updates/development/indigo/" class="jive-link-external-small"&gt;http://download.jboss.org/jbosstools/updates/development/indigo/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family: arial, helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;Maven Profile Selection&lt;/h3&gt;&lt;p&gt;In this release we&amp;#39;ve therefore included an UI which allows you to easily set/change the profiles on single and multiple projects. &lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;This is especially something that becomes useful when you use Arquillian where it is a common practice to use Maven profiles to toggle the various dependency sets for each server you wish to test against.&lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;It works by you selecting the relevant project(s), press &lt;strong&gt;Ctrl+Alt+P&lt;/strong&gt; or use &lt;strong&gt;Maven &amp;gt; Select Maven Profiles... &lt;/strong&gt;and a dialog box appears allowing you to enable/disable the available profiles for the project(s):&lt;/p&gt; &lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://community.jboss.org/servlet/JiveServlet/showImage/38-4159-16994/maven-profile-selection-single-project.jpg"&gt;&lt;img class="jive-image-thumbnail jive-image" src="http://community.jboss.org/servlet/JiveServlet/downloadImage/38-4159-16994/450-298/maven-profile-selection-single-project.jpg" height="298" alt="maven-profile-selection-single-project.jpg" width="450" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;h3&gt;Easier Remote Debugging&lt;/h3&gt;&lt;p&gt;Ever been tired of having to manually configure ports, projects and source path lookups for debugging on Remote Applications in Eclipse ?&lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;We are, especially after we learned that JVM&amp;#39;s running on Hotspot provides API to discover such applications and allow for easy configuration of your debugger. In this release we&amp;#39;ve thus added a command available from &lt;strong&gt;Debug As... &amp;gt; Remote Java Application&lt;/strong&gt;... in the context menu on any set of resources.&lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;Once you select this command, we use the Hotspot API to discover the remote running applications, allows you to select which you application want to connect to and then we do the tedious work of configuring the ports, names and source code lookups (including maven dependencies if applicable) for your Remote debugging. &lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://community.jboss.org/servlet/JiveServlet/showImage/38-4159-16996/remote-debugging2.png"&gt;&lt;img class="jive-image-thumbnail jive-image" src="http://community.jboss.org/servlet/JiveServlet/downloadImage/38-4159-16996/450-206/remote-debugging2.png" height="206" alt="remote-debugging2.png" width="450" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;No need for manual tweaking anymore.&lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;Thanks to &lt;a href="http://community.jboss.org/people/aslak" class="jive-link-profile-small"&gt;Aslak Knutsen&lt;/a&gt; for bringing us the idea and initial code to make this happen!&lt;/p&gt; &lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;h3&gt;Running Server Detection&lt;/h3&gt;&lt;p&gt;The server adapters now attempt to detect if a server is already running to avoid port conflicts and UI inconcistencies. If a server is detected running you are shown a dialog allowing you to choose to either have the server adapter assume it is already running or force the launch anyway.&lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://community.jboss.org/servlet/JiveServlet/showImage/38-4159-17003/server-already-running.png"&gt;&lt;img class="jive-image" src="http://community.jboss.org/servlet/JiveServlet/downloadImage/38-4159-17003/450-197/server-already-running.png" height="197" alt="server-already-running.png" width="450" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;CDI &amp;amp; Seam Solder&lt;/h3&gt;&lt;p&gt;The CDI tooling adds a bunch of quickfixes to have JBoss Tools fix common issues. To aid in searching and navigating your CDI application, Find References (&lt;strong&gt;Ctrl+Shift+G&lt;/strong&gt;) will now show the full list of injection points and EL usage of your beans and Seam Solder and Config annotations and XML now have easy hyperlink navigation to it&amp;#39;s declarations.&lt;/p&gt;&lt;h3&gt;@ManagedBean&amp;#39;s &lt;/h3&gt;&lt;p&gt;The JSF tooling now detects @ManagedBean annotations. This avoids false warnings/errors when importing JSF 2 examples. Do consider using @Named instead for better integration into the JavaEE stack. &lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;h3&gt;SAR Projects&lt;/h3&gt;&lt;p&gt;For a long time we have been asked about providing support for SAR style projects for use on older versions of JBoss AS. This style of project packaging is now supported both in pure WTP style projects and via Maven.&lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;h3&gt;GWT Tools are back&lt;/h3&gt;&lt;p&gt;Since last time, Google released their GWT eclipse plugin in a version that supports Eclipse 3.7 allowing us to reenable the GWT Tools.&lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;h3&gt;And more...&lt;/h3&gt;&lt;p&gt;There are additional bugfixes and more features to browse over at &lt;a href="http://docs.jboss.org/tools/whatsnew/" class="jive-link-external-small"&gt;What&amp;#39;s New &amp;amp; Noteworthy&lt;/a&gt;&lt;/p&gt; &lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;Like the new features ? Leave a comment to let us know!&lt;/p&gt;&lt;p style="height: 8pt; padding: 0px;"&gt; &lt;/p&gt;&lt;p&gt;And by all means, &lt;/p&gt;&lt;p&gt;Have fun!&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;To know more about &lt;b&gt;Java EE 6&lt;/b&gt;, I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt; (Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;. &lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;(Article reblogged from &lt;a href="http://community.jboss.org/en/tools/blog/2011/09/19/adding-some-grease-to-jboss-tools-33-m3"&gt;JBoss Tools blog&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/3080773582456808088/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2011/09/jboss-tools-330m3-released-eclipse-plug.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/3080773582456808088?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/3080773582456808088?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2011/09/jboss-tools-330m3-released-eclipse-plug.html" title="JBoss Tools 3.3.0.M3 Released: Eclipse Plug-ins for Java EE 6 + JSF 2.0 Web Development" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;C0ENQXgzeSp7ImA9WhdbFEo.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-1239566363291291025</id><published>2011-08-03T20:08:00.001-07:00</published><updated>2011-10-12T19:08:10.681-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-12T19:08:10.681-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java EE Development" /><title>How to Fix Ant Build Error: "Could not load a dependent class com/jcraft/jsch/Logger. It is not enough to have Ant's optional JARs"</title><content type="html">&lt;div class='posterous_autopost'&gt;If you get an &lt;b&gt;error message&lt;/b&gt; like this while running a &lt;b&gt;problematic Ant build script file&lt;/b&gt; :&lt;p /&gt;&lt;div style="margin-left: 40px;"&gt;remote.flush:&lt;p /&gt;BUILD FAILED&lt;br /&gt;/home/ceefour/git/magento-id/build.xml:13: The following error occurred while executing this line:&lt;br /&gt; /home/ceefour/git/magento-id/build.xml:22: Problem: failed to create task or type sshexec&lt;br /&gt;Cause: Could not load a dependent class com/jcraft/jsch/Logger&lt;br /&gt;       It is not enough to have Ant&amp;#39;s optional JARs&lt;br /&gt;       you need the JAR files that the optional tasks depend upon.&lt;br /&gt;        Ant&amp;#39;s optional task dependencies are listed in the manual.&lt;br /&gt;Action: Determine what extra JAR files are needed, and place them in one of:&lt;br /&gt;        -/home/opt/eclipse_web/plugins/org.apache.ant_1.8.2.v20110505-1300/lib&lt;br /&gt;         -/home/ceefour/.ant/lib&lt;br /&gt;        -a directory added on the command line with the -lib argument&lt;p /&gt;Do not panic, this is a common problem.&lt;br /&gt;The commonest cause is a missing JAR.&lt;p /&gt;This is not a bug; it is a configuration problem&lt;br /&gt; &lt;/div&gt;&lt;br /&gt;It means your &lt;b&gt;Ant build script file&lt;/b&gt; using &lt;b&gt;optional Ant libraries&lt;/b&gt; and need to tell &lt;b&gt;Ant&lt;/b&gt; where to find them.&lt;p /&gt;In my case, it needs &lt;b&gt;jsch.jar&lt;/b&gt; aka &lt;b&gt;libjsch-java&lt;/b&gt; package in &lt;b&gt;Debian/Ubuntu Linux&lt;/b&gt;.&lt;p /&gt; First you need to install &lt;b&gt;ant-optional&lt;/b&gt; package for Ant &lt;b&gt;optional libraries support &lt;/b&gt;:&lt;br /&gt;&lt;span style="font-family: courier new,monospace;"&gt;sudo apt-get install ant-optional&lt;/span&gt;&lt;p /&gt;Then the &lt;b&gt;libjsch-java Debian/Ubuntu package&lt;/b&gt;:&lt;br /&gt; &lt;span style="font-family: courier new,monospace;"&gt;sudo apt-get install libjsch-java&lt;/span&gt;&lt;p /&gt; Then put it in correct directories so that Ant can find them :&lt;p /&gt;&lt;code&gt;&lt;/code&gt;&lt;span style="font-family: courier new,monospace;"&gt;sudo ln -s /usr/share/java/jsch.jar /usr/share/ant/lib/&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt; &lt;span style="font-family: courier new,monospace;"&gt;mkdir -vp ~/.ant/lib&lt;/span&gt;&lt;br style="font-family: courier new,monospace;" /&gt;&lt;span style="font-family: courier new,monospace;"&gt;ln -s /usr/share/java/jsch.jar ~/.ant/lib/&lt;/span&gt;&lt;p /&gt; Ubuntu&amp;#39;s &lt;b&gt;Ant&lt;/b&gt; look for libraries in &lt;span style="font-family: courier new,monospace;"&gt;/usr/share/ant/lib&lt;/span&gt; folder, while Eclipse IDE&amp;#39;s Ant look for &lt;b&gt;optional Ant libraries&lt;/b&gt; in &lt;span style="font-family: courier new,monospace;"&gt;$HOME/.ant/lib&lt;/span&gt; folder.&lt;p /&gt; Note that for &lt;b&gt;Eclipse IDE&lt;/b&gt;, you may need to refresh &lt;b&gt;Eclipse Ant Plug-in&amp;#39;s Runtime Classpath&lt;/b&gt;, by going to 	 	 	 	 Window &amp;gt; Preferences &amp;gt; Ant &amp;gt; Runtime, and clicking &amp;quot;Restore Defaults&amp;quot;.&lt;br /&gt;Make sure that the required libraries are now listed under &amp;quot;Global Entries&amp;quot;.&lt;p /&gt;&lt;b&gt;Ant build system&lt;/b&gt; is frequently used in typical &lt;i&gt;Java EE 6 enterprise application development&lt;/i&gt;. I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt;&lt;/a&gt; for a practical guide to the &lt;b&gt;Java EE 6 technology&lt;/b&gt;.&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/1239566363291291025/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2011/08/how-to-fix-ant-build-error-not-load.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/1239566363291291025?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/1239566363291291025?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2011/08/how-to-fix-ant-build-error-not-load.html" title="How to Fix Ant Build Error: &amp;quot;Could not load a dependent class com/jcraft/jsch/Logger. It is not enough to have Ant&amp;#39;s optional JARs&amp;quot;" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0ENQXgyfSp7ImA9WhdbFEo.&quot;"><id>tag:blogger.com,1999:blog-5686544298279829031.post-2943691307815683483</id><published>2011-07-12T07:20:00.001-07:00</published><updated>2011-10-12T19:08:10.695-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-12T19:08:10.695-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Java EE Development" /><title>JBoss AS 7.0 Final Version Released, Lighting Fast &amp; Configurable Java EE 6 Web Application Server</title><content type="html">&lt;div class='posterous_autopost'&gt;There have been many highs in my career and many of those have happened since I joined JBoss and &lt;a href="http://community.jboss.org/blogs/mark.little/2010/12/12/nearly-two-years-on" class="jive-link-blog-small"&gt;took over from Sacha&lt;/a&gt;. But today has to be in my top 1 or 2 ever! Today we can officially announce the release of &lt;a href="http://www.jboss.org/as7" class="jive-link-external-small"&gt;JBossAS 7.0 Final&lt;/a&gt;! And it&amp;#39;s EE6 Web Profile compliant too, so check out the &lt;a href="http://www.jboss.org/as7" class="jive-link-external-small"&gt;project pages&lt;/a&gt;. It&amp;#39;s &lt;a href="http://community.jboss.org/blogs/mark.little/2010/12/16/the-jbossas-team-rock" class="jive-link-blog-small"&gt;taken us a while to get here&lt;/a&gt; and we&amp;#39;ve taken some pretty drastic and &lt;a href="http://community.jboss.org/blogs/mark.little/2010/12/24/jbossas-600-goes-final" class="jive-link-blog-small"&gt;innovative steps&lt;/a&gt; along the way. Sometimes those decisions haven&amp;#39;t been ease to make and we&amp;#39;ve thought long and hard about them. For instance, I recall Jason Greene, Scott Stark and I discussing for ages the various ramifications of continuing with the then current micro container architecture versus radical changes. The decision to change wasn&amp;#39;t easy, but even then well over a year ago, we believed it was the right one to make. And now, with the &lt;a href="http://community.jboss.org/blogs/mark.little/2011/06/04/jbossas-7-is-coming" class="jive-link-blog-small"&gt;new micro services container&lt;/a&gt;, it&amp;#39;s proven itself! Some risks are worth taking.&lt;p&gt;But not every problem on our path has been technical or come from within Red Hat. Without going into details, let&amp;#39;s just say that at times it seemed that processes and red tape were being thrown in our way. However, we got past these and the results speak for themselves: &lt;a href="http://community.jboss.org/blogs/mark.little/2011/07/05/independence-day" class="jive-link-blog-small"&gt;the fastest, most configurable and adaptable EE6 implementation (Web Profile) out there&lt;/a&gt;. And full EE6 is next on the roadmap, with JBossAS 7.1 due out soon. So if you haven&amp;#39;t already tried it I encourage you to download it and give it a try.&lt;/p&gt;&lt;p&gt;I want to take this opportunity to thank everyone who has been involved in the development of &lt;a href="http://www.jboss.org/as7.html" class="jive-link-external-small"&gt;JBossAS 7.0&lt;/a&gt;. This includes a diverse group of people including the projects, our QE teams, docs, support, product management, program management, marketing and many others. It would be impossible to single out those individuals who have stood out during the last 18 months since everyone has been a rockstar. However, I do want to mention Jason Greene again: any team is influenced both negatively or positively by it&amp;#39;s leader and Jason has lead most positively by example throughout. And of course Bruno Georges, the engineering manager, who took over the role just over a year ago and mustered his troops so well! See what I mean? It&amp;#39;s really hard to call out one person without immediately thinking of all of the others involved! A great team effort.&lt;/p&gt;&lt;p /&gt; &lt;div&gt; To know more about Java EE 6, I highly recommend &lt;a href="http://www.amazon.com/gp/product/0137081855/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=springjavaee-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0137081855" target="_blank"&gt;&lt;b&gt;The Java EE 6 Tutorial: Basic Concepts (4th Edition)&lt;/b&gt; (Java Series) by Eric Jendrock, Ian Evans, Devika Gollapudi and Kim Haase&lt;/a&gt;. &lt;/div&gt; &lt;p /&gt; &lt;div&gt; I also recommend &lt;a href="http://www.amazon.com/gp/product/0596158025/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=gauldong-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0596158025" target="_blank"&gt;&lt;b&gt;Enterprise JavaBeans 3.1&lt;/b&gt; by Andrew Lee Rubinger and Bill Burke&lt;/a&gt; for a thorough explanation on updated EJB 3.1 technology (including &lt;b&gt;interceptors&lt;/b&gt;).  You can &lt;a href="http://astore.amazon.com/springjavaee-20" target="_blank"&gt;find more &lt;b&gt;Java EE 6 Resources&lt;/b&gt; here&lt;/a&gt;.&lt;/div&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;(Article copied mostly verbatim from &lt;a href="http://community.jboss.org/blogs/mark.little/2011/07/12/jbossas-70-is-here"&gt;Mark Little&amp;#39;s announcement&lt;/a&gt;)&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://spring-java-ee.blogspot.com/feeds/2943691307815683483/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://spring-java-ee.blogspot.com/2011/07/jboss-as-70-final-version-released.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/2943691307815683483?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5686544298279829031/posts/default/2943691307815683483?v=2" /><link rel="alternate" type="text/html" href="http://spring-java-ee.blogspot.com/2011/07/jboss-as-70-final-version-released.html" title="JBoss AS 7.0 Final Version Released, Lighting Fast &amp;amp; Configurable Java EE 6 Web Application Server" /><author><name>Hendy Irawan</name><uri>http://www.blogger.com/profile/05192845149798446052</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_NtoTtHZadHE/SOPBu7htv5I/AAAAAAAAAAM/PuboJ3TrIBA/S220/hendy-sitting_square.jpg" /></author><thr:total>0</thr:total></entry></feed>
