<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-28228406</id><updated>2012-02-02T12:55:23.517-05:00</updated><category term='Tomcat'/><category term='JavaEE'/><category term='JPA'/><category term='JBoss'/><category term='JNDI'/><category term='JRuby'/><category term='mysql'/><category term='EJB3'/><category term='Eclipse'/><category term='Tools'/><category term='Java Career'/><category term='Java/JDK'/><category term='Glassfish'/><category term='NetBeans'/><category term='concurrency'/><category term='IDE'/><category term='WebLogic'/><category term='Servlet'/><title type='text'>Java How To ...</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default?start-index=101&amp;max-results=100'/><author><name>howto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>223</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-28228406.post-5130792427064633752</id><published>2011-12-29T13:36:00.018-05:00</published><updated>2012-01-31T22:08:56.724-05:00</updated><title type='text'>Java Dynamic Proxy Example</title><content type='html'>In this post, I will go over the basic constructs of dynamic proxy, followed by some notes and things to watch out when implementing it.  First, the 5 elements of a dynamic proxy as implemented in this example:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TestImpl&lt;/span&gt;: the class behind the proxy, not to be directly invoked by the client.  In some cases, this type may not exist.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TestIF&lt;/span&gt;: the proxy interface implemented by TestImpl, and the dynamic proxy.  This is the interface type the client should reference.  One or more interfaces are required to create dynamic proxy.  If there is no such interface, you may need to dynamically generate them with tools like ASM.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;TestInvocationHandler&lt;/span&gt;: the InvocationHandler that handles method invocation on the proxy from the client.  It contains an instance of &lt;code&gt;TestImpl&lt;/code&gt; to delegate method invocations to.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Test&lt;/span&gt;: the test main class.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$Proxy0&lt;/span&gt;: the dynamic proxy that implements &lt;code&gt;TestIF&lt;/code&gt;, and the client-facing implementation of &lt;code&gt;TestIF&lt;/code&gt;.&lt;br /&gt;&lt;pre&gt;public interface TestIF {&lt;br /&gt;    String hello(String name);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;--------------------------&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;public class TestImpl implements TestIF {&lt;br /&gt;public String hello(String name) {&lt;br /&gt;   return String.format("Hello %s, this is %s", name, this);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;--------------------------&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;import java.lang.reflect.*;&lt;br /&gt;public class TestInvocationHandler implements InvocationHandler {&lt;br /&gt;private Object testImpl;&lt;br /&gt;&lt;br /&gt;public TestInvocationHandler(Object impl) {&lt;br /&gt;   this.testImpl = impl;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {&lt;br /&gt;   if(Object.class  == method.getDeclaringClass()) {&lt;br /&gt;       String name = method.getName();&lt;br /&gt;       if("equals".equals(name)) {&lt;br /&gt;           return proxy == args[0];&lt;br /&gt;       } else if("hashCode".equals(name)) {&lt;br /&gt;           return System.identityHashCode(proxy);&lt;br /&gt;       } else if("toString".equals(name)) {&lt;br /&gt;           return proxy.getClass().getName() + "@" +&lt;br /&gt;               Integer.toHexString(System.identityHashCode(proxy)) +&lt;br /&gt;               ", with InvocationHandler " + this;&lt;br /&gt;       } else {&lt;br /&gt;           throw new IllegalStateException(String.valueOf(method));&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;   return method.invoke(testImpl, args);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;--------------------------&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;import java.lang.reflect.*;&lt;br /&gt;public class Test {&lt;br /&gt;public static void main(String... args) {&lt;br /&gt;   TestIF t = (TestIF) Proxy.newProxyInstance(TestIF.class.getClassLoader(),&lt;br /&gt;                           new Class&amp;lt;?&amp;gt;[] {TestIF.class},&lt;br /&gt;                           new TestInvocationHandler(new TestImpl()));&lt;br /&gt;   System.out.printf("t.hello(Duke): %s%n", t.hello("Duke"));&lt;br /&gt;   System.out.printf("t.toString(): %s%n", t);&lt;br /&gt;   System.out.printf("t.hashCode(): %H%n", t);&lt;br /&gt;   System.out.printf("t.equals(t): %B%n", t.equals(t));&lt;br /&gt;   System.out.printf("t.equals(new Object()): %B%n", t.equals(new Object()));&lt;br /&gt;   System.out.printf("t.equals(null): %B%n", t.equals(null));&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;Implementation notes:&lt;br /&gt;&lt;br /&gt;When dispatching method invocations on proxy to delegate object, 3  methods from &lt;code&gt;java.lang.Object&lt;/code&gt; need special handling: &lt;code&gt;toString(), hashCode()&lt;/code&gt; and &lt;code&gt;equals(Object)&lt;/code&gt;.  Since they are related to the proxy object identity, they should be serviced directly by the handler.  One option is to base their return values on the proxy param, as in this example.&lt;br /&gt;&lt;br /&gt;Other public methods from &lt;code&gt;java.lang.Object&lt;/code&gt; are all final, and are not routed to the &lt;code&gt;InvocationHandler&lt;/code&gt; by JVM.  These methods are:&lt;pre&gt;public final native Class&amp;lt;?&amp;gt; getClass();&lt;br /&gt;public final native void notify();&lt;br /&gt;public final native void notifyAll();&lt;br /&gt;public final native void wait(long timeout) throws InterruptedException;&lt;br /&gt;public final void wait(long timeout, int nanos) throws InterruptedException;&lt;br /&gt;public final void wait() throws InterruptedException&lt;/pre&gt;The handler's invoke method should not invoke methods on the proxy object passed in as the first param (except the 6 final methods listed above), to avoid infinite loop and &lt;code&gt;StackOverflowError&lt;/code&gt;.  For example, this following debug line should not be used:&lt;pre&gt;System.out.printf("proxy=%s, method=%s, args=%s%n", &lt;br /&gt;                  proxy, method, Arrays.toString(args));&lt;br /&gt;&lt;/pre&gt;If the handler already knows how to acquire the delegate &lt;code&gt;TestImpl&lt;/code&gt; instance, through either direct instantiation or lookup, it can hide it completely from the client.  So the only type of TestIF the client knows is the proxy.&lt;br /&gt;&lt;br /&gt;The &lt;code&gt;Object[]&lt;/code&gt; args passed into handler's invoke method is null, when the invoked method takes no param.  This can come as a surprise to many.  So a null check is needed before operating on args.&lt;br /&gt;&lt;br /&gt;To run this example after compiling all java classes:&lt;pre&gt;$ java Test&lt;br /&gt;&lt;br /&gt;t.hello(Duke): Hello Duke, this is TestImpl@a3901c6&lt;br /&gt;t.toString(): $Proxy0@24a37368, with InvocationHandler TestInvocationHandler@66edc3a2&lt;br /&gt;t.hashCode(): 24A37368&lt;br /&gt;t.equals(t): TRUE&lt;br /&gt;t.equals(new Object()): FALSE&lt;br /&gt;t.equals(null): FALSE&lt;br /&gt;&lt;/pre&gt;To save/keep/dump the generated proxy class file (with non-standard option):&lt;pre&gt;java -Dsun.misc.ProxyGenerator.saveGeneratedFiles=true Test&lt;/pre&gt;To view the structure of the proxy class:&lt;pre&gt;$JAVA_HOME/bin/javap -v \$Proxy0&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-5130792427064633752?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/5130792427064633752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=5130792427064633752' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5130792427064633752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5130792427064633752'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/12/java-dynamic-proxy-example.html' title='Java Dynamic Proxy Example'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1676572579590218722</id><published>2011-12-29T07:29:00.017-05:00</published><updated>2012-01-27T14:32:44.063-05:00</updated><title type='text'>My Unix Linux Notes</title><content type='html'>How to extract/expand/explode file.tar.gz, or file.tgz:&lt;br /&gt;&lt;code&gt;gtar xzvf file.tar.gz&lt;/code&gt;    # if gtar is available, otherwise,&lt;br /&gt;&lt;code&gt;gunzip &amp;lt; file.tgz    | tar xvf -&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Note the use of &lt;code&gt;&amp;lt;&lt;/code&gt; (&lt;code&gt;gunzip file.tgz | tar xvf - &lt;/code&gt;won't work).  You can always run gunzip and tar in 2 steps, which creates an extra tar file:&lt;br /&gt;&lt;pre&gt;gunzip file.tar.gz&lt;br /&gt;tar xvf file.tar&lt;/pre&gt;How to find a port number (8080) in use:&lt;br /&gt;&lt;pre&gt;netstat -an | grep 8080&lt;/pre&gt;How to kill all java processes:&lt;br /&gt;&lt;code&gt;killall java&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;How to list all background jobs:&lt;br /&gt;&lt;code&gt;jobs&lt;br /&gt;[1]    Running                       ./standalone.sh&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;How to kill the current background job:&lt;br /&gt;&lt;code&gt;kill %&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;How to list all java processes:&lt;code&gt;&lt;br /&gt;$JAVA_HOME/bin/jps&lt;br /&gt;$JAVA_HOME/bin/jps -l&lt;br /&gt;$JAVA_HOME/bin/jps -lv&lt;br /&gt;ps -ef | grep java&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# more reliable than jps&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;How to find a java (jboss) process with jps and kill it:&lt;code&gt;&lt;br /&gt;jps | grep jboss | awk '{print $1}' | xargs kill -9&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;How to find a jboss process with "ps -ef" and kill it:&lt;code&gt;&lt;br /&gt;ps -ef | grep -v grep | grep jboss | awk '{print $2}' | xargs kill -9&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Note that in "ps -ef" output, the PID is the 2nd column, after UID.  This is different from "ps" and "jps..." output, where PID is column 1.&lt;br /&gt;&lt;br /&gt;How to find a file is opened by which program and user (takes a while to finish):&lt;code&gt;&lt;br /&gt;lsof | vim -&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;How to list all files in current directory in absolute path (for copying the path):&lt;code&gt;&lt;br /&gt;find $PWD&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1676572579590218722?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1676572579590218722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1676572579590218722' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1676572579590218722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1676572579590218722'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/12/my-unix-notes.html' title='My Unix Linux Notes'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1563842868337578617</id><published>2011-12-05T09:27:00.008-05:00</published><updated>2011-12-13T07:29:45.365-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Extend Thread vs implement Runnable</title><content type='html'>There are two ways to create your own thread type: subclass &lt;code&gt;java.lang.Thread&lt;/code&gt; class, or implementing &lt;code&gt;java.lang.Runnable&lt;/code&gt; and pass it to &lt;code&gt;Thread&lt;/code&gt; constructor or &lt;code&gt;java.util.concurrent.ThreadFactory&lt;/code&gt;.  What is the difference, and which one is better?&lt;br /&gt;&lt;br /&gt;1, The practical reason is, a Java class can have only one superclass.  So if your thread class extends &lt;code&gt;java.lang.Thread&lt;/code&gt;, it cannot inherit from any other classes.  This limits how you can reuse your application logic.&lt;br /&gt;&lt;br /&gt;2, From a design point of view, there should be a clean separation between how a task is identified and defined, between how it is executed.  The former is the responsibility of a &lt;code&gt;Runnalbe&lt;/code&gt; impl, and the latter is job of the &lt;code&gt;Thread&lt;/code&gt; class.&lt;br /&gt;&lt;br /&gt;3, A &lt;code&gt;Runnable&lt;/code&gt; instance can be passed to other libraries that accept task submission, e.g., &lt;code&gt;java.util.concurrent.Executors&lt;/code&gt;.  A Thread subclass inherits all the overhead of thread management and is hard to reuse.&lt;br /&gt;&lt;br /&gt;4, Their instances also have different lifecycle.  Once a thread is started and completed its work, it's subject to garbage collection.  An instance of &lt;code&gt;Runnalbe&lt;/code&gt; task can be resubmitted or retried multiple times, though usually new tasks are instantiated for each submission to ease state management.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1563842868337578617?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1563842868337578617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1563842868337578617' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1563842868337578617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1563842868337578617'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/12/extend-thread-vs-implement-runnable.html' title='Extend Thread vs implement Runnable'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-4054903376281343708</id><published>2011-11-27T10:55:00.007-05:00</published><updated>2011-11-28T14:04:01.535-05:00</updated><title type='text'>My tcsh notes</title><content type='html'>Settings to remember when I need to use tcsh in a foreign environment:&lt;pre&gt;set prompt="%/ &gt; "&lt;br /&gt;# set prompt="%{\033]0;%M: %c\007%}%/ &gt; "&lt;br /&gt;set complete=enhance&lt;br /&gt;set autolist=true&lt;br /&gt;&lt;br /&gt;set colorcat&lt;br /&gt;setenv GREP_OPTIONS --color=auto&lt;br /&gt;setenv GREP_COLOR 32&lt;br /&gt;&lt;/pre&gt;Copy the above lines to &lt;code&gt;$HOME/.tcshrc&lt;/code&gt;.  The first 3 are the most important ones to remember.  Setting prompt to &lt;code&gt;"%/ &gt; "&lt;/code&gt; puts the &lt;code&gt;$cwd&lt;/code&gt; in the front of the command prompt.  &lt;code&gt;$cwd&lt;/code&gt; is the same as the all-upper-case &lt;code&gt;$PWD&lt;/code&gt; but is easier to type.&lt;br /&gt;&lt;br /&gt;To list current key bindings in tcsh:&lt;pre&gt;$ bindkey&lt;br /&gt;"^A"           -&amp;gt;  beginning-of-line&lt;br /&gt;"^D"           -&amp;gt;  delete-char-or-list-or-eof&lt;br /&gt;"^E"           -&amp;gt;  end-of-line&lt;br /&gt;"^I"           -&amp;gt;  complete-word&lt;br /&gt;"^J"           -&amp;gt;  newline&lt;br /&gt;"^K"           -&amp;gt;  kill-line&lt;br /&gt;"^L"           -&amp;gt;  clear-screen&lt;br /&gt;"^M"           -&amp;gt;  newline&lt;br /&gt;"^P"           -&amp;gt;  up-history&lt;br /&gt;"^T"           -&amp;gt;  transpose-chars&lt;br /&gt;"^U"           -&amp;gt;  kill-whole-line&lt;br /&gt;"^W"           -&amp;gt;  kill-region&lt;br /&gt;... ...&lt;/pre&gt;To use vi-mode or emacs-mode command-line editing and navigation:&lt;pre&gt;bindkey -v&lt;br /&gt;bindkey -e&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-4054903376281343708?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/4054903376281343708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=4054903376281343708' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4054903376281343708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4054903376281343708'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/11/my-tcsh-notes.html' title='My tcsh notes'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-255553243451653106</id><published>2011-11-14T10:44:00.009-05:00</published><updated>2011-12-27T14:56:46.337-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Why use ThreadFactory</title><content type='html'>When submitting tasks to java executor service, some thread will be allocated to perform that task.  The servicing thread may be assigned from the internal thread pool, or created on-demand.  Each executor service has an associated ThreadFactory, and a default ThreadFactory if the application does not specify one.  For non-trivial apps, it's always a good idea to set a custom ThreadFactory.&lt;br /&gt;&lt;br /&gt;1, To set a more descriptive thread name.  With the default ThreadFactory, it gives thread names in the form of pool-m-thread-n, such as pool-1-thread-1, pool-2-thread-1, pool-3-thread-1, etc.  When these threads showing up in debugger, profiler, or monitoring tool, it's hard to know their purpose and how they were started.&lt;br /&gt;&lt;br /&gt;2, To set thread daemon status.  The default ThreadFactory produces non-daemon threads.&lt;br /&gt;&lt;br /&gt;3, To set thread contextClassLoader to appropriate value.  Threads created by the default ThreadFactory will inherit the contextClassLoader from the parent thread, which may not be what you want.  In general, a pooled thread itself should not be associated with any specific class loader.  Instead, the submitted task has the best knowledge about its class loading requirement, so the task &lt;code&gt;Runnable&lt;/code&gt; or &lt;code&gt;Callable&lt;/code&gt; should manage the thread contextClassLoader for the duration of its run method.&lt;br /&gt;&lt;br /&gt;If the new thread does not need to access classes loaded in the parent thead, set its contextClassLoader to null.  If a task needs visibility to a class loader, set its contextClassLoader at the beginning of its run method, and restore its contextClassLoader right before exiting run method.&lt;br /&gt;&lt;br /&gt;The default ThreadFactory in JDK 6 java.util.concurrent is a package-private static nested class in &lt;code&gt;java.util.concurrent.Executors&lt;/code&gt;:&lt;pre&gt;static class DefaultThreadFactory implements ThreadFactory {&lt;br /&gt;        static final AtomicInteger poolNumber = new AtomicInteger(1);&lt;br /&gt;        final ThreadGroup group;&lt;br /&gt;        final AtomicInteger threadNumber = new AtomicInteger(1);&lt;br /&gt;        final String namePrefix;&lt;br /&gt;&lt;br /&gt;        DefaultThreadFactory() {&lt;br /&gt;            SecurityManager s = System.getSecurityManager();&lt;br /&gt;            group = (s != null)? s.getThreadGroup() :&lt;br /&gt;                                 Thread.currentThread().getThreadGroup();&lt;br /&gt;            namePrefix = "pool-" +&lt;br /&gt;                          poolNumber.getAndIncrement() +&lt;br /&gt;                         "-thread-";&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public Thread newThread(Runnable r) {&lt;br /&gt;            Thread t = new Thread(group, r,&lt;br /&gt;                                  namePrefix + threadNumber.getAndIncrement(),&lt;br /&gt;                                  0);&lt;br /&gt;            if (t.isDaemon())&lt;br /&gt;                t.setDaemon(false);&lt;br /&gt;            if (t.getPriority() != Thread.NORM_PRIORITY)&lt;br /&gt;                t.setPriority(Thread.NORM_PRIORITY);&lt;br /&gt;            return t;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;Note that poolNumber is declared as &lt;code&gt;static final&lt;/code&gt; and threadNumber as &lt;code&gt;final&lt;/code&gt;.  Each instance of ThreadFactory is tied to a unique pool, and a static poolNumber tracks the sequence of all instances of DefaultThreadFactory.  An instance of ThreadFactory (and the associated pool) contains multiple threads, and the instance field threadNumber tallies all threads therein.&lt;br /&gt;&lt;br /&gt;Both poolNumber and threadNumber fields are of type java.util.concurrent.AtomicInteger to take advantage of its atomic compound operations.  Their initial value is 1 and getAndIncrement() is invoked to produce sequence like 1, 2, 3.  Alternatively we could set its initial value to 0 and invoke incrementAndGet() to produce the same sequence.&lt;br /&gt;&lt;br /&gt;Why poolNumber and threadNumber need to guard against concurrent access and modification?  poolNumber is static and thus a shared data among all instances of DefaultThreadFactory.  Multiple instances of &lt;code&gt;DefaultThreadFactory&lt;/code&gt; may be incrementing it simutaneously, so it needs to be thread-safe.&lt;br /&gt;&lt;br /&gt;As for threadNumber, the creation of threads, either initially at execution service startup time, or under heavy load, may be serialized by the execution service.  But an instance of &lt;code&gt;ThreadFactory&lt;/code&gt; can be passed around and associated with multiple execution service.  Therefore, the internal state of &lt;code&gt;ThreadFactory&lt;/code&gt; needs to be thread-safe and immutable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-255553243451653106?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/255553243451653106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=255553243451653106' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/255553243451653106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/255553243451653106'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/11/why-use-threadfactory.html' title='Why use ThreadFactory'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-4914839124047548113</id><published>2011-11-09T13:04:00.006-05:00</published><updated>2011-11-14T16:09:49.189-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Notes on Java Debugger (NetBeans)</title><content type='html'>Some notes on using NetBeans Java Debugger.  They also apply in principal to other Java debuggers.&lt;br /&gt;&lt;br /&gt;1, Set line breakpoint (the most common breakpoint), optionally make them conditional breakpoint to filter out irelevant hits.  Sometimes I found conditional breakpoint doesn't seem to work and the execution always pauses regardless of the condition.&lt;br /&gt;&lt;br /&gt;2, Use field breakpoint to intercept field access and/or modification.  This is very useful to track all access and mutation of the field without having to inspect its setter and getter.  And some fields don't even have setter or getter methods.&lt;br /&gt;&lt;br /&gt;3, Use method breakpoint to inspect method entry and exit.  This is just a variation of line breakpoint.&lt;br /&gt;&lt;br /&gt;4, Use class breakpoint to track class loading and unloading.  This is useful when you just have a vague idea that a certain class will be executed but don't know which part.  When the class breakpoint is hit, you can then note down the calling stack trace.&lt;br /&gt;&lt;br /&gt;5, Exception breakpoint is also available but haven't tried that.&lt;br /&gt;&lt;br /&gt;6, Rewind (step back) the calling sequence by popping off the top element in the calling stack.  You can do it from Debugger menu, or the context menu of a particular thread.&lt;br /&gt;&lt;br /&gt;7, Add debug buttons to tools bar, including "Attach Debugger ..." button.  If "Attach Debugger button is not included by default, you can customize the tool bar by dragging it into the bar.  This is very convenient for attaching debugger to remote java process.&lt;br /&gt;&lt;br /&gt;8, Apply code changes dynamically to the debugging session, without restarting the remote java application.  Debug &gt; Apply Code Changes, or Apply Code Changes button in tool bar.  Note that the code changes are not effective in current debugging session.  To make it permanent, need to rebuild and restart the remote application.&lt;br /&gt;&lt;br /&gt;9, You can start multiple debugging sessions by attaching to different java processes.  For example, to debug both the client side and server side operations.  Pay attention to where the execution is, the client side, or the server side?  Sometimes you can't tell where you are by just looking at the current class name, because some classes are loaded by both the client side and the server side programs.&lt;br /&gt;&lt;br /&gt;10, To copy the current stack trace, go to Debug &gt; Evaluate Express, enter &lt;br /&gt;Thread.dumpStack();&lt;br /&gt;The stack trace will appear in the application's log file or console.&lt;br /&gt;&lt;br /&gt;11, If you need to step into source code outside your main project, get hold of its source code if available, and create a IDE project off it.  That may involve checking it out from different repo, with different scm tool, or download source zip/jar files from maven repo.  A decompiler may be able to handle some simple classes, but tend to produce incomplete source code for large, complext classes.&lt;br /&gt;&lt;br /&gt;12, Always attach JDK source code and javadoc to your IDE. NetBeans Tools &gt; Java Platform &gt; JDK 1.6 &gt; Sources.  You will need to download the JDK source installer and install it to disk.  Source files for JDK classes are located in j2se/src/share/classes.&lt;br /&gt;&lt;br /&gt;Finally, shortcuts:&lt;pre&gt;Step Over        F8&lt;br /&gt;Step Into        F7&lt;br /&gt;Continue         F5&lt;br /&gt;Breakpoints      Ctrl-Shift-5&lt;br /&gt;Variables        Ctrl-Shift-1&lt;br /&gt;Watches          Ctrl-Shift-2&lt;br /&gt;Terminate Debug  Shift-F5&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-4914839124047548113?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/4914839124047548113/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=4914839124047548113' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4914839124047548113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4914839124047548113'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/11/notes-on-java-debugger-netbeans.html' title='Notes on Java Debugger (NetBeans)'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-4606703563836215660</id><published>2011-10-19T22:24:00.003-04:00</published><updated>2011-11-12T07:18:40.192-05:00</updated><title type='text'>Example of StackOverflowError</title><content type='html'>One cause of &lt;code&gt;java.lang.StackOverflowError&lt;/code&gt; is a method calling itself without exit condition.  The following Room class overrides &lt;code&gt;toString&lt;/code&gt; method to produce more meaningful string representation, but is implemented wrong:&lt;pre&gt;public class Room {&lt;br /&gt;    public static void main(String args[]) {&lt;br /&gt;        System.out.println("Created Room: " + new Room());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override public String toString() {&lt;br /&gt;        return "Room: " + this.toString();  //change to super.toString() to avoid StackOverflowError&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;Running Room class would fail with &lt;code&gt;java.lang.StackOverflowError&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-4606703563836215660?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/4606703563836215660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=4606703563836215660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4606703563836215660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4606703563836215660'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/10/example-of-stackoverflowerror.html' title='Example of StackOverflowError'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1554830593406280760</id><published>2011-09-25T11:03:00.006-04:00</published><updated>2011-11-14T07:58:29.351-05:00</updated><title type='text'>Dependency Injection (DI) in Java EE</title><content type='html'>In a J2EE/JavaEE server, container has always been the backbone for creating and managing the lifecycle of resident components. It's not a surprise to see some forms of DI is already present at the beginning of J2EE.  For example, &lt;code&gt;javax.ejb.SessionBean&lt;/code&gt;, the legacy interface implemented by old-style EJB bean class, contains a &lt;code&gt;setSessionContext(SessionContext ctx)&lt;/code&gt; method, which is called by ejb container to inject a &lt;code&gt;SessionContext&lt;/code&gt; to the bean class.  Similarly, &lt;code&gt;javax.ejb.EntityBean&lt;/code&gt; has &lt;code&gt;setEntityContext(EntityContext ctx)&lt;/code&gt;, and &lt;code&gt;javax.ejb.MessageDrivenBean&lt;/code&gt; has &lt;code&gt;setMessageDrivenContext(MessageDrivenContext ctx)&lt;/code&gt; callbacks.&lt;br /&gt;&lt;br /&gt;Another less obvious example is Servlet init methods, which are invoked by servlet container to initialize &lt;code&gt;ServletContext&lt;/code&gt; and &lt;code&gt;ServletConfig&lt;/code&gt; for servlet class:&lt;br /&gt;&lt;pre&gt;//Declared in javax.servlet.Servlet interface and implemented in GenericServlet:&lt;br /&gt;public void init(ServletConfig config)&lt;br /&gt;&lt;br /&gt;//Convenience method implemented in GenericServlet&lt;br /&gt;public void init();&lt;/pre&gt;This early forms of DI is typically defined as part of the lifecycle callbacks and strongly typed to a specific interface or abstract class.&lt;br /&gt;&lt;br /&gt;DI capability was substantially expanded in Java EE 5 with the introduction of annotation- and xml-based DI.  Both field- and setter-injections are supported, and xml deployment descriptors can be used to override or augment annotation meta data.  Most common ones are:&lt;br /&gt;&lt;pre&gt;@EJB private Calc calc;&lt;br /&gt;&lt;br /&gt;@EJB(name="ejb/calc", beanName="DefaultCalc", beanInterface=com.my.ejb.Calc.class)&lt;br /&gt;&lt;br /&gt;@Resource SessionContext ctx;&lt;br /&gt;&lt;br /&gt;@Resource private String widgetName;&lt;br /&gt;&lt;br /&gt;@Resource(mappedName="custom/widgetName")&lt;br /&gt;private String widgetName;&lt;br /&gt;&lt;br /&gt;@PersistenceContext private EntityManager em;&lt;br /&gt;&lt;br /&gt;@PersistenceContext(unitName="advanced-pu", type=TRANSACTION)&lt;br /&gt;private EntityManager em;&lt;/pre&gt;As you can see, the annotation type is specific to each resource type.  The advantage of this approach is, you can easily customize how a specific type of dependency is constructed and initialized.  This design makes sense as some resources need more initialization params than others.  But the downside is lack of internal consistency across the board.  For each new type of resources, we need to decide whether to reuse the existing annotations, add new attributes to existing annotations, or create a new one.  This task is tackled in Java EE 6, with JSR 330 (AtInject spec) and JSR 299 (CDI spec), both are required component specs in Java EE 6 Platform.&lt;br /&gt;&lt;br /&gt;Now in Java EE 6, all the above is doable with a single @java.inject.Inject.  For injections with no attributes (or default attributes), we can easily replace @EJB/@Resource/@PersistenceContext with @Inject.  Otherwise, a &lt;a href="http://download.oracle.com/javaee/6/api/javax/inject/Qualifier.html"&gt;@javax.inject.Qualifier&lt;/a&gt; is needed to provider more information.  Basically we are promoting annotation attributes to auxiliary annotations, replacing string-based qualifiers with typed qualifiers, and chaining them together to resolve the DI.&lt;br /&gt;&lt;br /&gt;@EJB and @Resource are also enhanced in Java EE 6 to take an additional portable attribute lookup, mainly as a replacement for the nonportable mappedName attribute:&lt;pre&gt;@EJB(lookup="java:global/myApp/myEJBModule/CalcBean")&lt;br /&gt;private Calc calc;&lt;br /&gt;&lt;br /&gt;@Resource(lookup="java:module/env/sleepSeconds")&lt;br /&gt;private long sleepSeconds;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1554830593406280760?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1554830593406280760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1554830593406280760' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1554830593406280760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1554830593406280760'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/09/dependency-injection-di-in-java-ee.html' title='Dependency Injection (DI) in Java EE'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-3968321158975404392</id><published>2011-09-23T13:05:00.021-04:00</published><updated>2011-10-18T19:18:30.147-04:00</updated><title type='text'>JUnit Notes, Do's and Don'ts</title><content type='html'>A skeleton JUnit 4 test case:&lt;pre&gt;import java.util.*;&lt;br /&gt;import org.junit.*;&lt;br /&gt;import static org.junit.Assert.*;&lt;br /&gt;&lt;br /&gt;public class MyTest {&lt;br /&gt;/** 4 optional lifecycle callback methods */&lt;br /&gt;@Before public void before() {}  //must be public void no-arg&lt;br /&gt;&lt;br /&gt;@After public void after() {}    //must be public void no-arg&lt;br /&gt;&lt;br /&gt;@BeforeClass public static void beforeClass() {} //must be public static void no-arg&lt;br /&gt;&lt;br /&gt;@AfterClass public static void afterClass() {}  //must be public static void no-arg&lt;br /&gt;&lt;br /&gt;@Test public void testAdd() {&lt;br /&gt;  int a = 1, b =2, expected = 3;&lt;br /&gt;  int actual = a + b;&lt;br /&gt;  assertEquals(expected, actual);&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;b&gt;Do not name your test main class Test.java&lt;/b&gt;, which has the same short name as @Test annotation.  Unless you explicitly use @org.junit.Test, @Test will resolve to your test class, instead of org.junit.Test annotation type.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Avoid using Java assert&lt;/b&gt;; use static assertXXX methods (statically imported) in org.junit.Assert class.  Java assert is turned off by default, and can be enabled only at command line with "java -ea", or "java -enableassertions" options.  So some tests using Java assert will always pass when running with the default configuration, regardless of the actual test conditions.  For example, the following method passes unless -ea option is passed to java:&lt;pre&gt;@Test public void testNumber() {&lt;br /&gt;  assert(1 &amp;lt; 0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;java -cp $tmp/junit-4.8.1.jar:. org.junit.runner.JUnitCore MyTest&lt;br /&gt;JUnit version 4.8.1&lt;br /&gt;Time: 0.009&lt;br /&gt;OK (4 tests)&lt;br /&gt;&lt;/pre&gt;A secondary reason to favor org.junit.Assert.assertXXX over Java assert is, the former is a richer API with more descriptive output, whereas Java assert, in its common form, only fails with java.lang.AssertionError and stack trace with no description.  Java assert can also provide details with a second param:&lt;code&gt; assert false : reason&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;maven &lt;a href="http://maven.apache.org/plugins/maven-surefire-plugin/howto.html"&gt;surefire plugin&lt;/a&gt; automatically enables Java assertions when running JUnit tests on JDK 1.4 and above. So when running with surefire, there is no problem of false positive test results. But still I would like my JUnit tests to work the same way across all testing environment.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Avoid using assertTrue&lt;/b&gt;(list1.equals(list2)); use assertEquals(list1, list2) instead.  assertTrue will only print out the useless message like "expecting true, but actual false", whereas assertEquals gives more helpful message like "expected:[null, 1, 2], but was:[1, 2]"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Do not add assertTrue(true) at the end of a @Test&lt;/b&gt; to signal the success result.  It's just not needed.  The test simply passes when nothing goes wrong.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;@Test method can declare throws clause&lt;/b&gt;, e.g., throws NamingException.  When an exception is thrown during test run, the test is failed.  So use exception as a means to communicate test failures.  Do not try-catch an exception, just to print it and manually fail() it.  For example, do this:&lt;pre&gt;@Test public void testNumber() {&lt;br /&gt;      int i = 10 / 0;&lt;br /&gt;}&lt;/pre&gt;Do NOT do this:&lt;pre&gt;@Test public void testNumber() {&lt;br /&gt;    try {&lt;br /&gt;      int i = 10 / 0;&lt;br /&gt;    } catch (ArithmeticException e) {&lt;br /&gt;        e.printStackTrace();&lt;br /&gt;        fail();      // or even worse, assert(false);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;When running the try-catch version, ArithmeticException stack trace is printed, followed by another stack trace of java.lang.AssertionError from calling fail(), whereas in the shorter version, only the ArithmeticException is logged and hence much easier to trace.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to run a single test&lt;/b&gt;?  org.junit.runner.JUnitCore, the default command-line runner, takes a list of test classes as input, but doesn't support running a single test method.  Other tools and IDE may support it by providing their own runner.  With maven surefire 2.7.3+ and JUnit 4 tests, it is supported with a -D sysprop (&lt;a href="http://maven.apache.org/plugins/maven-surefire-plugin/examples/single-test.html"&gt;link&lt;/a&gt;):&lt;pre&gt;mvn test -Dtest=com.my.test.TestMain#test1&lt;br /&gt;mvn test -Dtest=com.my.test.TestMain#*egative*&lt;br /&gt;mvn org.apache.maven.plugins:maven-surefire-plugin:2.8:test -Dtest=com.my.test.TestMain#test1&lt;/pre&gt;I prefer to put the test name at the very end of the line so it's easier to go through the history and edit command.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;To check the version&lt;/b&gt; of your JUnit:&lt;pre&gt;$ java -cp $tmp/junit.jar junit.runner.Version&lt;br /&gt;4.8.1&lt;/pre&gt;&lt;b&gt;To skip or exclude a test&lt;/b&gt;, use @Ignore (org.junit.Ignore).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-3968321158975404392?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/3968321158975404392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=3968321158975404392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3968321158975404392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3968321158975404392'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/09/junit-notes.html' title='JUnit Notes, Do&apos;s and Don&apos;ts'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7433871908695575194</id><published>2011-08-09T10:56:00.018-04:00</published><updated>2011-09-23T12:13:23.919-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Singleton, DCL, Holder Idiom, and When Singleton is not a Singleton</title><content type='html'>For eager-initialization singleton, the simplest way is to use an enum type with only 1 INSTANCE.  &lt;pre&gt;public enum EnumSingleton implements Calc {&lt;br /&gt;    INSTANCE;&lt;br /&gt;&lt;br /&gt;    public int add(int a, int b) {&lt;br /&gt;        return a + b;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;A traditional, non-enum implementation of eager-initialization singleton is:&lt;pre&gt;public class EagerSingleton {&lt;br /&gt;    private static EagerSingleton instance = new EagerSingleton();&lt;br /&gt;&lt;br /&gt;    private EagerSingleton() {}&lt;br /&gt;&lt;br /&gt;    public static EagerSingleton getInstance() { return instance; }&lt;br /&gt;} &lt;/pre&gt;A lazy-initialization singleton implemented with double-checked locking (DCL), which works in Java 5 onward:&lt;pre&gt;package test.concurrent;&lt;br /&gt;public final class MySingleton1 {&lt;br /&gt; private static volatile MySingleton1 instance;&lt;br /&gt;&lt;br /&gt; private MySingleton1() {}&lt;br /&gt;&lt;br /&gt; public static MySingleton1 getInstance() {&lt;br /&gt;   MySingleton1 result = instance;&lt;br /&gt;   if(result == null) {&lt;br /&gt;     synchronized (MySingleton1.class) {&lt;br /&gt;       result = instance;&lt;br /&gt;       if(result == null) {&lt;br /&gt;         instance = result = new MySingleton1();&lt;br /&gt;       }&lt;br /&gt;     }&lt;br /&gt;   }&lt;br /&gt;   return result;&lt;br /&gt; }&lt;/pre&gt;A lazy-initialization singleton implemented with holder idoim (applicable to lazy static field):&lt;pre&gt;package test.concurrent;&lt;br /&gt;public final class MySingleton2 {&lt;br /&gt; private MySingleton2() {}&lt;br /&gt;&lt;br /&gt; private static class Holder {&lt;br /&gt;   private static final MySingleton2 instance = new MySingleton2();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static MySingleton2 getInstance() {&lt;br /&gt;   return Holder.instance;&lt;br /&gt; }&lt;/pre&gt;A main method that spawns multiple threads calling getInstance():&lt;pre&gt;public static void main(String[] args) {&lt;br /&gt;   int numOfThreads = Integer.parseInt(args[0]);&lt;br /&gt;   for(int i = 0; i &amp;lt; numOfThreads; i++) {&lt;br /&gt;     Thread t = new Thread(new Runnable() {&lt;br /&gt;       public void run() {&lt;br /&gt;         System.out.println(MySingleton1.getInstance());&lt;br /&gt;       }&lt;br /&gt;     });&lt;br /&gt;     t.start();&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;When the same singleton class is loaded by different class loaders, each loader has its own class data.  MySingleton1.class loaded by classloader1 is a distinct class from MySingleton1.class loaded by classloader2.  Hence multiple instances will be created when calling MySingleton1.getInstance().&lt;br /&gt;&lt;br /&gt;To test this scenario, write a servlet that calls MySingleton1.getInstance, and print it.  Package the servlet class and MySingleton1 class in test.war, deploy it to appserver.  Redeploy the same war in a different context root test2.  Invoke the 2 webapp to see if the same instance is printed.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;The servlet class:&lt;/div&gt;&lt;pre&gt;package test;&lt;br /&gt;import java.io.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;&lt;br /&gt;@javax.servlet.annotation.WebServlet(urlPatterns = "/*")&lt;br /&gt;public class TestServlet extends HttpServlet {&lt;br /&gt; protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt; throws ServletException, IOException {&lt;br /&gt;   PrintWriter out = response.getWriter();&lt;br /&gt;   out.println("singleton: " + MySingleton1.getInstance());&lt;br /&gt; }&lt;br /&gt; @Override&lt;br /&gt; protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt; throws ServletException, IOException {&lt;br /&gt;   processRequest(request, response);&lt;br /&gt; }&lt;br /&gt; @Override&lt;br /&gt; protected void doPost(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt; throws ServletException, IOException {&lt;br /&gt;   processRequest(request, response);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;The content of test.war:&lt;/div&gt;&lt;pre&gt;WEB-INF/classes/test/MySingleton1$1.class&lt;br /&gt;WEB-INF/classes/test/MySingleton1.class&lt;br /&gt;WEB-INF/classes/test/TestServlet.class&lt;br /&gt;&lt;/pre&gt;To deploy the webapp to GlassFish:&lt;pre&gt;$ asadmin deploy test.war&lt;br /&gt;$ asadmin deploy --name test2 test.war&lt;br /&gt;$ asadmin list-applications&lt;br /&gt;&lt;/pre&gt;To run the 2 webapp and notice 2 different instances of MySingleton class are instantiated within the same JVM, one for each webapp:&lt;pre&gt;$ curl http://localhost:8080/test/&lt;br /&gt;singleton: test.MySingleton1@114536a5&lt;br /&gt;&lt;br /&gt;$ curl http://localhost:8080/test/&lt;br /&gt;singleton: test.MySingleton1@114536a5&lt;br /&gt;&lt;br /&gt;$ curl http://localhost:8080/test2/&lt;br /&gt;singleton: test.MySingleton1@3997ebf6&lt;br /&gt;&lt;br /&gt;$ curl http://localhost:8080/test2/&lt;br /&gt;singleton: test.MySingleton1@3997ebf6&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7433871908695575194?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7433871908695575194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7433871908695575194' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7433871908695575194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7433871908695575194'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/08/singleton-dcl-holder-idiom-and-when.html' title='Singleton, DCL, Holder Idiom, and When Singleton is not a Singleton'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-3440032813874159011</id><published>2011-08-08T17:43:00.008-04:00</published><updated>2011-09-23T16:32:14.319-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Join threads with FutureTask and Callable</title><content type='html'>Here is another way of having the main thread wait for all child threads to complete, using &lt;code&gt;java.util.concurrent.FutureTask&lt;/code&gt; and &lt;code&gt;Callable&lt;/code&gt;.&lt;pre&gt;package test.concurrent;  &lt;br /&gt; import java.util.Vector;  &lt;br /&gt; import java.util.concurrent.*;  &lt;br /&gt; &lt;br /&gt;public class FutureTaskTest {  &lt;br /&gt;   private Vector&amp;lt;String&amp;gt; threadNames = new Vector&amp;lt;String&amp;gt;();  &lt;br /&gt;   public static void main(String[] args) {  &lt;br /&gt;     FutureTaskTest test = new FutureTaskTest();  &lt;br /&gt;     test.threadTest(Integer.parseInt(args[0]));  &lt;br /&gt;     System.out.println(test.threadNames);  &lt;br /&gt;   }  &lt;br /&gt;&lt;br /&gt;   private void threadTest(int numOfThreads) {  &lt;br /&gt;     Thread[] threads = new Thread[numOfThreads];  &lt;br /&gt;     FutureTask&amp;lt;String&amp;gt;[] futureTasks = new FutureTask[numOfThreads];  &lt;br /&gt;     for (int i = 0; i &amp;lt; threads.length; i++) {  &lt;br /&gt;       futureTasks[i] = new FutureTask&amp;lt;String&amp;gt;(new MyCallable());  &lt;br /&gt;       threads[i] = new Thread(futureTasks[i]);  &lt;br /&gt;       threads[i].start();  &lt;br /&gt;     }  &lt;br /&gt;     for (FutureTask&amp;lt;String&amp;gt; f : futureTasks) {  &lt;br /&gt;       try {  &lt;br /&gt;         threadNames.add(f.get());  &lt;br /&gt;       } catch (InterruptedException e) {  &lt;br /&gt;         e.printStackTrace();  &lt;br /&gt;       } catch (ExecutionException e) {  &lt;br /&gt;         e.printStackTrace();  &lt;br /&gt;       }  &lt;br /&gt;     }  &lt;br /&gt;   }  &lt;br /&gt;&lt;br /&gt;   private static class MyCallable implements Callable&amp;lt;String&amp;gt; {  &lt;br /&gt;     public String call() {  &lt;br /&gt;       for (int i = 0; i &amp;lt; 1000000; i++) {  &lt;br /&gt;         i = i + 0;  &lt;br /&gt;       }  &lt;br /&gt;       return Thread.currentThread().getName();  &lt;br /&gt;     }  &lt;br /&gt;   }  &lt;br /&gt; }&lt;/pre&gt;FutureTask is usually used along with ExecutorService, but it can also be passed to Thread constructor.  The output is always in the order from thread-0 to thread-9, because when we iterate through futureTasks to get result, each get() call wait for a certain duration for the result to be published by child thread.&lt;pre&gt;$ java test.concurrent.FutureTaskTest 10&lt;br /&gt;[Thread-0, Thread-1, Thread-2, Thread-3, Thread-4, Thread-5, Thread-6, Thread-7, Thread-8, Thread-9]&lt;br /&gt;&lt;/pre&gt;The Vector field &lt;code&gt;threadNames&lt;/code&gt; can also be replaced with ArrayList, since it is only accessed in the main thread and no synchronization is needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-3440032813874159011?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/3440032813874159011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=3440032813874159011' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3440032813874159011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3440032813874159011'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/08/join-threads-with-futuretask-and.html' title='Join threads with FutureTask and Callable'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-5993349856667030379</id><published>2011-08-07T23:55:00.018-04:00</published><updated>2011-09-23T16:33:42.608-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>When to join threads with CountDownLatch</title><content type='html'>In my previous post &lt;a href="http://javahowto.blogspot.com/2007/05/when-to-join-threads.html"&gt;When to join threads&lt;/a&gt;, Thread.join() is used to wait for all child threads to complete.  Now I will update it using &lt;a href="http://download.oracle.com/javase/6/docs/api/java/util/concurrent/CountDownLatch.html"&gt;CountDownLatch&lt;/a&gt; instead:&lt;br /&gt;&lt;pre&gt;package test.concurrent;&lt;br /&gt;import java.util.Vector;&lt;br /&gt;import java.util.concurrent.CountDownLatch;&lt;br /&gt;&lt;br /&gt;public class ThreadTest {&lt;br /&gt;    private Vector&amp;lt;String&amp;gt; threadNames = new Vector&amp;lt;String&amp;gt;();&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        ThreadTest test = new ThreadTest();&lt;br /&gt;        test.threadTest(Integer.parseInt(args[0]));&lt;br /&gt;        System.out.println(test.threadNames);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void threadTest(int numOfThreads) {&lt;br /&gt;        final CountDownLatch latch = new CountDownLatch(numOfThreads);&lt;br /&gt;        Thread[] threads = new Thread[numOfThreads];&lt;br /&gt;        for (int i = 0; i &amp;lt; threads.length; i++) {&lt;br /&gt;            threads[i] = new ThreadTest.MyThread(latch);&lt;br /&gt;            threads[i].start();&lt;br /&gt;        }&lt;br /&gt;        try {&lt;br /&gt;            latch.await();&lt;br /&gt;        } catch (InterruptedException e) {&lt;br /&gt;            e.printStackTrace();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private class MyThread extends Thread {&lt;br /&gt;        private final CountDownLatch latch;&lt;br /&gt;        public MyThread(CountDownLatch latch) {&lt;br /&gt;            this.latch = latch;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        @Override public void run() {&lt;br /&gt;            for (int i = 0; i &amp;lt; 1000000; i++) {&lt;br /&gt;                i = i + 0;&lt;br /&gt;            }&lt;br /&gt;            threadNames.add(getName());&lt;br /&gt;            latch.countDown();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;A CountDownLatch is created in main thread, passed to each child thread's constructor.  Each child thread will count down by 1.  After starting all child threads, the main thread then wait for the latch count to reach 0.  To run it:&lt;br /&gt;&lt;pre&gt;$ java test.concurrent.ThreadTest 10&lt;br /&gt;[Thread-1, Thread-2, Thread-0, Thread-3, Thread-4, Thread-5, Thread-6, Thread-7, Thread-8, Thread-9]&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-5993349856667030379?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/5993349856667030379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=5993349856667030379' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5993349856667030379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5993349856667030379'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/08/when-to-join-threads-with.html' title='When to join threads with CountDownLatch'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-5939770567197719688</id><published>2011-08-07T19:52:00.013-04:00</published><updated>2011-12-05T09:59:41.886-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>My notes on java thread</title><content type='html'>(1) Thread.dumpStack(), not Thread.dumpStackTrace(), not Thread.currentThread().dumpStack().&lt;br /&gt;&lt;br /&gt;(2) thread can sleep with or without acquiring a lock, inside or outside synchronized block.  When sleeping without a lock, the CPU resource is re-allocated to one of the ready-to-run threads.  When sleeping inside synchronized block with a monitor lock, the lock is not relinquished, and the CPU is re-allocated to one of the other runnable threads that are not waiting on this lock.&lt;br /&gt;&lt;br /&gt;(3) wait-notify-flag pattern.  wait is almost always inside a while(flag) loop.  There can be multiple threads waiting on the same monitor, some is waiting for the flag to change value, and others are not.  In other words, there could be homogeneous threads and/or heterogeneous waiters. Once the flag changes value and notifyAll() is invoked, all threads waiting on the same monitor will be awaken.  All of them exit waiting state and enter ready-to-run state, but only one of them will get the lock and proceed.  If the lucky one consumes (reset) the flag after obtaining the lock, the previous flag set in notifyAll() becomes obsolete.  Therefore, other threads, after they get the monitor, will need to recheck the flag to decide to wait again or proceed.&lt;br /&gt;&lt;br /&gt;Another reason wait is inside a loop is there can be spurious wakeup, which are not triggered by notify or notifyAll calls.  wait can also be interrupted by other threads.  So the wait-notify protocol is not 100% reliable, and that's why a flag is needed to aid the inter-thread communication.&lt;br /&gt;&lt;br /&gt;When to use notify and when to use notifyAll?  When all waiters are homogeneous, i.e., whoever gets the monitor doesn't matter, use notify.  When waiters are heterogeneous, use notifyAll to ensure the correct threads are awaken.  If waiter are heterogeneous and we call notify, a waiter that does not care about the flag may be picked to proceed, while those waiters interested in the flag will not get the signal.&lt;br /&gt;&lt;br /&gt;The flag should be exclusively for this purpose, not used by other part of the application.  All access to this flag is inside synchronized block, so no need to make it volatile or AtomicBoolean.&lt;br /&gt;&lt;br /&gt;(4) make the lock object final if possible, for example:&lt;pre&gt;private final Object lock = new Object();&lt;br /&gt;&lt;/pre&gt;Do not synchronize on string literals, which are merely reference to the same string object in the string pool, or global constants.  It will unintentionally cause too many threads competing for the same lock.&lt;br /&gt;&lt;br /&gt;(5) volatile can be used on fields of primitive type, primitive wrapper types, or any other Object types.  A typical use is in singleton DCL pattern.  If a mutable field is simply read or written by multiple threads, then making it volatile usually suffice.  One step up in concurrency is to use java.util.concurrent.atomic.* classes like AtomicInteger, AtomicBoolean, etc.  Atomic types are ideal for simple compound operations like read-update-assignment, or if-absent-set.  Anything more complicated than that will need synchronized access.&lt;br /&gt;&lt;br /&gt;Further readings:&lt;br /&gt;&lt;a href="http://download.oracle.com/javase/tutorial/essential/concurrency/"&gt;Sun's Java Concurrency Tutorial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stackoverflow.com/questions/289434/how-to-make-a-java-thread-wait-for-another-threads-output"&gt;stackoverflow discussion on wait, notify, CountdownLatch, etc&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(6), 3 ways to get a new thread:&lt;br /&gt;* extend java.lang.Thread class and overriding its run() method;&lt;br /&gt;&lt;br /&gt;* provide an impl of Runnable interface and use it to instantiate a new thread;&lt;br /&gt;&lt;br /&gt;* provide an impl of Runnable interface and call ThreadFactory.newThread(runnable).  Get the default ThreadFactory with Executors.defaultThreadFactory().&lt;br /&gt;&lt;br /&gt;See their differences in another post: &lt;a href="http://javahowto.blogspot.com/2011/12/extend-thread-vs-implement-runnable.html"&gt;Extend Thread vs implement Runnable&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-5939770567197719688?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/5939770567197719688/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=5939770567197719688' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5939770567197719688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5939770567197719688'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/08/my-notes-on-java-thread.html' title='My notes on java thread'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1828431016879622345</id><published>2011-08-07T17:42:00.008-04:00</published><updated>2011-09-23T16:35:09.774-04:00</updated><title type='text'>Example of expensive computation</title><content type='html'>Sometimes I need to simulate some expensive computation, or long-running task, without using Thread.sleep or Object.wait.  A real busy waiting.  The following example of computing PI is adapted from this &lt;a href="http://download.oracle.com/javase/tutorial/rmi/client.html"&gt;RMI tutorial&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import java.math.BigDecimal;&lt;br /&gt;&lt;br /&gt;public class Pi implements java.io.Serializable {&lt;br /&gt;   private static final long serialVersionUID = 227L;&lt;br /&gt;   private static final BigDecimal FOUR = BigDecimal.valueOf(4);&lt;br /&gt;   private static final int roundingMode = BigDecimal.ROUND_HALF_EVEN;&lt;br /&gt;   public static void main(String[] args) {&lt;br /&gt;       BigDecimal result = computePi(Integer.parseInt(args[0]));&lt;br /&gt;       System.out.println("Pi is " + result);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Compute the value of pi to the specified number of digits after the&lt;br /&gt;    * decimal point. The value is computed using Machin's formula:&lt;br /&gt;    * pi/4 = 4*arctan(1/5) - arctan(1/239)&lt;br /&gt;    * and a power series expansion of arctan(x) to sufficient precision.&lt;br /&gt;    */&lt;br /&gt;   public static BigDecimal computePi(int digits) {&lt;br /&gt;       int scale = digits + 5;&lt;br /&gt;       BigDecimal arctan1_5 = arctan(5, scale);&lt;br /&gt;       BigDecimal arctan1_239 = arctan(239, scale);&lt;br /&gt;       BigDecimal pi = arctan1_5.multiply(FOUR).subtract(arctan1_239).multiply(FOUR);&lt;br /&gt;       return pi.setScale(digits, BigDecimal.ROUND_HALF_UP);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * Compute the value, in radians, of the arctangent of the inverse of the&lt;br /&gt;    * supplied integer to the specified number of digits after the decimal&lt;br /&gt;    * point. The value is computed using the power series expansion for the arc&lt;br /&gt;    * tangent:&lt;br /&gt;    * arctan(x) = x - (x^3)/3 + (x^5)/5 - (x^7)/7 + (x^9)/9 ...&lt;br /&gt;    */&lt;br /&gt;   public static BigDecimal arctan(int inverseX, int scale) {&lt;br /&gt;       BigDecimal result, numer, term;&lt;br /&gt;       BigDecimal invX = BigDecimal.valueOf(inverseX);&lt;br /&gt;       BigDecimal invX2 = BigDecimal.valueOf(inverseX * inverseX);&lt;br /&gt;       numer = BigDecimal.ONE.divide(invX, scale, roundingMode);&lt;br /&gt;       result = numer;&lt;br /&gt;       int i = 1;&lt;br /&gt;       do {&lt;br /&gt;           numer = numer.divide(invX2, scale, roundingMode);&lt;br /&gt;           int denom = 2 * i + 1;&lt;br /&gt;           term = numer.divide(BigDecimal.valueOf(denom), scale, roundingMode);&lt;br /&gt;           if ((i % 2) != 0) {&lt;br /&gt;               result = result.subtract(term);&lt;br /&gt;           } else {&lt;br /&gt;               result = result.add(term);&lt;br /&gt;           }&lt;br /&gt;           i++;&lt;br /&gt;       } while (term.compareTo(BigDecimal.ZERO) != 0);&lt;br /&gt;       return result;&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;To run and time the task:&lt;br /&gt;&lt;pre&gt;$ time java test.Pi 50000&lt;br /&gt;Pi is 3.14159265358979323846264338327950288419716939937510 ...&lt;br /&gt;9.263u 0.187s 0:09.22 102.3% 0+0k 0+6io 8pf+0w&lt;br /&gt;&lt;/pre&gt;It takes about 10 seconds to compute PI with 5000 digits after the decimal point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1828431016879622345?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1828431016879622345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1828431016879622345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1828431016879622345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1828431016879622345'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/08/example-of-expensive-computation.html' title='Example of expensive computation'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7921807389644192303</id><published>2011-08-07T15:18:00.012-04:00</published><updated>2011-11-11T17:12:20.616-05:00</updated><title type='text'>My notes on serialization and de-serialization</title><content type='html'>I wrote the following test to check some aspects of java serialization and de-serialization, followed by some notes:&lt;pre&gt;package test;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.logging.Logger;&lt;br /&gt;&lt;br /&gt;public class SerializableTest implements java.io.Serializable {&lt;br /&gt;&lt;br /&gt;private static final long serialVersionUID = 0L;&lt;br /&gt;private static final String fileName = "Serializable.ser";&lt;br /&gt;private static final Logger logger = Logger.getLogger("");&lt;br /&gt;private static String var;&lt;br /&gt;transient private String tran = "this is a transient instance field";&lt;br /&gt;private int number;&lt;br /&gt;private Thread th;&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) throws IOException, ClassNotFoundException {&lt;br /&gt;    if (args[0].startsWith("ser")) {&lt;br /&gt;        SerializableTest test = new SerializableTest();&lt;br /&gt;        test.number = 1;&lt;br /&gt;        var = "this is a static variable";&lt;br /&gt;        writeOut(test);&lt;br /&gt;        System.out.println("SerializableTest to be saved: " + test);&lt;br /&gt;    } else if (args[0].startsWith("deser")) {&lt;br /&gt;        System.out.println("SerializableTest deserialized: " + readIn());&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static Object readIn() throws IOException, ClassNotFoundException {&lt;br /&gt;    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File(fileName)));&lt;br /&gt;    return ois.readObject();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private static void writeOut(java.io.Serializable obj) throws IOException {&lt;br /&gt;    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(fileName)));&lt;br /&gt;    oos.writeObject(obj);&lt;br /&gt;    oos.close();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override public String toString() {&lt;br /&gt;    return "SerializableTest: final static fileName=" + fileName + ", final static logger=" + logger&lt;br /&gt;            + ", non-final static var=" + var + ", instance number=" + number&lt;br /&gt;            + ", transient instance tran=" + tran + ", non-serializable instance field:=" + th;&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;To run the program to serialize an instance to current directory:&lt;br /&gt;&lt;pre&gt;$ java test.SerializableTest ser&lt;br /&gt;&lt;br /&gt;SerializableTest to be saved: SerializableTest:&lt;br /&gt;final static fileName=Serializable.ser,&lt;br /&gt;final static logger=java.util.logging.LogManager$RootLogger@43ef9157,&lt;br /&gt;non-final static var=this is a static variable,&lt;br /&gt;instance number=1,&lt;br /&gt;transient instance tran=this is a transient instance field&lt;/pre&gt;The output dumps the in-memory state of the object, before writing it to disk.  To show the file type of the data file containing the object:&lt;pre&gt;$ file Serializable.ser&lt;br /&gt;Serializable.ser: Java serialization data, version 5&lt;/pre&gt;To de-serialize, or re-constitute the object from the data file:&lt;pre&gt;$ java test.SerializableTest deser&lt;br /&gt;&lt;br /&gt;SerializableTest deserialized:&lt;br /&gt;SerializableTest: final static fileName=Serializable.ser,&lt;br /&gt;final static logger=java.util.logging.LogManager$RootLogger@252f0999,&lt;br /&gt;non-final static var=null,&lt;br /&gt;instance number=1,&lt;br /&gt;transient instance tran=null&lt;br /&gt;&lt;/pre&gt;The output shows the object state reconstructed from the data file.&lt;br /&gt;&lt;br /&gt;(1) transient and static fields are ignored in serialization.  After de-serialization transient fields and non-final static fields will be null.  Final static fields still have values since they are part of the class data.&lt;br /&gt;&lt;br /&gt;(2) ObjectOutputStream.writeObject(obj) and ObjectInputStream.readObject() are used in serialization and de-serialization, not BufferedOutputStream/BufferedInputStream.  There is no BufferedObjectOutputStream or BufferedObjectInputStream.&lt;br /&gt;&lt;br /&gt;(3) During serialization, you need to handle IOException; during de-serialization, you need to handle IOException and ClassNotFoundException.  So the transitive closure of the de-serializaed type must be in the classpath on the receiving side.&lt;br /&gt;&lt;br /&gt;(4) Some non-serializable classes: Thread, Logger, LogManager and most classes in java.util.logging (Level and LogRecord are serializable, though).  Throwable extends Serializable, so all Error and Exception types are serializable via inheritance.&lt;br /&gt;&lt;br /&gt;(5) Uninitialized non-serializable, non-transient instance fields are tolerated.  When adding "private Thread th;", no error in serializable.  However, "private Thread th = new Thread();" will cause exception:&lt;pre&gt;Exception in thread "main" java.io.NotSerializableException: java.lang.Thread&lt;br /&gt; at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1164)&lt;br /&gt; at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1518)&lt;br /&gt; at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1483)&lt;br /&gt; at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1400)&lt;br /&gt; at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1158)&lt;br /&gt; at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:330)&lt;br /&gt; at test.SerializableTest.writeOut(SerializableTest.java:33)&lt;br /&gt; at test.SerializableTest.main(SerializableTest.java:19)&lt;br /&gt;&lt;/pre&gt;(6) It is possible to include static fields in serialization and de-serialization, by implementing writeObject and readObject methods.  These 2 methods are not in java.io.Serialiable, which is just a marker interface, and not in java.lang.Object, either.  They are just 2 magic methods with pre-defined signatures.  The following is from &lt;a href="http://java.sun.com/developer/technicalArticles/ALT/serialization/"&gt;Technical Article: Advanced Serialization&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;private void writeObject(ObjectOutputStream oos) throws IOException {&lt;br /&gt;  oos.defaultWriteObject();&lt;br /&gt;  // Write/save additional fields&lt;br /&gt;  oos.writeObject(new java.util.Date());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// assumes "static java.util.Date aDate;" declared&lt;br /&gt;private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {&lt;br /&gt;  ois.defaultReadObject();&lt;br /&gt;  // Read/initialize additional fields&lt;br /&gt;  aDate = (java.util.Date)ois.readObject();&lt;br /&gt;}&lt;/pre&gt;For a definitive guide, refer to &lt;a href="http://download.oracle.com/javase/6/docs/platform/serialization/spec/serial-arch.html"&gt;Official Java Object Serialization Specification version 6.0&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(7) Serialization and de-serialization can be used for copying and cloning objects.  It is slower than regular clone, but can produce a deep copy very easily.  The following util method is adapted from &lt;a href="http://java.sys-con.com/node/36149"&gt;Secrets of Java Serialization&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;    public static Object clone(Object o) throws IOException, ClassNotFoundException {&lt;br /&gt;       ByteArrayOutputStream bos = new ByteArrayOutputStream();&lt;br /&gt;       ObjectOutputStream oos = new ObjectOutputStream(bos);&lt;br /&gt;       oos.writeObject(o);&lt;br /&gt;       oos.close();&lt;br /&gt;       ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());&lt;br /&gt;       ObjectInputStream ois = new ObjectInputStream(bis);&lt;br /&gt;       Object copy = ois.readObject();&lt;br /&gt;       ois.close();&lt;br /&gt;       return copy;&lt;br /&gt;   }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7921807389644192303?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7921807389644192303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7921807389644192303' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7921807389644192303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7921807389644192303'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/08/my-notes-on-serialization-and-de.html' title='My notes on serialization and de-serialization'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2608003984532049357</id><published>2011-08-04T17:44:00.005-04:00</published><updated>2011-08-07T18:19:14.156-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Example of Java thread deadlock</title><content type='html'>A simple example showing a typical Java thread deadlock. 2 threads are spawned: thread-0 first locks lock1 and then lock2; thread-1 first locks lock2 and then lock1.  Each thread sleeps a bit before acquiring the second lock, to increase the chance of deadlock.&lt;br /&gt;&lt;pre&gt;package test.concurrent;&lt;br /&gt;public class DeadLockTest {&lt;br /&gt;   private static long sleepMillis;&lt;br /&gt;   private final Object lock1 = new Object();&lt;br /&gt;   private final Object lock2 = new Object();&lt;br /&gt;&lt;br /&gt;   public static void main(String[] args) {&lt;br /&gt;       sleepMillis = Long.parseLong(args[0]);&lt;br /&gt;       DeadLockTest test = new DeadLockTest();&lt;br /&gt;       test.doTest();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private void doTest() {&lt;br /&gt;       Thread t1 = new Thread(new Runnable() {&lt;br /&gt;           public void run() {&lt;br /&gt;               lock12();&lt;br /&gt;           }&lt;br /&gt;       });&lt;br /&gt;       Thread t2 = new Thread(new Runnable() {&lt;br /&gt;           public void run() {&lt;br /&gt;               lock21();&lt;br /&gt;           }&lt;br /&gt;       });&lt;br /&gt;       t1.start();&lt;br /&gt;       t2.start();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private void lock12() {&lt;br /&gt;       synchronized (lock1) {&lt;br /&gt;           sleep();&lt;br /&gt;           synchronized (lock2) {&lt;br /&gt;               sleep();&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private void lock21() {&lt;br /&gt;       synchronized (lock2) {&lt;br /&gt;           sleep();&lt;br /&gt;           synchronized (lock1) {&lt;br /&gt;               sleep();&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private void sleep() {&lt;br /&gt;       try {&lt;br /&gt;           Thread.sleep(sleepMillis);&lt;br /&gt;       } catch (InterruptedException e) {&lt;br /&gt;           e.printStackTrace();&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;To run the deadlock test with sleep time 1 millisecond:&lt;br /&gt;&lt;pre&gt;java -cp . test.concurrent.DeadLockTest 1&lt;br /&gt;&lt;/pre&gt;The process seems to hang for ever.  To get the thread dump, press Ctrl-\ (Ctrl-break on Windows).  Thread dump contains the following deadlock diagnositc:&lt;br /&gt;&lt;pre&gt;Found one Java-level deadlock:&lt;br /&gt;=============================&lt;br /&gt;"Thread-1":&lt;br /&gt; waiting to lock monitor 1017fcfb0 (object 7f31050b0, a java.lang.Object),&lt;br /&gt; which is held by "Thread-0"&lt;br /&gt;"Thread-0":&lt;br /&gt; waiting to lock monitor 1017fe360 (object 7f31050c0, a java.lang.Object),&lt;br /&gt; which is held by "Thread-1"&lt;br /&gt;&lt;br /&gt;Java stack information for the threads listed above:&lt;br /&gt;===================================================&lt;br /&gt;"Thread-1":&lt;br /&gt;   at test.concurrent.DeadLockTest.lock21(DeadLockTest.java:44)&lt;br /&gt;   - waiting to lock &amp;lt;7f31050b0&amp;gt; (a java.lang.Object)&lt;br /&gt;   - locked &amp;lt;7f31050c0&amp;gt; (a java.lang.Object)&lt;br /&gt;   at test.concurrent.DeadLockTest.access$1(DeadLockTest.java:40)&lt;br /&gt;   at test.concurrent.DeadLockTest$2.run(DeadLockTest.java:23)&lt;br /&gt;   at java.lang.Thread.run(Thread.java:680)&lt;br /&gt;"Thread-0":&lt;br /&gt;   at test.concurrent.DeadLockTest.lock12(DeadLockTest.java:35)&lt;br /&gt;   - waiting to lock &amp;lt;7f31050c0&amp;gt; (a java.lang.Object)&lt;br /&gt;   - locked &amp;lt;7f31050b0&amp;gt; (a java.lang.Object)&lt;br /&gt;   at test.concurrent.DeadLockTest.access$0(DeadLockTest.java:31)&lt;br /&gt;   at test.concurrent.DeadLockTest$1.run(DeadLockTest.java:18)&lt;br /&gt;   at java.lang.Thread.run(Thread.java:680)&lt;br /&gt;&lt;br /&gt;Found 1 deadlock.&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2608003984532049357?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2608003984532049357/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2608003984532049357' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2608003984532049357'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2608003984532049357'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/08/example-of-java-thread-deadlock.html' title='Example of Java thread deadlock'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1564141066127506416</id><published>2011-08-02T22:58:00.003-04:00</published><updated>2011-08-02T23:25:25.019-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><title type='text'>Simple Example of JSF and EJB 3.1</title><content type='html'>This is a very simple example of a JSF 2.0 managed bean invoking EJB 3.1 local singleton EJB.  Everything is packaged into a test.war file, and deployed to GlassFish.&lt;br /&gt;&lt;br /&gt;test.war consists of 4 entries:&lt;br /&gt;&lt;pre&gt;WEB-INF/classes/test/HelloEJB.class&lt;br /&gt;WEB-INF/classes/test/HelloJSFBean.class&lt;br /&gt;WEB-INF/web.xml&lt;br /&gt;index.xhtml&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;index.xhtml page:&lt;br /&gt;&lt;/div&gt;&lt;pre&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; xmlns:ui="http://java.sun.com/jsf/facelets"&lt;br /&gt; xmlns:f="http://java.sun.com/jsf/core"&lt;br /&gt; xmlns:h="http://java.sun.com/jsf/html"&amp;gt;&lt;br /&gt;&amp;lt;ui:composition&amp;gt;&lt;br /&gt; &amp;lt;h:head&amp;gt;&lt;br /&gt;     &amp;lt;h1&amp;gt;&amp;lt;h:outputText value="jsf-ejb example" /&amp;gt;&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;lt;/h:head&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;h:body&amp;gt;&lt;br /&gt;     &amp;lt;h:form id="form"&amp;gt;&lt;br /&gt;         &amp;lt;h:outputLabel value="helloEJB returned message: "/&amp;gt;&lt;br /&gt;         &amp;lt;h:outputText  value="#{HelloJSFBean.message}"/&amp;gt;&lt;br /&gt;     &amp;lt;/h:form&amp;gt;&lt;br /&gt; &amp;lt;/h:body&amp;gt;&lt;br /&gt;&amp;lt;/ui:composition&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;HelloJSFBean managed bean:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;package test;&lt;br /&gt;import javax.faces.bean.*;&lt;br /&gt;import javax.ejb.*;&lt;br /&gt;&lt;br /&gt;@ManagedBean(name="HelloJSFBean")&lt;br /&gt;@RequestScoped&lt;br /&gt;public class HelloJSFBean implements java.io.Serializable {&lt;br /&gt; @EJB&lt;br /&gt; private HelloEJB helloEJB;&lt;br /&gt;&lt;br /&gt; public String getMessage() {&lt;br /&gt;     return helloEJB.hello();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;HelloEJB singleton bean:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;package test;&lt;br /&gt;import javax.ejb.*;&lt;br /&gt;&lt;br /&gt;@Singleton&lt;br /&gt;public class HelloEJB {&lt;br /&gt; public String hello() {&lt;br /&gt;     return "Hello from " + this;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;web.xml:&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&amp;lt;web-app xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&lt;br /&gt;   version="3.0"&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt; &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt; &amp;lt;servlet-class&amp;gt;javax.faces.webapp.FacesServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt; &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt; &amp;lt;servlet-name&amp;gt;Faces Servlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt; &amp;lt;url-pattern&amp;gt;/faces/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;To run the webapp:&lt;br /&gt;&lt;pre&gt;curl http://localhost:8080/test/faces/index.xhtml&lt;br /&gt;&lt;br /&gt;helloEJB returned message: Hello from test.HelloEJB@1326d2fe&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1564141066127506416?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1564141066127506416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1564141066127506416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1564141066127506416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1564141066127506416'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/08/simple-example-of-jsf-and-ejb-31.html' title='Simple Example of JSF and EJB 3.1'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-467091742463027692</id><published>2011-08-01T13:30:00.010-04:00</published><updated>2012-01-10T09:22:01.252-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Runnable, Callable, FutureTask, ExecutorService and thread pool</title><content type='html'>Some notes on Java concurrency, starting with Runnable vs Callable:&lt;br /&gt;&lt;br /&gt;(1), Runnable.run() does not return a value; Callable&amp;lt;T&amp;gt;.run() returns a value of type T.  Callable&amp;lt;T&amp;gt; is a parameterized type whose type parameter indicates the return type of its run method.  Runnable cannot be parameterized.&lt;br /&gt;&lt;br /&gt;(2), Runnable.run() cannot throw any checked exception; Callable&amp;lt;T&amp;gt;.run() can throw checked and unchecked exceptions.&lt;br /&gt;&lt;br /&gt;(3), so it seems Callable is more powerful than Runnable.  But you cannot just replace all use of Runnable with Callable.  For example, in new Thread(runnable).  You cannot instantiate a new thread with Callable. &lt;br /&gt;&lt;br /&gt;(4), Callable is introduced in Java SE 5, as part of java.util.concurrent library.  Callable is mainly intended to use with ExecutorService, which is a higher level service than the direct manipulation of Thread.  Both Runnable and Callable can be submitted to ExecutorService for (usually asynchronous) execution.&lt;br /&gt;&lt;br /&gt;(5), java.util.concurrent.Executors (a util class similar to Collections, Arrays) has methods to upgrade a Runnable to Callable, but not the other way.&lt;pre&gt;Callable&amp;lt;Object&amp;gt; callable(Runnable task)&lt;br /&gt;&amp;lt;T&amp;gt; Callable&amp;lt;T&amp;gt; callable(Runnable task, T result)&lt;br /&gt;&lt;/pre&gt;The Callable converted from &lt;code&gt;callable(Runnable)&lt;/code&gt; returns null.  The Callable converted from &lt;code&gt;callable(Runnable, T)&lt;/code&gt; returns T.  However, this return value that was passed in by the client is not the real result of executing task.  Its purpose is to tell the client that the return type will be Future&amp;lt;T&amp;gt;.  In order to obtain the real result, the client still needs to arrange for a thread-safe shared data storage, e.g., a final or volatile field of Runnable impl.  Therefore, the converted Callable is still a Runnalbe in its core.&lt;br /&gt;&lt;br /&gt;(6) FutureTask is another artifact involving both Callable and Runnable.  FutureTask class implements RunnableFuture interface, which in turn extends both Runnable and Future interfaces.  So FutureTask is a Runnable by inheritance, and can be passed to new Thread(futureTask), or ExecutorService.submit(futureTask). &lt;br /&gt;&lt;br /&gt;FutureTask has a Callable&amp;lt;V&amp;gt; by composition as FutureTask's constructor takes Callable&amp;lt;V&amp;gt; as a param.  FutureTask also has another constructor that takes 2 params (Runnable, V), which are simply converted to Callable via Executors.callable(Runnable, V). In fact, the same pattern is employed in java.util.concurrent wherever a method is overloaded with (Callable) and (Runnable, V).&lt;br /&gt;&lt;br /&gt;(7), Runnable and Callable run() method takes no param.  Why?  For one thing, there is no way to know which types are to be passed in.  The best we can do is probably Object[] if we were to add params to it.  More importantly, it would export state from the calling thread to the task thread, and entails synchronization between the 2 sides.  I guess this is why the plain old Runnable.run() takes no param and returns void.  In Java 5 to balance simplicity and usefulness, Callable was added to return a result.&lt;br /&gt;&lt;br /&gt;(8), how can a task be performed without any params passed to run()?  The typical answer is to pass any required data in when instantiating the Callable or Runnable impl class via its constructor.  For example,&lt;pre&gt;public class RunnableImpl implements Runnable {&lt;br /&gt; private final List&amp;lt;String&amp;gt; names;&lt;br /&gt; &lt;br /&gt; public RunnableImpl(List&amp;lt;String&amp;gt; names) {&lt;br /&gt;   this.names = names;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void run() {...}&lt;br /&gt;}&lt;/pre&gt;If RunnableImpl is a static inner class, its run() method can directly reference any static fields in the enclosing class.  If RunnableImpl is an instance inner class, its run() method can directly reference any static and instance fields in the enclosing class.  If RunnableImpl is an anonymous inner class, its run() method can directly reference any static and instance fields of the enclosing class, and any final local variables in the enclosing method.&lt;br /&gt;&lt;br /&gt;(9), you can call Thread.setUncaughtExceptionHandler, or Thread.setDefaultUncaughtExceptionHandler to handle exceptions from Runnable.run().  When using ExecutionService where you have no direct control of threads, you can use a custom ThreadFactory.  Executors methods newCachedThreadPool, newFixedThreadPool, newScheduledThreadPool, newSingleThreadExecutor, newSingleThreadScheduledExecutor all take a custom ThreadFactory.&lt;br /&gt;&lt;br /&gt;(10), Worker thread in thread pools and regular thread are different.  A regular thread dies after its run method terminates and cannot be restarted.  A worker thread does not die after the completion of the assigned task; it goes back to the thread pool.  The main run method of a work thread is an infinite loop: taking a task from the work queue, and invoke the task's run method to do the task.&lt;br /&gt;&lt;br /&gt;(11), ThreadLocal variables should be cleared up by the client once the task is done.  Otherwise the left-over reference in worker threads prevent the referenced objects from being garbage-collected.  Over time it may cause OutOfMemoryError.&lt;br /&gt;&lt;br /&gt;(12), The thread pool default work queue in ExecutionService framework is unbounded.  It means once the corePoolSize is reached, all subsequent requests will go into this unbound BlockingQueue, until some busy worker threads complete its task.  No new worker threads will be created beyond corePoolSize, and maximumPoolSize is ignored in this case.  For more details, see &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6756747"&gt;bug 6756747: java.util.concurrent.ThreadPoolExecutor doesn't create new worker when it should&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-467091742463027692?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/467091742463027692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=467091742463027692' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/467091742463027692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/467091742463027692'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/08/runnable-callable-futuretask.html' title='Runnable, Callable, FutureTask, ExecutorService and thread pool'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1822056096688108924</id><published>2011-07-29T22:07:00.007-04:00</published><updated>2011-07-29T22:55:32.614-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>Example of JPA and Hibernate with JBoss and MySql</title><content type='html'>This post demonstrates how to write a simple web app using Java Persistence API (JPA), EJB 3 session bean and servlet, connecting to MySql database, and deployed to JBoss appserver 6.&lt;br /&gt;&lt;br /&gt;1, JPA entity class, Greeting, is the same as in my previous example, also included here in its entirety:&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import javax.persistence.*;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class Greeting implements Serializable {&lt;br /&gt;@Id @GeneratedValue private int id;&lt;br /&gt;@Basic private String message;&lt;br /&gt;@Basic private String language;&lt;br /&gt;&lt;br /&gt;public Greeting() {}&lt;br /&gt;&lt;br /&gt;public Greeting(String message, String language) {&lt;br /&gt;   this.message = message;&lt;br /&gt;   this.language = language;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String toString() {&lt;br /&gt;   return "Greeting id=" + id + ", message=" + message + ", language=" + language;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;2, a stateless session bean facade for CRUD operations with container-managed transaction and container-managed persistence context:&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import javax.ejb.*;&lt;br /&gt;import javax.persistence.*;&lt;br /&gt;&lt;br /&gt;@Stateless&lt;br /&gt;public class GreetingBean {&lt;br /&gt;   @PersistenceContext&lt;br /&gt;   private EntityManager em;&lt;br /&gt;&lt;br /&gt;   public void create(Greeting... gs) {&lt;br /&gt;       for(Greeting g : gs) {&lt;br /&gt;           em.persist(g);&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public Greeting findByLang(String lang) {&lt;br /&gt;       return (Greeting) em.createQuery("select g from Greeting g where g.language = :language")&lt;br /&gt;           .setParameter("language", lang).getSingleResult();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;3, TestServlet, which calls the stateless session bean:&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import java.io.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;import javax.ejb.EJB;&lt;br /&gt;&lt;br /&gt;@javax.servlet.annotation.WebServlet(urlPatterns = "/*")&lt;br /&gt;public class TestServlet extends HttpServlet {&lt;br /&gt;   @EJB&lt;br /&gt;   private GreetingBean bean;&lt;br /&gt;&lt;br /&gt;   protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;   throws ServletException, IOException {&lt;br /&gt;       PrintWriter out = response.getWriter();&lt;br /&gt;       Greeting g_en = new Greeting("hello world", "en");&lt;br /&gt;       Greeting g_es = new Greeting("hola, mundo", "es");&lt;br /&gt;       bean.create(g_en, g_es);&lt;br /&gt;       out.println("Created and persisted " + g_en + ", and " + g_es);&lt;br /&gt;&lt;br /&gt;       Greeting g = bean.findByLang("en");&lt;br /&gt;       out.println("Query returned: " + g);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;   throws ServletException, IOException {&lt;br /&gt;       processRequest(request, response);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void doPost(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;   throws ServletException, IOException {&lt;br /&gt;       processRequest(request, response);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;4, persistence.xml with JTA transaction using a MySQL datasource:&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;       xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"&lt;br /&gt;       version="2.0"&amp;gt;&lt;br /&gt;   &amp;lt;persistence-unit name="greeting-pu" transaction-type="JTA"&amp;gt;&lt;br /&gt;   &amp;lt;!--&lt;br /&gt;   &amp;lt;jta-data-source&amp;gt;java:/DefaultDS&amp;lt;/jta-data-source&amp;gt;&lt;br /&gt;   --&amp;gt;&lt;br /&gt;   &amp;lt;jta-data-source&amp;gt;java:/MySqlDS&amp;lt;/jta-data-source&amp;gt;&lt;br /&gt;   &amp;lt;properties&amp;gt;&lt;br /&gt;       &amp;lt;!--&lt;br /&gt;       &amp;lt;property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/&amp;gt;&lt;br /&gt;       --&amp;gt;&lt;br /&gt;       &amp;lt;property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/&amp;gt;&lt;br /&gt;       &amp;lt;property name="hibernate.hbm2ddl.auto" value="create-drop"/&amp;gt;&lt;br /&gt;   &amp;lt;/properties&amp;gt;&lt;br /&gt;   &amp;lt;/persistence-unit&amp;gt;&lt;br /&gt;&amp;lt;/persistence&amp;gt;&lt;br /&gt;&lt;/pre&gt;5, create the MySql datasource in JBoss appserver:&lt;br /&gt;&lt;pre&gt;cp $JBOSS_HOME/docs/examples/jca/mysql-ds.xml $JBOSS_HOME/server/default/deploy/&lt;br /&gt;# change user-name and password elements in mysql-ds.xml&lt;br /&gt;cp $HOME/downloads/mysql-connector-java-5.1.15-bin.jar $JBOSS_HOME/server/default/lib/&lt;br /&gt;&lt;/pre&gt;6, compile and package class files and persistence.xml into test.war:&lt;br /&gt;&lt;pre&gt;javac -d ../ -cp "$JBOSS_HOME/client/*" *.java&lt;br /&gt;&lt;br /&gt;content of test.war:&lt;br /&gt;====================&lt;br /&gt;WEB-INF/classes/META-INF/persistence.xml&lt;br /&gt;WEB-INF/classes/test/Greeting.class&lt;br /&gt;WEB-INF/classes/test/GreetingBean.class&lt;br /&gt;WEB-INF/classes/test/TestServlet.class&lt;br /&gt;&lt;/pre&gt;7, start MySql database server, JBoss default server and deploy test.war:&lt;br /&gt;&lt;pre&gt;cd /usr/local/mysql-5.1.32&lt;br /&gt;sudo bin/mysqld_safe --user root&lt;br /&gt;&lt;br /&gt;$JBOSS_HOME/bin/run.sh&lt;br /&gt;&lt;/pre&gt;8, deploy and run the test:&lt;br /&gt;&lt;pre&gt;cp test.war $JBOSS_HOME/server/default/deploy&lt;br /&gt;curl http://localhost:8080/test/&lt;br /&gt;&lt;/pre&gt;If you use the default HyperSonic embedded database in JBoss AS, instead of MySql database server, make the following adjustments:&lt;br /&gt;&lt;br /&gt;(a), toggle the comments in persistence.xml;&lt;br /&gt;(b), no need to copy mysql-ds.xml, or MySql driver jar;&lt;br /&gt;(c), no need to start MySql database server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1822056096688108924?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1822056096688108924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1822056096688108924' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1822056096688108924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1822056096688108924'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/07/example-of-jpa-and-hibernate-with-jboss.html' title='Example of JPA and Hibernate with JBoss and MySql'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1972612252837028425</id><published>2011-07-05T23:06:00.003-04:00</published><updated>2011-07-14T10:35:46.947-04:00</updated><title type='text'>How to programmatically copy jar files</title><content type='html'>To copy a jar file programmatically in java involves the following steps:&lt;br /&gt;&lt;br /&gt;1, create a JarOutputStream based on the destination jar file;&lt;br /&gt;&lt;br /&gt;2, loop through all entries in the source jar file, and get the InputStream from each entry;&lt;br /&gt;&lt;br /&gt;3, create a new jar entry with the same name as the source jar entry, and put the new entry to the JarOutputStream;&lt;br /&gt;&lt;br /&gt;4, now we have InputStream, OutputStream, and the new jar entry in place, we are ready to transfer the bits, by reading bytes from InputStream into a buffer and writing buffer content to OutputStream.&lt;br /&gt;&lt;br /&gt;5, close the InputStream, flush the JarOutputStream, and close the jar entry.  This completes the copying of one jar entry. &lt;br /&gt;&lt;br /&gt;6, after the loop ends, all entries are copied from source jar file to destination jar file. Finally, close the JarOutputStream.&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.Enumeration;&lt;br /&gt;import java.util.jar.*;&lt;br /&gt;&lt;br /&gt;//java -cp . test.CopyZip xxx/lib/sac-1.3.jar /tmp&lt;br /&gt;//&lt;br /&gt;public class CopyZip {&lt;br /&gt;   public static void main(String[] args) throws Exception {&lt;br /&gt;       File sourceFileOrDir = new File(args[0]);&lt;br /&gt;       File destDir = new File(args[1]);&lt;br /&gt;       if (sourceFileOrDir.isFile()) {&lt;br /&gt;           copyJarFile(new JarFile(sourceFileOrDir), destDir);&lt;br /&gt;       } else if (sourceFileOrDir.isDirectory()) {&lt;br /&gt;           File[] files = sourceFileOrDir.listFiles(new FilenameFilter() {&lt;br /&gt;               public boolean accept(File dir, String name) {&lt;br /&gt;                   return name.endsWith(".jar");&lt;br /&gt;               }&lt;br /&gt;           });&lt;br /&gt;           for (File f : files) {&lt;br /&gt;               copyJarFile(new JarFile(f), destDir);&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public static void copyJarFile(JarFile jarFile, File destDir) throws IOException {&lt;br /&gt;       String fileName = jarFile.getName();&lt;br /&gt;       String fileNameLastPart = fileName.substring(fileName.lastIndexOf(File.separator));&lt;br /&gt;       File destFile = new File(destDir, fileNameLastPart);&lt;br /&gt;&lt;br /&gt;       JarOutputStream jos = new JarOutputStream(new FileOutputStream(destFile));&lt;br /&gt;       Enumeration&amp;lt;JarEntry&amp;gt; entries = jarFile.entries();&lt;br /&gt;&lt;br /&gt;       while (entries.hasMoreElements()) {&lt;br /&gt;           JarEntry entry = entries.nextElement();&lt;br /&gt;           InputStream is = jarFile.getInputStream(entry);&lt;br /&gt;&lt;br /&gt;           //jos.putNextEntry(entry);&lt;br /&gt;           //create a new entry to avoid ZipException: invalid entry compressed size&lt;br /&gt;           jos.putNextEntry(new JarEntry(entry.getName()));&lt;br /&gt;           byte[] buffer = new byte[4096];&lt;br /&gt;           int bytesRead = 0;&lt;br /&gt;           while ((bytesRead = is.read(buffer)) != -1) {&lt;br /&gt;               jos.write(buffer, 0, bytesRead);&lt;br /&gt;           }&lt;br /&gt;           is.close();&lt;br /&gt;           jos.flush();&lt;br /&gt;           jos.closeEntry();&lt;br /&gt;       }&lt;br /&gt;       jos.close();&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;A common error is:&lt;br /&gt;&lt;pre&gt;Exception in thread "main" java.util.zip.ZipException: invalid entry compressed size (expected 1665 but got 1680 bytes)&lt;br /&gt;   at java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:206)&lt;br /&gt;   at test.CopyZip.copyJarFile(CopyZip.java:63)&lt;br /&gt;   at test.CopyZip.main(CopyZip.java:37)&lt;/pre&gt;It usually occurs when text file entries in the source jar file contain some non-ASCII characters such as ^I ^Z ^D ^C. Some common files are META-INF/COPYRIGHT.html, META-INF/LICENSE.txt, etc, probably because these files were created in a non-ASCII editor but saved as text files.  Open them in vi or vim to see these offending characters.&lt;br /&gt;&lt;br /&gt;To avoid this type of ZipException, always create a new JarEntry with the same name, and pass it to putNextEntry() method.  Do not pass the existing jar entry from the source jar file to putNextEntry() method.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1972612252837028425?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1972612252837028425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1972612252837028425' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1972612252837028425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1972612252837028425'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/07/how-to-programmatically-copy-jar-files.html' title='How to programmatically copy jar files'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7342630460953409321</id><published>2011-07-03T12:36:00.009-04:00</published><updated>2011-07-18T16:17:26.922-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Servlet'/><title type='text'>Servlet init method vs PostConstruct method</title><content type='html'>There are 2 initialization methods in servlet:&lt;br /&gt;&lt;br /&gt;(1), init(ServletConfig config) methods defined in &lt;a href="http://download.oracle.com/javaee/6/api/javax/servlet/Servlet.html#method_summary"&gt;javax.servlet.Servlet interface&lt;/a&gt;.  Servlet init method has been there since the first version of Servlet.  This method was later (around Servlet 2.3) overloaded in &lt;a href="http://download.oracle.com/javaee/6/api/javax/servlet/GenericServlet.html"&gt;javax.servlet.GeneircServlet&lt;/a&gt; for convenience.  According to the above javadoc, the servlet container calls the init method exactly once after instantiating the servlet.&lt;br /&gt;&lt;br /&gt;(2), PostConstruct method, as defined in &lt;a href="http://download.oracle.com/javaee/6/api/javax/annotation/PostConstruct.html"&gt;javax.annotation.PostConstruct&lt;/a&gt;, was introduced in Java EE 5 to all component types, including all web components (Servlet 2.5).  Similarly, &lt;code&gt;@PostConstruct&lt;/code&gt; (or &lt;code&gt;post-construct&lt;/code&gt;, if declared in deployment descriptors) methods are to be invoked only once after the component class is instantiated and before it is put into service.&lt;br /&gt;&lt;br /&gt;But these two servlet methods are not exactly the same.&lt;br /&gt;&lt;br /&gt;The name of Servlet init method is set in the interface, and it must be public.  PostConstruct method is more flexible: it can be private, package default, protected, or public, and can be named anything.&lt;br /&gt;&lt;br /&gt;I could not find docs specifying the invocation order and relationship of the two methods.  But it turns out the order is:&lt;br /&gt;&lt;pre&gt;servlet class constructor --&amp;gt; PostConstruct --&amp;gt; init and init(ServletConfig)&lt;br /&gt;&lt;/pre&gt;So inside PostConstruct method at the second step, ServletConfig has not been initialized, and neither is ServletContext.  Calling &lt;code&gt;getServletConfig()&lt;/code&gt; in PostConstruct returns null.  Calling getServletContext() results in IllegalStateException in most servers (GlassFish 3, Tomcat 7 and JBoss 6), but returns null in Resin 4.&lt;br /&gt;&lt;br /&gt;Apparently there are overlappings and subtle differences between PostConstruct and servlet init methods. I guess ideally we could merge them into one.  If there is no PostConstruct method in servlet class, init() will be considered as its PostConstruct method; if developers want to specify a PostConstruct method, it has to be the same as init() method, basically adding the redundant @PostConstruct to init().  This is roughly how ejbCreate and PostConstruct is handled in EJB 3.&lt;br /&gt;&lt;br /&gt;What about web apps that already have both PostConstruct and init methods?  In order to accommodate them, the next desirable approach is to allow both, but clearly specify their relationship, making clear getServletConfig() and getServletContext() both return valid values inside the both methods.&lt;br /&gt;&lt;br /&gt;The same applies to PreDestroy and servlet destroy method, to a lesser extent.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7342630460953409321?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7342630460953409321/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7342630460953409321' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7342630460953409321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7342630460953409321'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/07/servlet-init-method-vs-postconstruct.html' title='Servlet init method vs PostConstruct method'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-581624541864938002</id><published>2011-06-20T15:30:00.011-04:00</published><updated>2011-07-01T10:54:04.041-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>Jetty to GlassFish remote EJB invocation</title><content type='html'>Jetty-to-GlassFish EJB invocation is similar to &lt;a href="http://javahowto.blogspot.com/2011/06/tomcat-to-glassfish-remote-ejb.html"&gt;Tomcat-to-GlassFish case&lt;/a&gt;. I tested with Jetty Hightide 7.4.2 and GlassFish 3.1. &lt;br /&gt;&lt;br /&gt;Jetty configuration (in csh/tcsh syntax):&lt;br /&gt;&lt;pre&gt;setenv JETTY_HOME $HOME/tools/jetty&lt;br /&gt;setenv JETTY_PORT 7070     # avoid port conflict&lt;br /&gt;mkdir $JETTY_HOME/lib/ext/glassfish&lt;br /&gt;&lt;/pre&gt;The following commands copy 32 GlassFish jars needed for this test to Jetty directory:&lt;br /&gt;&lt;pre&gt;cd $GLASSFISH_HOME/modules&lt;br /&gt;cp javax.ejb.jar ejb-container.jar deployment-common.jar dol.jar glassfish-corba-csiv2-idl.jar glassfish-corba-codegen.jar ssl-impl.jar security.jar ejb.security.jar management-api.jar gmbal-api-only.jar gmbal.jar glassfish-corba-asm.jar glassfish-corba-newtimer.jar glassfish-corba-orbgeneric.jar config-types.jar kernel.jar config.jar config-api.jar glassfish-corba-omgapi.jar glassfish-corba-orb.jar orb-connector.jar orb-enabler.jar orb-iiop.jar glassfish-api.jar auto-depends.jar hk2-core.jar internal-api.jar common-util.jar glassfish-corba-internal-api.jar glassfish-naming.jar bean-validator.jar $JETTY_HOME/lib/ext/glassfish&lt;br /&gt;&lt;/pre&gt;I had to slightly modify TestServlet to make it work in Jetty:&lt;br /&gt;&lt;br /&gt;1, declare &lt;code&gt;TestServlet&lt;/code&gt; with &lt;code&gt;web.xml&lt;/code&gt; instead of using &lt;code&gt;@javax.servlet.annotation.WebServlet&lt;/code&gt;, probably because servlet 3.0 support is not there yet in Jetty 7.4.2;&lt;br /&gt;&lt;br /&gt;2, change @PostConstruct method to servlet init method.  When using @PostConstruct to look up TestBean, it is not initialized and produced NullPointerException at request time.  So I changed it to servlet init() method, which is a lifecycle method since early days of servlet.  The complete TestServlet.java and web.xml:&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;import javax.annotation.*;&lt;br /&gt;&lt;br /&gt;public class TestServlet extends HttpServlet {&lt;br /&gt;   private static final String glassfishJndiPropertiesPath = "/glassfish-jndi.properties";&lt;br /&gt;   private static final String testBeanJndi = "java:global/test-ejb/TestBean";&lt;br /&gt;   private TestIF testBean;&lt;br /&gt;&lt;br /&gt;   private Properties getGlassFishJndiProperties() {&lt;br /&gt;      Properties props = new Properties();&lt;br /&gt;      try {&lt;br /&gt;          props.load(getClass().getResourceAsStream(glassfishJndiPropertiesPath));&lt;br /&gt;      } catch (IOException e) {&lt;br /&gt;          System.out.println("Failed to load " + glassfishJndiPropertiesPath);&lt;br /&gt;      }&lt;br /&gt;      System.out.println("Got glassfish-jndi.properties: " + props);&lt;br /&gt;      return props;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void init() {&lt;br /&gt;       try {&lt;br /&gt;           InitialContext ic = new InitialContext(getGlassFishJndiProperties());&lt;br /&gt;           testBean = (TestIF) ic.lookup(testBeanJndi);&lt;br /&gt;           System.out.println("Looked up " + testBeanJndi + ", got " + testBean);&lt;br /&gt;       } catch (NamingException e) {&lt;br /&gt;           throw new RuntimeException(e);&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;   throws ServletException, IOException {&lt;br /&gt;       PrintWriter out = response.getWriter();&lt;br /&gt;       out.println("testBean.hello(): " + testBean.hello());&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;   throws ServletException, IOException {&lt;br /&gt;       processRequest(request, response);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void doPost(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;   throws ServletException, IOException {&lt;br /&gt;       processRequest(request, response);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;web.xml:&lt;br /&gt;--------&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;servlet&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;TestServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;servlet-class&amp;gt;test.TestServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt; &amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;TestServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt; &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;After packaging, test2.war (a sample app test.war is already included in jetty/webapps, so use a different name) contains the following entries:&lt;br /&gt;&lt;pre&gt;WEB-INF/classes/glassfish-jndi.properties&lt;br /&gt;WEB-INF/classes/test/TestIF.class&lt;br /&gt;WEB-INF/classes/test/TestServlet.class&lt;br /&gt;WEB-INF/web.xml&lt;br /&gt;&lt;/pre&gt;Other files, TestIF, TestBean, test-ejb.jar and glassfish-jndi.properties, are all the same as in &lt;a href="http://javahowto.blogspot.com/2011/06/tomcat-to-glassfish-remote-ejb.html"&gt;Tomcat and Resin exercise&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-581624541864938002?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/581624541864938002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=581624541864938002' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/581624541864938002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/581624541864938002'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/06/jetty-to-glassfish-remote-ejb.html' title='Jetty to GlassFish remote EJB invocation'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2416092229992169223</id><published>2011-06-16T13:03:00.003-04:00</published><updated>2011-06-16T13:19:05.253-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>Resin to GlassFish remote EJB invocation</title><content type='html'>Resin-to-GlassFish EJB invocation is almost identical to &lt;a href="http://javahowto.blogspot.com/2011/06/tomcat-to-glassfish-remote-ejb.html"&gt;Tomcat-to-GlassFish case&lt;/a&gt;. I tested with Resin-4.0.18 with GlassFish 3.1.  One minor difference is that Resin has its own bean validation implementation, so GlassFish's bean-validator.jar need not be copied to Resin.  The following is the list of 31 GlassFish jars needed for Resin client, in one single line for copying:&lt;br /&gt;&lt;pre&gt;cd $GLASSFISH_HOME/modules&lt;br /&gt;cp javax.ejb.jar ejb-container.jar deployment-common.jar dol.jar glassfish-corba-csiv2-idl.jar glassfish-corba-codegen.jar ssl-impl.jar security.jar ejb.security.jar management-api.jar gmbal-api-only.jar gmbal.jar glassfish-corba-asm.jar glassfish-corba-newtimer.jar glassfish-corba-orbgeneric.jar config-types.jar kernel.jar config.jar config-api.jar glassfish-corba-omgapi.jar glassfish-corba-orb.jar orb-connector.jar orb-enabler.jar orb-iiop.jar glassfish-api.jar auto-depends.jar hk2-core.jar internal-api.jar common-util.jar glassfish-corba-internal-api.jar glassfish-naming.jar $RESIN_HOME/lib&lt;br /&gt;&lt;/pre&gt;To change Resin http port number from the default 8080 to other number (e.g., 7070), edit resin/conf/resin.xml:&lt;br /&gt;&lt;pre&gt;&amp;lt;http address="*" port="7070"/&amp;gt;&lt;br /&gt;&lt;/pre&gt;All the rest, including test app code, deployment &amp;amp; execution steps are exactly the same as in Tomcat exercise.  This is the test command &amp;amp; output in resin:&lt;br /&gt;&lt;pre&gt;curl http://localhost:7070/test/&lt;br /&gt;testBean.hello(): From test.TestBean@47dccc2&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2416092229992169223?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2416092229992169223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2416092229992169223' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2416092229992169223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2416092229992169223'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/06/resin-to-glassfish-remote-ejb.html' title='Resin to GlassFish remote EJB invocation'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-6079440296120553244</id><published>2011-06-11T21:56:00.013-04:00</published><updated>2011-06-17T17:17:12.333-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>Tomcat to GlassFish remote EJB invocation</title><content type='html'>In order to make Tomcat(7.0.8)-to-GlassFish(v3) remote EJB invocation, one has to solve 2 challenges:&lt;br /&gt;&lt;br /&gt;1, add relevent GlassFish client-side jar files to tomcat lib.  There is an all-inclusive client jar (glassfish/lib/gf-client.jar), which references practically all GlassFish jars.  But adding gf-client.jar to Tomcat lib would cause various conflict of system classes.  So one still needs to figure out which GlassFish jars are needed, mostly by trial and error.&lt;br /&gt;&lt;br /&gt;For a simple Tomcat-GlassFish test that includes a servlet (in Tomcat) invoking remote EJB 3 stateless bean (in GlassFish 3), the following 32 jars are the minimum set of jars to be included in Tomcat lib:&lt;br /&gt;&lt;br /&gt;javax.ejb.jar&lt;br /&gt;ejb-container.jar&lt;br /&gt;deployment-common.jar&lt;br /&gt;dol.jar&lt;br /&gt;glassfish-corba-csiv2-idl.jar&lt;br /&gt;glassfish-corba-codegen.jar&lt;br /&gt;ssl-impl.jar&lt;br /&gt;security.jar&lt;br /&gt;ejb.security.jar&lt;br /&gt;management-api.jar&lt;br /&gt;gmbal-api-only.jar&lt;br /&gt;gmbal.jar&lt;br /&gt;glassfish-corba-asm.jar&lt;br /&gt;glassfish-corba-newtimer.jar&lt;br /&gt;glassfish-corba-orbgeneric.jar&lt;br /&gt;bean-validator.jar&lt;br /&gt;config-types.jar&lt;br /&gt;kernel.jar&lt;br /&gt;config.jar&lt;br /&gt;config-api.jar&lt;br /&gt;glassfish-corba-omgapi.jar&lt;br /&gt;glassfish-corba-orb.jar&lt;br /&gt;orb-connector.jar&lt;br /&gt;orb-enabler.jar&lt;br /&gt;orb-iiop.jar&lt;br /&gt;glassfish-api.jar&lt;br /&gt;auto-depends.jar&lt;br /&gt;hk2-core.jar&lt;br /&gt;internal-api.jar&lt;br /&gt;common-util.jar&lt;br /&gt;glassfish-corba-internal-api.jar&lt;br /&gt;glassfish-naming.jar&lt;br /&gt;&lt;br /&gt;2, add GlassFish jndi properties to application lookup code.  The complete servlet class:&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;import javax.annotation.*;&lt;br /&gt;&lt;br /&gt;@javax.servlet.annotation.WebServlet(urlPatterns = "/*")&lt;br /&gt;public class TestServlet extends HttpServlet {&lt;br /&gt;private static final String glassfishJndiPropertiesPath = "/glassfish-jndi.properties";&lt;br /&gt;private static final String testBeanJndi = "test.TestIF";&lt;br /&gt;private TestIF testBean;&lt;br /&gt;&lt;br /&gt;private Properties getGlassFishJndiProperties() {&lt;br /&gt;Properties props = new Properties();&lt;br /&gt;try {&lt;br /&gt; props.load(getClass().getResourceAsStream(glassfishJndiPropertiesPath));&lt;br /&gt;} catch (IOException e) {&lt;br /&gt; System.out.println("Failed to load " + glassfishJndiPropertiesPath);&lt;br /&gt;}&lt;br /&gt;System.out.println("Got glassfish-jndi.properties: " + props);&lt;br /&gt;return props;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@PostConstruct&lt;br /&gt;private void initTestBean() {&lt;br /&gt;try {&lt;br /&gt;  InitialContext ic = new InitialContext(getGlassFishJndiProperties());&lt;br /&gt;  testBean = (TestIF) ic.lookup(testBeanJndi);&lt;br /&gt;} catch (NamingException e) {&lt;br /&gt;  throw new RuntimeException(e);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;PrintWriter out = response.getWriter();&lt;br /&gt;out.println("testBean.hello(): " + testBean.hello());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;processRequest(request, response);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void doPost(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;processRequest(request, response);&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;The content of the test.war deployed in Tomcat:&lt;br /&gt;&lt;pre&gt;WEB-INF/classes/glassfish-jndi.properties&lt;br /&gt;WEB-INF/classes/test/TestIF.class&lt;br /&gt;WEB-INF/classes/test/TestServlet.class&lt;br /&gt;&lt;/pre&gt;TestIF is the remote business interface of TestBean.  WEB-INF/classes/glassfish-jndi.properties is packaged into the war file to provide GlassFish jndi bootstrap properties.  Its content is basedon the one in GlassFish server:&lt;br /&gt;&lt;pre&gt;java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory&lt;br /&gt;java.naming.factory.url.pkgs=com.sun.enterprise.naming&lt;br /&gt;# Required to add a javax.naming.spi.StateFactory for CosNaming that&lt;br /&gt;# supports dynamic RMI-IIOP.&lt;br /&gt;java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl&lt;br /&gt;&lt;br /&gt;# uncomment the following lines if GlassFish is running on&lt;br /&gt;# different host and non-default port number.&lt;br /&gt;# org.omg.CORBA.ORBInitialHost=localhost&lt;br /&gt;# org.omg.CORBA.ORBInitialPort=3700&lt;br /&gt;&lt;/pre&gt;test-ejb.jar deployed in GlassFish 3 just contains the bean class and its remote business interface:&lt;br /&gt;&lt;pre&gt;test/TestBean.class&lt;br /&gt;test/TestIF.class&lt;br /&gt;&lt;/pre&gt;TestIF.java:&lt;br /&gt;========&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import javax.ejb.*;&lt;br /&gt;&lt;br /&gt;@Remote&lt;br /&gt;public interface TestIF {&lt;br /&gt;public String hello();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;TestBean.java:&lt;br /&gt;==========&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import javax.ejb.*;&lt;br /&gt;&lt;br /&gt;@Stateless&lt;br /&gt;@Remote(TestIF.class)&lt;br /&gt;public class TestBean implements TestIF {&lt;br /&gt;public String hello() {&lt;br /&gt;return "From " + this;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;After both test-ejb.jar and test.war are packaged, first deploy test-ejb.jar to GlassFish, and then deploy test.war to Tomcat:&lt;br /&gt;&lt;pre&gt;cp test-ejb.jar $GLASSFISH_HOME/domains/domain1/autodeploy&lt;br /&gt;&lt;br /&gt;# to verify it has been successfully deployed:&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin list-applications&lt;br /&gt;&lt;br /&gt;cp test.war tomcat/webapps&lt;br /&gt;&lt;/pre&gt;Visit the test URL http://localhost:7070/test/ to see the result of remote EJB invocation.  The default http port number in Tomcat and GlassFish are the same (8080).  So if they are on the same host, need to change one of them.  I changed Tomcat to use 7070 by editing tomcat/conf/server.xml.&lt;br /&gt;&lt;br /&gt;When loading glassfish-jndi.properties, the current class loader, instead of ServletContext, is used to get the resource.  The reason is in @PostConstruct method, ServletConfig has not been initialized, and so GenericServlet.getServletConfig().getServletContext() failed with NullPointerException.&lt;br /&gt;&lt;br /&gt;The jndi name for looking up, test.TestIF, is the default GlassFish-specific global jndi name.  The portable global jndi name, java:global/test-ejb/TestBean, works as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-6079440296120553244?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/6079440296120553244/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=6079440296120553244' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6079440296120553244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6079440296120553244'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/06/tomcat-to-glassfish-remote-ejb.html' title='Tomcat to GlassFish remote EJB invocation'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1745570124281510436</id><published>2011-06-10T22:19:00.008-04:00</published><updated>2011-07-26T16:48:36.116-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>javax.naming.Reference cannot be cast to in GlassFish</title><content type='html'>This error usually happens when the client tries to cast the lookup result to the expected type, such as EJB remote interface.   This is what happens behind the scene.  During the naming context lookup, a javax.naming.Reference is first acquired, which contains information how to create the actual object for the client.  If the object creation step fails, then the half-baked &lt;code&gt;javax.naming.Reference&lt;/code&gt; is returned to the client, hence the &lt;code&gt;ClassCastException&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Some reasons why the naming manager failed to create object:&lt;br /&gt;&lt;br /&gt;1, the object factory class responsible for creating the object is not available in the client classpath.  Think of javax.naming.Reference as the raw material for creating the object.  When there is no factory, no object is created, and the raw material is thrown back to the client.&lt;br /&gt;&lt;br /&gt;In GlassFish 3, the object factory for remote EJB reference appears to be com.sun.ejb.containers.RemoteBusinessObjectFactory, packaged in ejb-container.jar.  So ejb-container.jar and javax.ejb.jar should be in the client classpath by direct inclusion or by reference, along with a series of other jar files.&lt;br /&gt;&lt;br /&gt;The following is the toString format of the returned javax.naming.Reference:&lt;pre&gt;Reference Class Name: test.TestIF&lt;br /&gt;Type: url&lt;br /&gt;Content: ejb/TestBean__3_x_Internal_RemoteBusinessHome__&lt;br /&gt;&lt;/pre&gt;2, the object factory is in client classpath, but not loadable by the current thread context class loader.&lt;br /&gt;&lt;br /&gt;The algorithm for creating object is in &lt;a href="http://download.oracle.com/javase/6/docs/api/javax/naming/spi/NamingManager.html#getObjectInstance%28java.lang.Object,%20javax.naming.Name,%20javax.naming.Context,%20java.util.Hashtable%29"&gt;javax.naming.spi.NamingManager&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1745570124281510436?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1745570124281510436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1745570124281510436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1745570124281510436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1745570124281510436'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/06/javaxnamingreference-cannot-be-cast-to.html' title='javax.naming.Reference cannot be cast to in GlassFish'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7930243220920095690</id><published>2011-05-05T13:28:00.007-04:00</published><updated>2011-05-15T14:57:25.829-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>VirtualBox shared folder for Ubuntu guest</title><content type='html'>After upgrading my Ubuntu guest OS, the configured Guest Addition and shared folders are gone.  So I have to go through the exercise again.  Keep this note for future reference:&lt;br /&gt;&lt;br /&gt;1, Make sure dkms is up to date:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo apt-get install dkms&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Reading package lists... Done&lt;br /&gt;Building dependency tree    &lt;br /&gt;Reading state information... Done&lt;br /&gt;dkms is already the newest version.&lt;br /&gt;0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.&lt;br /&gt;&lt;br /&gt;2, install Guest Addition on Ubuntu:&lt;br /&gt;&lt;br /&gt;Click VirtualBox menu Devices | Install Guest Additions..., nothing happened.  Then run it manually instead:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo sh /media/VBOXADDITIONS_4.0.6_71344/VBoxLinuxAdditions.run&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3, Add shared folders by clicking VirtualBox menu Devices | Shared Folders&lt;br /&gt;&lt;br /&gt;4, Mount the shared folder to the guest Ubuntu and make it accessible to yourself.&lt;br /&gt;&lt;br /&gt;The default mounting point is &lt;code&gt;/media/sf_&amp;lt;the-name-entered-in-step-3&amp;gt;&lt;/code&gt;, and is accessible to group vboxsf only.   To open it up for yourself, go to Ubuntu menu System | Administration | Users and Groups,  then go to Manage Groups | vboxsf | Properties | Group Members, and add yourself to this group.&lt;br /&gt;&lt;br /&gt;While there, also change the account type to Administrator.  It's not a required step, but I like to have maximum permission.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7930243220920095690?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7930243220920095690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7930243220920095690' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7930243220920095690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7930243220920095690'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/05/virtualbox-shared-folder-for-ubuntu.html' title='VirtualBox shared folder for Ubuntu guest'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-754419918228714983</id><published>2011-04-20T08:37:00.005-04:00</published><updated>2011-11-12T07:31:07.090-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>My mvn notes</title><content type='html'>To skip running tests:&lt;br /&gt;&lt;pre&gt;mvn install -DskipTests&lt;br /&gt;mvn install -DskipTests=true  //to override skipTests property in pom&lt;br /&gt;&lt;/pre&gt;To skip compiling and running tests:&lt;br /&gt;&lt;pre&gt;mvn install -Dmaven.test.skip=true&lt;br /&gt;&lt;/pre&gt;To run maven in offline mode, to avoid downloading:&lt;pre&gt;mvn -o install&lt;br /&gt;mvn --offline install&lt;/pre&gt;To force check for updates of snapshots and releases from remote repositories:&lt;pre&gt;mvn -U install&lt;br /&gt;mvn --update-snapshots install&lt;/pre&gt;To override maven surefire plugin forkMode:&lt;pre&gt;mvn test -DforkMode=never&lt;br /&gt;mvn test -DforkMode=always&lt;/pre&gt;To debug a non-forked test, just need to attach the remote debugger to mvn process itself.  mvnDebug is a convenience script located in the same directory as mvn executable:&lt;pre&gt;mvnDebug test&lt;br /&gt;mvnDebug test -DforkMode=never&lt;/pre&gt;To debug a forked test, you will need to set the debug option to the forked VM, not the mvn VM.  The way to do it is to set -Dmaven.surefire.debug flag to mvn VM (the parent VM):&lt;pre&gt;mvn test -Dmaven.surefire.debug&lt;br /&gt;mvn test -Dmaven.surefire.debug -DforkMode=always&lt;br /&gt;mvn test -Dmaven.surefire.debug -Dtest=com.my.test.MyTest#test1&lt;/pre&gt;To avoid OutOfMemoryError from running maven, especially maven 3, set environment variable MAVEN_OPTS:&lt;pre&gt;# in $HOME/.tcshrc, or $HOME/.cshrc, if using csh or tcsh:&lt;br /&gt;setenv MAVEN_OPTS "-Xmx1024m -XX:MaxPermSize=256m"&lt;br /&gt;&lt;br /&gt;# in $HOME/.profile or $HOME/.bashrc, if using ksh or bash:&lt;br /&gt;export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=256m"&lt;br /&gt;&lt;br /&gt;# in Windows Control Panel, or set it in DOS command line:&lt;br /&gt;set MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=256m&lt;/pre&gt;&lt;br /&gt;To run mvn with an alternate user setting file, e.g., settings-jboss.xml:&lt;pre&gt;mvn -s $HOME/.m2/settings-jboss.xml&lt;/pre&gt;The content of settings-jboss.xml:&lt;pre&gt;&amp;lt;settings&amp;gt;&lt;br /&gt;&amp;lt;repositories&amp;gt;&lt;br /&gt;        &amp;lt;repository&amp;gt;&lt;br /&gt;          &amp;lt;id&amp;gt;jboss-public-repository-group&amp;lt;/id&amp;gt;&lt;br /&gt;          &amp;lt;name&amp;gt;JBoss Public Maven Repository Group&amp;lt;/name&amp;gt;&lt;br /&gt;          &amp;lt;url&amp;gt;https://repository.jboss.org/nexus/content/groups/public-jboss/&amp;lt;/url&amp;gt;&lt;br /&gt;          &amp;lt;layout&amp;gt;default&amp;lt;/layout&amp;gt;&lt;br /&gt;          &amp;lt;releases&amp;gt;&lt;br /&gt;            &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;&lt;br /&gt;            &amp;lt;updatePolicy&amp;gt;never&amp;lt;/updatePolicy&amp;gt;&lt;br /&gt;          &amp;lt;/releases&amp;gt;&lt;br /&gt;          &amp;lt;snapshots&amp;gt;&lt;br /&gt;            &amp;lt;enabled&amp;gt;true&amp;lt;/enabled&amp;gt;&lt;br /&gt;            &amp;lt;updatePolicy&amp;gt;never&amp;lt;/updatePolicy&amp;gt;&lt;br /&gt;          &amp;lt;/snapshots&amp;gt;&lt;br /&gt;        &amp;lt;/repository&amp;gt;&lt;br /&gt;      &amp;lt;/repositories&amp;gt;&lt;br /&gt;&amp;lt;/settings&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-754419918228714983?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/754419918228714983/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=754419918228714983' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/754419918228714983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/754419918228714983'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/04/my-mvn-notes.html' title='My mvn notes'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-3202140777357262850</id><published>2011-04-01T15:28:00.024-04:00</published><updated>2012-01-30T09:57:54.127-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>My vim notes</title><content type='html'>To open all files whose paths are stored in a file into multiple vim buffers:&lt;br /&gt;&lt;pre&gt;cat list.txt | xargs vim&lt;br /&gt;xargs vim &amp;lt; /tmp/a&lt;/pre&gt;To redirect the output from a command (ps) into vim for easy search and maybe saving it:&lt;pre&gt;ps -ef | vim -&lt;/pre&gt;To combine vim and find to open all matched files:&lt;br /&gt;&lt;pre&gt;vim `find . -name build.xml`&lt;br /&gt;find . -name web.xml | xargs vim&lt;/pre&gt;&lt;code&gt;find . -name web.xml -exec vim {} \;&lt;/code&gt; is different: it will find a match, vim it, and repeat, and only 1 buffer in any vim session.&lt;br /&gt;&lt;br /&gt;Be careful with file names with spaces. These pipelined use of find and xargs will treat spaces as delimiter between args, and break one arg into two.&lt;br /&gt;&lt;br /&gt;vim search &amp;amp; replace in a file(replace old with new in the whole file, CASE sensitive, asking for confirmation).  When prompted for confirmation, press 'a' to confirm all ocurrences including and after the current one.&lt;br /&gt;&lt;pre&gt;:%s/old/new/gcI&lt;/pre&gt;To bookmark a location as bookmark a, type ma.  To go to bookmark a, type 'a&lt;br /&gt;&lt;br /&gt;To turn off syntax highlighting, run command ":sy off", or ":syn off", or ":syntax off", to turn on highlighting again ":sy on", or ":syn on", or ":syntax on".  After typing ":sy", you can press TAB key for autocomplete, or press Ctrl-D to list all matching commands.&lt;br /&gt;&lt;br /&gt;To turn off highlight after you are done with a search, run command ":nohl"&lt;br /&gt;&lt;br /&gt;To turn on highight search, if it's not already on, run command ":set hls"&lt;br /&gt;&lt;br /&gt;To save all changed files, run command ":wa"&lt;br /&gt;&lt;br /&gt;To save all changed files and exit, run command ":xa"&lt;br /&gt;&lt;br /&gt;":x" is the same as ":wq": save and exit&lt;br /&gt;&lt;br /&gt;To close all files and exit, run command ":qa", but vim won't exit if there is unsaved changes.&lt;br /&gt;&lt;br /&gt;To close all files and exit forcifully, run command ":q!".&lt;br /&gt;&lt;br /&gt;To open a file and go the end of the file (to skip long copyright):&lt;code&gt;&lt;br /&gt;vim -c :$ pom.xml&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To open a file (e.g., log file) in read-only mode and go to the end of file:&lt;code&gt;&lt;br /&gt;  view -c :$ $JBOSS_HOME/standalone/log/server.log&lt;br /&gt;vim -R -c :$ $JBOSS_HOME/standalone/log/server.log&lt;/code&gt;&lt;br /&gt;The above commands are similar to &lt;code&gt;tail -f&lt;/code&gt;, but easier to search and navigate inside vim.&lt;br /&gt;&lt;br /&gt;To open a file with gvim or vim from Mac OS terminal, run &lt;pre&gt;"open -a gvim build.xml"&lt;/pre&gt;  If you configure Finder to always open *.xml files with gvim, directly run &lt;pre&gt;"open build.xml"&lt;/pre&gt;  You can still open them with the default TextEdit with &lt;pre&gt;"open -a textedit build.xml"&lt;/pre&gt;To customize gvim window size (the default is too small), add the following lines to &lt;code&gt;$HOME/.gvimrc&lt;/code&gt; on Mac/Linux/Solaris, or &lt;code&gt;%HOMEPATH%\_gvimrc&lt;/code&gt; on Windows:&lt;br /&gt;&lt;pre&gt;set lines=80 columns=120&lt;br /&gt;&lt;/pre&gt;To substitue the current character and stay in insertion mode, type s&lt;br /&gt;&lt;br /&gt;To change to overwrite/replace mode (as opposed to insertion), shift-R (Uppercase R)&lt;br /&gt;&lt;br /&gt;To undo the last undo: Ctrl-R&lt;br /&gt;&lt;br /&gt;To search with case-insensitive option for this search only, /foo\c&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-3202140777357262850?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/3202140777357262850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=3202140777357262850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3202140777357262850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3202140777357262850'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/04/my-vim-notes.html' title='My vim notes'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-4545998928515423416</id><published>2011-02-11T10:32:00.009-05:00</published><updated>2011-04-16T08:57:15.898-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>GlassFish embedded, JPA, EJB, DataSource and glassfish-resources.xml</title><content type='html'>In a &lt;a href="http://javahowto.blogspot.com/2011/02/ejb-lite-jpa-datasource-embedded-in.html"&gt;previous post&lt;/a&gt; I wrote about using &lt;code&gt;@DataSourceDefinition&lt;/code&gt; to create a JTA data source for JPA in a standalone java application.  Another option is to use &lt;code&gt;glassfish-resources.xml&lt;/code&gt; to define the data source.  The following is a standalone test app that includes glassfish embedded, JPA, EJB, Servlet, and JTA data source defined with glassfish-resources.xml.&lt;br /&gt;&lt;br /&gt;As with the previous test app, GlassFish server is running in the same JVM as the test app. And in this example, the test program starts the GlassFish embedded, constructs a scattered web app, deploys it, sends http request, undeploys it, and finally shuts down the server.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;WEB-INF/classes/META-INF/persistence.xml :&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"&amp;gt;&lt;br /&gt;&amp;lt;persistence-unit name="test_pu" transaction-type="JTA"&amp;gt;&lt;br /&gt;&amp;lt;jta-data-source&amp;gt;java:app/jdbc/test&amp;lt;/jta-data-source&amp;gt;&lt;br /&gt;&amp;lt;properties&amp;gt;&lt;br /&gt; &amp;lt;property name="eclipselink.ddl-generation" value="create-tables"/&amp;gt;&lt;br /&gt; &amp;lt;property name="eclipselink.logging.level" value="FINE"/&amp;gt;&lt;br /&gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;lt;/persistence-unit&amp;gt;&lt;br /&gt;&amp;lt;/persistence&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;WEB-INF/glassfish-resources.xml&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;&amp;lt;jdbc-connection-pool&lt;br /&gt; name="java:app/jdbc/test_pool"&lt;br /&gt; res-type="javax.sql.DataSource"&lt;br /&gt; datasource-classname="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"&lt;br /&gt; pool-resize-quantity="1"&lt;br /&gt; max-pool-size="5"&lt;br /&gt; steady-pool-size="0"&lt;br /&gt; statement-timeout-in-seconds="30" &amp;gt;&lt;br /&gt;   &amp;lt;property name="User" value="root"&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;   &amp;lt;property name="Password" value="root"&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;   &amp;lt;property name="portNumber" value="3306"&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;   &amp;lt;property name="dataBaseName" value="test"&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt;   &amp;lt;property name="serverName" value="localhost"&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/jdbc-connection-pool&amp;gt;&lt;br /&gt; &amp;lt;jdbc-resource pool-name="java:app/jdbc/test_pool" jndi-name="java:app/jdbc/test"&amp;gt;&amp;lt;/jdbc-resource&amp;gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;WEB-INF/classes/test/Employee:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import javax.persistence.*;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class Employee implements java.io.Serializable {&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;@Id @GeneratedValue(strategy = GenerationType.AUTO)&lt;br /&gt;private Long id;&lt;br /&gt;&lt;br /&gt;@Basic private String name;&lt;br /&gt;&lt;br /&gt;public Long getId() {&lt;br /&gt;   return id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setId(Long id) {&lt;br /&gt;   this.id = id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getName() {&lt;br /&gt;   return name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setName(String name) {&lt;br /&gt;   this.name = name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override public int hashCode() {&lt;br /&gt;   int hash = 0;&lt;br /&gt;   hash += (id != null ? id.hashCode() : 0);&lt;br /&gt;   return hash;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override public boolean equals(Object object) {&lt;br /&gt;   // TODO: Warning - this method won't work in the case the id fields are not set&lt;br /&gt;   if (!(object instanceof Employee)) {&lt;br /&gt;       return false;&lt;br /&gt;   }&lt;br /&gt;   Employee other = (Employee) object;&lt;br /&gt;   if ((this.id == null &amp;amp;&amp;amp; other.id != null) || (this.id != null &amp;amp;&amp;amp; !this.id.equals(other.id))) {&lt;br /&gt;       return false;&lt;br /&gt;   }&lt;br /&gt;   return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override public String toString() {&lt;br /&gt;   return "Employee id=" + id + ", name=" + name;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;WEB-INF/classes/test/TestBean:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import javax.ejb.Stateless;&lt;br /&gt;import javax.persistence.*;&lt;br /&gt;import javax.annotation.sql.DataSourceDefinition;&lt;br /&gt;&lt;br /&gt;@Stateless&lt;br /&gt;public class TestBean {&lt;br /&gt;@PersistenceContext private EntityManager em;&lt;br /&gt;&lt;br /&gt;public void addEmployee(String[] names) {&lt;br /&gt;   for(String name : names) {&lt;br /&gt;       Employee e = new Employee();&lt;br /&gt;       e.setName(name);&lt;br /&gt;       em.persist(e);&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;WEB-INF/classes/test/TestServlet:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import java.io.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;import javax.annotation.*;&lt;br /&gt;import javax.ejb.*;&lt;br /&gt;&lt;br /&gt;@javax.servlet.annotation.WebServlet(urlPatterns = "/*")&lt;br /&gt;public class TestServlet extends HttpServlet {&lt;br /&gt; @EJB private TestBean testBean;&lt;br /&gt;&lt;br /&gt; protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt; throws ServletException, IOException {&lt;br /&gt;     PrintWriter out = response.getWriter();&lt;br /&gt;     String[] names =request.getParameterValues("name");&lt;br /&gt;     testBean.addEmployee(names);&lt;br /&gt;     out.println("Added employees " + java.util.Arrays.toString(names));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt; throws ServletException, IOException {&lt;br /&gt;     processRequest(request, response);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt; throws ServletException, IOException {&lt;br /&gt;     processRequest(request, response);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;WEB-INF/classes/test/Client:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import org.glassfish.embeddable.Deployer;&lt;br /&gt;import org.glassfish.embeddable.GlassFish;&lt;br /&gt;import org.glassfish.embeddable.GlassFishProperties;&lt;br /&gt;import org.glassfish.embeddable.GlassFishRuntime;&lt;br /&gt;import org.glassfish.embeddable.archive.ScatteredArchive;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.net.*;&lt;br /&gt;&lt;br /&gt;public class Client {&lt;br /&gt; private static final String warName = "test";&lt;br /&gt; private static final int portNumber = 8080;&lt;br /&gt; private GlassFish glassfish;&lt;br /&gt; private Deployer  deployer;&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) throws Exception {&lt;br /&gt;     Client client = new Client();&lt;br /&gt;     client.setUp();&lt;br /&gt;     client.test(args);&lt;br /&gt;     client.tearDown();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; protected void setUp() throws Exception {&lt;br /&gt;     GlassFishProperties props = new GlassFishProperties();&lt;br /&gt;     props.setPort("http-listener", portNumber);&lt;br /&gt;     glassfish = GlassFishRuntime.bootstrap().newGlassFish(props);&lt;br /&gt;     glassfish.start();&lt;br /&gt;     deployer = glassfish.getDeployer();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; protected void tearDown() throws Exception {&lt;br /&gt;     deployer.undeploy(warName);&lt;br /&gt;     glassfish.dispose();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; protected void test(String[] names) throws Exception {&lt;br /&gt;     ScatteredArchive scattered = new ScatteredArchive(warName, ScatteredArchive.Type.WAR, new File("./"));&lt;br /&gt;     deployer.deploy(scattered.toURI());&lt;br /&gt;     URL url = new URL("http://localhost:" + portNumber + "/" + warName + "/?name=Jon&amp;amp;name=Jane");&lt;br /&gt;     HttpURLConnection conn = (HttpURLConnection) url.openConnection();&lt;br /&gt;     BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));&lt;br /&gt;     System.out.println("Request url: " + url);&lt;br /&gt;     String line = null;&lt;br /&gt;     while ((line = in.readLine()) != null) {&lt;br /&gt;         System.out.println(line);&lt;br /&gt;     }&lt;br /&gt;     in.close();&lt;br /&gt;     conn.disconnect();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;To compile from project directory:&lt;br /&gt;&lt;pre&gt;$ javac -cp "$GLASSFISH_HOME/lib/embedded/glassfish-embedded-static-shell.jar" WEB-INF/classes/test/*java&lt;br /&gt;&lt;/pre&gt;Start mysqld, and run the app:&lt;br /&gt;&lt;pre&gt;cd /usr/local/mysql-5.1.32; sudo bin/mysqld_safe --user root&lt;br /&gt;java -cp "WEB-INF/classes:$GLASSFISH_HOME/lib/embedded/glassfish-embedded-static-shell.jar:$HOME/mysql-connector-java-5.1.5-bin.jar" test.Client&lt;br /&gt;&lt;/pre&gt;Among very verbose command-line output are these lines:&lt;br /&gt;&lt;pre&gt;Request url: http://localhost:8080/test/?name=Jon&amp;amp;name=Jane&lt;br /&gt;Added employees [Jon, Jane]&lt;br /&gt;classLoader = WebappClassLoader (delegate=true; repositories=WEB-INF/classes/)&lt;br /&gt;&lt;/pre&gt;Verify entities are successfully created by running mysql:&lt;br /&gt;&lt;pre&gt;mysql&amp;gt; select * from EMPLOYEE;&lt;br /&gt;+----+------+&lt;br /&gt;| ID | NAME |&lt;br /&gt;+----+------+&lt;br /&gt;|  1 | Jon  |&lt;br /&gt;|  2 | Jane |&lt;br /&gt;+----+------+&lt;br /&gt;2 rows in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;The test client main class mimics the strucutre of a JUnit test case, and can be easily converted to one if needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-4545998928515423416?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/4545998928515423416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=4545998928515423416' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4545998928515423416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4545998928515423416'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/02/glassfish-embedded-jpa-ejb-datasource.html' title='GlassFish embedded, JPA, EJB, DataSource and glassfish-resources.xml'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2853932703525532585</id><published>2011-02-10T10:41:00.013-05:00</published><updated>2011-11-12T08:05:01.849-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>How to create and look up thread pool resource in GlassFish</title><content type='html'>In order to create a custom thread pool task executor resource, one needs to implement 2 classes: the thread pool class, and its object factory class.&lt;br /&gt;&lt;br /&gt;In my implementation, the thread pool class, &lt;code&gt;test.ThreadPoolExecutor&lt;/code&gt; is simply a subclass of &lt;code&gt;java.util.concurrent.ThreadPoolExecutor&lt;/code&gt;.  It is implemented as a singleton so every lookup and injection always return the same instance.&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.util.concurrent.BlockingQueue;&lt;br /&gt;import java.util.concurrent.LinkedBlockingQueue;&lt;br /&gt;import java.util.concurrent.TimeUnit;&lt;br /&gt;&lt;br /&gt;public class ThreadPoolExecutor extends java.util.concurrent.ThreadPoolExecutor {&lt;br /&gt; static final int defaultCorePoolSize = 5;&lt;br /&gt; static final int defaultMaximumPoolSize = 10;&lt;br /&gt; static final long defaultKeepAliveTime = 10;&lt;br /&gt; static final TimeUnit defaultTimeUnit = TimeUnit.MINUTES;&lt;br /&gt; static final BlockingQueue&amp;lt;Runnable&amp;gt; workQueue = new LinkedBlockingQueue&amp;lt;Runnable&amp;gt;();&lt;br /&gt; private static ThreadPoolExecutor instance;&lt;br /&gt;&lt;br /&gt; private ThreadPoolExecutor() {&lt;br /&gt;     super(defaultCorePoolSize, defaultMaximumPoolSize, defaultKeepAliveTime, defaultTimeUnit, workQueue);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; synchronized static ThreadPoolExecutor getInstance() {&lt;br /&gt;     if (instance == null) {&lt;br /&gt;         instance = new ThreadPoolExecutor();&lt;br /&gt;     }&lt;br /&gt;     return instance;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;The factory class, &lt;code&gt;test.ThreadPoolExecutorFactory&lt;/code&gt;, is required to implement &lt;code&gt;javax.naming.spi.ObjectFactory&lt;/code&gt;.  It also implements a GlassFish-specific interface &lt;code&gt;com.sun.appserv.server.LifecycleListener&lt;/code&gt; so that it can also be registered as a GlassFish lifecycle module.  Upon receiving a server termination event, this class will shutdown the thread pool resource.&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.util.Enumeration;&lt;br /&gt;import java.util.Hashtable;&lt;br /&gt;import java.util.concurrent.TimeUnit;&lt;br /&gt;&lt;br /&gt;import javax.naming.Context;&lt;br /&gt;import javax.naming.Name;&lt;br /&gt;import javax.naming.NamingException;&lt;br /&gt;import javax.naming.RefAddr;&lt;br /&gt;import javax.naming.Reference;&lt;br /&gt;&lt;br /&gt;import com.sun.appserv.server.LifecycleEvent;&lt;br /&gt;import com.sun.appserv.server.ServerLifecycleException;&lt;br /&gt;&lt;br /&gt;public class ThreadPoolExecutorFactory implements javax.naming.spi.ObjectFactory,&lt;br /&gt;     com.sun.appserv.server.LifecycleListener, java.io.Serializable {&lt;br /&gt; public Object getObjectInstance(Object obj, Name name, Context nameCtx,&lt;br /&gt;         Hashtable&amp;lt;?, ?&amp;gt; environment) throws Exception {&lt;br /&gt;     ThreadPoolExecutor tp = ThreadPoolExecutor.getInstance();&lt;br /&gt;     try {&lt;br /&gt;         Reference reference = (Reference) obj;&lt;br /&gt;         Enumeration&amp;lt;?&amp;gt; enumeration = reference.getAll();&lt;br /&gt;         TimeUnit timeUnit = ThreadPoolExecutor.defaultTimeUnit;&lt;br /&gt;         long keepAliveTime = ThreadPoolExecutor.defaultKeepAliveTime;&lt;br /&gt;         while (enumeration.hasMoreElements()) {&lt;br /&gt;             RefAddr refAddr = (RefAddr) enumeration.nextElement();&lt;br /&gt;             String pname = refAddr.getType();&lt;br /&gt;             String pvalue = (String) refAddr.getContent();&lt;br /&gt;             if ("corePoolSize".equalsIgnoreCase(pname)) {&lt;br /&gt;                 tp.setCorePoolSize(Integer.parseInt(pvalue));&lt;br /&gt;             } else if ("maximumPoolSize".equalsIgnoreCase(pname)) {&lt;br /&gt;                 tp.setMaximumPoolSize(Integer.parseInt(pvalue));&lt;br /&gt;             } else if ("timeUnit".equalsIgnoreCase(pname)) {&lt;br /&gt;                 timeUnit = TimeUnit.valueOf(pvalue);&lt;br /&gt;             } else if ("keepAliveTime".equalsIgnoreCase(pname)) {&lt;br /&gt;                 keepAliveTime = Long.parseLong(pvalue);&lt;br /&gt;             } else if ("allowCoreThreadTimeOut".equalsIgnoreCase(pname)) {&lt;br /&gt;                 tp.allowCoreThreadTimeOut(Boolean.parseBoolean(pvalue));&lt;br /&gt;             } else if ("prestartAllCoreThreads".equalsIgnoreCase(pname)) {&lt;br /&gt;                 if (Boolean.parseBoolean(pvalue)) {&lt;br /&gt;                     tp.prestartAllCoreThreads();&lt;br /&gt;                 }&lt;br /&gt;             } else {&lt;br /&gt;                 throw new IllegalArgumentException("Unrecognized property name: " + pname);&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;         tp.setKeepAliveTime(keepAliveTime, timeUnit);&lt;br /&gt;     } catch (Exception e) {&lt;br /&gt;         throw (NamingException) (new NamingException()).initCause(e);&lt;br /&gt;     }&lt;br /&gt;     return tp;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void handleEvent(LifecycleEvent event) throws ServerLifecycleException {&lt;br /&gt;     if (event.getEventType() == LifecycleEvent.TERMINATION_EVENT) {&lt;br /&gt;         ThreadPoolExecutor tp = ThreadPoolExecutor.getInstance();&lt;br /&gt;         System.out.println("About to purge and shutdown " + tp + ", active thread count: "&lt;br /&gt;                 + tp.getActiveCount());&lt;br /&gt;         tp.purge();&lt;br /&gt;         tp.shutdown();&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;Copy 2 class files to $GLASSFISH_HOME/domains/domain1/lib/classes directory, with package name, and restart domain:&lt;br /&gt;&lt;pre&gt;ls $GLASSFISH_HOME/domains/domain1/lib/classes/test/&lt;br /&gt;ThreadPoolExecutorFactory.class  ThreadPoolExecutor.class&lt;br /&gt;&lt;br /&gt;$ asadmin restart-domain&lt;br /&gt;&lt;/pre&gt;Next, create the thread pool resource, and register lifecycle module.  It can also be done in admin console, in a more user-friendly manner.&lt;br /&gt;&lt;pre&gt;$ asadmin create-custom-resource --restype test.ThreadPoolExecutor --factoryclass test.ThreadPoolExecutorFactory --description "A ThreadPoolExecutor backed by LinkedBlockingQueue" --property corePoolSize=6:maximumPoolSize=50:keepAliveTime=4:timeUnit=MINUTES:allowCoreThreadTimeOut=true:prestartAllCoreThreads=true concurrency/TP&lt;br /&gt;Command create-custom-resource executed successfully.&lt;br /&gt;&lt;br /&gt;$ asadmin create-lifecycle-module --classname "test.ThreadPoolExecutorFactory" --failurefatal=true concurrency/TP-shutdown&lt;/pre&gt;To list and delete custom resources and lifecycle modules:&lt;br /&gt;&lt;pre&gt;$ asadmin list-custom-resources&lt;br /&gt;&lt;br /&gt;$ asadmin list-lifecycle-modules&lt;br /&gt;&lt;br /&gt;$ asadmin delete-lifecycle-module concurrency/TP-shutdown&lt;br /&gt;&lt;br /&gt;$ asadmin delete-custom-resource concurrency/TP&lt;br /&gt;&lt;/pre&gt;This is how it looks like in admin console, where you can easily manage it:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-wsavh2sGqnY/TVQcMPa0r2I/AAAAAAAAB9U/t3wjwvxG60c/s1600/custom-resource-threadpool.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 218px;" src="http://3.bp.blogspot.com/-wsavh2sGqnY/TVQcMPa0r2I/AAAAAAAAB9U/t3wjwvxG60c/s320/custom-resource-threadpool.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5572109635587190626" /&gt;&lt;/a&gt;&lt;br /&gt;To use this resource, just inject or look up in application components. The following is a test servlet that verifies that the resource can be obtained with either @Resource or regular lookup, and that multiple lookups return the same instance.&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import java.io.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;import javax.annotation.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;&lt;br /&gt;@javax.servlet.annotation.WebServlet(urlPatterns = "/*")&lt;br /&gt;public class TestServlet extends HttpServlet {&lt;br /&gt;   @Resource(name="java:app/env/concurrency/TP", mappedName="concurrency/TP")&lt;br /&gt;   private test.ThreadPoolExecutor tp;&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;   throws ServletException, IOException {&lt;br /&gt;       testLookup();&lt;br /&gt;       System.out.println("About to submit tasks to " + tp);&lt;br /&gt;       for(int i = 0; i &amp;lt; 30; i++) {&lt;br /&gt;           tp.execute(new MyRunnable());  &lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private void testLookup() throws ServletException {&lt;br /&gt;       try {&lt;br /&gt;           for(int i = 0; i &amp;lt; 10; i++) {&lt;br /&gt;               ThreadPoolExecutor t = InitialContext.&amp;lt;ThreadPoolExecutor&amp;gt;doLookup("java:app/env/concurrency/TP");&lt;br /&gt;               System.out.println("ThreadPoolExecutor from lookup: " + t);&lt;br /&gt;           }&lt;br /&gt;       } catch (NamingException e) {&lt;br /&gt;           throw new ServletException(e);&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   private static class MyRunnable implements Runnable {&lt;br /&gt;       public void run() {&lt;br /&gt;           System.out.println("Executing task in " + Thread.currentThread());&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;When running the test webapp at http://localhost:8080/test/, many log messages like these will appear in server.log:&lt;br /&gt;&lt;pre&gt;ThreadPoolExecutor from lookup: test.ThreadPoolExecutor@12e0a75a&lt;br /&gt;Executing task in Thread[pool-29-thread-6,5,grizzly-kernel&lt;br /&gt;&lt;/pre&gt;In the above output, &lt;code&gt;pool-29-thread-6&lt;/code&gt; is the thread name, 5 (normal) is its priority, and &lt;code&gt;grizzly-kernel&lt;/code&gt; is thread group name. When shutting down the server, the thread pool is purged and shutdown, thanks to the lifecycle module &lt;code&gt;concurrency/TP-shutdown&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;Server shutdown initiated&lt;br /&gt;About to purge and shutdown test.ThreadPoolExecutor@12e0a75a, active thread count: 0&lt;br /&gt;JMXStartupService: Stopped JMXConnectorServer: null&lt;br /&gt;JMXStartupService and JMXConnectors have been shut down.&lt;br /&gt;Shutdown procedure finished&lt;br /&gt;&lt;/pre&gt;This is just a simplistic implementation of thead pool resource in GlassFish. There is a potential class loader leak and may cause ClassCastException and/or OutOfMemoryError in large applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2853932703525532585?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2853932703525532585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2853932703525532585' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2853932703525532585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2853932703525532585'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/02/how-to-create-and-look-up-thread-pool.html' title='How to create and look up thread pool resource in GlassFish'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-wsavh2sGqnY/TVQcMPa0r2I/AAAAAAAAB9U/t3wjwvxG60c/s72-c/custom-resource-threadpool.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1096633053500078777</id><published>2011-02-06T14:54:00.009-05:00</published><updated>2011-10-19T11:08:15.661-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='JPA'/><title type='text'>EJB lite, JPA, DataSource embedded in java application</title><content type='html'>This post demonstrates how to put EJB lite, JPA, DataSource together in a standalone java application, using standard JavaEE 6 API in GlassFish. The application source consists of 4 files: persistence.xml, JPA entity, no-interface EJB, and main class.&lt;br /&gt;&lt;br /&gt;Transaction is managed by embeddable EJB container.  The persistence unit is backed by an application-scoped JTA DataSource declared with annotation on EJB class.  No need to package or deploy anything.  Client and server pieces are all in a single JVM.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;classes/META-INF/persistence.xml :&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"&amp;gt;&lt;br /&gt;&amp;lt;persistence-unit name="test_pu" transaction-type="JTA"&amp;gt;&lt;br /&gt;  &amp;lt;jta-data-source&amp;gt;java:app/jdbc/test&amp;lt;/jta-data-source&amp;gt;&lt;br /&gt;  &amp;lt;properties&amp;gt;&lt;br /&gt;    &amp;lt;property name="eclipselink.ddl-generation" value="create-tables"/&amp;gt;&lt;br /&gt;    &amp;lt;property name="eclipselink.logging.level" value="FINE"/&amp;gt;&lt;br /&gt;  &amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;lt;/persistence-unit&amp;gt;&lt;br /&gt;&amp;lt;/persistence&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;JPA entity Employee:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import javax.persistence.*;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class Employee implements java.io.Serializable {&lt;br /&gt;  private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;  @Id @GeneratedValue(strategy = GenerationType.AUTO)&lt;br /&gt;  private Long id;&lt;br /&gt;&lt;br /&gt;  @Basic private String name;&lt;br /&gt;&lt;br /&gt;  public Long getId() {&lt;br /&gt;      return id;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setId(Long id) {&lt;br /&gt;      this.id = id;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public String getName() {&lt;br /&gt;      return name;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public void setName(String name) {&lt;br /&gt;      this.name = name;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override public int hashCode() {&lt;br /&gt;      int hash = 0;&lt;br /&gt;      hash += (id != null ? id.hashCode() : 0);&lt;br /&gt;      return hash;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override public boolean equals(Object object) {&lt;br /&gt;      // TODO: Warning - this method won't work in the case the id fields are not set&lt;br /&gt;      if (!(object instanceof Employee)) {&lt;br /&gt;          return false;&lt;br /&gt;      }&lt;br /&gt;      Employee other = (Employee) object;&lt;br /&gt;      if ((this.id == null &amp;amp;&amp;amp; other.id != null) || (this.id != null &amp;amp;&amp;amp; !this.id.equals(other.id))) {&lt;br /&gt;          return false;&lt;br /&gt;      }&lt;br /&gt;      return true;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @Override public String toString() {&lt;br /&gt;      return "Employee id=" + id + ", name=" + name;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;No-interface stateless EJB:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import javax.ejb.Stateless;&lt;br /&gt;import javax.persistence.*;&lt;br /&gt;import javax.annotation.sql.DataSourceDefinition;&lt;br /&gt;&lt;br /&gt;@Stateless&lt;br /&gt;@DataSourceDefinition(&lt;br /&gt;          name="java:app/jdbc/test",&lt;br /&gt;          className="com.mysql.jdbc.jdbc2.optional.MysqlDataSource",&lt;br /&gt;          user="root",&lt;br /&gt;          password="root",&lt;br /&gt;          databaseName="test",&lt;br /&gt;          serverName="localhost",&lt;br /&gt;          portNumber=3306 )&lt;br /&gt;public class TestBean {&lt;br /&gt;  @PersistenceContext private EntityManager em;&lt;br /&gt;&lt;br /&gt;  public void addEmployee(String[] names) {&lt;br /&gt;      for(String name : names) {&lt;br /&gt;          Employee e = new Employee();&lt;br /&gt;          e.setName(name);&lt;br /&gt;          em.persist(e);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;main class:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import javax.ejb.embeddable.EJBContainer;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;&lt;br /&gt;public class Client {&lt;br /&gt;  public static void main(String[] args) throws Exception {&lt;br /&gt;      EJBContainer container = EJBContainer.createEJBContainer();&lt;br /&gt;      Context namingContext = container.getContext();&lt;br /&gt;      TestBean testBean = (TestBean) namingContext.lookup("java:global/classes/TestBean");&lt;br /&gt;      testBean.addEmployee(args);  //need to pass in employee names from command line&lt;br /&gt;      container.close();&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;To compile from project directory:&lt;br /&gt;&lt;pre&gt;$ javac -cp "classes:$GLASSFISH_HOME/lib/embedded/glassfish-embedded-static-shell.jar" classes/test/*java&lt;br /&gt;&lt;/pre&gt;Start mysqld, and run the app:&lt;br /&gt;&lt;pre&gt;cd /usr/local/mysql-5.1.32; sudo bin/mysqld_safe --user root&lt;br /&gt;java -cp "classes:$GLASSFISH_HOME/lib/embedded/glassfish-embedded-static-shell.jar:$HOME/mysql-connector-java-5.1.5-bin.jar" test.Client Jon Jane&lt;br /&gt;&lt;/pre&gt;Verify entities are successfully created by running mysql:&lt;br /&gt;&lt;pre&gt;mysql&amp;gt; select * from EMPLOYEE;&lt;br /&gt;+----+------+&lt;br /&gt;| ID | NAME |&lt;br /&gt;+----+------+&lt;br /&gt;|  1 | Jon  |&lt;br /&gt;|  2 | Jane |&lt;br /&gt;+----+------+&lt;br /&gt;2 rows in set (0.00 sec)&lt;br /&gt;&lt;/pre&gt;If you are wondering why the jar is named xxx-static-shell.jar, I guess "static" means it's not OSGi bundle, and "shell" means it's a wrapper for all the other GlassFish jars.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1096633053500078777?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1096633053500078777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1096633053500078777' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1096633053500078777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1096633053500078777'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/02/ejb-lite-jpa-datasource-embedded-in.html' title='EJB lite, JPA, DataSource embedded in java application'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-6227368444385067723</id><published>2011-02-05T09:24:00.009-05:00</published><updated>2011-02-11T11:20:30.457-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>A sample glassfish-resources.xml</title><content type='html'>A sample glassfish-resources.xml file that defines a global datasource and its underlying jdbc connection pool:&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd"&amp;gt;&lt;br /&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;&amp;lt;jdbc-connection-pool name="jdbc/test-pool" res-type="javax.sql.DataSource"&lt;br /&gt;datasource-classname="org.apache.derby.jdbc.ClientDataSource"&lt;br /&gt;pool-resize-quantity="1" max-pool-size="5" steady-pool-size="0"&lt;br /&gt;statement-timeout-in-seconds="60" &amp;gt;&lt;br /&gt;   &amp;lt;property name="serverName" value="localhost" /&amp;gt;&lt;br /&gt;   &amp;lt;property name="portNumber" value="1527" /&amp;gt;&lt;br /&gt;   &amp;lt;property name="dataBaseName" value="sun-appserv-samples" /&amp;gt;&lt;br /&gt;   &amp;lt;property name="User" value="APP" /&amp;gt;&lt;br /&gt;   &amp;lt;property name="Password" value="APP" /&amp;gt;&lt;br /&gt;   &amp;lt;property name="connectionAttributes" value=";create=true" /&amp;gt;&lt;br /&gt;   &amp;lt;property name="driverType" value="4" /&amp;gt;&lt;br /&gt; &amp;lt;/jdbc-connection-pool&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;jdbc-resource jndi-name="jdbc/test-ds" pool-name="jdbc/test-pool" /&amp;gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;/pre&gt;To create the declared jdbc resources with GlassFish asadmin command:&lt;br /&gt;&lt;pre&gt;$ asadmin add-resources $HOME/glassfish-resources.xml&lt;br /&gt;Command : JDBC connection pool jdbc/test-pool created successfully.&lt;br /&gt;Command : JDBC resource jdbc/test-ds created successfully.&lt;br /&gt;Command add-resources executed successfully.&lt;br /&gt;&lt;/pre&gt;To delete both resources:&lt;br /&gt;&lt;pre&gt;$ asadmin delete-jdbc-connection-pool&lt;br /&gt;--cascade true jdbc/test-pool&lt;br /&gt;JDBC Connection pool jdbc/test-pool deleted successfully&lt;br /&gt;Command delete-jdbc-connection-pool executed successfully.&lt;/pre&gt;To create, delete or list these jdbc resources in a cluster, simply add target option to the asadmin command:&lt;br /&gt;&lt;pre&gt;$ asadmin add-resources --target cluster1 $HOME/glassfish-resources.xml&lt;br /&gt;instance1:&lt;br /&gt;Command : JDBC connection pool jdbc/test-pool created successfully.&lt;br /&gt;Command : JDBC resource jdbc/test-ds created successfully.&lt;br /&gt;&lt;br /&gt;instance2:&lt;br /&gt;Command : JDBC connection pool jdbc/test-pool created successfully.&lt;br /&gt;Command : JDBC resource jdbc/test-ds created successfully.&lt;br /&gt;&lt;br /&gt;Command : JDBC connection pool jdbc/test-pool created successfully.&lt;br /&gt;Command : JDBC resource jdbc/test-ds created successfully.&lt;br /&gt;Command add-resources executed successfully.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ asadmin list-jdbc-resources cluster1&lt;br /&gt;jdbc/test-ds&lt;br /&gt;Command list-jdbc-resources executed successfully.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ asadmin list-jdbc-connection-pools cluster1&lt;br /&gt;__TimerPool&lt;br /&gt;DerbyPool&lt;br /&gt;jdbc/test-pool&lt;br /&gt;Command list-jdbc-connection-pools executed successfully.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ asadmin delete-jdbc-connection-pool --cascade true --target cluster1 jdbc/test-pool&lt;br /&gt;CLI031 Warning: Option "target" is obsolete and will be ignored.&lt;br /&gt;JDBC Connection pool jdbc/test-pool deleted successfully&lt;br /&gt;instance1:&lt;br /&gt;JDBC Connection pool jdbc/test-pool deleted successfully&lt;br /&gt;&lt;br /&gt;instance2:&lt;br /&gt;JDBC Connection pool jdbc/test-pool deleted successfully&lt;br /&gt;&lt;br /&gt;Command delete-jdbc-connection-pool executed successfully.&lt;/pre&gt;You can also create jdbc resources in GlassFish admin console, or via asadmin specifying command-line options.  More details are in &lt;a href="http://javahowto.blogspot.com/2008/12/how-to-create-jdbc-connection-pool-and.html"&gt;How to create jdbc connection pool and DataSource in GlassFish&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Another usage of glassfish-resources.xml is to include it inside application, e.g., WEB-INF/glassfish-resources.xml for web app, META-INF/glassfish-resources.xml for ejb jar, etc.  The declared resources are created upon deployment, and disposed of upon undeployment.  More details in &lt;a href="http://javahowto.blogspot.com/2011/02/glassfish-embedded-jpa-ejb-datasource.html"&gt;GlassFish embedded, JPA, EJB, DataSource and glassfish-resources.xml&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-6227368444385067723?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/6227368444385067723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=6227368444385067723' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6227368444385067723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6227368444385067723'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/02/sample-glassfish-resourcesxml.html' title='A sample glassfish-resources.xml'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1453213096185902793</id><published>2011-01-02T15:03:00.011-05:00</published><updated>2011-02-04T20:55:57.174-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Servlet'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>Simple webapp with FORM authentication and SSL</title><content type='html'>This post is similar to &lt;a href="http://javahowto.blogspot.com/2010/12/simple-webapp-with-basic-authentication.html"&gt;Simple webapp with BASIC authentication&lt;/a&gt;, except that this one uses form-based authentication and ssl.  The required steps are as follows:&lt;br /&gt;&lt;br /&gt;(1) configure roles and other security aspects in web.xml;&lt;br /&gt;&lt;br /&gt;(2) administratively create the users in application server;&lt;br /&gt;&lt;br /&gt;(3) map the roles declared in step 1 to users created in step 2, with appserver-specific descriptor;&lt;br /&gt;&lt;br /&gt;(4) create login form for entering username and password, and error form for displaying after failed login.&lt;br /&gt;&lt;br /&gt;This test webapp contains the servlet class, web.xml, sun-web.xml, login.html, and error.html:&lt;br /&gt;&lt;br /&gt;TestServlet.java:&lt;br /&gt;--------------------&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;&lt;br /&gt;public class TestServlet extends HttpServlet {&lt;br /&gt;protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;PrintWriter out = response.getWriter();&lt;br /&gt;out.println("Hello from " + getServletName());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;processRequest(request, response);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void doPost(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;processRequest(request, response);&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;web.xml:&lt;br /&gt;-----------&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&lt;br /&gt;version="3.0"&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;TestServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;test.TestServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;TestServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/TestServlet&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-constraint&amp;gt;&lt;br /&gt;&amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;    &amp;lt;web-resource-name&amp;gt;secure&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;    &amp;lt;url-pattern&amp;gt;/TestServlet&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;&amp;lt;auth-constraint&amp;gt;&lt;br /&gt;    &amp;lt;role-name&amp;gt;tester&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;/auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;user-data-constraint&amp;gt;&lt;br /&gt;    &amp;lt;transport-guarantee&amp;gt;CONFIDENTIAL&amp;lt;/transport-guarantee&amp;gt;&lt;br /&gt;&amp;lt;/user-data-constraint&amp;gt;&lt;br /&gt;&amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;login-config&amp;gt;&lt;br /&gt;&amp;lt;auth-method&amp;gt;FORM&amp;lt;/auth-method&amp;gt;&lt;br /&gt;&amp;lt;realm-name&amp;gt;file&amp;lt;/realm-name&amp;gt;&lt;br /&gt;&amp;lt;form-login-config&amp;gt;&lt;br /&gt;    &amp;lt;form-login-page&amp;gt;/login.html&amp;lt;/form-login-page&amp;gt;&lt;br /&gt;    &amp;lt;form-error-page&amp;gt;/error.html&amp;lt;/form-error-page&amp;gt;&lt;br /&gt;&amp;lt;/form-login-config&amp;gt;&lt;br /&gt;&amp;lt;/login-config&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-role&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;tester&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;/security-role&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;sun-web.xml:&lt;br /&gt;----------------&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD GlassFish Application Server 3.0 Servlet 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_3_0-0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;sun-web-app&amp;gt;&lt;br /&gt;&amp;lt;security-role-mapping&amp;gt;&lt;br /&gt;&amp;lt;role-name&amp;gt;tester&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;principal-name&amp;gt;joe&amp;lt;/principal-name&amp;gt;&lt;br /&gt;&amp;lt;group-name&amp;gt;user&amp;lt;/group-name&amp;gt;&lt;br /&gt;&amp;lt;/security-role-mapping&amp;gt;&lt;br /&gt;&amp;lt;/sun-web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;login.html:&lt;br /&gt;-------------&lt;br /&gt;&lt;pre&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Login Form&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;form method="POST" action="j_security_check" &amp;gt;&lt;br /&gt;        &amp;lt;p&amp;gt;username: &amp;lt;input type="text"  name="j_username" &amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;        &amp;lt;p&amp;gt;password: &amp;lt;input type="password"  name="j_password" &amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;br /&gt;        &amp;lt;p&amp;gt;&lt;br /&gt;        &amp;lt;input type="submit" value="Submit" &amp;gt;&lt;br /&gt;        &amp;lt;input type="reset" value="Reset" &amp;gt;&lt;br /&gt;        &amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;error.html:&lt;br /&gt;-------------&lt;br /&gt;&lt;pre&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Invalid user name or password&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;a href="login.html"&amp;gt;Login again&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To create the user in GlassFish (this is the user name and password that will be entered when running it):&lt;br /&gt;&lt;pre&gt;$ $GLASSFISH_HOME/bin/asadmin create-file-user --group user joe&lt;br /&gt;&lt;/pre&gt;Compile TestServlet class and jar up *.class, *.html and *.xml into a test.war:&lt;br /&gt;&lt;pre&gt;WEB-INF/classes/test/TestServlet.class&lt;br /&gt;WEB-INF/sun-web.xml&lt;br /&gt;WEB-INF/web.xml&lt;br /&gt;error.html&lt;br /&gt;login.html&lt;br /&gt;&lt;/pre&gt;Copy it to &lt;code&gt;$GLASSFISH_HOME/domains/domain1/autodeploy&lt;/code&gt; directory to deploy it.  To run it go to the url http://localhost:8181/test/TestServlet.  After entering the username and password, the following response is displayed:&lt;br /&gt;&lt;pre&gt;Hello from TestServlet&lt;br /&gt;&lt;/pre&gt;If the wrong user name / password is entered, error.html will be displayed with a link to login.html for retry.  8181 is the default ssl port in GlassFish.  If you use the non-secure port number 8080 in the test url, GlassFish will automatically redirect to 8181.  The browser may display a warning since a self-signed cert (as opposed to one issued by certificate authority) is used to identify the GlassFish server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1453213096185902793?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1453213096185902793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1453213096185902793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1453213096185902793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1453213096185902793'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2011/01/simple-webapp-with-form-authentication.html' title='Simple webapp with FORM authentication and SSL'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2091020019353965425</id><published>2010-12-31T18:01:00.008-05:00</published><updated>2011-02-09T07:21:03.299-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Servlet'/><title type='text'>Simple webapp with BASIC authentication</title><content type='html'>To enable BASIC authentication in a webapp, one needs to &lt;br /&gt;(1) configure roles and other security aspects in web.xml; &lt;br /&gt;&lt;br /&gt;(2) administratively create the users in application server; and &lt;br /&gt;&lt;br /&gt;(3) map the roles declared in step 1 to users created in step 2, with appserver-specific descriptor.&lt;br /&gt;&lt;br /&gt;The following is a simple webapp that only contains 3 files: TestServlet class, web.xml, sun-web.xml.&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;&lt;br /&gt;public class TestServlet extends HttpServlet {&lt;br /&gt;protected void processRequest(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;   PrintWriter out = response.getWriter();&lt;br /&gt;   out.println("Hello from " + getServletName());&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;   processRequest(request, response);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void doPost(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;throws ServletException, IOException {&lt;br /&gt;   processRequest(request, response);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&lt;br /&gt;version="3.0"&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;  &amp;lt;servlet-name&amp;gt;TestServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;  &amp;lt;servlet-class&amp;gt;test.TestServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;  &amp;lt;servlet-name&amp;gt;TestServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;  &amp;lt;url-pattern&amp;gt;/TestServlet&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-constraint&amp;gt;&lt;br /&gt;  &amp;lt;web-resource-collection&amp;gt;&lt;br /&gt;      &amp;lt;web-resource-name&amp;gt;secure&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt;      &amp;lt;url-pattern&amp;gt;/TestServlet&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;  &amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt;  &amp;lt;auth-constraint&amp;gt;&lt;br /&gt;      &amp;lt;role-name&amp;gt;tester&amp;lt;/role-name&amp;gt;&lt;br /&gt;  &amp;lt;/auth-constraint&amp;gt;&lt;br /&gt;&amp;lt;/security-constraint&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;login-config&amp;gt;&lt;br /&gt;  &amp;lt;auth-method&amp;gt;BASIC&amp;lt;/auth-method&amp;gt;&lt;br /&gt;  &amp;lt;realm-name&amp;gt;file&amp;lt;/realm-name&amp;gt;&lt;br /&gt;&amp;lt;/login-config&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;security-role&amp;gt;&lt;br /&gt;  &amp;lt;role-name&amp;gt;tester&amp;lt;/role-name&amp;gt;&lt;br /&gt;&amp;lt;/security-role&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD GlassFish Application Server 3.0 Servlet 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_3_0-0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;sun-web-app&amp;gt;&lt;br /&gt;&amp;lt;security-role-mapping&amp;gt;&lt;br /&gt; &amp;lt;role-name&amp;gt;tester&amp;lt;/role-name&amp;gt;&lt;br /&gt; &amp;lt;principal-name&amp;gt;joe&amp;lt;/principal-name&amp;gt;&lt;br /&gt; &amp;lt;group-name&amp;gt;user&amp;lt;/group-name&amp;gt;&lt;br /&gt;&amp;lt;/security-role-mapping&amp;gt;&lt;br /&gt;&amp;lt;/sun-web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;To create the user in GlassFish:&lt;br /&gt;&lt;pre&gt;$ $GLASSFISH_HOME/bin/asadmin create-file-user --group user joe&lt;br /&gt;&lt;/pre&gt;Compile TestServlet class and jar up *.class and *.xml into a test.war:&lt;br /&gt;&lt;pre&gt;WEB-INF/classes/test/TestServlet.class&lt;br /&gt;WEB-INF/sun-web.xml&lt;br /&gt;WEB-INF/web.xml&lt;br /&gt;&lt;/pre&gt;Copy it to $GLASSFISH_HOME/domains/domain1/autodeploy directory to deploy it.  To run it go to the url http://localhost:8080/test/TestServlet.  After entering the username and password, the following response is displayed:&lt;br /&gt;&lt;pre&gt;Hello from TestServlet&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2091020019353965425?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2091020019353965425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2091020019353965425' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2091020019353965425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2091020019353965425'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/12/simple-webapp-with-basic-authentication.html' title='Simple webapp with BASIC authentication'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7742615436879999831</id><published>2010-12-12T17:10:00.009-05:00</published><updated>2010-12-23T17:54:00.150-05:00</updated><title type='text'>vnc notes on Linux</title><content type='html'>To start vncserver: &lt;code&gt;$ vncserver&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To stop  vncserver: &lt;code&gt;$ vncserver -kill :1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To make the vnc view screen larger, edit &lt;code&gt;/usr/bin/vncserver&lt;/code&gt; script:&lt;br /&gt;&lt;pre&gt;sudo chmod a+w /usr/bin/vncserver&lt;br /&gt;vim !$&lt;br /&gt;&lt;br /&gt;#$geometry = "1024x768";&lt;br /&gt;$geometry = "1500x1050";&lt;br /&gt;&lt;/pre&gt;A sample $HOME/.vnc/xstartup file:&lt;br /&gt;&lt;pre&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;# Uncomment the following two lines for normal desktop:&lt;br /&gt;unset SESSION_MANAGER&lt;br /&gt;exec /etc/X11/xinit/xinitrc&lt;br /&gt;&lt;br /&gt;[ -x /etc/vnc/xstartup ] &amp;amp;&amp;amp; exec /etc/vnc/xstartup&lt;br /&gt;[ -r $HOME/.Xresources ] &amp;amp;&amp;amp; xrdb $HOME/.Xresources&lt;br /&gt;xsetroot -solid grey&lt;br /&gt;vncconfig -iconic &amp;amp;&lt;br /&gt;xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &amp;amp;&lt;br /&gt;twm &amp;amp;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7742615436879999831?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7742615436879999831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7742615436879999831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7742615436879999831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7742615436879999831'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/12/vnc-notes-on-linux.html' title='vnc notes on Linux'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-6965152774073705591</id><published>2010-11-05T17:26:00.009-04:00</published><updated>2011-03-22T20:49:20.938-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JNDI'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>Programmatically bind global JNDI resources</title><content type='html'>Starting from Java EE 6, an application can configure JNDI resources in global, application, module, and component namespaces.  Usually this is done with &lt;code&gt;@Resource&lt;/code&gt; annotations and deployment descriptors.  It is also possible to bind global JNDI resources programmatically in a Java EE application, as shown in the following servlet.&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.annotation.WebServlet;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;import javax.annotation.*;&lt;br /&gt;&lt;br /&gt;@WebServlet(urlPatterns = "/*")&lt;br /&gt;public class TestServlet extends HttpServlet {&lt;br /&gt;&lt;br /&gt;  private static final String name = "java:global/env/foo";&lt;br /&gt;  private static final String value = "FOO";&lt;br /&gt;&lt;br /&gt;  protected void doPost(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;          throws ServletException, IOException {&lt;br /&gt;  PrintWriter out = response.getWriter();&lt;br /&gt;&lt;br /&gt;  try {&lt;br /&gt;      InitialContext ic = new InitialContext();&lt;br /&gt;      try {&lt;br /&gt;          Object obj = ic.lookup(name);&lt;br /&gt;          out.println("found " + name + " : " + obj);&lt;br /&gt;      } catch (NamingException ne) {&lt;br /&gt;          ic.rebind(name, value);&lt;br /&gt;          out.println("not found: " + name + ", rebind: " + value);&lt;br /&gt;      }&lt;br /&gt;  } catch (NamingException e) {&lt;br /&gt;      out.println(e);&lt;br /&gt;  }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  @PreDestroy&lt;br /&gt;  private void preDestroy() {&lt;br /&gt;      try {&lt;br /&gt;          InitialContext ic = new InitialContext();&lt;br /&gt;          ic.unbind(name);&lt;br /&gt;          System.out.println("unbound " + name);&lt;br /&gt;      } catch (NamingException e) {&lt;br /&gt;          System.out.println("failed to unbind " + name);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;          throws ServletException, IOException {&lt;br /&gt;      doPost(request, response);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;Compile &lt;code&gt;TestServlet.java&lt;/code&gt;, package it in &lt;code&gt;test.war:WEB-INF/classes/test/TestServlet.class&lt;/code&gt;, cp it to &lt;code&gt;$GLASSFISH_HOME/domains/domain1/autodeploy/&lt;/code&gt;, and run it at http://localhost:8080/test/&lt;br /&gt;&lt;br /&gt;Result from the first run:&lt;br /&gt;&lt;pre&gt;not found: java:global/env/foo, rebind: FOO&lt;br /&gt;&lt;/pre&gt;Result from the subsequent run:&lt;br /&gt;&lt;pre&gt;found java:global/env/foo : FOO&lt;/pre&gt;You can also verify the global JNDI resource with GlassFish asadmin command:&lt;br /&gt;&lt;pre&gt;$ asadmin list-jndi-entries --context java:global/env&lt;br /&gt;foo: java.lang.String&lt;br /&gt;&lt;/pre&gt;This resource is available server-wide to all deployed apps.  It will be removed after test.war is undeployed thanks to &lt;code&gt;TestServlet.preDestroy&lt;/code&gt;.  To retain it beyond the life of test.war, do not unbind it in &lt;code&gt;TestServlet.preDestroy&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-6965152774073705591?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/6965152774073705591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=6965152774073705591' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6965152774073705591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6965152774073705591'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/11/programmatically-bind-global-jndi.html' title='Programmatically bind global JNDI resources'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2148251681600984109</id><published>2010-10-22T15:48:00.004-04:00</published><updated>2011-02-09T07:21:25.181-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>glassfish-application.xml and sun-application.xml examples</title><content type='html'>The following &lt;code&gt;glassfish-application.xml&lt;/code&gt; and  &lt;code&gt;sun-application.xml&lt;/code&gt; have the same content.  &lt;code&gt;glassfish-application.xml&lt;/code&gt; (the new name for  &lt;code&gt;sun-application.xml&lt;/code&gt;) is the file for specifying additional application (EAR) configuration in GlassFish 3.1.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;sun-application.xml&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE sun-application PUBLIC "-//Sun Microsystems, Inc.//DTD GlassFish Application Server 3.0 Java EE Application 6.0//EN" "http://www.sun.com/software/appserver/dtds/sun-application_6_0-0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;sun-application&amp;gt;&lt;br /&gt; &amp;lt;web&amp;gt;&lt;br /&gt;   &amp;lt;web-uri&amp;gt;hello.war&amp;lt;/web-uri&amp;gt;&lt;br /&gt;   &amp;lt;context-root&amp;gt;hi&amp;lt;/context-root&amp;gt;&lt;br /&gt; &amp;lt;/web&amp;gt;&lt;br /&gt; &amp;lt;security-role-mapping&amp;gt;&lt;br /&gt;   &amp;lt;role-name&amp;gt;admin&amp;lt;/role-name&amp;gt;&lt;br /&gt;   &amp;lt;principal-name&amp;gt;js&amp;lt;/principal-name&amp;gt;&lt;br /&gt;   &amp;lt;group-name&amp;gt;manager&amp;lt;/group-name&amp;gt;&lt;br /&gt; &amp;lt;/security-role-mapping&amp;gt;&lt;br /&gt;&amp;lt;/sun-application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;glassfish-application.xml&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE glassfish-application PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Java EE Application 6.0//EN" "http://glassfish.org/dtds/glassfish-application_6_0-1.dtd"&amp;gt;&lt;br /&gt;&amp;lt;glassfish-application&amp;gt;&lt;br /&gt; &amp;lt;web&amp;gt;&lt;br /&gt;   &amp;lt;web-uri&amp;gt;hello.war&amp;lt;/web-uri&amp;gt;&lt;br /&gt;   &amp;lt;context-root&amp;gt;hi&amp;lt;/context-root&amp;gt;&lt;br /&gt; &amp;lt;/web&amp;gt;&lt;br /&gt; &amp;lt;security-role-mapping&amp;gt;&lt;br /&gt;   &amp;lt;role-name&amp;gt;admin&amp;lt;/role-name&amp;gt;&lt;br /&gt;   &amp;lt;principal-name&amp;gt;js&amp;lt;/principal-name&amp;gt;&lt;br /&gt;   &amp;lt;group-name&amp;gt;manager&amp;lt;/group-name&amp;gt;&lt;br /&gt; &amp;lt;/security-role-mapping&amp;gt;&lt;br /&gt;&amp;lt;/glassfish-application&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2148251681600984109?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2148251681600984109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2148251681600984109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2148251681600984109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2148251681600984109'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/10/glassfish-applicationxml-and-sun.html' title='glassfish-application.xml and sun-application.xml examples'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-284066888318279950</id><published>2010-10-22T15:27:00.006-04:00</published><updated>2010-12-12T14:54:38.286-05:00</updated><title type='text'>glassfish-application-client.xml and sun-application-client.xml examples</title><content type='html'>The following &lt;code&gt;glassfish-application-client.xml&lt;/code&gt; and &lt;code&gt;sun-application-client.xml&lt;/code&gt; have the same content. &lt;code&gt;glassfish-application-client.xml&lt;/code&gt; (the new name for &lt;code&gt;sun-application-client.xml&lt;/code&gt;) is the file for specifying additional application client (&lt;code&gt;application-client.jar&lt;/code&gt;) configuration in GlassFish 3.1.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;sun-application-client.xml&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE sun-application-client PUBLIC "-//Sun Microsystems, Inc.//DTD GlassFish Application Server 3.0 Application Client 6.0//EN" "http://www.sun.com/software/appserver/dtds/sun-application-client_6_0-0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;sun-application-client&amp;gt;&lt;br /&gt;&amp;lt;ejb-ref&amp;gt;&lt;br /&gt;  &amp;lt;ejb-ref-name&amp;gt;ejb/BarBean&amp;lt;/ejb-ref-name&amp;gt;&lt;br /&gt;  &amp;lt;jndi-name&amp;gt;java:global/app-name/module-name/FooBean!com.test.xxx.FooRemote&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;&amp;lt;/ejb-ref&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;resource-ref&amp;gt;&lt;br /&gt;  &amp;lt;res-ref-name&amp;gt;queueConnectionFactory&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;  &amp;lt;jndi-name&amp;gt;jms/QueueConnectionFactory&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;  &amp;lt;default-resource-principal&amp;gt;&lt;br /&gt;    &amp;lt;name&amp;gt;guest&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;password&amp;gt;guest&amp;lt;/password&amp;gt;&lt;br /&gt;  &amp;lt;/default-resource-principal&amp;gt;&lt;br /&gt;&amp;lt;/resource-ref&amp;gt;&lt;br /&gt;&amp;lt;/sun-application-client&amp;gt;&lt;br /&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;glassfish-application-client&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;pre&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE glassfish-application-client PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Java EE Application Client 6.0//EN" "http://glassfish.org/dtds/glassfish-application-client_6_0-1.dtd"&amp;gt;&lt;br /&gt;&amp;lt;glassfish-application-client&amp;gt;&lt;br /&gt;&amp;lt;ejb-ref&amp;gt;&lt;br /&gt;  &amp;lt;ejb-ref-name&amp;gt;ejb/BarBean&amp;lt;/ejb-ref-name&amp;gt;&lt;br /&gt;  &amp;lt;jndi-name&amp;gt;java:global/app-name/module-name/FooBean!com.test.xxx.FooRemote&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;&amp;lt;/ejb-ref&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;resource-ref&amp;gt;&lt;br /&gt;  &amp;lt;res-ref-name&amp;gt;queueConnectionFactory&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;  &amp;lt;jndi-name&amp;gt;jms/QueueConnectionFactory&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;  &amp;lt;default-resource-principal&amp;gt;&lt;br /&gt;    &amp;lt;name&amp;gt;guest&amp;lt;/name&amp;gt;&lt;br /&gt;    &amp;lt;password&amp;gt;guest&amp;lt;/password&amp;gt;&lt;br /&gt;  &amp;lt;/default-resource-principal&amp;gt;&lt;br /&gt;&amp;lt;/resource-ref&amp;gt;&lt;br /&gt;&amp;lt;/glassfish-application-client&amp;gt;&lt;/pre&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-284066888318279950?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/284066888318279950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=284066888318279950' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/284066888318279950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/284066888318279950'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/10/glassfish-application-clientxml-and-sun.html' title='glassfish-application-client.xml and sun-application-client.xml examples'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7887922079068712355</id><published>2010-10-22T14:51:00.006-04:00</published><updated>2010-10-22T15:53:38.860-04:00</updated><title type='text'>glassfish-web.xml and sun-web.xml examples</title><content type='html'>The following glassfish-web.xml and sun-web.xml have the same content. glassfish-web.xml (the new name for sun-web.xml) is the file for specifying additional web app (WAR) configuration in GlassFish 3.1.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;sun-web.xml&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD GlassFish Application Server 3.0 Servlet 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_3_0-0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;sun-web-app&amp;gt;&lt;br /&gt; &amp;lt;context-root&amp;gt;different-name&amp;lt;/context-root&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;security-role-mapping&amp;gt;&lt;br /&gt;   &amp;lt;role-name&amp;gt;admin&amp;lt;/role-name&amp;gt;&lt;br /&gt;   &amp;lt;principal-name&amp;gt;js&amp;lt;/principal-name&amp;gt;&lt;br /&gt;   &amp;lt;group-name&amp;gt;manager&amp;lt;/group-name&amp;gt;&lt;br /&gt; &amp;lt;/security-role-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;ejb-ref&amp;gt;&lt;br /&gt;     &amp;lt;ejb-ref-name&amp;gt;ejb/helloBean&amp;lt;/ejb-ref-name&amp;gt;&lt;br /&gt;     &amp;lt;jndi-name&amp;gt;HelloBean&amp;lt;/jndi-name&amp;gt;&lt;br /&gt; &amp;lt;/ejb-ref&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;resource-ref&amp;gt;&lt;br /&gt;     &amp;lt;res-ref-name&amp;gt;jdbc/dataSource&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;     &amp;lt;jndi-name&amp;gt;jdbc/__default&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;     &amp;lt;default-resource-principal&amp;gt;&lt;br /&gt;         &amp;lt;name&amp;gt;guest&amp;lt;/name&amp;gt;&lt;br /&gt;         &amp;lt;password&amp;gt;guest&amp;lt;/password&amp;gt;&lt;br /&gt;     &amp;lt;/default-resource-principal&amp;gt;&lt;br /&gt; &amp;lt;/resource-ref&amp;gt;&lt;br /&gt; &amp;lt;class-loader delegate="true"/&amp;gt;&lt;br /&gt;&amp;lt;/sun-web-app&amp;gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;glassfish-web.xml&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"&amp;gt;&lt;br /&gt;&amp;lt;glassfish-web-app&amp;gt;&lt;br /&gt; &amp;lt;context-root&amp;gt;different-name&amp;lt;/context-root&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;security-role-mapping&amp;gt;&lt;br /&gt;   &amp;lt;role-name&amp;gt;admin&amp;lt;/role-name&amp;gt;&lt;br /&gt;   &amp;lt;principal-name&amp;gt;js&amp;lt;/principal-name&amp;gt;&lt;br /&gt;   &amp;lt;group-name&amp;gt;manager&amp;lt;/group-name&amp;gt;&lt;br /&gt; &amp;lt;/security-role-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;ejb-ref&amp;gt;&lt;br /&gt;     &amp;lt;ejb-ref-name&amp;gt;ejb/helloBean&amp;lt;/ejb-ref-name&amp;gt;&lt;br /&gt;     &amp;lt;jndi-name&amp;gt;HelloBean&amp;lt;/jndi-name&amp;gt;&lt;br /&gt; &amp;lt;/ejb-ref&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;resource-ref&amp;gt;&lt;br /&gt;     &amp;lt;res-ref-name&amp;gt;jdbc/dataSource&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;     &amp;lt;jndi-name&amp;gt;jdbc/__default&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;     &amp;lt;default-resource-principal&amp;gt;&lt;br /&gt;         &amp;lt;name&amp;gt;myname&amp;lt;/name&amp;gt;&lt;br /&gt;         &amp;lt;password&amp;gt;password&amp;lt;/password&amp;gt;&lt;br /&gt;     &amp;lt;/default-resource-principal&amp;gt;&lt;br /&gt; &amp;lt;/resource-ref&amp;gt;&lt;br /&gt; &amp;lt;class-loader delegate="true"/&amp;gt;&lt;br /&gt;&amp;lt;/glassfish-web-app&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7887922079068712355?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7887922079068712355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7887922079068712355' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7887922079068712355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7887922079068712355'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/10/glassfish-webxml-and-sun-webxml.html' title='glassfish-web.xml and sun-web.xml examples'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2893650051045299205</id><published>2010-10-22T14:13:00.005-04:00</published><updated>2010-10-22T14:26:34.244-04:00</updated><title type='text'>glassfish-ejb-jar.xml and sun-ejb-jar.xml examples</title><content type='html'>The following glassfish-ejb-jar.xml and sun-ejb-jar.xml have the same content.  glassfish-ejb-jar.xml (the new name for sun-ejb-jar.xml) is the file for specifying additional EJB jar configuration in GlassFish 3.1.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center; font-weight: bold;"&gt;sun-ejb-jar.xml&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE sun-ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 EJB 3.0//EN" "http://www.sun.com/software/appserver/dtds/sun-ejb-jar_3_0-0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;sun-ejb-jar&amp;gt;&lt;br /&gt;   &amp;lt;enterprise-beans&amp;gt;&lt;br /&gt;   &amp;lt;ejb&amp;gt;&lt;br /&gt;     &amp;lt;ejb-name&amp;gt;FooBean&amp;lt;/ejb-name&amp;gt;&lt;br /&gt;     &amp;lt;jndi-name&amp;gt;FooBean&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;     &amp;lt;ejb-ref&amp;gt;&lt;br /&gt;       &amp;lt;ejb-ref-name&amp;gt;ejb/BarBean&amp;lt;/ejb-ref-name&amp;gt;&lt;br /&gt;       &amp;lt;jndi-name&amp;gt;java:global/app-name/module-name/FooBean!com.test.xxx.FooRemote&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;     &amp;lt;/ejb-ref&amp;gt;&lt;br /&gt;     &amp;lt;ejb-ref&amp;gt;&lt;br /&gt;       &amp;lt;ejb-ref-name&amp;gt;ejb/BuzBean&amp;lt;/ejb-ref-name&amp;gt;&lt;br /&gt;       &amp;lt;jndi-name&amp;gt;corbaname:iiop:1.2@otherserver:3700#BuzBean&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;     &amp;lt;/ejb-ref&amp;gt;&lt;br /&gt;     &amp;lt;resource-ref&amp;gt;&lt;br /&gt;       &amp;lt;res-ref-name&amp;gt;jdbc/employee&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;       &amp;lt;jndi-name&amp;gt;jdbc/__default&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;     &amp;lt;/resource-ref&amp;gt;&lt;br /&gt;   &amp;lt;/ejb&amp;gt;&lt;br /&gt;   &amp;lt;/enterprise-beans&amp;gt;&lt;br /&gt;&amp;lt;/sun-ejb-jar&amp;gt;&lt;/pre&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;glassfish-ejb-jar.xml&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE glassfish-ejb-jar PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 EJB 3.1//EN" "http://glassfish.org/dtds/glassfish-ejb-jar_3_1-1.dtd"&amp;gt;&lt;br /&gt;&amp;lt;glassfish-ejb-jar&amp;gt;&lt;br /&gt;   &amp;lt;enterprise-beans&amp;gt;&lt;br /&gt;   &amp;lt;ejb&amp;gt;&lt;br /&gt;     &amp;lt;ejb-name&amp;gt;FooBean&amp;lt;/ejb-name&amp;gt;&lt;br /&gt;     &amp;lt;jndi-name&amp;gt;FooBean&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;     &amp;lt;ejb-ref&amp;gt;&lt;br /&gt;       &amp;lt;ejb-ref-name&amp;gt;ejb/BarBean&amp;lt;/ejb-ref-name&amp;gt;&lt;br /&gt;       &amp;lt;jndi-name&amp;gt;java:global/app-name/module-name/FooBean!com.test.xxx.FooRemote&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;     &amp;lt;/ejb-ref&amp;gt;&lt;br /&gt;     &amp;lt;ejb-ref&amp;gt;&lt;br /&gt;       &amp;lt;ejb-ref-name&amp;gt;ejb/BuzBean&amp;lt;/ejb-ref-name&amp;gt;&lt;br /&gt;       &amp;lt;jndi-name&amp;gt;corbaname:iiop:1.2@otherserver:3700#BuzBean&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;     &amp;lt;/ejb-ref&amp;gt;&lt;br /&gt;     &amp;lt;resource-ref&amp;gt;&lt;br /&gt;       &amp;lt;res-ref-name&amp;gt;jdbc/employee&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;       &amp;lt;jndi-name&amp;gt;jdbc/__default&amp;lt;/jndi-name&amp;gt;&lt;br /&gt;     &amp;lt;/resource-ref&amp;gt;&lt;br /&gt;   &amp;lt;/ejb&amp;gt;&lt;br /&gt;   &amp;lt;/enterprise-beans&amp;gt;&lt;br /&gt;&amp;lt;/glassfish-ejb-jar&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2893650051045299205?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2893650051045299205/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2893650051045299205' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2893650051045299205'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2893650051045299205'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/10/glassfish-ejb-jarxml-and-sun-ejb-jarxml.html' title='glassfish-ejb-jar.xml and sun-ejb-jar.xml examples'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-5398133489828199822</id><published>2010-09-28T14:03:00.004-04:00</published><updated>2010-10-18T09:42:38.562-04:00</updated><title type='text'>java -agentlib:jdwp for attaching debugger</title><content type='html'>In Java SE 5 or newer, one can use a new standard JVM option to attach a remote debugger.  For example,&lt;br /&gt;&lt;pre&gt;-agentlib:jdwp=transport=dt_socket,address=localhost:9009,server=y,suspend=y&lt;br /&gt;&lt;/pre&gt;In Sun JDK 1.4 or earlier, one still uses this old options:&lt;br /&gt;&lt;pre&gt;-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9009&lt;br /&gt;&lt;/pre&gt;The following is the usage from running this java command:&lt;br /&gt;&lt;pre&gt;$ java -agentlib:jdwp=help&lt;br /&gt;&lt;br /&gt;            Java Debugger JDWP Agent Library&lt;br /&gt;            --------------------------------&lt;br /&gt;&lt;br /&gt;(see http://java.sun.com/products/jpda for more information)&lt;br /&gt;&lt;br /&gt;jdwp usage: java -agentlib:jdwp=[help]|[&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt;, ...]&lt;br /&gt;&lt;br /&gt;Option Name and Value            Description                       Default&lt;br /&gt;---------------------            -----------                       -------&lt;br /&gt;suspend=y|n                      wait on startup?                  y&lt;br /&gt;transport=&amp;lt;name&amp;gt;                 transport spec                    none&lt;br /&gt;address=&amp;lt;listen/attach address&amp;gt;  transport spec                    ""&lt;br /&gt;server=y|n                       listen for debugger?              n&lt;br /&gt;launch=&amp;lt;command line&amp;gt;            run debugger on event             none&lt;br /&gt;onthrow=&amp;lt;exception name&amp;gt;         debug on throw                    none&lt;br /&gt;onuncaught=y|n                   debug on any uncaught?            n&lt;br /&gt;timeout=&amp;lt;timeout value&amp;gt;          for listen/attach in milliseconds n&lt;br /&gt;mutf8=y|n                        output modified utf-8             n&lt;br /&gt;quiet=y|n                        control over terminal messages    n&lt;br /&gt;&lt;br /&gt;Obsolete Options&lt;br /&gt;----------------&lt;br /&gt;strict=y|n&lt;br /&gt;stdalloc=y|n&lt;br /&gt;&lt;br /&gt;Examples&lt;br /&gt;--------&lt;br /&gt;- Using sockets connect to a debugger at a specific address:&lt;br /&gt; java -agentlib:jdwp=transport=dt_socket,address=localhost:8000 ...&lt;br /&gt;- Using sockets listen for a debugger to attach:&lt;br /&gt; java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y ...&lt;br /&gt;&lt;br /&gt;Notes&lt;br /&gt;-----&lt;br /&gt;- A timeout value of 0 (the default) is no timeout.&lt;br /&gt;&lt;br /&gt;Warnings&lt;br /&gt;--------&lt;br /&gt;- The older -Xrunjdwp interface can still be used, but will be removed in&lt;br /&gt; a future release, for example:&lt;br /&gt;     java -Xdebug -Xrunjdwp:[help]|[&amp;lt;option&amp;gt;=&amp;lt;value&amp;gt;, ...]&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-5398133489828199822?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/5398133489828199822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=5398133489828199822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5398133489828199822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5398133489828199822'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/09/java-agentlibjdwp-for-attaching.html' title='java -agentlib:jdwp for attaching debugger'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-4223037381502944412</id><published>2010-08-25T10:48:00.045-04:00</published><updated>2011-12-19T16:51:14.253-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>My subversion svn notes</title><content type='html'>Non-comment lines of $HOME/.subversion/config (%APPDATA%\Subversion\config on Windows):&lt;pre&gt;global-ignores = *.ipr *.iml *.iws .project .classpath .settings .*.swp out.txt todo.txt *.save *.my *.class *.org #*# .*.rej *.rej .*~ *~ .#* .DS_Store&lt;br /&gt;enable-auto-props = yes&lt;br /&gt;*.java = svn:eol-style=native;svn:keywords=Date Author Id Revision HeadURL&lt;/pre&gt;To view the usage of a subcommand, for example, propedit:&lt;br /&gt;&lt;pre&gt;svn help propedit&lt;/pre&gt;To view the details of a commit with rev number, including changed files and log messages (Without -v option, changed files are omitted in the output):&lt;pre&gt;svn log -v -c 1234 Foo.java&lt;br /&gt;&lt;br /&gt;# shows all changes made by rev 1234 compared to previous rev&lt;br /&gt;svn diff -c 1234 Foo.java   &lt;/pre&gt;To get, or set end-of-line property (One of 'native', 'LF', 'CR', 'CRLF'):&lt;pre&gt;svn pg      svn:eol-style Utils.java&lt;br /&gt;svn pget    svn:eol-style Utils.java&lt;br /&gt;svn propget svn:eol-style Utils.java&lt;br /&gt;&lt;br /&gt;svn propset svn:eol-style LF Utils.java&lt;br /&gt;svn pset    svn:eol-style LF Utils.java&lt;br /&gt;svn ps      svn:eol-style LF Utils.java&lt;/pre&gt;To view the svn:externals or svn:ignore for the current directory:&lt;br /&gt;&lt;pre&gt;svn propget svn:externals .&lt;br /&gt;svn pg svn:externals .&lt;br /&gt;svn pg svn:ignore .&lt;/pre&gt;To delete the svn:ignore for the current directory:&lt;br /&gt;&lt;pre&gt;svn pd svn:ignore .&lt;/pre&gt;To edit the externals for the current directory:&lt;br /&gt;&lt;pre&gt;svn --editor-cmd vim propedit svn:externals .&lt;br /&gt;svn --editor-cmd vim pe svn:externals .&lt;/pre&gt;If any one of these environment variables SVN_EDITOR, VISUAL or EDITOR is set, you can omit the "--editor-cmd vim" part:&lt;br /&gt;&lt;pre&gt;setenv EDITOR vim (in csh/tcsh)&lt;br /&gt;export EDITOR=vim (in bash)&lt;br /&gt;svn pe svn:externals .&lt;/pre&gt;To compare two different versions of a file:&lt;br /&gt;&lt;pre&gt;svn diff -r r99:r100 build.xml&lt;br /&gt;svn diff -r 99:100 build.xml&lt;br /&gt;svn diff -c 100&lt;/pre&gt;It's easier to copy r99 r100 from svn log output, so I prefer the first form. The option "-c 100" is the same as "-r 99:100", and shows all changes made by rev 100.&lt;br /&gt;&lt;br /&gt;To skip any differences in deleted files:&lt;pre&gt;svn diff --no-diff-deleted&lt;/pre&gt;svn diff will not included newly added files, or files that are moved to target directory.  To view colored diff with vim:&lt;br /&gt;&lt;pre&gt;svn diff | view -&lt;/pre&gt;I also have a shell script wrapper (diffv) for the above:&lt;pre&gt;#! /bin/sh&lt;br /&gt;svn diff -x -wub $@ | view -&lt;br /&gt;# use -x -wub to ignore whitespace changes&lt;/pre&gt;To get detailed info like URL, repository URL, revision, last changed date, etc:&lt;br /&gt;&lt;pre&gt;svn info .&lt;/pre&gt;To relocate a loca workspace after the server repository has moved:&lt;pre&gt;cd root-of-current-workspace&lt;br /&gt;svn switch --relocate http://old http://new .&lt;/pre&gt;To revert all modified files under current directory:&lt;br /&gt;&lt;pre&gt;svn revert *&lt;br /&gt;svn revert util/*&lt;/pre&gt;Note that "&lt;code&gt;svn revert .&lt;/code&gt;" does not revert changes in sub-directories.  For recursive revert, &lt;pre&gt;svn revert --depth infinity util&lt;br /&gt;svn revert -R util&lt;br /&gt;svn revert --recursive util&lt;/pre&gt;&lt;br /&gt;To downgrade svn client version:&lt;pre&gt;cd {to the directory with local changes};&lt;br /&gt;python $HOME/bin/change-svn-wc-format.py . 1.5&lt;/pre&gt;The above command will downgrade the working copy format to svn 1.5.  This is to fix the annoying svn version error:&lt;br /&gt;&lt;pre&gt;svn: This client is too old to work with working copy '...'.  You need&lt;br /&gt;to get a newer Subversion client, or to downgrade this working copy.&lt;br /&gt;See http://subversion.tigris.org/faq.html#working-copy-format-change&lt;br /&gt;for details.&lt;/pre&gt;To apply a patch (.diff file), ignoring all parent directories in diff index:&lt;br /&gt;&lt;pre&gt;cd {working directory containing the target file}&lt;br /&gt;patch -i $HOME/Desktop/a.diff&lt;/pre&gt;&lt;br /&gt;To apply a patch (.diff file), preserving all parent directories in diff index:&lt;pre&gt;cd {parent directory of the whole directory structure in diff index}&lt;br /&gt;patch -p0 -i /tmp/a.diff&lt;/pre&gt;This is useful when target files do not fall under the same directory.  -p means how many levels of directories to prune.  patch is a Unix (not svn) command, usually resolves to /usr/bin/patch.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To make directories and parent directories together (the equivalent of mkdir -p),&lt;pre&gt;svn mkdir --parents com/a/b/c&lt;/pre&gt;&lt;br /&gt;To move some files to another directory (--parents option will make any intermediate directories):&lt;pre&gt;cd &amp;lt;source directory&amp;gt;&lt;br /&gt;svn mv --parents *.java $HOME/my-project-svn/a/b/c&lt;br /&gt;&lt;/pre&gt;To remove a directory (there is no svn rmdir command),&lt;pre&gt;svn rm a/&lt;/pre&gt;To merge some changes from trunk to branch, branch to trunk, or branch 1 to branch 2:&lt;pre&gt;cd &amp;lt;source directory of changes&amp;gt;&lt;br /&gt;svn log . | head -25&lt;br /&gt;copy and paste the start rev and end rev, e.g., r123:r129&lt;br /&gt;svn info; and copy the source URL, e.g., http://host:port/my-project-svn/a/b&lt;br /&gt;cd &amp;lt;dest directory&amp;gt;&lt;br /&gt;svn merge --dry-run -r r123:r129 http://host:port/my-project-svn/a/b&lt;/pre&gt;To make real changes, omit --dry-run option.&lt;br /&gt;&lt;br /&gt;To merge ALL changes in Foo.java from trunk to branch:&lt;pre&gt;cd &amp;lt;source directory of changes&amp;gt;&lt;br /&gt;svn info Foo.java; and copy the complete source URL, e.g., http://host:port/.../Foo.java&lt;br /&gt;cd &amp;lt;dest directory&amp;gt;&lt;br /&gt;svn merge http://host:port/.../Foo.java ./Foo.java&lt;/pre&gt;&lt;br /&gt;To merge rev 567 in Foo.java from trunk to branch:&lt;pre&gt;cd &amp;lt;source directory of changes&amp;gt;&lt;br /&gt;svn info Foo.java; and copy the complete source URL, e.g., http://host:port/.../Foo.java&lt;br /&gt;cd &amp;lt;dest directory&amp;gt;&lt;br /&gt;svn merge -c 567 http://host:port/.../Foo.java ./Foo.java&lt;/pre&gt;&lt;br /&gt;To quickly undo or revert a bad commit (rev 99) with a reverse merge (notice the negative rev number is used.  It must be a number; args like -c -r99 is rejected.):&lt;pre&gt;svn merge -c -99 .&lt;br /&gt;svn ci -m 'revert my changes in rev 99.'&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-4223037381502944412?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/4223037381502944412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=4223037381502944412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4223037381502944412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4223037381502944412'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/08/my-subversion-svn-notes.html' title='My subversion svn notes'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-8119520386331720214</id><published>2010-07-16T11:14:00.003-04:00</published><updated>2010-07-16T11:25:46.299-04:00</updated><title type='text'>String.contains and String.indexOf</title><content type='html'>To check if a string contains a substring, I usually use:&lt;br /&gt;&lt;pre&gt;if(s.indexOf(sub) &gt;= 0)&lt;br /&gt;&lt;/pre&gt;For JDK 5 or later, a &lt;code&gt;contains&lt;/code&gt; method can also be used, which seems to be a little more readable:&lt;br /&gt;&lt;pre&gt;if(s.contains(sub))&lt;br /&gt;&lt;/pre&gt;The signature of &lt;code&gt;contains&lt;/code&gt; method is:&lt;br /&gt;&lt;pre&gt;public boolean contains(java.lang.CharSequence s);&lt;br /&gt;&lt;/pre&gt;Note that &lt;code&gt;CharSequence&lt;/code&gt; is a super-interface of &lt;code&gt;String, StringBuffer, StringBuilder, java.nio.CharBuffer, javax.swing.text.Segment&lt;/code&gt;.  So you can pass any of the 5 types to &lt;code&gt;contains&lt;/code&gt; method.&lt;br /&gt;&lt;br /&gt;The current implementation of &lt;code&gt;contains&lt;/code&gt; method just convert the param to &lt;code&gt;String&lt;/code&gt; and calls &lt;code&gt;indexOf&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-8119520386331720214?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/8119520386331720214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=8119520386331720214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8119520386331720214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8119520386331720214'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/07/stringcontains-and-stringindexof.html' title='String.contains and String.indexOf'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-4219547993501903452</id><published>2010-07-14T10:00:00.002-04:00</published><updated>2010-07-14T10:32:46.501-04:00</updated><title type='text'>Java debug options in ant build.xml</title><content type='html'>To add debug options to java (Sun's JDK) command line:&lt;br /&gt;&lt;pre&gt;-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9009&lt;br /&gt;&lt;/pre&gt;If the java process runs and terminates itself, change suspend=y, so you can have a chance to attach the remote debugger.&lt;br /&gt;&lt;br /&gt;To add the same debug options to ant build.xml java task:&lt;br /&gt;&lt;pre&gt;&amp;lt;target name="run"&amp;gt;&lt;br /&gt; &amp;lt;java fork="on"&lt;br /&gt;       failonerror="true"&lt;br /&gt;       classpath="xxx"&lt;br /&gt;       classname="xxx"&amp;gt;&lt;br /&gt;     &amp;lt;jvmarg line="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9009" /&amp;gt;&lt;br /&gt;     &amp;lt;arg line="--arg1 arg2 --arg3 arg4"/&amp;gt;&lt;br /&gt;  &amp;lt;/java&amp;gt;&lt;br /&gt;&amp;lt;/target&amp;gt;&lt;/pre&gt;Note: &lt;code&gt;&amp;lt;arg&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;jvmarg&amp;gt;&lt;/code&gt; take either &lt;code&gt;line&lt;/code&gt; or &lt;code&gt;value&lt;/code&gt; attribute, but &lt;code&gt;value&lt;/code&gt; attributes are treated as one single argument that may contain spaces.  So in our case &lt;code&gt;line&lt;/code&gt; attribute is used to specify multiple arguments separated by spaces.  If &lt;code&gt;value&lt;/code&gt; attribute was used instead of &lt;code&gt;line&lt;/code&gt; attribute, the debug options will not take effect.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-4219547993501903452?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/4219547993501903452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=4219547993501903452' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4219547993501903452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4219547993501903452'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/07/java-debug-options-in-ant-buildxml.html' title='Java debug options in ant build.xml'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-6795169670679738012</id><published>2010-07-04T16:18:00.008-04:00</published><updated>2011-01-07T20:07:32.439-05:00</updated><title type='text'>Some basic steps using Derby 10.5</title><content type='html'>The following is some basic steps of using derby bundled with GlassFish.&lt;br /&gt;&lt;br /&gt;1. start derby database server:&lt;pre&gt;$GLASSFISH_HOME/bin/asadmin start-database&lt;br /&gt;&lt;br /&gt;or start it on a non-default port number:&lt;br /&gt;&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin start-database --dbport 1528&lt;br /&gt;&lt;/pre&gt;2. make sure environment variable DERBY_HOME is set:&lt;br /&gt;&lt;pre&gt;$ echo $DERBY_HOME&lt;br /&gt;/Users/root/v3/glassfish/../javadb&lt;/pre&gt;3. start derby ij (or ij.bat), connect to derby server:&lt;br /&gt;&lt;pre&gt;$ $DERBY_HOME/bin/ij&lt;br /&gt;ij version 10.5&lt;br /&gt;ij&amp;gt; connect 'jdbc:derby://localhost:1527/sun-appserv-samples;user=APP;password=APP;create=true';&lt;br /&gt;&lt;br /&gt;ij&amp;gt; select count(*) COUNT from sys.systables;&lt;br /&gt;COUNT &lt;br /&gt;-----------&lt;br /&gt;24    &lt;br /&gt;&lt;br /&gt;1 row selected&lt;br /&gt;&lt;br /&gt;ij&amp;gt; select OWNERID from EJB__TIMER__TBL;&lt;br /&gt;ij&amp;gt; delete from EJB__TIMER__TBL;&lt;br /&gt;&lt;br /&gt;ij&amp;gt; show tables;&lt;br /&gt;TABLE_SCHEM |TABLE_NAME           |REMARKS           &lt;br /&gt;-------------------------------------------&lt;br /&gt;SYS         |SYSALIASES            |                               &lt;br /&gt;SYS         |SYSCHECKS             |                               &lt;br /&gt;SYS         |SYSCOLPERMS           |                               &lt;br /&gt;SYS         |SYSCOLUMNS            |                               &lt;br /&gt;SYS         |SYSCONGLOMERATES      |                               &lt;br /&gt;SYS         |SYSCONSTRAINTS        |                               &lt;br /&gt;SYS         |SYSDEPENDS            |                               &lt;br /&gt;SYS         |SYSFILES              |                               &lt;br /&gt;SYS         |SYSFOREIGNKEYS        |                               &lt;br /&gt;SYS         |SYSKEYS               |                               &lt;br /&gt;SYS         |SYSROLES              |                               &lt;br /&gt;SYS         |SYSROUTINEPERMS       |                               &lt;br /&gt;SYS         |SYSSCHEMAS            |                               &lt;br /&gt;SYS         |SYSSTATEMENTS         |                               &lt;br /&gt;SYS         |SYSSTATISTICS         |                               &lt;br /&gt;SYS         |SYSTABLEPERMS         |                               &lt;br /&gt;SYS         |SYSTABLES             |                               &lt;br /&gt;SYS         |SYSTRIGGERS           |                               &lt;br /&gt;SYS         |SYSVIEWS              |                               &lt;br /&gt;SYSIBM      |SYSDUMMY1             |                               &lt;br /&gt;APP         |LEAGUE                |                               &lt;br /&gt;APP         |PLAYER                |                               &lt;br /&gt;APP         |TEAM                  |                               &lt;br /&gt;APP         |TEAMPLAYER            |                               &lt;br /&gt;&lt;br /&gt;24 rows selected&lt;br /&gt;&lt;br /&gt;ij&amp;gt; describe player;&lt;br /&gt;COLUMN_NAME         |TYPE_NAME|DEC&amp;amp;|NUM&amp;amp;|COLUM&amp;amp;|COLUMN_DEF|CHAR_OCTE&amp;amp;|IS_NULL&amp;amp;&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;PLAYER_ID           |VARCHAR  |NULL|NULL|255   |NULL      |510       |NO &lt;br /&gt;NAME                |VARCHAR  |NULL|NULL|255   |NULL      |510       |YES&lt;br /&gt;POSITION            |VARCHAR  |NULL|NULL|255   |NULL      |510       |YES&lt;br /&gt;SALARY              |DOUBLE   |NULL|2   |52    |NULL      |NULL      |NO &lt;br /&gt;&lt;br /&gt;4 rows selected&lt;br /&gt;&lt;br /&gt;ij&amp;gt; CREATE TABLE FOO (FOO_ID BIGINT, FOO_NAME VARCHAR(25), DESCRIPTION VARCHAR(64));&lt;br /&gt;0 rows inserted/updated/deleted&lt;br /&gt;&lt;br /&gt;ij&amp;gt; insert into foo values(1, 'foo1', 'foo1, that is.');&lt;br /&gt;1 row inserted/updated/deleted&lt;br /&gt;&lt;br /&gt;ij&amp;gt; select * from foo;&lt;br /&gt;FOO_ID              |FOO_NAME                 |DESCRIPTION                                                &lt;br /&gt;---------------------------------------------------------------------------------------------------------------&lt;br /&gt;1                   |foo1                     |foo1, that is.                                             &lt;br /&gt;&lt;br /&gt;1 row selected&lt;br /&gt;&lt;br /&gt;ij&amp;gt; update foo set foo_name='foo1 new name' where foo_id=1;&lt;br /&gt;1 row inserted/updated/deleted&lt;br /&gt;&lt;br /&gt;ij&amp;gt; delete from foo where foo_id=1;&lt;br /&gt;1 row inserted/updated/deleted&lt;br /&gt;&lt;br /&gt;ij&amp;gt; select count(*) count from foo;&lt;br /&gt;COUNT &lt;br /&gt;-----------&lt;br /&gt;0     &lt;br /&gt;&lt;br /&gt;1 row selected&lt;br /&gt;&lt;br /&gt;ij&amp;gt; drop table foo;&lt;br /&gt;0 rows inserted/updated/deleted&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To start ij and connect to a database in single step:&lt;pre&gt;java -classpath $GLASSFISH_HOME/../javadb/lib/derbyrun.jar -Dij.connection.sample="jdbc:derby://localhost:1527/sun-appserv-samples;user=APP;password=APP;create=true" org.apache.derby.tools.ij&lt;/pre&gt;When starting derby with GlassFish "asadmin start-database" command, the default host is localhost, the default port number is 1527, and the default derby system home is set to $GLASSFISH_HOME/databases.  This is also the directory where derby.log and database files will be stored.  To overwrite the defaults with the following options:&lt;br /&gt;&lt;pre&gt;asadmin start-database --dbhost dell-01 --dbport 3333 --terse=true --dbhome $HOME/derby&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-6795169670679738012?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/6795169670679738012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=6795169670679738012' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6795169670679738012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6795169670679738012'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/07/some-basic-steps-using-derby-105.html' title='Some basic steps using Derby 10.5'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7261954967888850476</id><published>2010-07-04T14:44:00.002-04:00</published><updated>2010-07-04T15:01:55.023-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Servlet'/><title type='text'>A sample web.xml (servlet 3.0) with ejb-ref and ejb-local-ref</title><content type='html'>This is a sample web.xml based on servlet 3.0 (part of Java EE 6).&lt;pre&gt;&amp;lt;web-app xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&lt;br /&gt;      version="3.0"&amp;gt; &lt;br /&gt;      &lt;br /&gt;  &amp;lt;servlet&amp;gt;&lt;br /&gt;   &amp;lt;display-name&amp;gt;Servlet1&amp;lt;/display-name&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;Servlet1&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;servlet-class&amp;gt;test.Servlet1&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;   &amp;lt;init-param&amp;gt;&lt;br /&gt;     &amp;lt;param-name&amp;gt;sleep-time-in-seconds&amp;lt;/param-name&amp;gt;&lt;br /&gt;     &amp;lt;param-value&amp;gt;10&amp;lt;/param-value&amp;gt;&lt;br /&gt;   &amp;lt;/init-param&amp;gt;&lt;br /&gt;   &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt; &amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;Servlet1&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;url-pattern&amp;gt;/Servlet1&amp;lt;/url-pattern&amp;gt;&lt;br /&gt; &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt; &lt;br /&gt;  &amp;lt;ejb-ref&amp;gt;&lt;br /&gt;    &amp;lt;ejb-ref-name&amp;gt;ejb/fooremote&amp;lt;/ejb-ref-name&amp;gt;&lt;br /&gt;    &amp;lt;ejb-ref-type&amp;gt;Session&amp;lt;/ejb-ref-type&amp;gt;&lt;br /&gt;    &amp;lt;remote&amp;gt;test.FooRemoteIF&amp;lt;/remote&amp;gt;&lt;br /&gt;  &amp;lt;/ejb-ref&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;ejb-local-ref&amp;gt;&lt;br /&gt;    &amp;lt;ejb-ref-name&amp;gt;ejb/foo&amp;lt;/ejb-ref-name&amp;gt;&lt;br /&gt;    &amp;lt;ejb-ref-type&amp;gt;Session&amp;lt;/ejb-ref-type&amp;gt;&lt;br /&gt;    &amp;lt;local&amp;gt;test.FooIF&amp;lt;/local&amp;gt;&lt;br /&gt;    &amp;lt;ejb-link&amp;gt;FooBean&amp;lt;/ejb-link&amp;gt;&lt;br /&gt;  &amp;lt;/ejb-local-ref&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7261954967888850476?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7261954967888850476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7261954967888850476' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7261954967888850476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7261954967888850476'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/07/sample-webxml-servlet-30-with-ejb-ref.html' title='A sample web.xml (servlet 3.0) with ejb-ref and ejb-local-ref'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2306483982597863037</id><published>2010-06-25T10:10:00.006-04:00</published><updated>2010-06-25T22:46:49.756-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>GlassFish rotate-log</title><content type='html'>GlassFish has a command to rotate or reset server.log file:&lt;br /&gt;&lt;pre&gt;$GLASSFISH_HOME/bin/asadmin rotate-log&lt;/pre&gt;After running this command the logs directory looks like this:&lt;br /&gt;&lt;pre&gt;/glassfish-3.1/glassfish/domains/domain1/logs &amp;gt; ll&lt;br /&gt;total 200&lt;br /&gt;-rw-r--r--  1 root      0 Jun 25 10:11 server.log&lt;br /&gt;-rw-r--r--  1 root  10780 Jun 25 10:11 server.log_2010-06-25T10-09-48&lt;br /&gt;-rw-r--r--  1 root  16384 Jun 25 10:10 jvm.log&lt;br /&gt;drwxr-xr-x  3 root    102 Jun 25 10:02 server/&lt;br /&gt;&lt;/pre&gt;This command renames server.log file to a timestamped backup file, and leaves the current server.log file empty.  I usually run this command before starting a test run to make sure the current server.log only contains logs from this test run.&lt;br /&gt;&lt;br /&gt;For convenience, I also have an alias for it (in tcsh syntax):&lt;br /&gt;&lt;pre&gt;alias rlog '$GLASSFISH_HOME/bin/asadmin rotate-log'&lt;/pre&gt;For more details, see &lt;a href="http://docs.sun.com/app/docs/doc/820-7701/rotate-log-1?l=en&amp;a=view"&gt;official docs&lt;/a&gt;, or view the online help: &lt;pre&gt;$GLASSFISH_HOME/bin/asadmin rotate-log --help&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2306483982597863037?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2306483982597863037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2306483982597863037' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2306483982597863037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2306483982597863037'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/06/glassfish-rotate-log.html' title='GlassFish rotate-log'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-4198737619445489172</id><published>2010-05-24T11:42:00.004-04:00</published><updated>2011-11-10T11:36:20.455-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Double click in NetBeans 6.5 &amp; 6.8 editor</title><content type='html'>NetBeans 6.x editors handle double-click differently from other applications.  In firefox, thunderbird, eclipse, or even terminal, I can doulble-click anywhere in a word to select the whole word, keep the mouse button pressed, and slide forward to expand the selection. &lt;br /&gt;&lt;br /&gt;In NetBeans, doing the same will drag the selected word, just like moving the word elsewhere.  While it seems cool to be able to drag-and-drop, I don't see any practical value.  In java editor, I always avoid drag-and-drop anything, since the selected element often lands in the wrong place when your mouse/pad reaches its end.&lt;br /&gt;&lt;br /&gt;Update: It has been fixed in NetBeans 7.1 according to &lt;a href="http://netbeans.org/bugzilla/show_bug.cgi?id=89607"&gt;this bug&lt;/a&gt;.  I installed 7.1 beta just to get this fix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-4198737619445489172?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/4198737619445489172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=4198737619445489172' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4198737619445489172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4198737619445489172'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/05/double-click-in-netbeans-65-68-editor.html' title='Double click in NetBeans 6.5 &amp; 6.8 editor'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2039175913738603614</id><published>2010-05-06T11:22:00.007-04:00</published><updated>2010-05-23T14:41:12.333-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaEE'/><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><title type='text'>Example of EJB 3.1 Stateful Session Bean and Servlet</title><content type='html'>Stateful session bean class:&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import java.util.concurrent.TimeUnit;&lt;br /&gt;import java.util.logging.Logger;&lt;br /&gt;import javax.ejb.PostActivate;&lt;br /&gt;import javax.ejb.PrePassivate;&lt;br /&gt;import javax.ejb.Stateful;&lt;br /&gt;import javax.ejb.StatefulTimeout;&lt;br /&gt;&lt;br /&gt;@Stateful&lt;br /&gt;@StatefulTimeout(unit = TimeUnit.MINUTES, value = 30)&lt;br /&gt;public class StatefulTestBean {&lt;br /&gt; private static final Logger logger = Logger.getLogger("test");&lt;br /&gt;&lt;br /&gt; private String clientInfo;&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unused")&lt;br /&gt; @PrePassivate&lt;br /&gt; private void prePassivate() {&lt;br /&gt;     logger.info("In PrePassivate method");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @SuppressWarnings("unused")&lt;br /&gt; @PostActivate&lt;br /&gt; private void postActivate() {&lt;br /&gt;     logger.info("In PostActivate method");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getBeanInfo() {&lt;br /&gt;     return this.toString();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getClientInfo() {&lt;br /&gt;     return clientInfo;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setClientInfo(String clientInfo) {&lt;br /&gt;     this.clientInfo = clientInfo;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;Servlet class:&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.PrintWriter;&lt;br /&gt;&lt;br /&gt;import javax.naming.InitialContext;&lt;br /&gt;import javax.naming.NamingException;&lt;br /&gt;import javax.servlet.ServletException;&lt;br /&gt;import javax.servlet.annotation.WebServlet;&lt;br /&gt;import javax.servlet.http.HttpServlet;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.http.HttpServletResponse;&lt;br /&gt;import javax.servlet.http.HttpSession;&lt;br /&gt;&lt;br /&gt;@WebServlet(urlPatterns = "/TestServlet")&lt;br /&gt;public class TestServlet extends HttpServlet {&lt;br /&gt; private static final String STATEFUL_TEST_BEAN_KEY = "STATEFUL_TEST_BEAN_KEY";&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;         throws ServletException, IOException {&lt;br /&gt;     PrintWriter writer = response.getWriter();&lt;br /&gt;     StatefulTestBean statefulTestBean = getStatefulTestBean(request);&lt;br /&gt;     writer.println("clientInfo: " + statefulTestBean.getClientInfo());&lt;br /&gt;     writer.println("beanInfo:   " + statefulTestBean.getBeanInfo());&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; private StatefulTestBean getStatefulTestBean(HttpServletRequest request)&lt;br /&gt;         throws ServletException {&lt;br /&gt;     HttpSession httpSession = request.getSession(true);&lt;br /&gt;     StatefulTestBean statefulTestBean = (StatefulTestBean)&lt;br /&gt;             httpSession.getAttribute(STATEFUL_TEST_BEAN_KEY);&lt;br /&gt;     if (statefulTestBean == null) {&lt;br /&gt;         try {&lt;br /&gt;             InitialContext ic = new InitialContext();&lt;br /&gt;             statefulTestBean = (StatefulTestBean) ic.lookup("java:module/StatefulTestBean");&lt;br /&gt;             httpSession.setAttribute(STATEFUL_TEST_BEAN_KEY, statefulTestBean);&lt;br /&gt;          &lt;br /&gt;             String userAgent = request.getHeader("User-Agent");&lt;br /&gt;             String userName  = request.getParameter("userName");&lt;br /&gt;             statefulTestBean.setClientInfo(userAgent + ", " + userName);&lt;br /&gt;         } catch (NamingException e) {&lt;br /&gt;             throw new ServletException(e);&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt;     return statefulTestBean;&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;To compile the above 2 classes:&lt;br /&gt;&lt;pre&gt;javac -cp "$GLASSFISH_HOME/modules/*" TestServlet.java StatefulTestBean.java&lt;br /&gt;&lt;/pre&gt;Copy *.class files under a &lt;code&gt;WEB-INF&lt;/code&gt; directory, and package the above 2 classes into a WAR file, &lt;code&gt;stateful.war&lt;/code&gt;, that contains the following:&lt;br /&gt;&lt;pre&gt;WEB-INF/classes/test/StatefulTestBean.class&lt;br /&gt;WEB-INF/classes/test/TestServlet.class&lt;br /&gt;&lt;/pre&gt;To deploy it, copy stateful.war to appserver autodeploy directory.&lt;br /&gt;&lt;br /&gt;I did the following to test the stateful session behavior:&lt;br /&gt;&lt;br /&gt;1, open the following url in firefox:&lt;br /&gt;http://localhost:8080/stateful/TestServlet?userName=nobody&lt;br /&gt;&lt;br /&gt;will get the following response:&lt;br /&gt;clientInfo: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3, nobody&lt;br /&gt;beanInfo:   test._StatefulTestBean_Serializable@3af78ba5&lt;br /&gt;&lt;br /&gt;2, In the same firefox window, enter url without userName:&lt;br /&gt;http://localhost:8080/stateful/TestServlet&lt;br /&gt;&lt;br /&gt;will still get the same response, since the second request share the same http session and stateful session bean with the first request.&lt;br /&gt;&lt;br /&gt;3, Open a new firefox window and repeat step 2, will still get the same response, since the http session is tied to the firefox browser.&lt;br /&gt;&lt;br /&gt;4, Open a chrome window and repeat step 2, will get a different response due to a new http session and new stateful session bean instance were created.&lt;br /&gt;&lt;br /&gt;Since both http sessin and stateful session bean are used to manage user session, their timeout value should be in kept in sync.&lt;br /&gt;&lt;br /&gt;This app is programmed to JavaEE 6 and EJB 3.1, using some new features such as &lt;code&gt;@StatefulTimeout&lt;/code&gt; and a portable module-scope jndi name.  I've tested with GlassFish 3.0, and it should also work, without any modification, in any JavaEE-6-compliant appserver.  To run with JavaEE 5 appserver, some minor modifications are needed.&lt;br /&gt;&lt;br /&gt;The stateful bean reference is looked up, instead of using field injection.  This is necessary to keep it thread safe and avoid being accessed by different users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2039175913738603614?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2039175913738603614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2039175913738603614' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2039175913738603614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2039175913738603614'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/05/example-of-ejb-31-stateful-session-bean.html' title='Example of EJB 3.1 Stateful Session Bean and Servlet'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-8065853679203601886</id><published>2010-04-26T21:53:00.004-04:00</published><updated>2010-05-03T21:45:54.109-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>restart-domain in GlassFish</title><content type='html'>Restarting an appserver is a common operation after manually editing server config, or adding new library jars, or just to be safe.  I hava an alias to restart GlassFish, and all it does is: stop domain, sleep 3 seconds, and start domain.&lt;br /&gt;&lt;br /&gt;In GlassFish v3, this can be done with a single asadmin command: &lt;code&gt;restart-domain&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;First, I tried &lt;code&gt;restart-domain&lt;/code&gt; while the server is not running, which is equivalent to &lt;code&gt;start-domain&lt;/code&gt; command:&lt;br /&gt;&lt;pre&gt;./asadmin restart-domain&lt;br /&gt;Server is not running, will attempt to start it...&lt;br /&gt;Waiting for DAS to start .....................&lt;br /&gt;Started domain: domain1&lt;br /&gt;Domain location: /v3/glassfish/domains/domain1&lt;br /&gt;Log file: /v3/glassfish/domains/domain1/logs/server.log&lt;br /&gt;Admin port for the domain: 4848&lt;br /&gt;Command restart-domain executed successfully.&lt;br /&gt;&lt;/pre&gt;Then, try it while the server is running.  This command takes a few seconds to finish since it involves stopping the domain first, possibly pausing a bit, and then starting the domain:&lt;br /&gt;&lt;pre&gt;./asadmin restart-domain&lt;br /&gt;Successfully restarted the domain&lt;br /&gt;Command restart-domain executed successfully.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-8065853679203601886?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/8065853679203601886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=8065853679203601886' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8065853679203601886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8065853679203601886'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/04/restart-domain-in-glassfish.html' title='restart-domain in GlassFish'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-8997752966183254363</id><published>2010-04-21T22:03:00.006-04:00</published><updated>2010-05-28T16:00:31.540-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><title type='text'>Example of EJB Interceptor class</title><content type='html'>EJB 3.x interceptor class can contain either EJB lifecycle callback methods (e.g., &lt;code&gt;@PostConstruct, @PreDestroy, @PrePassivate, @PostActivate&lt;/code&gt;), or business interceptor methods (i.e., &lt;code&gt;@AroundInvoke&lt;/code&gt;), or any combination of these methods.  The following is a simple example of EJB interceptor class:&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;import javax.annotation.PostConstruct;&lt;br /&gt;import javax.annotation.PreDestroy;&lt;br /&gt;import javax.ejb.PrePassivate;&lt;br /&gt;import javax.ejb.PostActivate;&lt;br /&gt;import javax.interceptor.AroundInvoke;&lt;br /&gt;import javax.interceptor.InvocationContext;&lt;br /&gt;&lt;br /&gt;public class Interceptor1 {&lt;br /&gt;   @PostConstruct&lt;br /&gt;   protected void myPostConstruct(InvocationContext ctx) {&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @PreDestroy &lt;br /&gt;   protected void myPreDestroy(InvocationContext ctx) {&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   @PostActivate&lt;br /&gt;   private void postActivate(InvocationContext ctx) {&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @PrePassivate&lt;br /&gt;   private void prePassivate(InvocationContext ctx) {&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @AroundInvoke&lt;br /&gt;   public Object businessIntercept(InvocationContext ctx) &lt;br /&gt;       throws Exception {&lt;br /&gt;       Object result = null;&lt;br /&gt;       try {&lt;br /&gt;           // PreInvoke: do something before handing control to the next in chain&lt;br /&gt;           result = ctx.proceed();&lt;br /&gt;           return result;&lt;br /&gt;       } finally {&lt;br /&gt;           // PostInvoke: do something (cleanup, etc) after the main processing is done&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;The interceptor class is attached to EJB bean class (or business method in EJB bean class) with @Interceptors annotation, or specified in ejb-jar.xml.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-8997752966183254363?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/8997752966183254363/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=8997752966183254363' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8997752966183254363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8997752966183254363'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/04/example-of-ejb-interceptor-class.html' title='Example of EJB Interceptor class'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-6889840618489010580</id><published>2010-04-20T17:26:00.005-04:00</published><updated>2010-04-21T14:45:57.709-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaEE'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>@Resource.lookup and classpath</title><content type='html'>JavaEE 6 added a new lookup attribute to @javax.annotation.Resource.  So one can inject resources like this:&lt;br /&gt;&lt;pre&gt;@Resource(lookup = "java:module/env/rate")&lt;br /&gt;private String rate;&lt;br /&gt;&lt;/pre&gt;Compile the classes:&lt;br /&gt;&lt;pre&gt;javac -cp "$GLASSFISH_HOME/modules/*" *Bean.java&lt;br /&gt;&lt;br /&gt;EmailBean.java:18: cannot find symbol&lt;br /&gt;symbol  : method lookup()&lt;br /&gt;location: @interface javax.annotation.Resource&lt;br /&gt;   @Resource(lookup = "java:module/env/rate")&lt;br /&gt;             ^&lt;br /&gt;1 error&lt;/pre&gt;In GlassFish, all JavaEE classes are in various jars under $GLASSFISH_HOME/modules and its subdirectories.  It failed because version 1.0 of javax.annotation.Resource class (and other javax.annotation.* classes) are included in Java SE 6.  The use of lookup attribute requires version 1.1 of Common Annotation jar, which is included in JavaEE 6. &lt;br /&gt;&lt;br /&gt;To fix it, simply add a -Djava.endorsed.dirs sysprop to override those classes in Java SE 6:&lt;br /&gt;&lt;pre&gt;javac -cp "$GLASSFISH_HOME/modules/*" -Djava.endorsed.dirs=$GLASSFISH_HOME/modules/endorsed  *Bean.java&lt;br /&gt;&lt;/pre&gt;In Eclipse IDE, you just need to put $GLASSFISH_HOME/modules/endorsed/javax.annotation.jar before JRE System Library when configuring Java Build Path.&lt;br /&gt;&lt;br /&gt;This should also work with any compliant appserver, though actual jar name and location may vary.  The same -Djava.endorsed.dirs sysprop should also be used when running the app.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-6889840618489010580?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/6889840618489010580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=6889840618489010580' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6889840618489010580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6889840618489010580'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/04/resourcelookup-and-classpath.html' title='@Resource.lookup and classpath'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2790567894275343747</id><published>2010-04-19T13:45:00.003-04:00</published><updated>2010-04-27T23:08:50.073-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaEE'/><title type='text'>2 @ManagedBean in JavaEE 6</title><content type='html'>There are 2 @ManagedBean annotations in JavaEE 6:&lt;br /&gt;&lt;br /&gt;javax.annotation.ManagedBean (&lt;a href="http://java.sun.com/javaee/6/docs/api/javax/annotation/ManagedBean.html"&gt;javadoc&lt;/a&gt;)&lt;br /&gt;javax.faces.bean.ManagedBean (&lt;a href="http://java.sun.com/javaee/6/docs/api/javax/faces/bean/ManagedBean.html"&gt;javadoc&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Looks like we are running out of names.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2790567894275343747?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2790567894275343747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2790567894275343747' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2790567894275343747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2790567894275343747'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/04/2-managedbean-in-javaee-6.html' title='2 @ManagedBean in JavaEE 6'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-5960759580758747083</id><published>2010-04-17T09:52:00.005-04:00</published><updated>2010-04-17T18:09:48.161-04:00</updated><title type='text'>Env-entry enhancement in JavaEE 6</title><content type='html'>JavaEE 6 adds 2 additional types to the list of env-entry types: java.lang.Class and any enum type.  So there are now 11 portable env-entry types that must be supported by all compliant application servers:&lt;pre&gt;       java.lang.Class&lt;br /&gt;      any enum type&lt;br /&gt;      java.lang.Boolean&lt;br /&gt;      java.lang.Byte&lt;br /&gt;      java.lang.Character&lt;br /&gt;      java.lang.String&lt;br /&gt;      java.lang.Short&lt;br /&gt;      java.lang.Integer&lt;br /&gt;      java.lang.Long&lt;br /&gt;      java.lang.Float&lt;br /&gt;      java.lang.Double&lt;/pre&gt;For example, to use java.lang.Class and enum env-entry-type in a web.xml:&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"&amp;gt;&lt;br /&gt;&amp;lt;env-entry&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;example of java.lang.Class env-entry-type&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;env-entry-name&amp;gt;java:app/env/myImplClass&amp;lt;/env-entry-name&amp;gt;&lt;br /&gt;&amp;lt;env-entry-type&amp;gt;java.lang.Class&amp;lt;/env-entry-type&amp;gt;&lt;br /&gt;&amp;lt;env-entry-value&amp;gt;test.MyServiceProvider&amp;lt;/env-entry-value&amp;gt;&lt;br /&gt;&amp;lt;/env-entry&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;env-entry&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;example of enum env-entry-type&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;env-entry-name&amp;gt;java:app/env/day&amp;lt;/env-entry-name&amp;gt;&lt;br /&gt;&amp;lt;env-entry-type&amp;gt;com.examplexxx.util.Day&amp;lt;/env-entry-type&amp;gt;&lt;br /&gt;&amp;lt;env-entry-value&amp;gt;SUNDAY&amp;lt;/env-entry-value&amp;gt;&lt;br /&gt;&amp;lt;/env-entry&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;/pre&gt;To inject the above 2 env-entry into fields in a servlet, or EJB bean class, or any other components in the EAR: &lt;pre&gt;@Resource(lookup="java:app/env/myImplClass")&lt;br /&gt;@SuppressWarnings("unchecked")&lt;br /&gt;private Class myImplClass;&lt;br /&gt;&lt;br /&gt;@Resource(lookup="java:app/env/day")&lt;br /&gt;private com.examplexxx.util.Day day;&lt;br /&gt;&lt;/pre&gt;For java.lang.Class type, only the raw type, not the generic type, can be declared as the field type, hence @SuppressWarnings("unchecked").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-5960759580758747083?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/5960759580758747083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=5960759580758747083' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5960759580758747083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5960759580758747083'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/04/env-entry-enhancement-in-javaee-6.html' title='Env-entry enhancement in JavaEE 6'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1198389943202603095</id><published>2010-04-16T09:34:00.006-04:00</published><updated>2010-04-17T09:50:57.670-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaEE'/><title type='text'>DataSourceDefinition Examples in JavaEE 6</title><content type='html'>The usual way to create a DataSource is through the appserver's administration, CLI or GUI tool.  Then applications can declare resource-ref mapped to the DataSource.  This involves both application developer and server administrator, and sometimes can be too much for simple apps.  JavaEE 6 added 2 annotations to ease this task: javax.annotation.sql.DataSourceDefinition and javax.annotation.sql.DataSourceDefinitions.&lt;br /&gt;&lt;br /&gt;With the 2 annotations, applications can take control of DataSource creation, and choose to expose the DataSource in various scopes: component-, module-, application, and global-scope.  For simple apps, all this can be done without any server configuration or XML descriptors.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Example 1&lt;/span&gt;: a servlet declares how to create a derby DataSource, and injects a reference to this DataSource into a field.  This DataSource is scoped to the whole module (the entire webapp).&lt;br /&gt;&lt;pre&gt;@DataSourceDefinition(name="java:module/env/inventory",&lt;br /&gt;   className="org.apache.derby.jdbc.ClientDataSource",&lt;br /&gt;      portNumber=1527,&lt;br /&gt;      serverName="localhost",&lt;br /&gt;      databaseName="inventory",&lt;br /&gt;      user="user1",&lt;br /&gt;      password="password1")&lt;br /&gt;@WebServlet(urlPatterns = "/InventoryServlet")&lt;br /&gt;public class InventoryServlet extends HttpServlet {&lt;br /&gt;  @Resource(lookup="java:module/env/inventory")&lt;br /&gt;  private DataSource inventoryds;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Example 2&lt;/span&gt;: a Stateless session bean creates an application-scope Oracle DataSource, and injects its resource-ref.  This DataSource is visible to the entire application (EAR).&lt;pre&gt;@DataSourceDefinition(name="java:app/env/inventory",&lt;br /&gt;      className="oracle.jdbc.pool.OracleDataSource",&lt;br /&gt;      portNumber=1521,&lt;br /&gt;      serverName="localhost",&lt;br /&gt;      databaseName="inventory",&lt;br /&gt;      user="user1",&lt;br /&gt;      password="password1",&lt;br /&gt;      properties={"driverType=thin"}&lt;br /&gt;)&lt;br /&gt;@Stateless&lt;br /&gt;public class InventoryBean {&lt;br /&gt;  @Resource(lookup="java:app/env/inventory")&lt;br /&gt;  private DataSource inventoryds;&lt;br /&gt;&lt;/pre&gt;For more details, see JavaEE 6 javadoc page for &lt;a href="http://java.sun.com/javaee/6/docs/api/javax/annotation/sql/DataSourceDefinition.html"&gt;@DataSourceDefinition&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1198389943202603095?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1198389943202603095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1198389943202603095' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1198389943202603095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1198389943202603095'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/04/datasourcedefinition-examples-in-javaee.html' title='DataSourceDefinition Examples in JavaEE 6'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7362978742449189622</id><published>2010-04-14T17:31:00.008-04:00</published><updated>2010-12-17T16:56:46.507-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>Message Driven Bean Example with Servlet Client</title><content type='html'>This is a simple example of JMS Queue message-driven bean (MDB), with a servlet client.  MessageServlet sends a text message to the queue that the MDB is bound to, the MDB then consumes the incoming message.  This example requires EJB 3.1 and Servlet 3.0, both are in Java EE 6.&lt;br /&gt;&lt;br /&gt;First, the MDB class:&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.util.logging.Logger;&lt;br /&gt;import javax.ejb.ActivationConfigProperty;&lt;br /&gt;import javax.ejb.MessageDriven;&lt;br /&gt;import javax.jms.JMSException;&lt;br /&gt;import javax.jms.Message;&lt;br /&gt;import javax.jms.MessageListener;&lt;br /&gt;&lt;br /&gt;@MessageDriven(mappedName="testQueue2",&lt;br /&gt;     activationConfig = { @ActivationConfigProperty(&lt;br /&gt;     propertyName="destinationType", propertyValue="javax.jms.Queue")})&lt;br /&gt;public class MessageBean implements MessageListener {&lt;br /&gt; Logger logger = Logger.getLogger("test");&lt;br /&gt;&lt;br /&gt; public void onMessage(Message msg) {&lt;br /&gt;     try {&lt;br /&gt;         String name = msg.getStringProperty("name");&lt;br /&gt;         logger.info("Received msg " + msg + ", from " + name);&lt;br /&gt;     } catch (JMSException e) {&lt;br /&gt;         throw new RuntimeException(e);&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;The servlet class:&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import javax.annotation.Resource;&lt;br /&gt;import javax.jms.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.annotation.WebServlet;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;&lt;br /&gt;@WebServlet(urlPatterns = "/MessageServlet")&lt;br /&gt;public class MessageServlet extends HttpServlet {&lt;br /&gt; @Resource(mappedName = "testQueue2")&lt;br /&gt; private Queue queue;&lt;br /&gt;&lt;br /&gt; @Resource(mappedName = "jms/QueueConnectionFactory")&lt;br /&gt; private QueueConnectionFactory queueConnectionFactory;&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;         throws ServletException, IOException {&lt;br /&gt;     QueueConnection queueConnection = null;&lt;br /&gt;     try {&lt;br /&gt;         queueConnection = queueConnectionFactory.createQueueConnection();&lt;br /&gt;         queueConnection.start();&lt;br /&gt;         QueueSession queueSession = queueConnection.createQueueSession(false,&lt;br /&gt;                 Session.AUTO_ACKNOWLEDGE);&lt;br /&gt;         QueueSender sender = queueSession.createSender(queue);&lt;br /&gt;&lt;br /&gt;         TextMessage msg = queueSession.createTextMessage();&lt;br /&gt;         msg.setText("A message from MessageServlet");&lt;br /&gt;         msg.setStringProperty("name", "MessageServlet");&lt;br /&gt;&lt;br /&gt;         sender.send(msg);&lt;br /&gt;     } catch (JMSException e) {&lt;br /&gt;         throw new RuntimeException(e);&lt;br /&gt;     } finally {&lt;br /&gt;         try {&lt;br /&gt;             if (queueConnection != null) {&lt;br /&gt;                 queueConnection.close();&lt;br /&gt;             }&lt;br /&gt;         } catch (JMSException e) { //ignore&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;After compiling, package the two classes into a WAR file, say, mdb.war:&lt;br /&gt;&lt;pre&gt;WEB-INF/classes/test/MessageBean.class&lt;br /&gt;WEB-INF/classes/test/MessageServlet.class&lt;br /&gt;&lt;/pre&gt;Create the 2 JMS resources (testQueue2 &amp;amp; jms/QueueConnectionFactory) in the target application server.  In GlassFish, you can do it in Admin GUI, or via asadmin CLI:&lt;pre&gt;./asadmin create-jms-resource --restype javax.jms.Queue testQueue2&lt;br /&gt;./asadmin create-jms-resource --restype javax.jms.QueueConnectionFactory jms/QueueConnectionFactory&lt;/pre&gt;Deploy mdb.war by copying it to server autodeploy directory.&lt;br /&gt;&lt;br /&gt;Enter the URL in browser to invoke the servlet:&lt;br /&gt;http://localhost:8080/mdb/MessageServlet&lt;br /&gt;&lt;br /&gt;You will see the following log in server.log as a result of MDB processing:&lt;br /&gt;&lt;pre&gt;[#|2010-04-14T17:28:49.900-0400|INFO|glassfishv3.0|test|_ThreadID=31;_ThreadName=Thread-1;|Received msg com.sun.messaging.jms.ra.DirectTextPacket@3ce177de, from MessageServlet|#]&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7362978742449189622?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7362978742449189622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7362978742449189622' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7362978742449189622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7362978742449189622'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/04/message-driven-bean-example-with.html' title='Message Driven Bean Example with Servlet Client'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2096068437040834213</id><published>2010-04-08T14:46:00.007-04:00</published><updated>2010-04-14T18:03:43.123-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>GlassFish set-web-env-entry</title><content type='html'>env-entry elements can be used to configure a webapp without recompiling.  Usually one still needs to update them in web.xml, and redeploy the WAR for the new config to take effect.  I just noticed GlassFish v3 now supports in-place, dynamic updating web env-entry via its powerful asadmin command.  I guess it can also be done in GlassFish admin GUI.&lt;br /&gt;&lt;br /&gt;1, download a sample webapp, hello.war, from GlassFish web site, to $GLASSFISH_HOME/domains/domain1/autodeploy/ directory:&lt;br /&gt;&lt;pre&gt;wget https://glassfish.dev.java.net/downloads/quickstart/hello.war&lt;/pre&gt;2, verify hello.war has been successfully deployed:&lt;br /&gt;&lt;pre&gt;cd $GLASSFISH_HOME/bin&lt;br /&gt;./asadmin list-components&lt;/pre&gt;3,  &lt;pre&gt;./asadmin set-web-env-entry --name=contact-email --value=info@examplexxx.com --type=java.lang.String hello&lt;br /&gt;./asadmin set-web-env-entry --name=debug --value=true --type=java.lang.Boolean hello&lt;/pre&gt;4, verify the 2 new env-entry elements:&lt;br /&gt;&lt;pre&gt;./asadmin list-web-env-entry hello&lt;br /&gt;Reported 2 env-entry settings&lt;br /&gt;&lt;br /&gt;contact-email (java.lang.String) = info@examplexxx.com ignoreDescriptorItem=false //(description not specified)&lt;br /&gt;debug (java.lang.Boolean) = true ignoreDescriptorItem=false //(description not specified)&lt;br /&gt;&lt;/pre&gt;You can also verify them by viewing $GLASSFISH_HOME/domains/domain1/domain.xml:&lt;br /&gt;&lt;pre&gt;&amp;lt;application context-root="/hello" location="${com.sun.aas.instanceRootURI}/applications/hello/" name="hello" object-type="user"&amp;gt;&lt;br /&gt;&amp;lt;property name="defaultAppName" value="hello" /&amp;gt;&lt;br /&gt;&amp;lt;module name="hello"&amp;gt;&lt;br /&gt;  &amp;lt;engine sniffer="security" /&amp;gt;&lt;br /&gt;  &amp;lt;engine sniffer="web"&amp;gt;&lt;br /&gt;    &amp;lt;web-module-config&amp;gt;&lt;br /&gt;      &amp;lt;env-entry&amp;gt;&lt;br /&gt;        &amp;lt;env-entry-type&amp;gt;java.lang.String&amp;lt;/env-entry-type&amp;gt;&lt;br /&gt;        &amp;lt;env-entry-value&amp;gt;info@examplexxx.com&amp;lt;/env-entry-value&amp;gt;&lt;br /&gt;        &amp;lt;env-entry-name&amp;gt;contact-email&amp;lt;/env-entry-name&amp;gt;&lt;br /&gt;      &amp;lt;/env-entry&amp;gt;&lt;br /&gt;      &amp;lt;env-entry&amp;gt;&lt;br /&gt;        &amp;lt;env-entry-type&amp;gt;java.lang.Boolean&amp;lt;/env-entry-type&amp;gt;&lt;br /&gt;        &amp;lt;env-entry-value&amp;gt;true&amp;lt;/env-entry-value&amp;gt;&lt;br /&gt;        &amp;lt;env-entry-name&amp;gt;debug&amp;lt;/env-entry-name&amp;gt;&lt;br /&gt;      &amp;lt;/env-entry&amp;gt;&lt;br /&gt;    &amp;lt;/web-module-config&amp;gt;&lt;br /&gt;  &amp;lt;/engine&amp;gt;&lt;br /&gt;&amp;lt;/module&amp;gt;&lt;br /&gt;&amp;lt;/application&amp;gt;&lt;/pre&gt;&lt;br /&gt;To learn more about set-web-env-entry subcommand, try one of the following:&lt;br /&gt;&lt;pre&gt;./asadmin help set-web-env-entry&lt;br /&gt;./asadmin set-web-env-entry --help&lt;/pre&gt;To list and unset env-entry, use the following asadmin commands:&lt;pre&gt;&lt;br /&gt;list-web-env-entry&lt;br /&gt;unset-web-env-entry&lt;/pre&gt;The same feature also exists for web context-param, via the following commands:&lt;pre&gt;&lt;br /&gt;list-web-context-param&lt;br /&gt;set-web-context-param&lt;br /&gt;unset-web-context-param&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2096068437040834213?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2096068437040834213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2096068437040834213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2096068437040834213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2096068437040834213'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/04/glassfish-set-web-env-entry.html' title='GlassFish set-web-env-entry'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-4921158760553605522</id><published>2010-04-01T11:30:00.012-04:00</published><updated>2011-03-04T17:35:43.463-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><title type='text'>EJB 3.1 Timer Simple Example</title><content type='html'>This is a simple webapp that polls a web site to check if a product is available.  It uses a stateless session bean and calendar-based timer.&lt;br /&gt;&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStreamReader;&lt;br /&gt;import java.net.URI;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.util.logging.Logger;&lt;br /&gt;&lt;br /&gt;import javax.ejb.Schedule;&lt;br /&gt;import javax.ejb.Stateless;&lt;br /&gt;&lt;br /&gt;@Stateless&lt;br /&gt;public class InventoryCheckBean {&lt;br /&gt;  private static final String PRODUCT_URL = "http://www.amazon.com/dp/B002BSA298/";&lt;br /&gt;  private static final String IN_STOCK = "In Stock";&lt;br /&gt;&lt;br /&gt;  @SuppressWarnings("unused")&lt;br /&gt;  @Schedule(dayOfWeek = "0-5", hour = "0/2", minute = "0/20", timezone = "America/Los_Angeles")&lt;br /&gt;  private void checkInventory() {&lt;br /&gt;      BufferedReader br = null;&lt;br /&gt;      try {&lt;br /&gt;          String line = null;&lt;br /&gt;          URL url = new URI(PRODUCT_URL).toURL();&lt;br /&gt;          br = new BufferedReader(new InputStreamReader(url.openStream()));&lt;br /&gt;          while ((line = br.readLine()) != null) {&lt;br /&gt;              if(line.indexOf(IN_STOCK) &amp;gt;= 0) {&lt;br /&gt;                  //email notify&lt;br /&gt;                  Logger.getLogger("").info(line);&lt;br /&gt;                  break;&lt;br /&gt;              }&lt;br /&gt;          }&lt;br /&gt;      } catch (Exception e) {&lt;br /&gt;          throw new RuntimeException(e);&lt;br /&gt;      } finally {&lt;br /&gt;          if(br != null) {&lt;br /&gt;              try {&lt;br /&gt;                  br.close();&lt;br /&gt;              } catch (IOException e) { //ignore&lt;br /&gt;              }&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;After compiling, simply package test/InventoryCheckBean.class into a WAR file under WEB-INF/classes.  No other files are needed.&lt;br /&gt;&lt;pre&gt;/tmp &amp;gt; jar tf $owd/inventory.war&lt;br /&gt;META-INF/&lt;br /&gt;META-INF/MANIFEST.MF&lt;br /&gt;WEB-INF/&lt;br /&gt;WEB-INF/classes/&lt;br /&gt;WEB-INF/classes/test/&lt;br /&gt;WEB-INF/classes/test/InventoryCheckBean.class&lt;/pre&gt;Deploy this war to any application server that is Java EE 6 compliant.  The timer is activated upon successful deployment, and starts to check the specified site at the specified intervals.  This is so-called automatic timer.&lt;br /&gt;&lt;br /&gt;In the server log file, you will notice these logs:&lt;br /&gt;&lt;pre&gt;[#|2010-04-01T10:50:01.644-0400|INFO|glassfishv3.0||_ThreadID=26;_ThreadName=Thread-1;|&amp;lt;span class="availGreen"&amp;gt;In Stock.&amp;lt;/span&amp;gt;&amp;lt;br/ &amp;gt; Ships from and sold by &amp;lt;b&amp;gt;Amazon.com&amp;lt;/b&amp;gt;. Gift-wrap available.|#]&lt;/pre&gt;Note:&lt;br /&gt;(1) This WAR file contains only an EJB bean class.&lt;br /&gt;&lt;br /&gt;(2) There is no business method in this EJB; only 1 private timer method, which is only invoked by the container after deployment.  So @SuppressWarnings is used to mute any warnings that this method is never used.&lt;br /&gt;&lt;br /&gt;(3) No client action is needed.  Right after deployment, the timer is activated and starts the processing specified in the timer method.&lt;br /&gt;&lt;br /&gt;(4) timezone is optionals and defaults to that of the hosting machine.&lt;br /&gt;&lt;br /&gt;(5) This timer goes off every 20 minutes of every other hour starting from 0 o'clock from Sunday to Friday, and the time is based on America/Los_Angeles timezone.&lt;br /&gt;&lt;br /&gt;Update on 3/4/2011, I deployed the same inventory.war to JBoss AS 6.0, by copying it to $JBOSS_HOME/server/default/deploy, it also worked. No need to change anything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-4921158760553605522?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/4921158760553605522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=4921158760553605522' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4921158760553605522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4921158760553605522'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/04/ejb-31-timer-simple-example.html' title='EJB 3.1 Timer Simple Example'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1975695422524579370</id><published>2010-03-17T11:19:00.010-04:00</published><updated>2011-08-07T18:21:32.151-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><category scheme='http://www.blogger.com/atom/ns#' term='concurrency'/><title type='text'>Simple Asynchronous methods in EJB 3.1</title><content type='html'>EJB 3.1 introduced a simple mechanism for asynchronous invocation.  This post presents such an example with a Singleton session bean and its JUnit test case.  2 styles of asynchronous EJB invocations are used:&lt;br /&gt;&lt;br /&gt;(1) fire-and-forget asynchronous methods having &lt;code&gt;void&lt;/code&gt; return type.&lt;br /&gt;&lt;br /&gt;(2) retrieve-result-later asynchronous methods having &lt;code&gt;Future&amp;lt;?&amp;gt;&lt;/code&gt; return type.&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.util.concurrent.Future;&lt;br /&gt;import javax.ejb.Asynchronous;&lt;br /&gt;import javax.ejb.AsyncResult;&lt;br /&gt;import javax.ejb.Singleton;&lt;br /&gt;&lt;br /&gt;@Singleton&lt;br /&gt;@Asynchronous&lt;br /&gt;public class AsyncBean {&lt;br /&gt;    @Asynchronous  //this line can be omitted&lt;br /&gt;    public void ignoreResult(int a, int b) {&lt;br /&gt;        // the client doesn't care what happens here&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Asynchronous  //this line can be omitted&lt;br /&gt;    public Future&amp;lt;Integer&amp;gt; longProcessing(int a, int b) {&lt;br /&gt;        return new AsyncResult&amp;lt;Integer&amp;gt;(a * b);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;Since the class is annotated with &lt;code&gt;@Asynchronous&lt;/code&gt;, all business methods are asynchronous.  The method-level &lt;code&gt;@Asynchronous&lt;/code&gt; is therefore redundant, and kept there for illustration purpose.&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.util.concurrent.ExecutionException;&lt;br /&gt;import java.util.concurrent.Future;&lt;br /&gt;import javax.ejb.embeddable.EJBContainer;&lt;br /&gt;import javax.naming.Context;&lt;br /&gt;import junit.framework.TestCase;&lt;br /&gt;&lt;br /&gt;public class AsyncBeanTest extends TestCase {&lt;br /&gt;    private EJBContainer container;&lt;br /&gt;    private Context namingContext;&lt;br /&gt;    private AsyncBean asyncBean;&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    protected void setUp() throws Exception {&lt;br /&gt;        super.setUp();&lt;br /&gt;        container = EJBContainer.createEJBContainer();&lt;br /&gt;        namingContext = container.getContext();&lt;br /&gt;        asyncBean = (AsyncBean) namingContext.lookup("java:global/testApp/AsyncBean");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    protected void tearDown() throws Exception {&lt;br /&gt;        super.tearDown();&lt;br /&gt;        container.close();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public final void testIgnoreResult() {&lt;br /&gt;        asyncBean.ignoreResult(0, 0); // fire and forget&lt;br /&gt;        System.out.println("Proceed without waiting for the async method result.");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public final void testLongProcessing() throws InterruptedException, ExecutionException {&lt;br /&gt;        Future&amp;lt;Integer&amp;gt; futureResult = asyncBean.longProcessing(8, 9);&lt;br /&gt;        System.out.println("Proceed to other tasks and check async method result later.");&lt;br /&gt;        Integer intResult = futureResult.get();&lt;br /&gt;        System.out.println("The prior async method returned " + intResult);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;I've tested this example with GlassFish V3 in its embedded mode.  It should work with any Java EE 6 application servers as well.  The configureation (classpath, outputDir, etc) and how to run it are the same as &lt;a href="http://javahowto.blogspot.com/2009/12/ejb-lite-testing-with-junit-and.html"&gt;EJB Lite testing with JUnit and embeddable container&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1975695422524579370?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1975695422524579370/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1975695422524579370' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1975695422524579370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1975695422524579370'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/03/simple-asynchronous-methods-in-ejb-31.html' title='Simple Asynchronous methods in EJB 3.1'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-6036905967996860634</id><published>2010-03-10T17:03:00.005-05:00</published><updated>2010-04-14T18:04:22.309-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><title type='text'>How to trim ant property string value</title><content type='html'>When writing ant build files, I often need to trim the string value of an ant property.  But I couldn't find a simple task to do that.  So I wrote the following ant macrodef for this purpose.  In short, it saves the property value into a temp file, trims lines while moving the file, and loads the file back into a new property.&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;project basedir="." default="trim" name="test"&amp;gt;&lt;br /&gt; &amp;lt;target name="trim"&amp;gt;&lt;br /&gt;   &amp;lt;trim input="${text}" property="text.trimmed" /&amp;gt;&lt;br /&gt;   &amp;lt;echo message="original text='${text}'" /&amp;gt;&lt;br /&gt;   &amp;lt;echo message="trimmed  text='${text.trimmed}'" /&amp;gt;&lt;br /&gt; &amp;lt;/target&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;macrodef name="trim"&amp;gt;&lt;br /&gt;   &amp;lt;attribute name="input" /&amp;gt;&lt;br /&gt;   &amp;lt;attribute name="property" /&amp;gt;&lt;br /&gt;   &amp;lt;sequential&amp;gt;&lt;br /&gt;     &amp;lt;tempfile property="temp.file" /&amp;gt;&lt;br /&gt;     &amp;lt;echo file="${temp.file}" message="@{input}" /&amp;gt;&lt;br /&gt;     &amp;lt;move file="${temp.file}" tofile="${temp.file}.2"&amp;gt;&lt;br /&gt;       &amp;lt;filterchain&amp;gt;&lt;br /&gt;         &amp;lt;trim/&amp;gt;&lt;br /&gt;       &amp;lt;/filterchain&amp;gt;&lt;br /&gt;     &amp;lt;/move&amp;gt;&lt;br /&gt;     &amp;lt;loadfile property="@{property}" srcFile="${temp.file}.2" /&amp;gt;&lt;br /&gt;     &amp;lt;delete file="${temp.file}.2" failonerror="false" /&amp;gt;&lt;br /&gt;   &amp;lt;/sequential&amp;gt;&lt;br /&gt; &amp;lt;/macrodef&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;/pre&gt;To run this target:&lt;pre&gt;/tmp &amp;gt; ant -Dtext=' a b c '&lt;br /&gt;Buildfile: build.xml&lt;br /&gt;&lt;br /&gt;trim:&lt;br /&gt;    [move] Moving 1 file to /tmp&lt;br /&gt;  [delete] Deleting: /tmp/null1355243589.2&lt;br /&gt;    [echo] original text=' a b c '&lt;br /&gt;    [echo] trimmed  text='a b c'&lt;br /&gt;&lt;br /&gt;BUILD SUCCESSFUL&lt;br /&gt;Total time: 0 seconds&lt;/pre&gt;The ant macro named trim declares the trim operation, while the trim target shows an example of calling the trim macro.&lt;br /&gt;&lt;br /&gt;There are other solutions to achive the same result, e.g., write a custom ant task, or use ant-contrib tasks.  But the advantage of this sample is that it only uses built-in ant tasks and no other library jars are needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-6036905967996860634?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/6036905967996860634/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=6036905967996860634' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6036905967996860634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6036905967996860634'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2010/03/how-to-trim-ant-property-string-value.html' title='How to trim ant property string value'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-4768586032378440505</id><published>2009-12-16T13:17:00.015-05:00</published><updated>2010-04-14T18:04:34.939-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JNDI'/><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><title type='text'>Portable JNDI names in EJB 3.1</title><content type='html'>Java EE 6 made some efforts to standardize JNDI names at global,application, and module levels. Now EJB deployed to EJB-3.1-capable server will have various standard JNDI names registered. EJB 3.1 spec defines the following 3 levels of JNDI names for EJB:&lt;br /&gt;&lt;br /&gt;Global JNDI name:&lt;pre&gt;java:global[/&amp;lt;app-name&amp;gt;]/&amp;lt;module-name&amp;gt;/&amp;lt;bean-name&amp;gt;[!&amp;lt;fully-quali-fied-interface-name&amp;gt;]&lt;/pre&gt;Application-scope JNDI name:&lt;br /&gt;&lt;pre&gt;java:app/&amp;lt;module-name&amp;gt;/&amp;lt;bean-name&amp;gt;[!&amp;lt;fully-qualified-interface-name&amp;gt;]&lt;br /&gt;&lt;/pre&gt;Module-scope JNDI name:&lt;br /&gt;&lt;pre&gt;java:module/&amp;lt;bean-name&amp;gt;[!&amp;lt;fully-qualified-interface-name&amp;gt;]&lt;/pre&gt;The following exampels shows various EJB JNDI names, depending upon how the EJB is packaged, its business interface(s), and bean class:&lt;br /&gt;&lt;br /&gt;Bean class: &lt;code&gt;test.TestBean&lt;/code&gt;&lt;br /&gt;business interface: none&lt;table border="1" width="100%"&gt;&lt;tbody&gt;&lt;tr style="font-weight: bold;" valign="TOP"&gt;&lt;td width="17%"&gt;How the EJB is packaged&lt;/td&gt;&lt;br /&gt;          &lt;td width="31%"&gt;&lt;p&gt;Global JNDI names&lt;/p&gt;&lt;/td&gt;&lt;br /&gt;          &lt;td width="28%"&gt;&lt;br /&gt;                  Application-scope JND names&lt;br /&gt;          &lt;/td&gt;&lt;br /&gt;          &lt;td width="24%"&gt;&lt;br /&gt;                  Module-scope JNDI names&lt;br /&gt;          &lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;  &lt;tr valign="TOP"&gt;&lt;br /&gt;          &lt;td width="17%"&gt;&lt;br /&gt;          in testEJB.jar inside testApp.ear&lt;br /&gt;          &lt;/td&gt;&lt;br /&gt;          &lt;td width="31%"&gt;&lt;br /&gt;          java:global/testApp/testEJB/TestBean&lt;br /&gt;             &lt;br /&gt;                  &lt;p&gt;java:global/testApp/testEJB/TestBean!test.TestBean&lt;/p&gt;               &lt;/td&gt;&lt;br /&gt;          &lt;td width="28%"&gt;&lt;br /&gt;                  &lt;p style="margin-bottom: 0.2in;"&gt;java:app/testEJB/TestBean&lt;/p&gt;                       &lt;p&gt;java:app/testEJB/TestBean!test.TestBean&lt;/p&gt;&lt;br /&gt;          &lt;/td&gt;&lt;br /&gt;          &lt;td width="24%"&gt;&lt;br /&gt;                  &lt;p style="margin-bottom: 0.2in;"&gt;java:module/TestBean&lt;/p&gt;&lt;br /&gt;                                         &lt;p&gt;java:module/TestBean!test.TestBean&lt;/p&gt;               &lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;  &lt;tr valign="TOP"&gt;&lt;br /&gt;          &lt;td width="17%"&gt;&lt;br /&gt;                  &lt;p&gt;in testWeb.war&lt;/p&gt;&lt;br /&gt;          &lt;/td&gt;&lt;br /&gt;          &lt;td width="31%"&gt;&lt;br /&gt;                  &lt;p style="margin-bottom: 0.2in;"&gt;java:global/testWeb/TestBean&lt;/p&gt;                       &lt;p&gt;java:global/testWeb/TestBean!test.TestBean&lt;/p&gt;               &lt;/td&gt;&lt;br /&gt;          &lt;td width="28%"&gt;&lt;br /&gt;                  &lt;p style="margin-bottom: 0.2in;"&gt;java:app/testWeb/TestBean&lt;/p&gt;                       &lt;p&gt;java:app/testWeb/TestBean!test.TestBean&lt;/p&gt;               &lt;/td&gt;&lt;br /&gt;          &lt;td width="24%"&gt;&lt;br /&gt;                  &lt;p style="margin-bottom: 0.2in;"&gt;java:module/TestBean&lt;/p&gt;&lt;br /&gt;                  &lt;p&gt;java:module/TestBean!test.TestBean&lt;/p&gt;&lt;br /&gt;          &lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;  &lt;tr valign="TOP"&gt;&lt;br /&gt;          &lt;td width="17%"&gt;&lt;br /&gt;                  &lt;p&gt;in testEJB.jar&lt;/p&gt;&lt;br /&gt;          &lt;/td&gt;&lt;br /&gt;          &lt;td width="31%"&gt;&lt;br /&gt;                  &lt;p style="margin-bottom: 0.2in;"&gt;java:global/testEJB/TestBean&lt;/p&gt;                       &lt;p&gt;java:global/testEJB/TestBean!test.TestBean&lt;/p&gt;&lt;br /&gt;          &lt;/td&gt;&lt;br /&gt;          &lt;td width="28%"&gt;&lt;br /&gt;                  &lt;p style="margin-bottom: 0.2in;"&gt;java:app/testEJB/TestBean&lt;/p&gt;                       &lt;p&gt;java:app/testEJB/TestBean!test.TestBean&lt;/p&gt;&lt;br /&gt;          &lt;/td&gt;&lt;br /&gt;          &lt;td width="24%"&gt;&lt;br /&gt;                  &lt;p style="margin-bottom: 0.2in;"&gt;java:module/TestBean&lt;/p&gt;&lt;br /&gt;                  &lt;p&gt;java:module/TestBean!test.TestBean&lt;/p&gt;&lt;br /&gt;          &lt;/td&gt;&lt;br /&gt;  &lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-4768586032378440505?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/4768586032378440505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=4768586032378440505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4768586032378440505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4768586032378440505'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/12/portable-jndi-names-in-ejb-31.html' title='Portable JNDI names in EJB 3.1'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-5327076349225730208</id><published>2009-12-10T13:11:00.014-05:00</published><updated>2011-03-28T09:56:00.079-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>EJB Lite testing with JUnit and embeddable container</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_GUaFO77rw-w/SyFBr2nJ81I/AAAAAAAAB7U/PES9Tupo6Uo/s1600-h/ejblite-junit-run.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 320px; height: 137px;" src="http://4.bp.blogspot.com/_GUaFO77rw-w/SyFBr2nJ81I/AAAAAAAAB7U/PES9Tupo6Uo/s320/ejblite-junit-run.png" alt="" id="BLOGGER_PHOTO_ID_5413680448725971794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;In EJB 3.1, one can unit-test EJB using standadard EJB API, JUnit, and outside any application server.  This is how I created an Eclipse java project to unit-test a simple EJB with GlassFish v3.&lt;br /&gt;&lt;br /&gt;1. inside Eclipse, create a new java project, named &lt;code&gt;ejblite&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Build path: &lt;code&gt;$GLASSFISH_HOME/lib/embedded/glassfish-embedded-static-shell.jar $GLASSFISH_HOME/modules/javax.ejb.jar&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Output dir: testApp (it is used in global jndi name in the test)&lt;br /&gt;&lt;br /&gt;2. create a new java class named &lt;code&gt;TestBean&lt;/code&gt;:&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import javax.ejb.Stateless;&lt;br /&gt;&lt;br /&gt;@Stateless&lt;br /&gt;public class TestBean {&lt;br /&gt;public int add(int a, int b) {&lt;br /&gt;   return a + b;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public int multiply(int a, int b) {&lt;br /&gt;   return a * b;&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;3. select &lt;code&gt;TestBean.java&lt;/code&gt; in the package panel, create a new JUnit Test Case (File -&gt; New -&gt; JUnit Test Case).  Choose TestBean as the test target, and the test method for both business methods (add and multiply) will be generated, along with setUp and tearDown.&lt;br /&gt;&lt;br /&gt;4. modify the test case:&lt;pre&gt;package test;&lt;br /&gt;&lt;br /&gt;import javax.ejb.embeddable.EJBContainer;&lt;br /&gt;import javax.naming.Context;&lt;br /&gt;&lt;br /&gt;import junit.framework.TestCase;&lt;br /&gt;&lt;br /&gt;public class TestBeanTest extends TestCase {&lt;br /&gt;private EJBContainer container;&lt;br /&gt;private Context namingContext;&lt;br /&gt;private TestBean testBean;&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void setUp() throws Exception {&lt;br /&gt;   super.setUp();&lt;br /&gt;   container = EJBContainer.createEJBContainer();&lt;br /&gt;   namingContext = container.getContext();&lt;br /&gt;   testBean = (TestBean) namingContext.lookup("java:global/testApp/TestBean");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;protected void tearDown() throws Exception {&lt;br /&gt;   super.tearDown();&lt;br /&gt;   namingContext.close();&lt;br /&gt;   container.close();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Test method for {@link test.TestBean#add(int, int)}.&lt;br /&gt;*/&lt;br /&gt;public final void testAdd() {&lt;br /&gt;   int a = 1, b = 2, expected = a + b;&lt;br /&gt;   assertEquals(expected, testBean.add(a, b));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt;* Test method for {@link test.TestBean#multiply(int, int)}.&lt;br /&gt;*/&lt;br /&gt;public final void testMultiply() {&lt;br /&gt;   int a = 1, b = 2, expected = a * b;&lt;br /&gt;   assertEquals(expected, testBean.multiply(a, b));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;5. select TestBeanTest class, and run it as JUnit test.&lt;br /&gt;&lt;br /&gt;Our EJB classes all reside under &lt;code&gt;testApp&lt;/code&gt; directory (the output dir of the current project), and &lt;code&gt;testApp&lt;/code&gt; is also used as the module-name for the current EJB app.  If you choose to use a different output dir value, you will also need to change the global jndi-name accordingly.&lt;br /&gt;&lt;br /&gt;If you are interested in using DataSource and JPA in EJB embeddable, check out &lt;a href="http://javahowto.blogspot.com/2011/02/ejb-lite-jpa-datasource-embedded-in.html"&gt;EJB lite, JPA, DataSource embedded in java application.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-5327076349225730208?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/5327076349225730208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=5327076349225730208' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5327076349225730208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5327076349225730208'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/12/ejb-lite-testing-with-junit-and.html' title='EJB Lite testing with JUnit and embeddable container'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_GUaFO77rw-w/SyFBr2nJ81I/AAAAAAAAB7U/PES9Tupo6Uo/s72-c/ejblite-junit-run.png' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-8805087261008875825</id><published>2009-12-08T15:50:00.008-05:00</published><updated>2010-01-21T10:15:37.868-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><title type='text'>A sample EJB 3.1 Lite client</title><content type='html'>EJB Lite is a lightweight subset of EJB 3.1, including the support for running EJB container embedded in the current java application.  So one can run EJB without appserver.  The following sample contains a no-interface stateless EJB, and a java application that looks up and invokes the EJB.&lt;br /&gt;&lt;br /&gt;1. project structure:&lt;pre&gt;mkdir -p ejblite/src/test&lt;br /&gt;mkdir -p ejblite/testApp&lt;/pre&gt;&lt;br /&gt;2. go to ejblite/src/test, and edit 2 java files:&lt;br /&gt;&lt;pre&gt;-------------&lt;br /&gt;TestBean.java&lt;br /&gt;-------------&lt;br /&gt;&lt;br /&gt;package test;&lt;br /&gt;import javax.ejb.Stateless;&lt;br /&gt;&lt;br /&gt;@Stateless&lt;br /&gt;public class TestBean {&lt;br /&gt;  public String hello(String name) {&lt;br /&gt;      return "Hello, " + name;&lt;br /&gt;  } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-----------&lt;br /&gt;Client.java&lt;br /&gt;-----------&lt;br /&gt;&lt;br /&gt;package test;&lt;br /&gt;&lt;br /&gt;import javax.ejb.embeddable.EJBContainer;&lt;br /&gt;import javax.naming.Context;&lt;br /&gt;import javax.naming.NamingException;&lt;br /&gt;&lt;br /&gt;public class Client {&lt;br /&gt;  public static void main(String args[]) throws NamingException {&lt;br /&gt;        EJBContainer container = null;&lt;br /&gt;        try {&lt;br /&gt;            container = EJBContainer.createEJBContainer();&lt;br /&gt;            Context namingContext = container.getContext();&lt;br /&gt;            TestBean testBean = (TestBean) namingContext.lookup(&lt;br /&gt;                    "java:global/testApp/TestBean");&lt;br /&gt;            String hi = testBean.hello("client");&lt;br /&gt;            System.out.println("testBean.hello method returned: " + hi);&lt;br /&gt;        } finally {&lt;br /&gt;            if(container != null) {&lt;br /&gt;                container.close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;3. compile and run from src/test directory, using GlassFish v3:&lt;br /&gt;&lt;pre&gt;javac -d ../../testApp/ -cp $GLASSFISH_HOME/lib/embedded/glassfish-embedded-static-shell.jar:../../classes Client.java TestBean.java&lt;br /&gt;&lt;br /&gt;java -cp $GLASSFISH_HOME/lib/embedded/glassfish-embedded-static-shell.jar:../../testApp test.Client&lt;br /&gt;&lt;/pre&gt;You will see the following output, when running with GlassFish v3:&lt;br /&gt;&lt;pre&gt;Dec 8, 2009 3:47:45 PM com.sun.enterprise.v3.server.AppServerStartup run&lt;br /&gt;INFO: GlassFish v3 (74.2) startup time : Embedded(1246ms) startup services(511ms) total(1757ms)&lt;br /&gt;Dec 8, 2009 3:47:45 PM org.glassfish.admin.mbeanserver.JMXStartupService$JMXConnectorsStarterThread run&lt;br /&gt;INFO: JMXStartupService: JMXConnector system is disabled, skipping.&lt;br /&gt;Dec 8, 2009 3:47:46 PM com.sun.enterprise.transaction.JavaEETransactionManagerSimplified initDelegates&lt;br /&gt;INFO: Using com.sun.enterprise.transaction.jts.JavaEETransactionManagerJTSDelegate as the delegate&lt;br /&gt;Dec 8, 2009 3:47:46 PM AppServerStartup run&lt;br /&gt;INFO: [Thread[GlassFish Kernel Main Thread,5,main]] started&lt;br /&gt;Dec 8, 2009 3:47:47 PM com.sun.enterprise.security.SecurityLifecycle &amp;lt;init&amp;gt;&lt;br /&gt;INFO: security.secmgroff&lt;br /&gt;Dec 8, 2009 3:47:47 PM com.sun.enterprise.security.SecurityLifecycle onInitialization&lt;br /&gt;INFO: Security startup service called&lt;br /&gt;Dec 8, 2009 3:47:47 PM com.sun.enterprise.security.PolicyLoader loadPolicy&lt;br /&gt;INFO: policy.loading&lt;br /&gt;Dec 8, 2009 3:47:47 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate&lt;br /&gt;INFO: Realm admin-realm of classtype com.sun.enterprise.security.auth.realm.file.FileRealm successfully created.&lt;br /&gt;Dec 8, 2009 3:47:47 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate&lt;br /&gt;INFO: Realm file of classtype com.sun.enterprise.security.auth.realm.file.FileRealm successfully created.&lt;br /&gt;Dec 8, 2009 3:47:47 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate&lt;br /&gt;INFO: Realm certificate of classtype com.sun.enterprise.security.auth.realm.certificate.CertificateRealm successfully created.&lt;br /&gt;Dec 8, 2009 3:47:47 PM com.sun.enterprise.security.SecurityLifecycle onInitialization&lt;br /&gt;INFO: Security service(s) started successfully....&lt;br /&gt;Dec 8, 2009 3:47:48 PM com.sun.ejb.containers.BaseContainer initializeHome&lt;br /&gt;INFO: Portable JNDI names for EJB TestBean : [java:global/testApp/TestBean!test.TestBean, java:global/testApp/TestBean]&lt;br /&gt;testBean.hello method returned: Hello, client&lt;br /&gt;Dec 8, 2009 3:47:48 PM org.glassfish.admin.mbeanserver.JMXStartupService shutdown&lt;br /&gt;INFO: JMXStartupService and JMXConnectors have been shut down.&lt;br /&gt;Dec 8, 2009 3:47:48 PM com.sun.enterprise.v3.server.AppServerStartup stop&lt;br /&gt;INFO: Shutdown procedure finished&lt;br /&gt;Dec 8, 2009 3:47:48 PM AppServerStartup run&lt;br /&gt;INFO: [Thread[GlassFish Kernel Main Thread,5,main]] exiting&lt;/pre&gt;It's a good practice to close the EJB container before program exists, to avoid any resource leaking.  It's more easily handled in JUnit tearDown method.  See my follow-up post &lt;a href="http://javahowto.blogspot.com/2009/12/ejb-lite-testing-with-junit-and.html"&gt;EJB Lite testing with JUnit and embeddable container&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-8805087261008875825?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/8805087261008875825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=8805087261008875825' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8805087261008875825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8805087261008875825'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/12/sample-ejb-31-lite-client.html' title='A sample EJB 3.1 Lite client'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7154106304291899103</id><published>2009-12-08T11:08:00.004-05:00</published><updated>2010-04-14T18:04:53.900-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JNDI'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaEE'/><title type='text'>How to get module name and app name</title><content type='html'>Java EE 6 brings an easy and portable way to get the module name and application name of the current app, using &lt;code&gt;@Resource&lt;/code&gt; field injection or lookup:&lt;br /&gt;&lt;pre&gt;    @Resource(lookup="java:module/ModuleName")&lt;br /&gt;   private String moduleName;&lt;br /&gt;      &lt;br /&gt;   @Resource(lookup="java:app/AppName")&lt;br /&gt;   private String appName;&lt;br /&gt;&lt;/pre&gt;The above code can be in any Java EE component classes, such as servlet, servlet filter, web listener class, JSP tag handler class, JSF managed bean, EJB bean class, interceptor class, application client main class, and their super classes as well.&lt;br /&gt;&lt;br /&gt;You can also look up the module name and app name by their reserved jndi names:&lt;br /&gt;&lt;pre&gt;//look up inside a method&lt;br /&gt;String mname = (String) initialContext.lookup("java:module/ModuleName");&lt;br /&gt;String anmae = (String) initialContext.lookup("java:app/AppName");&lt;br /&gt;&lt;/pre&gt;If you only need moduleName or appName in a particular method, I feel looking them up on-demand is slightly better.&lt;br /&gt;&lt;br /&gt;From Java EE 6 forward, the default module name is the base name of a WAR, ejb-jar, or application client jar, that is, the jar name without the .war and .jar extension.  One can customize it in descriptors (web.xml, ejb-jar.xml, application-client.xml), though this is rarely needed.&lt;br /&gt;&lt;br /&gt;The default app name is the basename of a EAR, i.e., the EAR name without the .ear extension.  One can customize it in application.xml.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7154106304291899103?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7154106304291899103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7154106304291899103' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7154106304291899103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7154106304291899103'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/12/how-to-get-module-name-and-app-name.html' title='How to get module name and app name'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-3694813377155705562</id><published>2009-10-14T08:54:00.004-04:00</published><updated>2009-10-19T09:05:26.954-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaEE'/><title type='text'>A sample application-client.xml (Java EE 5)</title><content type='html'>Application client is another type of Java EE module, the least utilized one.  It attempts to wrap up Java SE application, deploy it to application server, and make use of deployed EJB, platform services and resources.&lt;br /&gt;&lt;br /&gt;The following application-client.xml declares an env-entry, ejb-ref and resource-ref.&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;application-client xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application-client_5.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;display-name&amp;gt;A sample application client&amp;lt;/display-name&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;env-entry&amp;gt;&lt;br /&gt;   &amp;lt;description&amp;gt;admin email&amp;lt;/description&amp;gt;&lt;br /&gt;   &amp;lt;env-entry-name&amp;gt;adminEmail&amp;lt;/env-entry-name&amp;gt;&lt;br /&gt;   &amp;lt;env-entry-value&amp;gt;admin@example.x&amp;lt;/env-entry-value&amp;gt;&lt;br /&gt; &amp;lt;/env-entry&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;ejb-ref&amp;gt;&lt;br /&gt;   &amp;lt;ejb-ref-name&amp;gt;ejb/testBean&amp;lt;/ejb-ref-name&amp;gt;&lt;br /&gt;   &amp;lt;remote&amp;gt;test.TestRemoteInterface&amp;lt;/remote&amp;gt;&lt;br /&gt;   &amp;lt;ejb-link&amp;gt;TestBean&amp;lt;/ejb-link&amp;gt;&lt;br /&gt; &amp;lt;/ejb-ref&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;resource-ref&amp;gt;&lt;br /&gt;   &amp;lt;res-ref-name&amp;gt;HRDS&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;   &amp;lt;res-type&amp;gt;javax.sql.DataSource&amp;lt;/res-type&amp;gt;&lt;br /&gt;   &amp;lt;mapped-name&amp;gt;jdbc/__default&amp;lt;/mapped-name&amp;gt;&lt;br /&gt; &amp;lt;/resource-ref&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/application-client&amp;gt;&lt;/pre&gt;The env-entry can be looked up with name "java:comp/env/adminEmail", or injected into the application client main class or its superclasses.  For example:&lt;pre&gt;@Resource(name="adminEmail")&lt;br /&gt;//use static modifier in application client main class only&lt;br /&gt;private static String adminEmail;&lt;/pre&gt;The ejb-ref and resource-ref can be looked up with names "java:comp/ejb/testBean" and "java:comp/env/HRDS", respectively.&lt;br /&gt;&lt;br /&gt;The reason I include ejb-ref and resource-ref is to show how they fit in descriptors.  In Java EE 5 and later, it is easier to use @EJB and @Resource to declare and inject them into component classes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-3694813377155705562?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/3694813377155705562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=3694813377155705562' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3694813377155705562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3694813377155705562'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/10/sample-application-clientxml-java-ee-5.html' title='A sample application-client.xml (Java EE 5)'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7629682589440486421</id><published>2009-10-13T13:02:00.005-04:00</published><updated>2011-06-02T22:08:03.759-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaEE'/><title type='text'>A sample application.xml (Java EE 5 and Java EE 6)</title><content type='html'>The following is a sample application.xml that declares 3 modules (application client, ejb jar, and war), and a library directory.  The &lt;code&gt;library-directory&lt;/code&gt; element is redundant here since the default value is "lib".&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;application xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;module&amp;gt;&lt;br /&gt; &amp;lt;java&amp;gt;test-client.jar&amp;lt;/java&amp;gt;&lt;br /&gt;&amp;lt;/module&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;module&amp;gt;&lt;br /&gt; &amp;lt;ejb&amp;gt;test-ejb.jar&amp;lt;/ejb&amp;gt;&lt;br /&gt;&amp;lt;/module&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;module&amp;gt;&lt;br /&gt; &amp;lt;web&amp;gt;&lt;br /&gt;   &amp;lt;web-uri&amp;gt;test.war&amp;lt;/web-uri&amp;gt;&lt;br /&gt;   &amp;lt;context-root&amp;gt;test&amp;lt;/context-root&amp;gt;&lt;br /&gt; &amp;lt;/web&amp;gt;&lt;br /&gt;&amp;lt;/module&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;library-directory&amp;gt;lib&amp;lt;/library-directory&amp;gt;&lt;br /&gt;&amp;lt;/application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Java EE 6 application.xml:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;  version="6" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;application-name&amp;gt;test-app&amp;lt;/application-name&amp;gt;&lt;br /&gt;  &amp;lt;initialize-in-order&amp;gt;true&amp;lt;/initialize-in-order&amp;gt;&lt;br /&gt;  &amp;lt;module&amp;gt;&lt;br /&gt;    &amp;lt;web&amp;gt;&lt;br /&gt;      &amp;lt;web-uri&amp;gt;test-web.war&amp;lt;/web-uri&amp;gt;&lt;br /&gt;      &amp;lt;context-root&amp;gt;test&amp;lt;/context-root&amp;gt;&lt;br /&gt;    &amp;lt;/web&amp;gt;&lt;br /&gt;  &amp;lt;/module&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;module&amp;gt;&lt;br /&gt;    &amp;lt;ejb&amp;gt;test-ejb.jar&amp;lt;/ejb&amp;gt;&lt;br /&gt;  &amp;lt;/module&amp;gt;&lt;br /&gt;  &amp;lt;library-directory&amp;gt;lib&amp;lt;/library-directory&amp;gt;&lt;br /&gt;&amp;lt;/application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7629682589440486421?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7629682589440486421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7629682589440486421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7629682589440486421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7629682589440486421'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/10/sample-applicationxml-java-ee-5.html' title='A sample application.xml (Java EE 5 and Java EE 6)'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-260835276222171464</id><published>2009-10-12T16:27:00.007-04:00</published><updated>2009-12-08T10:10:21.151-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><title type='text'>A sample ejb-jar.xml (EJB 3.0)</title><content type='html'>&lt;code&gt;ejb-jar.xml&lt;/code&gt; is optional starting from EJB 3.0.  Annotations are extensively used to declare metadata in place of descriptor elements.  In certain cases, &lt;code&gt;ejb-jar.xml&lt;/code&gt; is still necessary, and 2 such cases I can think of are the declaration of &lt;code&gt;env-entry&lt;/code&gt; and default interceptor.&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;  version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"&amp;gt;&lt;br /&gt;  &amp;lt;enterprise-beans&amp;gt;&lt;br /&gt;    &amp;lt;session&amp;gt;&lt;br /&gt;      &amp;lt;ejb-name&amp;gt;TestBean&amp;lt;/ejb-name&amp;gt;&lt;br /&gt;      &amp;lt;env-entry&amp;gt;&lt;br /&gt;        &amp;lt;description&amp;gt;admin email&amp;lt;/description&amp;gt;&lt;br /&gt;        &amp;lt;env-entry-name&amp;gt;adminEmail&amp;lt;/env-entry-name&amp;gt;&lt;br /&gt;        &amp;lt;env-entry-value&amp;gt;admin@example.x&amp;lt;/env-entry-value&amp;gt;&lt;br /&gt;      &amp;lt;/env-entry&amp;gt;&lt;br /&gt;    &amp;lt;/session&amp;gt;&lt;br /&gt;  &amp;lt;/enterprise-beans&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;interceptors&amp;gt;&lt;br /&gt;    &amp;lt;interceptor&amp;gt;&lt;br /&gt;      &amp;lt;interceptor-class&amp;gt;test.Interceptor1&amp;lt;/interceptor-class&amp;gt;&lt;br /&gt;    &amp;lt;/interceptor&amp;gt;&lt;br /&gt;  &amp;lt;/interceptors&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;assembly-descriptor&amp;gt;&lt;br /&gt;    &amp;lt;interceptor-binding&amp;gt;&lt;br /&gt;      &amp;lt;ejb-name&amp;gt;*&amp;lt;/ejb-name&amp;gt;&lt;br /&gt;      &amp;lt;interceptor-class&amp;gt;test.Interceptor1&amp;lt;/interceptor-class&amp;gt;&lt;br /&gt;    &amp;lt;/interceptor-binding&amp;gt;&lt;br /&gt;  &amp;lt;/assembly-descriptor&amp;gt;&lt;br /&gt;&amp;lt;/ejb-jar&amp;gt;&lt;br /&gt;&lt;/pre&gt;This ejb-jar.xml assumes that TestBean is already annotated with either &lt;code&gt;@Stateless&lt;/code&gt; or &lt;code&gt;@Stateful&lt;/code&gt;.  The descriptor adds a env-entry resource to this session bean's naming environment.  This env-entry can be injected into TestBean class, or looked up in TestBean's naming environment.&lt;br /&gt;&lt;br /&gt;The interceptor-binding element binds Interceptor1 to all EJBs packaged in the current ejb jar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-260835276222171464?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/260835276222171464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=260835276222171464' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/260835276222171464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/260835276222171464'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/10/sample-ejb-jarxml-ejb-30.html' title='A sample ejb-jar.xml (EJB 3.0)'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-4302765344108137780</id><published>2009-10-12T15:24:00.004-04:00</published><updated>2009-10-23T13:20:21.630-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Servlet'/><title type='text'>A minimal sample web.xml (servlet 2.5)</title><content type='html'>A very short web.xml (Servlet 2.5) that declares a servlet and its mapping.  Some elements, like &lt;code&gt;session-config&lt;/code&gt; and &lt;code&gt;welcome-file-list&lt;/code&gt; have reasonable defaults provided by web containers.  &lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" &lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;servlet&amp;gt;&lt;br /&gt;    &amp;lt;display-name&amp;gt;Servlet1&amp;lt;/display-name&amp;gt;&lt;br /&gt;    &amp;lt;servlet-name&amp;gt;Servlet1&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;    &amp;lt;servlet-class&amp;gt;test.Servlet1&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;  &amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;    &amp;lt;servlet-name&amp;gt;Servlet1&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;    &amp;lt;url-pattern&amp;gt;/Servlet1&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;  &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-4302765344108137780?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/4302765344108137780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=4302765344108137780' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4302765344108137780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4302765344108137780'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/10/minimal-sample-webxml-servlet-25.html' title='A minimal sample web.xml (servlet 2.5)'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2230623144397459301</id><published>2009-10-12T13:30:00.005-04:00</published><updated>2009-11-16T09:17:53.538-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Servlet'/><title type='text'>A sample web.xml (servlet 2.5)</title><content type='html'>This is a sample web.xml based on Servlet 2.5 (part of Java EE 5) that declares common elements.  All top-level elements are optional, and can be in any order.&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;context-param&amp;gt;&lt;br /&gt;   &amp;lt;param-name&amp;gt;debug&amp;lt;/param-name&amp;gt;&lt;br /&gt;   &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt; &amp;lt;/context-param&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;session-config&amp;gt;  &amp;lt;!--  10 minutes --&amp;gt;&lt;br /&gt;   &amp;lt;session-timeout&amp;gt;10&amp;lt;/session-timeout&amp;gt;&lt;br /&gt; &amp;lt;/session-config&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;servlet&amp;gt;&lt;br /&gt;   &amp;lt;display-name&amp;gt;Servlet1&amp;lt;/display-name&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;Servlet1&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;servlet-class&amp;gt;test.Servlet1&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;   &amp;lt;init-param&amp;gt;&lt;br /&gt;     &amp;lt;param-name&amp;gt;sleep-time-in-seconds&amp;lt;/param-name&amp;gt;&lt;br /&gt;     &amp;lt;param-value&amp;gt;10&amp;lt;/param-value&amp;gt;&lt;br /&gt;   &amp;lt;/init-param&amp;gt;&lt;br /&gt;   &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;&lt;br /&gt; &amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;Servlet1&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;url-pattern&amp;gt;/Servlet1&amp;lt;/url-pattern&amp;gt;&lt;br /&gt; &amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;env-entry&amp;gt;&lt;br /&gt;   &amp;lt;description&amp;gt;admin email&amp;lt;/description&amp;gt;&lt;br /&gt;   &amp;lt;env-entry-name&amp;gt;adminEmail&amp;lt;/env-entry-name&amp;gt;&lt;br /&gt;   &amp;lt;env-entry-value&amp;gt;admin@example.x&amp;lt;/env-entry-value&amp;gt;&lt;br /&gt; &amp;lt;/env-entry&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;resource-ref&amp;gt;&lt;br /&gt;   &amp;lt;res-ref-name&amp;gt;HRDS&amp;lt;/res-ref-name&amp;gt;&lt;br /&gt;   &amp;lt;res-type&amp;gt;javax.sql.DataSource&amp;lt;/res-type&amp;gt;&lt;br /&gt;   &amp;lt;mapped-name&amp;gt;jdbc/__default&amp;lt;/mapped-name&amp;gt;&lt;br /&gt; &amp;lt;/resource-ref&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;filter&amp;gt;&lt;br /&gt;   &amp;lt;display-name&amp;gt;Filter1&amp;lt;/display-name&amp;gt;&lt;br /&gt;   &amp;lt;filter-name&amp;gt;Filter1&amp;lt;/filter-name&amp;gt;&lt;br /&gt;   &amp;lt;filter-class&amp;gt;Filter1&amp;lt;/filter-class&amp;gt;&lt;br /&gt; &amp;lt;/filter&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;   &amp;lt;filter-name&amp;gt;Filter1&amp;lt;/filter-name&amp;gt;&lt;br /&gt;   &amp;lt;url-pattern&amp;gt;/Filter1&amp;lt;/url-pattern&amp;gt;&lt;br /&gt; &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;filter-mapping&amp;gt;&lt;br /&gt;   &amp;lt;filter-name&amp;gt;Filter1&amp;lt;/filter-name&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;Servlet1&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;   &amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;   &amp;lt;dispatcher&amp;gt;INCLUDE&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;   &amp;lt;dispatcher&amp;gt;ERROR&amp;lt;/dispatcher&amp;gt;&lt;br /&gt; &amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;listener&amp;gt;&lt;br /&gt;   &amp;lt;listener-class&amp;gt;Listener1&amp;lt;/listener-class&amp;gt;&lt;br /&gt; &amp;lt;/listener&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;   &amp;lt;welcome-file&amp;gt;index.html&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;   &amp;lt;welcome-file&amp;gt;index.htm&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;   &amp;lt;welcome-file&amp;gt;index.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;   &amp;lt;welcome-file&amp;gt;default.html&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;   &amp;lt;welcome-file&amp;gt;default.htm&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;   &amp;lt;welcome-file&amp;gt;default.jsp&amp;lt;/welcome-file&amp;gt;&lt;br /&gt; &amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2230623144397459301?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2230623144397459301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2230623144397459301' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2230623144397459301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2230623144397459301'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/10/sample-webxml-servlet-25.html' title='A sample web.xml (servlet 2.5)'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-8168100954066747201</id><published>2009-10-09T17:59:00.005-04:00</published><updated>2009-10-09T18:31:31.160-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Servlet'/><category scheme='http://www.blogger.com/atom/ns#' term='JavaEE'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>Servlet without web.xml</title><content type='html'>One of the new features in Servlet 3.0 is the introduction of annotation to define a servlet, thus making web.xml optional.  The following is a simple web app that only contains a servlet:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. create project directory structure:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;mkdir nowebxml&lt;br /&gt;cd nowebxml/&lt;br /&gt;mkdir -p src/test build/WEB-INF/classes&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;2. create TestServlet.java in src/test&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;cd src/test&lt;br /&gt;-------------------&lt;br /&gt;&lt;br /&gt;package test;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.PrintWriter;&lt;br /&gt;&lt;br /&gt;import javax.ejb.EJB;&lt;br /&gt;import javax.servlet.ServletException;&lt;br /&gt;import javax.servlet.annotation.WebServlet;&lt;br /&gt;import javax.servlet.http.HttpServlet;&lt;br /&gt;import javax.servlet.http.HttpServletRequest;&lt;br /&gt;import javax.servlet.http.HttpServletResponse;&lt;br /&gt;&lt;br /&gt;@WebServlet(urlPatterns = "/TestServlet", loadOnStartup = 1)&lt;br /&gt;public class TestServlet extends HttpServlet {&lt;br /&gt;protected void doGet(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;        throws ServletException, IOException {&lt;br /&gt;    doPost(request, response);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected void doPost(HttpServletRequest request, HttpServletResponse response)&lt;br /&gt;        throws ServletException, IOException {&lt;br /&gt;    PrintWriter writer = response.getWriter();&lt;br /&gt;    writer.println("A servlet without web.xml: " + getServletName());&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;3. compile and package&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;javac -cp "$GLASSFISH_HOME/modules/*" -d ../../build/WEB-INF/classes/ TestServlet.java&lt;br /&gt;&lt;br /&gt;cd ../../build/&lt;br /&gt;&lt;br /&gt;jar cvf nowebxml.war WEB-INF/&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;4. deploy&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;cp nowebxml.war $GLASSFISH_HOME/domains/domain1/autodeploy/&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;5. run TestServlet&lt;/span&gt;&lt;pre&gt;curl http://localhost:8080/nowebxml/TestServlet&lt;br /&gt;A servlet without web.xml: test.TestServlet&lt;/pre&gt;GlassFish V3 is used for deploy and running the test web app, but this web app is portable and should work with any container that supports Servlet 3.0.&lt;br /&gt;&lt;br /&gt;My javac command uses a wildcard in classpath values, which is only supported in Java SE 6 or later.  Classpath wildcard is very convenient, especially in testing.  In addition, Servlet 3.0 is part of Java EE 6, which itself requires Java SE 6.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-8168100954066747201?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/8168100954066747201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=8168100954066747201' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8168100954066747201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8168100954066747201'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/10/servlet-without-webxml.html' title='Servlet without web.xml'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7979572200055784026</id><published>2009-10-09T17:14:00.005-04:00</published><updated>2009-10-09T17:26:20.415-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java/JDK'/><title type='text'>Print array content with Arrays.toString or Arrays.asList</title><content type='html'>When directly printing an array, it gives its element type and hashcode, which is not the desired result in most cases.  A better way is to use java.util.Arrays.toString(), or Arrays.asList() method to print the string representation of the array.&lt;br /&gt;&lt;br /&gt;This test method tries 2 ways of printing the content of a string array:&lt;pre&gt;public final void testPrintArray() {&lt;br /&gt;   final String[] names = {"Linux", "Mac OS X", "Windows", "Solaris", null};&lt;br /&gt;   System.out.println("print names array directly: " + names);&lt;br /&gt;   System.out.println("print names with Arrays.toString(): " + Arrays.toString(names));&lt;br /&gt;   System.out.println("print names with Arrays.asList(): " + Arrays.asList(names));&lt;br /&gt;}&lt;/pre&gt;Test output:&lt;pre&gt;print names array directly: [Ljava.lang.String;@5122cdb6&lt;br /&gt;print names with Arrays.toString(): [Linux, Mac OS X, Windows, Solaris, null]&lt;br /&gt;print names with Arrays.asList(): [Linux, Mac OS X, Windows, Solaris, null]&lt;br /&gt;&lt;/pre&gt;Between the 2 methods, I find toString() is more natural.  Arrays.toString() was introduced in Java 5, somewhat later than Arrays.asList().  &lt;br /&gt;&lt;br /&gt;Also note that a List can take null as element value, and its string representation is "null".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7979572200055784026?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7979572200055784026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7979572200055784026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7979572200055784026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7979572200055784026'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/10/print-array-content-with-arraystostring.html' title='Print array content with Arrays.toString or Arrays.asList'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-3274509679619389451</id><published>2009-04-28T11:32:00.012-04:00</published><updated>2009-06-11T18:26:26.050-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><title type='text'>Use string constants in annotations</title><content type='html'>Generally speaking, string literals should be replaced with string constants in source code.  This rule also holds when it comes to annotation-based resource injections.&lt;br /&gt;&lt;br /&gt;For field or setter injections, any string constants can be declared in the enclosing class.  The following example shows how to declare an env-entry in web.xml and inject it to a servlet class.&lt;span class="Apple-style-span" style="white-space: pre;font-family:-webkit-monospace;font-size:10;"  &gt;  &lt;/span&gt;&lt;pre&gt;public static final String ADMIN_EMAIL = "adminEmail";&lt;br /&gt;&lt;br /&gt;@Resource(name=ADMIN_EMAIL)&lt;br /&gt;private String adminEmail;&lt;br /&gt;&lt;br /&gt;&amp;lt;env-entry&amp;gt;&lt;br /&gt;   &amp;lt;description&amp;gt;admin email&amp;lt;/description&amp;gt;&lt;br /&gt;   &amp;lt;env-entry-name&amp;gt;adminEmail&amp;lt;/env-entry-name&amp;gt;&lt;br /&gt;   &amp;lt;env-entry-value&amp;gt;admin@example.x&amp;lt;/env-entry-value&amp;gt;&lt;br /&gt;&amp;lt;/env-entry&amp;gt;&lt;/pre&gt;The name attribute is mandatory and used to match this injection to the appropriate env-entry in web.xml.  This env-entry can be injected into several other classes, and therefore it is desirable to declare its name as a constant.  This string constant may also reside in a separate class (e.g., a Constants class, utility class, or even some interface), depending on how it is used.&lt;br /&gt;&lt;br /&gt;For type-level injections, these string constants must be declared in a separate class in order to be referenced in type-level annotations.  This is probably because any field declarations have not be parsed when type-level annotations in the same class are processed.  The follwoing example shows how to inject a stateful EJB reference at a servlet class level.&lt;pre&gt;import static test.Constants.FOO_EJB_NAME;&lt;br /&gt;import static test.Constants.FOO_EJB_REF_NAME;&lt;br /&gt;&lt;br /&gt;@EJB(name=FOO_EJB_REF_NAME, beanName=FOO_EJB_NAME, beanInterface=FooBean.class)&lt;br /&gt;public class Servlet2 extends HttpServlet {...}&lt;/pre&gt;In the above injection, &lt;code&gt;beanName&lt;/code&gt; is optional only if there is only one EJB with business interface &lt;code&gt;FooBean&lt;/code&gt;, and hence no ambiguity in mapping the EJB reference to target EJB.  &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;beanInterface&lt;/code&gt; attributes are always required when the &lt;code&gt;@EJB&lt;/code&gt; injection is used at type level.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-3274509679619389451?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/3274509679619389451/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=3274509679619389451' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3274509679619389451'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3274509679619389451'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/04/use-string-constants-in-annotations.html' title='Use string constants in annotations'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7393444202644284216</id><published>2009-03-27T14:06:00.007-04:00</published><updated>2009-07-02T11:44:26.893-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Configure default target class name when copying class in Eclipse</title><content type='html'>I often copy a class and paste it into the same package, just as a template for creating another similar class.  This is well supported in both NetBeans and Eclipse.  The small difference between the 2 IDE is in the default name for the target class: NetBeans uses the format "Foo_1", while Eclipse uses "CopyOfFoo".  Since I will never use a class like CopyOfFoo, I prefer the short form used in NetBeans.&lt;br /&gt;&lt;br /&gt;So how to configure the default target class name in Eclipse?  I searched in Eclipse preference to no avail.  A grep through Eclipse installation directory reveals 2 jar files containing the string "CopyOf"&lt;pre&gt;Binary file ./plugins/org.eclipse.jdt.ui_3.4.1.r341_v20080827-1100.jar matches&lt;br /&gt;Binary file ./plugins/org.eclipse.wst.jsdt.ui_1.0.12.v200809172136.jar matches&lt;/pre&gt;The first one looks right.  So I first quit Eclipse, back up &lt;code&gt;plugins/org.eclipse.jdt.ui_3.4.1.r341_v20080827-1100.jar&lt;/code&gt;, expand it to &lt;code&gt;/tmp/eclipse&lt;/code&gt;, and edit the file &lt;code&gt;org/eclipse/jdt/internal/corext/refactoring/refactoring.properties&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Change the value of the following property from CopyOf{0} to the desired value (say X{0}):&lt;pre&gt;- CopyRefactoring_cu_copyOf1=CopyOf{0}&lt;br /&gt;+ CopyRefactoring_cu_copyOf1=X{0}&lt;/pre&gt;Update &lt;code&gt;plugins/org.eclipse.jdt.ui_3.4.1.r341_v20080827-1100.jar&lt;/code&gt; with modified refactoring.properties:&lt;pre&gt;cd /tmp/eclipse&lt;br /&gt;jar uvf $HOME/eclipse/plugins/org.eclipse.jdt.ui_3.4.1.r341_v20080827-1100.jar org/eclipse/jdt/internal/corext/refactoring/refactoring.properties&lt;/pre&gt;Ideally, I wanted to append, rather than prepend, the extra 'X', but it turns out &lt;code&gt;{0}X&lt;/code&gt; is resolved to a file name like &lt;code&gt;Foo.javaX&lt;/code&gt;, not &lt;code&gt;FooX.java&lt;/code&gt;.  So Eclipse refactoring complains about it not being a valid compilation unit.&lt;br /&gt;&lt;br /&gt;Restart Eclipse and see the new default name in action.  These steps have worked for me (my Eclipse is Version 3.4.1), but this should not be the preferred way to configure Eclipse.  I wish it can be configured in preferences.  Any changes to that plugin jar may be overwritten when it is updated from remote repository.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7393444202644284216?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7393444202644284216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7393444202644284216' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7393444202644284216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7393444202644284216'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/03/configure-default-target-class-name.html' title='Configure default target class name when copying class in Eclipse'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-6469913745856405675</id><published>2009-02-13T10:00:00.006-05:00</published><updated>2009-03-02T09:30:56.694-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Unable to copy and paste multiple files in Eclipse project explorer</title><content type='html'>One thing I often do inside a java IDE is to copy files from one package to another.  The IDE (either Eclipse or NetBeans) does the refactoring automatically including renaming the package.  I usually copy multiple files of mixed types (e.g., java source files, ant &lt;code&gt;build.xml&lt;/code&gt; files, &lt;code&gt;web.xml&lt;/code&gt;, etc) in one operation.&lt;br /&gt;&lt;br /&gt;I recently found I can't do that in Eclipse project explorer (3.4.1 ganymede).  I can only copy files of the same content type in one command.  That is, I can copy-paste-refactor multiple java files, or multiple xml files from one package to another.  But it would fail if I try to copy java source files AND xml files.&lt;br /&gt;&lt;br /&gt;It seems the copying part failed.  When I tried to paste files of mixed types, the files copied in the last command were pasted, not the one supposed to have been copied.&lt;br /&gt;&lt;br /&gt;This has been working pretty well in NetBeans 6.1 and 6.5.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-6469913745856405675?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/6469913745856405675/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=6469913745856405675' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6469913745856405675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6469913745856405675'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/02/unable-to-copy-and-paste-multiple-files.html' title='Unable to copy and paste multiple files in Eclipse project explorer'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-8477672954139992891</id><published>2009-02-03T20:56:00.014-05:00</published><updated>2009-03-23T17:26:50.645-04:00</updated><title type='text'>Install subversion 1.5.5 on Ubuntu</title><content type='html'>The latest subversion is 1.5.5 (as of now 2/3/2009), but it's not available yet in Ubuntu repository or web site (svn 1.4.6).    So I tried to install it manually.  I only need the client, not the server, so I would skip those parts that are only for server. I went through the following steps and finally was able to install it.  Take it at your own risk.&lt;br /&gt;&lt;br /&gt;0. Switch (&lt;code&gt;su&lt;/code&gt;) to root.&lt;br /&gt;&lt;br /&gt;1. Go to &lt;a href="http://subversion.tigris.org/getting.html"&gt;http://subversion.tigris.org/getting.html&lt;/a&gt;, and click the link &lt;a href="http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=260&amp;amp;expandFolder=74"&gt;Source Releases Area&lt;/a&gt;.  Download subversion 1.5.5 source archive and the dependency tarball to Desktop (note: 2 separate gz files: &lt;code&gt;subversion-1.5.5.tar.gz &amp;amp; subversion-deps-1.5.5.tar.gz&lt;/code&gt;).  This site also lists binary downloads for various platforms.  I checked Ubuntu and other Linux platforms, but they don't have 1.5.5 yet.&lt;br /&gt;&lt;br /&gt;2. Unpack subversion source and dependency tarballs (note that both must be unpacked inside the same directory)&lt;br /&gt;&lt;pre&gt;cd $HOME/tmp&lt;br /&gt;tar xzvf $HOME/Desktop/subversion-1.5.5.tar.gz&lt;br /&gt;tar xzvf $HOME/Desktop/subversion-deps-1.5.5.tar.gz&lt;/pre&gt;3. Try to configure and install it&lt;br /&gt;&lt;pre&gt;cd $HOME/tmp/subversion-1.5.5&lt;br /&gt;./configure --without-berkeley-db --without-apache --without-neon --without-swig&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;4. If it failed at step 3, most likely some dependencies are still missing.   In my case, openssl is reported missing, though I'm sure openssl is already installed.  Anyway, download and install openssl. It should be straight-forward to install openssl from source:&lt;br /&gt;&lt;br /&gt;Go to &lt;a href="http://openssl.org/"&gt;openssl.org&lt;/a&gt; to download the latest stable version of openssl (currently &lt;code&gt;openssl-0.9.8j&lt;/code&gt;).  Note: OpenSSL 0.9.8 has a problem that can cause SSL negotiation failure (SSL negotiation failed: SSL error: decryption failed or bad record mac).  For more details, see &lt;a href="http://wiki.open.collab.net/wiki/Subversion_Client_FAQ"&gt;http://wiki.open.collab.net/wiki/Subversion_Client_FAQ&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;cd $HOME/tmp&lt;br /&gt;tar xzvf $HOME/Desktop/openssl-0.9.8j.tar.gz&lt;br /&gt;cd openssl-0.9.8j&lt;br /&gt;./config&lt;br /&gt;make&lt;br /&gt;make install&lt;/pre&gt;5. Try installing subversion 1.5.5 again, with &lt;code&gt;--with-openssl=/usr/local/ssl&lt;/code&gt; option, assuming openssl is installed to /usr/local/ssl.&lt;br /&gt;&lt;pre&gt;cd $HOME/tmp/subversion-1.5.5&lt;br /&gt;./configure --without-berkeley-db --without-apache --without-neon&lt;br /&gt;--without-swig --with-openssl=/usr/local/ssl&lt;/pre&gt;6. If it fails due to zlib not present, try installing zlib1g-dev:&lt;br /&gt;&lt;pre&gt;sudo apt-get install zlib1g-dev  (without sudo, if running as root)&lt;/pre&gt;7. Try installing  subversion 1.5.5 again, with --with-zlib=... option:&lt;br /&gt;&lt;pre&gt;./configure --without-berkeley-db --without-apache --without-neon&lt;br /&gt;--without-swig --with-openssl=/usr/local/ssl --with-zlib=/usr/include&lt;/pre&gt;That should do it.  Subversion 1.5.5 (at least the client) has been installed successfully!&lt;br /&gt;&lt;pre&gt;/tmp &amp;gt; which svn&lt;br /&gt;/usr/local/bin/svn&lt;br /&gt;&lt;br /&gt;/tmp &amp;gt; svn  --version&lt;br /&gt;svn, version 1.5.5 (r34862)&lt;br /&gt;compiled Feb  3 2009, 14:23:41&lt;br /&gt;&lt;br /&gt;Copyright (C) 2000-2008 CollabNet.&lt;br /&gt;Subversion is open source software, see http://subversion.tigris.org/&lt;br /&gt;This product includes software developed by CollabNet (http://www.Collab.Net/).&lt;br /&gt;&lt;br /&gt;The following repository access (RA) modules are available:&lt;br /&gt;&lt;br /&gt;* ra_svn : Module for accessing a repository using the svn network protocol.&lt;br /&gt;- handles 'svn' scheme&lt;br /&gt;* ra_local : Module for accessing a repository on local disk.&lt;br /&gt;- handles 'file' scheme&lt;br /&gt;* ra_serf : Module for accessing a repository via WebDAV protocol using serf.&lt;br /&gt;- handles 'http' scheme&lt;br /&gt;- handles 'https' scheme&lt;/pre&gt;&lt;br /&gt;Update: After  using this subversion client for about a month, I found a problem when committing changes to a repository with https.  It only happens when running the commit sub-command using http protocol.  It's probably related to the openssl issue mentioned above.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-8477672954139992891?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/8477672954139992891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=8477672954139992891' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8477672954139992891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8477672954139992891'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/02/install-subversion-155-on-ubuntu.html' title='Install subversion 1.5.5 on Ubuntu'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-6950861170340744822</id><published>2009-02-03T10:52:00.004-05:00</published><updated>2009-02-03T11:14:16.603-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Change svn project to java project in Eclipse</title><content type='html'>I checked out a project from subversion repository using Eclipse (3.4.1 ganymede).  I chose to check it out into a new Eclipse project, but it turned out to be a non-java, svn project was created.  In the project properties, there is no associated builder.  Its .project file looks like this:&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;projectDescription&amp;gt;&lt;br /&gt; &amp;lt;name&amp;gt;project1&amp;lt;/name&amp;gt;&lt;br /&gt; &amp;lt;comment&amp;gt;project1&amp;lt;/comment&amp;gt;&lt;br /&gt; &amp;lt;projects&amp;gt;&lt;br /&gt; &amp;lt;/projects&amp;gt;&lt;br /&gt; &amp;lt;buildSpec&amp;gt;&lt;br /&gt; &amp;lt;/buildSpec&amp;gt;&lt;br /&gt; &amp;lt;natures&amp;gt;&lt;br /&gt; &amp;lt;/natures&amp;gt;&lt;br /&gt;&amp;lt;/projectDescription&amp;gt;&lt;br /&gt;&lt;/pre&gt;Now I want to turn it into a java project so it can be built with a java builder.  I tried a few menus and other places inside Eclipse to no avail.  Then I found I can just edit .project file, and that did the trick.  Close Eclipse before doing these manual editing.&lt;br /&gt;&lt;pre&gt;$HOME/workspace/project1/.project:&lt;br /&gt;----------------------------------&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;projectDescription&amp;gt;&lt;br /&gt; &amp;lt;name&amp;gt;project1&amp;lt;/name&amp;gt;&lt;br /&gt; &amp;lt;comment&amp;gt;project1&amp;lt;/comment&amp;gt;&lt;br /&gt; &amp;lt;projects&amp;gt;&lt;br /&gt; &amp;lt;/projects&amp;gt;&lt;br /&gt; &amp;lt;buildSpec&amp;gt;&lt;br /&gt;  &amp;lt;buildCommand&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;org.eclipse.jdt.core.javabuilder&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;arguments&amp;gt;&lt;br /&gt;   &amp;lt;/arguments&amp;gt;&lt;br /&gt;  &amp;lt;/buildCommand&amp;gt;&lt;br /&gt; &amp;lt;/buildSpec&amp;gt;&lt;br /&gt; &amp;lt;natures&amp;gt;&lt;br /&gt;  &amp;lt;nature&amp;gt;org.eclipse.jdt.core.javanature&amp;lt;/nature&amp;gt;&lt;br /&gt; &amp;lt;/natures&amp;gt;&lt;br /&gt;&amp;lt;/projectDescription&amp;gt;&lt;br /&gt;&lt;/pre&gt;I also added a .classpath file:&lt;br /&gt;&lt;pre&gt;$HOME/workspace/project1/.classpath:&lt;br /&gt;-----------------------------------&lt;/pre&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;classpath&amp;gt;&lt;br /&gt; &amp;lt;classpathentry kind="src" path="src"/&amp;gt;&lt;br /&gt; &amp;lt;classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/&amp;gt;&lt;br /&gt;       &amp;lt;!-- change the default bin directory to classes directory --&amp;gt;&lt;br /&gt; &amp;lt;classpathentry kind="output" path="classes"/&amp;gt;&lt;br /&gt;&amp;lt;/classpath&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Finally, start Eclipse, open project1, and modify its source path, libraries, and other project properties.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-6950861170340744822?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/6950861170340744822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=6950861170340744822' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6950861170340744822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6950861170340744822'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/02/change-svn-project-to-java-project-in.html' title='Change svn project to java project in Eclipse'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-4509800336990593338</id><published>2009-01-01T17:40:00.007-05:00</published><updated>2009-02-02T10:24:55.664-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>NetBeans 6.5 Quick Search Box, Slow Refactoring, and Transfering Repository Index</title><content type='html'>I recently upgraded to NetBeans 6.5 and have been pretty happy with it overall.  These 3 new features you may have also noticed:&lt;br /&gt;&lt;br /&gt;1. There is now a new Quick Search box at the upper right corner, with shortcut key &lt;code&gt;Ctrl-I&lt;/code&gt;.  The pull-down list shows it can search for Types, Actions, Options and help items.  It seems interesting and I should use it more often.&lt;br /&gt;&lt;br /&gt;I usually use Ctrl-O to jump to a class in my projects, which is very fast.  Or use Alt-Shift-O to go to a file (much slower than Ctrl-O).  In NetBeans 6.1, Ctrl-O (go to type) used to show all the useless javascript files except the java classes I was looking for.  Now 6.5 seems to have fixed it.&lt;br /&gt;&lt;br /&gt;2.  Refactoring is extremely slow.  Any refactoring, even renaming a local variable is slow.  The blue progress bar stops at 100% for close to 1 minute in my computer.  NetBeans seems to be searching across all projects and cache and gathering dependency.&lt;br /&gt;&lt;br /&gt;3.  Sometimes at startup, it shows a background task "Transfering Repository Index :Central Repository" (NetBeans typo: it should be Transfe&lt;span style="font-weight: bold;"&gt;rr&lt;/span&gt;ing).  It's not blocking anything but does take quite long to complete.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-4509800336990593338?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/4509800336990593338/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=4509800336990593338' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4509800336990593338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/4509800336990593338'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2009/01/netbeans-65-quick-search-box-slow.html' title='NetBeans 6.5 Quick Search Box, Slow Refactoring, and Transfering Repository Index'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-952543268845335644</id><published>2008-12-31T17:18:00.005-05:00</published><updated>2009-01-12T09:54:41.141-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>GlassFish MySql connection pool with empty password</title><content type='html'>The default mysql database server password is empty, which is convenient in development mode, but turns out to be trouble when creating a jdbc connection pool in GlassFish.  There seems to be no way to specify an empty password either in admingui or asadmin.&lt;br /&gt;&lt;br /&gt;One workaround is to use a temporary password (say, "xxx") when creating the connection pool, stop the domain, open &lt;code&gt;$GLASSFISH_HOME/domains/domain1/config/domain.xml&lt;/code&gt;, and replace "xxx" with ""&lt;br /&gt;&lt;br /&gt;This should work with all versions of GlassFish (v1, v2, and v3).  To do it with script:&lt;br /&gt;&lt;pre&gt;$GLASSFISH_HOME/bin/asadmin start-domain&lt;br /&gt;&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin create-jdbc-connection-pool --datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlXADataSource --property user=root:password=xxx:DatabaseName=test:ServerName=localhost:port=3306 mysql-pool&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin create-jdbc-resource --connectionpoolid mysql-pool jdbc/test&lt;br /&gt;&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin stop-domain&lt;br /&gt;&lt;br /&gt;cd $GLASSFISH_HOME/domains/domain1/config&lt;br /&gt;cat domain.xml | sed "s/xxx//" &amp;gt; domain.xml.replaced&lt;br /&gt;mv domain.xml domain.xml.original&lt;br /&gt;mv domain.xml.replaced domain.xml&lt;br /&gt;&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin start-domain&lt;br /&gt;&lt;/pre&gt;vi/vim is also well suited for this type of search-replace:&lt;br /&gt;&lt;pre&gt;vim domain.xml&lt;br /&gt;/xxx&lt;br /&gt;dw&lt;br /&gt;:wq&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-952543268845335644?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/952543268845335644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=952543268845335644' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/952543268845335644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/952543268845335644'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/12/glassfish-mysql-connection-pool-with.html' title='GlassFish MySql connection pool with empty password'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2507653457033944895</id><published>2008-12-17T08:27:00.013-05:00</published><updated>2009-10-01T17:57:55.884-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java/JDK'/><title type='text'>Pass optional params with varargs</title><content type='html'>Varargs (introduced in Java SE 5) allows you to pass 0, 1, or more params to a method's vararg param.  This reduces the need for overloading methods that do the similar things.  For example,&lt;pre&gt;package javahowto;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.lang.StringUtils;&lt;br /&gt;&lt;br /&gt;public class HelloWorld {&lt;br /&gt;    public static void main(String[] args) {&lt;br /&gt;        hello();&lt;br /&gt;        hello("World");&lt;br /&gt;        hello("Santa", "Bye");&lt;br /&gt;        &lt;br /&gt;        final String[] names = {"John", "Joe"};&lt;br /&gt;        hello(names);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void hello(String... names) {&lt;br /&gt;        final String defaultName = "Duke";&lt;br /&gt;        String msg = "Hello, ";&lt;br /&gt;        msg += ((names.length == 0) ? defaultName : StringUtils.join(names, ", "));&lt;br /&gt;        System.out.println(msg);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;code&gt;org.apache.commons.lang.StringUtils&lt;/code&gt; is in &lt;code&gt;commons-lang-2.4.jar&lt;/code&gt;.  Running this example gives the following output:&lt;pre&gt;Hello, Duke&lt;br /&gt;Hello, World&lt;br /&gt;Hello, Santa, Bye&lt;br /&gt;Hello, John, Joe&lt;br /&gt;BUILD SUCCESSFUL (total time: 0 seconds)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2507653457033944895?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2507653457033944895/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2507653457033944895' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2507653457033944895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2507653457033944895'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/12/pass-optional-params-with-varargs.html' title='Pass optional params with varargs'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-412963720443138303</id><published>2008-12-07T21:52:00.012-05:00</published><updated>2010-08-02T13:05:07.168-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>How to create jdbc connection pool and DataSource in GlassFish</title><content type='html'>Every GlassFish DataSource depends on a connection pool that specifies how to connect to database.  DataSource is just a thin layer on top of a connection pool.  This is different from several other appservers.&lt;br /&gt;&lt;br /&gt;Usually the easiest way is to do it in admin GUI at http://localhost:4848/ , choose Create New JDBC Connection Pools from the Common Tasks list on the front page right after login.  You may need to scroll down a little bit to see it.  On my screen, it is always hidden underneath the panel bottom.  So for a while, I didn't notice its existence and always go to the left panel and choose &lt;code&gt;Resources | JDBC | Connection Pools&lt;/code&gt;, which does the same with more clicks.  The rest steps are self-explanatory.&lt;br /&gt;&lt;br /&gt;For repeated configuration tasks, I prefer using GlassFish command line tool asadmin (&lt;code&gt;$GLASSFISH_HOME/bin/asadmin&lt;/code&gt;).  For example, this is script for creating mysql connection pool and datasource:&lt;br /&gt;&lt;pre&gt;cp $HOME/mysql-connector-java-5.1.5-bin.jar $GLASSFISH_HOME/domains/domain1/lib/ext&lt;br /&gt;&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin stop-domain&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin start-domain&lt;br /&gt;&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin create-jdbc-connection-pool --datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlDataSource --property user=root:password=test:DatabaseName=test:ServerName=localhost:port=3306 test-pool&lt;br /&gt;&lt;br /&gt;$GLASSFISH_HOME/bin/asadmin create-jdbc-resource --connectionpoolid test-pool jdbc/test&lt;br /&gt;&lt;/pre&gt;To create a connection pool that supports distributed transaction, use &lt;code&gt;com.mysql.jdbc.jdbc2.optional.MysqlXADataSource&lt;/code&gt; as datasourceclassname, and set &lt;code&gt;--restype javax.sql.XADataSource&lt;/code&gt; option:&lt;br /&gt;&lt;pre&gt;$GLASSFISH_HOME/bin/asadmin create-jdbc-connection-pool --restype javax.sql.XADataSource --datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlXADataSource --property user=root:password=test:DatabaseName=test:ServerName=localhost:port=3306 test-pool&lt;br /&gt;&lt;/pre&gt;Run &lt;code&gt;asadmin ping-connection-pool test-pool&lt;/code&gt; to verify whether the created connection pool can connect to the database.  The database server needs to be running.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-412963720443138303?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/412963720443138303/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=412963720443138303' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/412963720443138303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/412963720443138303'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/12/how-to-create-jdbc-connection-pool-and.html' title='How to create jdbc connection pool and DataSource in GlassFish'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-8505796807421200846</id><published>2008-12-02T14:58:00.008-05:00</published><updated>2008-12-07T21:46:17.410-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Disable NetBeans httpmonitor in GlassFish</title><content type='html'>I found my GlassFish v2 server.log file is littered with these warning messages:&lt;br /&gt;&lt;pre&gt;WARNING *********** NetBeans HTTP Monitor ************&lt;br /&gt;The request cannot be recorded most likely because the&lt;br /&gt;NetBeans HTTP Server is not running....&lt;/pre&gt;Here is what I just did to disable and completely remove NetBeans httpmonitor from my GlassFish v2:&lt;br /&gt;&lt;br /&gt;1. Open &lt;code&gt;$GLASSFISH_HOME/domains/domain1/config/default-web.xml&lt;/code&gt;, delete or comment out the declaration and mapping for servlet filter &lt;code&gt;HTTPMonitorFilter&lt;/code&gt;.  That is, the following lines:&lt;br /&gt;&lt;pre&gt;&amp;lt;filter&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;HTTPMonitorFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;filter-class&amp;gt;org.netbeans.modules.web.monitor.server.MonitorFilter&amp;lt;/filter-class&amp;gt;&lt;br /&gt;&amp;lt;init-param&amp;gt;&lt;br /&gt; &amp;lt;param-name&amp;gt;netbeans.monitor.ide&amp;lt;/param-name&amp;gt;&lt;br /&gt; &amp;lt;param-value&amp;gt;127.0.0.1:8082&amp;lt;/param-value&amp;gt;&lt;br /&gt;&amp;lt;/init-param&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;br /&gt;&amp;lt;filter-mapping&amp;gt;&lt;br /&gt;&amp;lt;filter-name&amp;gt;HTTPMonitorFilter&amp;lt;/filter-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;INCLUDE&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;dispatcher&amp;gt;ERROR&amp;lt;/dispatcher&amp;gt;&lt;br /&gt;&amp;lt;/filter-mapping&amp;gt;&lt;br /&gt;&lt;/pre&gt;2. Optionally, delete $GLASSFISH_HOME/domains/domain1/lib/org-netbeans-modules-web-httpmonitor.jar.&lt;br /&gt;Since I don't need this httpmonitor, there is no reason to keep this jar.&lt;br /&gt;&lt;br /&gt;3. Redeploy any web applications that was previously deployed when NetBeans HTTPMonitorFilter was in default-web.xml.  This step is needed for apps already deployed, because the generated web.xml already contains HTTPMonitorFilter (inherited from the old default-web.xml), and it will not be regenerated even at server restart.&lt;br /&gt;&lt;br /&gt;That should get rid of this warning messages.  For more technical details, see &lt;a href="http://www.netbeans.org/issues/show_bug.cgi?id=139653"&gt;NetBeans issue 139653&lt;/a&gt; and &lt;a href="https://glassfish.dev.java.net/issues/show_bug.cgi?id=3844"&gt;GlassFish issue 3844&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-8505796807421200846?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/8505796807421200846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=8505796807421200846' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8505796807421200846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8505796807421200846'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/12/disable-netbeans-httpmonitor-in.html' title='Disable NetBeans httpmonitor in GlassFish'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-8525781350799559252</id><published>2008-10-20T11:43:00.011-04:00</published><updated>2008-11-03T09:42:53.861-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>HelloWorld with EclipseLink and MySQL</title><content type='html'>This is a simple example of standalone java application using Java Persistence API (JPA), EclipseLink, and MySql. It consists of an entity class, a main class, and a persistence.xml file. No need to create tables, as they are created and dropped automatically.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;META-INF/persistence.xml&lt;/code&gt; must be at the root of the persistence unit. In my example project, it's located at &lt;code&gt;$HOME/NetBeansProjects/greeting/build/classes/META-INF/persistence.xml&lt;/code&gt;.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"&lt;br /&gt;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt;xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"&amp;gt;&lt;br /&gt;&amp;lt;persistence-unit name="greetingPU" transaction-type="RESOURCE_LOCAL"&amp;gt;&lt;br /&gt;&amp;lt;provider&amp;gt;org.eclipse.persistence.jpa.PersistenceProvider&amp;lt;/provider&amp;gt;&lt;br /&gt;&amp;lt;class&amp;gt;javahowto.Greeting&amp;lt;/class&amp;gt;&lt;br /&gt;&amp;lt;properties&amp;gt;&lt;br /&gt;&amp;lt;property name="eclipselink.jdbc.password" value=""/&amp;gt;&lt;br /&gt;&amp;lt;property name="eclipselink.jdbc.user" value="root"/&amp;gt;&lt;br /&gt;&amp;lt;property name="eclipselink.jdbc.driver" value="com.mysql.jdbc.Driver"/&amp;gt;&lt;br /&gt;&amp;lt;property name="eclipselink.jdbc.url" value="jdbc:mysql://localhost:3306/test"/&amp;gt;&lt;br /&gt;&amp;lt;property name="eclipselink.ddl-generation" value="drop-and-create-tables"/&amp;gt;&lt;br /&gt;&amp;lt;property name="eclipselink.logging.level" value="INFO"/&amp;gt;&lt;br /&gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;&amp;lt;/persistence-unit&amp;gt;&lt;br /&gt;&amp;lt;/persistence&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Entity class (generated by NetBeans 6.1):&lt;br /&gt;&lt;pre&gt;&lt;code&gt;package javahowto;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;import javax.persistence.Basic;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.Id;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class Greeting implements Serializable {&lt;br /&gt;private static final long serialVersionUID = 1L;&lt;br /&gt;&lt;br /&gt;@Id&lt;br /&gt;private Long id;&lt;br /&gt;&lt;br /&gt;@Basic&lt;br /&gt;private String message;&lt;br /&gt;&lt;br /&gt;public Long getId() {&lt;br /&gt;return id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setId(Long id) {&lt;br /&gt;this.id = id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getMessage() {&lt;br /&gt;return message;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setMessage(String message) {&lt;br /&gt;this.message = message;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public int hashCode() {&lt;br /&gt;int hash = 0;&lt;br /&gt;hash += (id != null ? id.hashCode() : 0);&lt;br /&gt;return hash;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public boolean equals(Object object) {&lt;br /&gt;// TODO: Warning - this method won't work in the case the id fields are not set&lt;br /&gt;if (!(object instanceof Greeting)) {&lt;br /&gt; return false;&lt;br /&gt;}&lt;br /&gt;Greeting other = (Greeting) object;&lt;br /&gt;if ((this.id == null &amp;amp;&amp;amp; other.id != null) ||&lt;br /&gt; (this.id != null &amp;amp;&amp;amp; !this.id.equals(other.id))) {&lt;br /&gt; return false;&lt;br /&gt;}&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public String toString() {&lt;br /&gt;return "javahowto.Greeting[id=" + id + ", message='" + getMessage() +&lt;br /&gt;"']";&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Main class:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;package javahowto;&lt;br /&gt;import java.util.logging.Logger;&lt;br /&gt;import javax.persistence.EntityManager;&lt;br /&gt;import javax.persistence.EntityManagerFactory;&lt;br /&gt;import javax.persistence.Persistence;&lt;br /&gt;&lt;br /&gt;public class Main {&lt;br /&gt;private static final Logger logger = Logger.getLogger("javahowto.greeting");&lt;br /&gt;private static final String PERSISTENCE_UNIT_NAME = "greetingPU";&lt;br /&gt;private EntityManagerFactory emf;&lt;br /&gt;private EntityManager em;&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;Main main = new Main();&lt;br /&gt;main.initEntityManager();&lt;br /&gt;main.createAndRead();&lt;br /&gt;main.createAndRollback();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void createAndRead() {&lt;br /&gt;Greeting g = new Greeting();&lt;br /&gt;g.setId(1L);&lt;br /&gt;g.setMessage("hello, createAndRead");&lt;br /&gt;em.getTransaction().begin();&lt;br /&gt;em.persist(g);&lt;br /&gt;em.getTransaction().commit();&lt;br /&gt;&lt;br /&gt;//g should be written to database now.&lt;br /&gt;//Read it from db (no transaction context needed for em.find method)&lt;br /&gt;Greeting g2 = em.find(Greeting.class, g.getId());&lt;br /&gt;logger.info("Greeting " + g.getId() + " from db: " + g2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void createAndRollback() {&lt;br /&gt;Greeting g = new Greeting();&lt;br /&gt;g.setId(2L);&lt;br /&gt;g.setMessage("hello, createAndRollback");&lt;br /&gt;em.getTransaction().begin();&lt;br /&gt;em.persist(g);&lt;br /&gt;em.getTransaction().rollback();&lt;br /&gt;&lt;br /&gt;logger.info("Persisted " + g + ", but the transaction was rolled back.");&lt;br /&gt;Greeting g2 = em.find(Greeting.class, g.getId());&lt;br /&gt;logger.info("Greeting " + g.getId() + " from db: " + g2);  //should be null&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private void initEntityManager() {&lt;br /&gt;emf = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);&lt;br /&gt;em = emf.createEntityManager();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;To compile the project,&lt;br /&gt;&lt;pre&gt;&lt;code&gt;/NetBeansProjects/greeting/src &amp;gt;&lt;br /&gt;javac -d ../build/classes -cp $GLASSFISH_HOME/modules/javax.persistence.jar javahowto/*.java&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Start MySql on localhost, and run the following command.  No need to create the table since our persistence.xml tells EclipseLink to automatically drop and create it.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;/home/javahowto/mysql &gt; bin/mysqld_safe &amp;amp;&lt;br /&gt;&lt;br /&gt;/NetBeansProjects/greeting/build/classes &amp;gt;&lt;br /&gt;java -cp $HOME/tmp/mysql-connector-java-5.1.5-bin.jar:$GLASSFISH_HOME/modules/javax.persistence.jar:$GLASSFISH_HOME/modules/org.eclipse.persistence.jpa.jar:$GLASSFISH_HOME/modules/org.eclipse.persistence.core.jar:. javahowto.Main&lt;br /&gt;&lt;br /&gt;[EL Info]: 2008.10.20 11:56:24.712--ServerSession(4744654)--EclipseLink, version: Eclipse Persistence Services - 1.0.1 (Build 20080905)&lt;br /&gt;[EL Info]: 2008.10.20 11:56:25.163--ServerSession(4744654)--file:/home/javahowto/NetBeansProjects/greeting/build/classes/-greetingPU login successful&lt;br /&gt;Oct 20, 2008 11:56:25 AM javahowto.Main createAndRead&lt;br /&gt;INFO: Greeting 1 from db: javahowto.Greeting[id=1, message='hello, createAndRead']&lt;br /&gt;Oct 20, 2008 11:56:25 AM javahowto.Main createAndRollback&lt;br /&gt;INFO: Persisted javahowto.Greeting[id=2, message='hello, createAndRollback'], but the transaction was rolled back.&lt;br /&gt;Oct 20, 2008 11:56:25 AM javahowto.Main createAndRollback&lt;br /&gt;INFO: Greeting 2 from db: null&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;To stop MySQL server:&lt;br /&gt;&lt;pre&gt;/home/javahowto/mysql &gt; bin/mysqladmin -u root shutdown&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-8525781350799559252?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/8525781350799559252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=8525781350799559252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8525781350799559252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8525781350799559252'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/10/helloworld-with-eclipselink-and-mysql.html' title='HelloWorld with EclipseLink and MySQL'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7662400512205090313</id><published>2008-10-09T11:01:00.010-04:00</published><updated>2009-04-06T14:34:32.935-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><title type='text'>Solve java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy</title><content type='html'>I recently ran into this type of exceptions when experimenting with &lt;a href="https://glassfish.dev.java.net/"&gt;GlassFish V3&lt;/a&gt;.   It turned out the root cause is that a class (&lt;code&gt;HelloInterceptor&lt;/code&gt;) used in type-level &lt;code&gt;@Interceptors&lt;/code&gt; annotation is missing in the WAR file.  Once this class is packaged in the WAR file, it works.  In appservers that support EJB 3.1, EJB can be packaged inside a WAR file.&lt;br /&gt;&lt;pre&gt;@Stateless&lt;br /&gt;@Interceptors(HelloInterceptor.class)&lt;br /&gt;public class HelloBean {&lt;br /&gt;   public String hello(String name) {&lt;br /&gt;       return "Hello, " + name;&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;&lt;a href="file:///usr/lib/jvm/java-6-sun/docs/api/java/lang/ArrayStoreException.html"&gt;ArrayStoreException&lt;/a&gt; has been in Java since JDK 1.0, but this is the first time I saw it.  The javadoc says it is "[t]hrown to indicate that an attempt has been made to store the   wrong type of object into an array of objects."  So it's a low level exception that I would normally catch and shield it from client.&lt;br /&gt;&lt;br /&gt;The stacktrace in server.log is pretty long, repeating the same stacktrace 3-4 times.  In short it looks like this:&lt;br /&gt;&lt;pre&gt;[#|2008-10-09T10:57:39.262-0400|SEVERE|GlassFish10.0|javax.enterprise.system.core|_ThreadID=17;_ThreadName=Thread-4;|&lt;br /&gt;Exception while deploying the app&lt;br /&gt;java.lang.RuntimeException: sun.reflect.annotation.TypeNotPresentExceptionProxy&lt;br /&gt;at org.glassfish.javaee.core.deployment.JavaEEDeployer.loadMetaData(JavaEEDeployer.java:160)&lt;br /&gt;at com.sun.enterprise.v3.server.ApplicationLifecycle.prepare(ApplicationLifecycle.java:436)&lt;br /&gt;at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:180)&lt;br /&gt;at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:314)&lt;br /&gt;at com.sun.enterprise.v3.admin.CommandRunner$2.execute(CommandRunner.java:302)&lt;br /&gt;at com.sun.enterprise.v3.admin.CommandRunner.doCommand(CommandRunner.java:312)&lt;br /&gt;at com.sun.enterprise.v3.admin.CommandRunner.doCommand(CommandRunner.java:135)&lt;br /&gt;at org.glassfish.deployment.autodeploy.AutoOperation.run(AutoOperation.java:122)&lt;br /&gt;at org.glassfish.deployment.autodeploy.AutoDeployer.deploy(AutoDeployer.java:524)&lt;br /&gt;at org.glassfish.deployment.autodeploy.AutoDeployer.deployAll(AutoDeployer.java:410)&lt;br /&gt;at org.glassfish.deployment.autodeploy.AutoDeployer.run(AutoDeployer.java:342)&lt;br /&gt;at org.glassfish.deployment.autodeploy.AutoDeployer.run(AutoDeployer.java:330)&lt;br /&gt;at org.glassfish.deployment.autodeploy.AutoDeployService$1.run(AutoDeployService.java:200)&lt;br /&gt;at java.util.TimerThread.mainLoop(Timer.java:512)&lt;br /&gt;at java.util.TimerThread.run(Timer.java:462)&lt;br /&gt;Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy&lt;br /&gt;at sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.java:653)&lt;br /&gt;at sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.java:460)&lt;br /&gt;at sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.java:286)&lt;br /&gt;at sun.reflect.annotation.AnnotationParser.parseAnnotation(AnnotationParser.java:222)&lt;br /&gt;at sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.java:69)&lt;br /&gt;at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:52)&lt;br /&gt;at java.lang.Class.initAnnotationsIfNecessary(Class.java:3072)&lt;br /&gt;at java.lang.Class.getAnnotations(Class.java:3052)&lt;br /&gt;at org.glassfish.apf.impl.AnnotationProcessorImpl.processAnnotations(AnnotationProcessorImpl.java:278)&lt;br /&gt;at org.glassfish.apf.impl.AnnotationProcessorImpl.process(AnnotationProcessorImpl.java:188)&lt;br /&gt;at org.glassfish.apf.impl.AnnotationProcessorImpl.process(AnnotationProcessorImpl.java:129)&lt;br /&gt;at com.sun.enterprise.deployment.archivist.Archivist.processAnnotations(Archivist.java:476)&lt;br /&gt;at com.sun.enterprise.deployment.archivist.Archivist.readAnnotations(Archivist.java:348)&lt;br /&gt;at com.sun.enterprise.deployment.archivist.Archivist.readDeploymentDescriptors(Archivist.java:320)&lt;br /&gt;at com.sun.enterprise.deployment.archivist.Archivist.open(Archivist.java:211)&lt;br /&gt;at com.sun.enterprise.deployment.archivist.ApplicationFactory.openArchive(ApplicationFactory.java:143)&lt;br /&gt;at org.glassfish.javaee.core.deployment.JavaEEDeployer.parseModuleMetaData(JavaEEDeployer.java:231)&lt;br /&gt;at com.sun.enterprise.web.WebDeployer.parseModuleMetaData(WebDeployer.java:110)&lt;br /&gt;&lt;/pre&gt;Update on Mar 06, 2009: I ran into ArrayStoreException again.  This time I used type-level @Remote and @Local on bean class but forgot to include the remote and local business interface classes into the WAR file:&lt;pre&gt;@Remote(HelloRemote.class)&lt;br /&gt;@Local(HelloLocal.class)&lt;br /&gt;public class HelloBean {&lt;br /&gt;   public String hello(String name) {&lt;br /&gt;       return "Hello, " + name;&lt;br /&gt;   }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7662400512205090313?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7662400512205090313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7662400512205090313' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7662400512205090313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7662400512205090313'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/10/solve-javalangarraystoreexception.html' title='Solve java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-7900056066529718203</id><published>2008-07-07T11:28:00.010-04:00</published><updated>2008-07-31T15:05:53.077-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>Install MySql GUI tools (MySql Administrator and Query Browser)</title><content type='html'>The easiest way to install them on Ubuntu is to use Ubuntu package manager, either command line:&lt;br /&gt;&lt;pre&gt;sudo apt-get install mysql-admin&lt;br /&gt;sudo apt-get install mysql-query-browser&lt;br /&gt;&lt;/pre&gt;Or inside System | Administration | Synaptic Package Manager, search for "mysql-admin" and "mysql-query", mark them for install, and then apply the changes.&lt;br /&gt;&lt;br /&gt;After installation is complete, open a terminal and run command &lt;code&gt;mysql-admin&lt;/code&gt; or &lt;code&gt;mysql-query-browser&lt;/code&gt;.  If running them in an existing terminal, you may need to run rehash command first to include the new tools in PATH.  Everything should just work.&lt;br /&gt;&lt;br /&gt;I also tried installing the generic Linux tar bundle for MySql GUI tools, but had a couple of problems:&lt;br /&gt;&lt;br /&gt;1. Download the generic Linux bundle (mysql-gui-tools-5.0r12-linux-i386.tar.gz) from &lt;a href="http://dev.mysql.com/downloads/gui-tools/5.0.html"&gt;http://dev.mysql.com/downloads/gui-tools/5.0.html&lt;/a&gt; .  The bundle for Linux includes MySql Administrator and Query Browser (MySQL Migration Toolkit is currently only in Windows bundle).&lt;br /&gt;&lt;br /&gt;2. To install the tools, just extract the archive.  There are instructions at &lt;a href="http://dev.mysql.com/doc/administrator/en/install-generic-tarball.html"&gt;http://dev.mysql.com/doc/administrator/en/install-generic-tarball.html&lt;/a&gt; .  Basically, execute this command to expand the downloaded file on Desktop to &lt;code&gt;/opt&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;cd /opt&lt;br /&gt;sudo tar xzf $HOME/Desktop/mysql-gui-tools-5.0r12-linux-i386.tar.gz&lt;br /&gt;&lt;/pre&gt;3. To run MySql Administrator and Query Browser:&lt;br /&gt;&lt;pre&gt;/opt/mysql-gui-tools-5.0/mysql-administrator&lt;br /&gt;/opt/mysql-gui-tools-5.0/mysql-query-browser&lt;/pre&gt;You may also want to copy/move/link &lt;code&gt;MySQLAdministrator.desktop&lt;/code&gt; and &lt;code&gt;MySQLQueryBrowser.desktop&lt;/code&gt; to &lt;code&gt;$HOME/Desktop&lt;/code&gt;, so you can double-click to launch them.&lt;br /&gt;&lt;br /&gt;When running Query Browser, I ran into this issue: &lt;a href="http://bugs.mysql.com/bug.php?id=30055&amp;amp;thanks=sub"&gt;mysql-query-browser is freezing every way i try to pick, or click, a scheme&lt;/a&gt;.   I tried removing everything under &lt;code&gt;$HOME/.mysqlgui/&lt;/code&gt; but still the same.&lt;br /&gt;&lt;br /&gt;It's possible to install to directories other than &lt;code&gt;/opt&lt;/code&gt;, but it may cause various troubles.  I'd suggest stick to the default install directory &lt;code&gt;/opt&lt;/code&gt;.  I first tried to install under &lt;code&gt;$HOME/mysql&lt;/code&gt; directory, to group all mysql-related programs under one umbrella.  But I had this error when running &lt;code&gt;./mysql-administrator --update-paths:&lt;/code&gt;&lt;br /&gt;&lt;pre&gt;(mysql-administrator-bin:11880): libglade-WARNING **: could not find glade file '/home/me/mysql/share/mysql-gui/common/preferences.glade'&lt;br /&gt;terminate called after throwing an instance of 'MGGladeXML::Error'&lt;br /&gt;Aborted&lt;/pre&gt;I then chose to install directly under $HOME so that mysql-gui-tools-5.0/ and mysql/ are at the same level.  I also ran mysql-administrator --update-paths to update the paths.  I was able to run MySql Administrator, but the GUI fonts are sort of blurred, probably because some GTK library cannot be found.  This problem was gone once I changed to the default install location /opt/mysql-gui-tools-5.0.&lt;br /&gt;&lt;br /&gt;In addition, the update-paths command doesn't seem to update path for Query Browser, since MySQLQueryBrowser.desktop file still has paths under /opt.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-7900056066529718203?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/7900056066529718203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=7900056066529718203' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7900056066529718203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/7900056066529718203'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/07/install-mysql-gui-tools-mysql.html' title='Install MySql GUI tools (MySql Administrator and Query Browser)'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2735907613364404725</id><published>2008-07-07T10:15:00.011-04:00</published><updated>2008-08-28T08:01:22.376-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Configure MySql in NetBeans</title><content type='html'>NetBeans 6.1 has an interface to manage MySql, including start and stop MySql database server, connect/disconnect from databases, launch external MySql admin tool, execute queries, etc.  Here are steps to configure MySql management inside NetBeans:&lt;br /&gt;&lt;br /&gt;1. Create a wrapper script for mysqld_safe.  The reason is that mysqld start script assumes the user is running the script from mysql base directory.  An attempt to start &lt;code&gt;mysqld&lt;/code&gt; from &lt;code&gt;mysql/bin&lt;/code&gt; directory results in the following error:&lt;br /&gt;&lt;pre&gt;/home/me/mysql/bin &amp;gt; ./mysqld_safe&lt;br /&gt;./mysqld_safe: 199: my_print_defaults: not found&lt;br /&gt;./mysqld_safe: 204: my_print_defaults: not found&lt;br /&gt;The file /usr/local/mysql/bin/mysqld doesn't exist or is not executable&lt;br /&gt;Please do a cd to the mysql installation directory and restart&lt;br /&gt;this script from there as follows:&lt;br /&gt;./bin/mysqld_safe.&lt;br /&gt;See http://dev.mysql.com/doc/mysql/en/mysqld_safe.html for more information&lt;/pre&gt;So I created script &lt;code&gt;/home/me/mysql/bin/mymysqld_safe&lt;/code&gt;, which can be called by NetBeans:&lt;pre&gt;#! /bin/sh&lt;br /&gt;cd /home/me/mysql/&lt;br /&gt;./bin/mysqld_safe &amp;amp;&lt;/pre&gt;I had also tried changing mysqld_safe script to replace the hardcoded ./bin/ with `dirname $0`, but it caused other errors.  So I figured the best option is to use a wrapper without touching mysql files.&lt;br /&gt;&lt;br /&gt;2. Go to NetBeans Window | Services tab, and right-click DataBases node.  Choose Properties.&lt;br /&gt;Basic properties:&lt;br /&gt;Server host name: localhost&lt;br /&gt;Server port number: 3306&lt;br /&gt;Administrator user name: root&lt;br /&gt;Administrator password:&lt;br /&gt;&lt;br /&gt;Admin properties:&lt;br /&gt;Path/URL to admin tool: /usr/bin/mysql-admin&lt;br /&gt;Path to start command: /home/me/mysql/bin/mymysqld_safe&lt;br /&gt;Path to stop command: /home/me/mysql/bin/mysqladmin&lt;br /&gt;Arguments to stop command: -u root shutdown&lt;br /&gt;&lt;br /&gt;How to install MySql admin tool and Query Browser is posted in the previous post &lt;a href="http://javahowto.blogspot.com/2008/07/install-mysql-gui-tools-mysql.html"&gt;Install MySql GUI tools (MySql Administrator and Query Browser)&lt;/a&gt; .&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2735907613364404725?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2735907613364404725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2735907613364404725' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2735907613364404725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2735907613364404725'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/07/configure-mysql-in-netbeans.html' title='Configure MySql in NetBeans'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-6148138451233592079</id><published>2008-06-19T14:25:00.008-04:00</published><updated>2008-06-28T09:02:17.375-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java/JDK'/><title type='text'>java pkg.Main or java pkg/Main?</title><content type='html'>Which format do you use to run a java application?  I always pass the fully-qualified class name to java command, namely, &lt;code&gt;java com.whatever.Main&lt;/code&gt;.  In fact, either way is acceptable:&lt;br /&gt;&lt;pre&gt;build/classes &amp;gt; java javahowto.Member&lt;br /&gt;build/classes &amp;gt; java javahowto/Member&lt;/pre&gt;I've tried java command with both forms in JDK 1.4, JDK 5, and JDK 6 on &lt;span style="font-weight: bold;"&gt;Linux&lt;/span&gt; without any error.  On Windows, you can use either &lt;code&gt;pkg.Main&lt;/code&gt;, or &lt;code&gt;pkg/Main&lt;/code&gt;, but not &lt;code&gt;pkg\Main&lt;/code&gt;:&lt;br /&gt;&lt;pre&gt;C:\javahowto\build\classes&amp;gt;java javahowto.Main&lt;br /&gt;In Main.main(String[])&lt;br /&gt;C:\javahowto\build\classes&amp;gt;java javahowto/Main&lt;br /&gt;In Main.main(String[])&lt;br /&gt;C:\javahowto\build\classes&amp;gt;java javahowto\Main&lt;br /&gt;Exception in thread "main" java.lang.NoClassDefFoundError: javahowto\Main (wrong name: javahowto/Main)&lt;br /&gt;    at java.lang.ClassLoader.defineClass1(Native Method)&lt;br /&gt;    at java.lang.ClassLoader.defineClass(ClassLoader.java:620)&lt;br /&gt;    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)&lt;br /&gt;    at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)&lt;br /&gt;    at java.net.URLClassLoader.access$000(URLClassLoader.java:56)&lt;br /&gt;    at java.net.URLClassLoader$1.run(URLClassLoader.java:195)&lt;br /&gt;    at java.security.AccessController.doPrivileged(Native Method)&lt;br /&gt;    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)&lt;br /&gt;    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)&lt;br /&gt;    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)&lt;br /&gt;    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)&lt;br /&gt;    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)&lt;/pre&gt;In any event, do not include &lt;code&gt;.class&lt;/code&gt; in the class name.  When running from the root of class directory on Unix, one can use the shell auto-completion to fill the class name, instead of typing the FQN.  That's a big plus for the the second format.   On Windows, auto-complete doesn't help in this case, since \ is class name is not accepted.  I guess from now on, I will be using the slash form more often.&lt;br /&gt;&lt;br /&gt;Unlike java command, javac operates on java source files and always takes file paths as arguments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-6148138451233592079?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/6148138451233592079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=6148138451233592079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6148138451233592079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6148138451233592079'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/06/java-pkgmain-or-java-pkgmain.html' title='java pkg.Main or java pkg/Main?'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-340030355010391195</id><published>2008-06-08T15:30:00.011-04:00</published><updated>2008-09-04T16:13:08.875-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java/JDK'/><title type='text'>Java generics examples -- parameterized class</title><content type='html'>Not only can Java generics be used in fields and methods, it can also be used in class definitions to produce parameterized classes.  Since JDK 1.5, many built-in Java classes have been retrofitted to parameterized forms.  An example is &lt;code&gt;java.lang.Class&lt;/code&gt;, which is declared to be &lt;code&gt;public final class Class&amp;lt;T&amp;gt;&lt;/code&gt;, the parameter type &lt;code&gt;&amp;lt;T&amp;gt;&lt;/code&gt; represents the actual type modeled by this &lt;code&gt;Class&lt;/code&gt; object.  One benefit is that some of its methods can take or return specific types, avoiding casting while enforcing type-check.&lt;br /&gt;&lt;br /&gt;It's also easy to write your own parameterized class.  The following is a &lt;code&gt;Member&lt;/code&gt; class whose Id field can be parameterized to String, Integer, etc:&lt;br /&gt;&lt;pre&gt;package javahowto;&lt;br /&gt;public class Member&amp;lt;T&amp;gt; {&lt;br /&gt; private T id;&lt;br /&gt; public Member(T id) {&lt;br /&gt;   this.id = id;&lt;br /&gt; }&lt;br /&gt; public T getId() {&lt;br /&gt;   return id;&lt;br /&gt; }&lt;br /&gt; public void setId(T id) {&lt;br /&gt;   this.id = id;&lt;br /&gt; }&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;   Member&amp;lt;String&amp;gt; mString = new Member&amp;lt;String&amp;gt;("id1");&lt;br /&gt;   mString.setId("id2");&lt;br /&gt;   System.out.printf("id after setting id: %s%n", mString.getId());&lt;br /&gt;   //output:  id after setting id: id2&lt;br /&gt;&lt;br /&gt;   Member&amp;lt;Integer&amp;gt; mInteger = new Member&amp;lt;Integer&amp;gt;(1);&lt;br /&gt;   mInteger.setId(2);&lt;br /&gt;   System.out.printf("id after setting id: %d%n", mInteger.getId());&lt;br /&gt;   //output:  id after setting id: 2&lt;br /&gt; }&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-340030355010391195?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/340030355010391195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=340030355010391195' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/340030355010391195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/340030355010391195'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/06/java-generics-examples-parameterized.html' title='Java generics examples -- parameterized class'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-6699698802140498072</id><published>2008-05-26T14:22:00.011-04:00</published><updated>2009-01-27T15:30:52.247-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java/JDK'/><title type='text'>Java generics examples -- use generics in collection</title><content type='html'>Here are some most simple and common use of generics with collection.&lt;br /&gt;&lt;br /&gt;Example 1:&lt;br /&gt;&lt;pre&gt;List&amp;lt;String&amp;gt; names = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;names.add("John");&lt;br /&gt;System.out.printf("List&amp;lt;String&amp;gt; names: %s%n", names);&lt;/pre&gt;In the above example, &lt;code&gt;names&lt;/code&gt; is a List of String.  When retrieving elements from the List, the return value is of type String.  So no need for casting, which is a big advantage over the old, non-parameterized collection.&lt;br /&gt;&lt;br /&gt;Example 2:&lt;br /&gt;&lt;pre&gt;Map&amp;lt;Integer, String&amp;gt; idToName = new HashMap&amp;lt;Integer, String&amp;gt;();&lt;br /&gt;idToName.put(0, "John");&lt;br /&gt;System.out.printf("Map&amp;lt;Integer, String&amp;gt; idToName: %s%n", idToName);&lt;/pre&gt;In the above example, &lt;code&gt;idToName&lt;/code&gt; is a Map with a Integer key and String value.  The output is:&lt;br /&gt;&lt;pre&gt;Map&amp;lt;Integer, String&amp;gt; idToName: {0=John}&lt;/pre&gt;&lt;br /&gt;Example 3:&lt;pre&gt;List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; listOfList = new ArrayList&amp;lt;List&amp;lt;String&amp;gt;&amp;gt;();&lt;br /&gt;List&amp;lt;String&amp;gt; sublist1 = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;sublist1.add("A String inside sublist1");&lt;br /&gt;listOfList.add(sublist1);&lt;br /&gt;&lt;br /&gt;List&amp;lt;String&amp;gt; sublist2 = new LinkedList&amp;lt;String&amp;gt;();&lt;br /&gt;sublist2.add("A String inside sublist2");&lt;br /&gt;listOfList.add(sublist2);&lt;br /&gt;System.out.printf("List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; listOfList: %s%n", listOfList);&lt;/pre&gt;The above example shows a List whose elements are of type List, i.e., a List of List.  The inner List declares that it can only hold String elements.    The first inner list is an ArrayList of String, and the second is a LinkedList of String.  Running this code snippet prints:&lt;br /&gt;&lt;pre&gt;List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; listOfList: [[A String inside sublist1], [A String inside sublist2]]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Example 4:&lt;br /&gt;&lt;pre&gt;private static &amp;lt;T&amp;gt; List&amp;lt;T&amp;gt; extractElements(List bag, Class&amp;lt;T&amp;gt; type) {&lt;br /&gt; List&amp;lt;T&amp;gt; result = new ArrayList&amp;lt;T&amp;gt;();&lt;br /&gt; for(Object e : bag) {&lt;br /&gt;//if(e instanceof T)  can't use instanceof&lt;br /&gt;if(type.isAssignableFrom(e.getClass())) {&lt;br /&gt;    result.add((T) e);&lt;br /&gt;}&lt;br /&gt; }&lt;br /&gt; return result;&lt;br /&gt;}&lt;/pre&gt;This method takes a List of mixed elements and extracts those elements of the desired type.  The following shows how to call this method:&lt;br /&gt;&lt;pre&gt;List bag = new ArrayList();&lt;br /&gt;bag.add(new Integer(0));&lt;br /&gt;bag.add(new Integer(1));&lt;br /&gt;bag.add(new Double(2008.5));&lt;br /&gt;bag.add("a string");&lt;br /&gt;List&amp;lt;Number&amp;gt; numbersInBag = extractElements(bag, Number.class);&lt;br /&gt;System.out.printf("All elements in bag: %s%nNumber elements in bag: %s%n",&lt;br /&gt;bag, numbersInBag);&lt;br /&gt;List&amp;lt;Integer&amp;gt; integersInBag = extractElements(bag, Integer.class);&lt;br /&gt;System.out.printf("All elements in bag: %s%nInteger elements in bag: %s%n",&lt;br /&gt;bag, integersInBag);&lt;br /&gt;&lt;br /&gt;-------- output -----------&lt;br /&gt;All elements in bag: [0, 1, 2008.5, a string]&lt;br /&gt;Number elements in bag: [0, 1, 2008.5]&lt;br /&gt;All elements in bag: [0, 1, 2008.5, a string]&lt;br /&gt;Integer elements in bag: [0, 1]&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-6699698802140498072?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/6699698802140498072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=6699698802140498072' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6699698802140498072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/6699698802140498072'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/05/java-generics-examples-use-generics-in.html' title='Java generics examples -- use generics in collection'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2644628698728428861</id><published>2008-05-16T12:19:00.007-04:00</published><updated>2008-12-07T21:42:42.544-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Copy plugins between NetBeans installations</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;NetBeans installer does not migrate plugins, and with every new installation, your old plugins are gone.  This makes sense because the new NetBeans installation may not support the old plugins.  So you will need to re-install these plugins through update centers or manually installing downloaded *.nbm files.&lt;br /&gt;&lt;br /&gt;Another option is to copy the plugin jar and configuration files, from the old .netbeans directory to the new .netbeans directory.  For example, this is how I copied whichelement plugin from NetBeans 6.0 to 6.1:&lt;br /&gt;&lt;pre&gt;cd $HOME/.netbeans/6.0/modules&lt;br /&gt;cp org-netbeans-modules-whichelement.jar $HOME/.netbeans/6.1/modules/&lt;br /&gt;&lt;br /&gt;cd $HOME/.netbeans/6.0/config/Modules/&lt;br /&gt;cp org-netbeans-modules-whichelement.xml $HOME/.netbeans/6.1/config/Modules/&lt;/pre&gt;Restart NetBeans and you will see the new plugin is enabled.  These copied plugins will always appear installed in Tools | Plugins window, and grayed out.  So there is no way to deactivate or uninstall them, since they were not installed with the wizard in the first place.  But I guess you can always configure them by editing their config files under &lt;code&gt;.netbeans/6.1/config/Modules&lt;/code&gt;.  The following is the config file for whichelement (org-netbeans-modules-whichelement.xml):&lt;br /&gt;&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE module PUBLIC "-//NetBeans//DTD Module Status 1.0//EN"&lt;br /&gt;                     "http://www.netbeans.org/dtds/module-status-1_0.dtd"&amp;gt;&lt;br /&gt;&amp;lt;module name="org.netbeans.modules.whichelement"&amp;gt;&lt;br /&gt; &amp;lt;param name="autoload"&amp;gt;false&amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param name="eager"&amp;gt;false&amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param name="enabled"&amp;gt;true&amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param name="jar"&amp;gt;modules/org-netbeans-modules-whichelement.jar&amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param name="reloadable"&amp;gt;false&amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;param name="specversion"&amp;gt;1.5&amp;lt;/param&amp;gt;&lt;br /&gt;&amp;lt;/module&amp;gt;&lt;/pre&gt;This is not the recommended approach in most cases and may not work for some plugins.  However, it can be useful if you can't find it in update centers or in *.nbm form.&lt;br /&gt;&lt;br /&gt;Update on 12/07/2008:&lt;br /&gt;I've copied whichelement plugin from my NetBeans 6.1 installation to 6.5.  It works fine so far.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2644628698728428861?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2644628698728428861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2644628698728428861' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2644628698728428861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2644628698728428861'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/05/copy-plugins-between-netbeans.html' title='Copy plugins between NetBeans installations'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-5413506200111543178</id><published>2008-05-15T11:43:00.006-04:00</published><updated>2008-09-10T21:39:17.428-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>How to customize NetBeans look and feel</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;NetBeans by default uses the platform native look and feel: windows look and feel on Windows, and Gtk look and feel on Linux and Solaris where Gtk 2 is available.  While the windows look and feel is fine and pretty close to native windows applications, NetBeans doesn't look the best with Gtk look and feel.  Here are some options to adjust them, in order of my preference:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Plastic looks from JGoodies&lt;/span&gt;.  Go to &lt;a href="http://www.jgoodies.com/downloads/libraries.html"&gt;JGoodies download page&lt;/a&gt;, choose "JGoodies Looks" among the list of download links.  Runs with Java 1.4 or greater.&lt;br /&gt;&lt;br /&gt;Unzip the download file (looks-2.1.4.zip) to somewhere, e.g., /home/xxx.  The zip file contains a top-level root directory so no need to make a temp dir for unzipping.&lt;br /&gt;&lt;br /&gt;Edit &lt;code&gt;NetBeans-dir/etc/netbeans.conf&lt;/code&gt; file, appending the following options to netbeans_default_options (You may want to copy and comment out the original line for safety):&lt;pre&gt;&lt;br /&gt;--cp:p /home/xxx/looks-2.1.4/looks-2.1.4.jar --laf com.jgoodies.looks.plastic.Plastic3DLookAndFeel&lt;/pre&gt;Note that netbeans_default_options value is quoted so after your editing, it should still end with ".  Restart NetBeans to see the new look.  You can also pass these options in command line when you start NetBeans and command line options will override netbeans_default_options in netbeans.conf file:&lt;pre&gt;&lt;br /&gt;NetBeans-dir/bin/netbeans --cp:p /home/xxx/looks-2.1.4/looks-2.1.4.jar --laf com.jgoodies.looks.windows.WindowsLookAnd&lt;/pre&gt;JGoodies looks comes with the following look and feels:&lt;pre&gt;com.jgoodies.looks.plastic.Plastic3DLookAndFeel&lt;br /&gt;com.jgoodies.looks.plastic.PlasticLookAndFeel&lt;br /&gt;com.jgoodies.looks.plastic.PlasticXPLookAndFeel&lt;br /&gt;com.jgoodies.looks.windows.WindowsLookAndFeel&lt;/pre&gt;All of them are cross-platform, which means you can also use com.jgoodies.looks.windows.WindowsLookAndFeel on Linux.  But it's not much different from swing metal look and feel.  While trying Plastic3DLookAndFeel, PlasticLookAndFeel and PlasticXPLookAndFeel on my Linux laptop, I didn't see any noticeable difference among them.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Use the classic swing metal look and feel&lt;/span&gt;.  Although not visually appealing, it has some benefits: (1) no additional jar on classpath; (2) consistent look and feel across platform; and (2) maybe a bit faster.  To use metal, edit NetBeans-dir/etc/netbeans.conf:&lt;pre&gt;netbeans_default_options="... --laf javax.swing.plaf.metal.MetalLookAndFeel"&lt;/pre&gt;Since NetBeans always sets look and feel whether you specify --laf option or not, the swing default look and feel does to take effect.   Adding a file in JAVA_HOME/jre/lib/swing.properties has no effect either.  It is not possible to use swing Windows look and feel on non-Windows platform.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. If NetBeans is running on JDK 6 or greater, Install NetBeans Substance plugin.&lt;/span&gt;  This is listed # 3, though recommended at &lt;a href="http://wiki.netbeans.org/LookAndFeel"&gt;NetBeans wiki page&lt;/a&gt;.  You can download the plugin as a *.nbm file at &lt;a href="http://plugins.netbeans.org/PluginPortal/faces/PluginDetailPage.jsp?pluginid=815"&gt;NetBeans Plugin Portal&lt;/a&gt;, and install it following menu Tools | Plugins | Downloaded tab | Add Plugins... button.  Once installed, a wide variety of skins can be chosen from menu View | Skins.  You can change skin at any time without restarting NetBeans.&lt;br /&gt;&lt;br /&gt;I tried all skins and they seem to be very similar, differing only in colors used.  The good ones (good to my eyes) are "Moderate" and "Business *".  One thing I don't like is that they all auto-hide the plus sign in front of the folder icon inside File and Favorite panel, which I found is very annoying and distracting.  When the mouse moves on the left panel, the on-focus elements changes background color.  I find it confusing since the current selected element is also highlighted. &lt;br /&gt;&lt;br /&gt;After trying it for a couple of days, I decide to unininstall it (Tools | Plugins | Installed tab, select the plugin and click Deactivate on the right, or click Uninstall button on the bottom).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Napkin look and feel&lt;/span&gt;, making you feel like coding on a napkins.  I don't quite like its informal style but others may.  Links: &lt;a href="http://napkinlaf.sourceforge.net/"&gt;overview &amp;amp; snapshots,&lt;/a&gt; &lt;a href="http://sourceforge.net/projects/napkinlaf/"&gt;download&lt;/a&gt;, &lt;a href="http://wiki.java.net/bin/view/Projects/NapkinLAF"&gt;instructions.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Nimbus look and feel in JDK 6 update 10&lt;/span&gt; (beta as of 5/15/2008).  See &lt;a href="http://java.sun.com/developer/technicalArticles/javase/java6u10/index.html#nimbus"&gt;here&lt;/a&gt; for a comparison to metal.  To use it with NetBeans, install JDK 6 update 10, set netbeans_jdkhome to JDK 6u10, and netbeans_default_options to include "--laf com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" in NetBeans-dir/etc/netbeans.conf.&lt;br /&gt;&lt;br /&gt;Wtih Nimbus, I can only see the selected items on my left panel (File, Favorite, or Project views).  Other elements all have the same color as the white background so are invisible.  Will try it again when the final JDK 6u10 is out.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-5413506200111543178?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/5413506200111543178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=5413506200111543178' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5413506200111543178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5413506200111543178'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/05/how-to-customize-netbeans-look-and-feel.html' title='How to customize NetBeans look and feel'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1229174747793124137</id><published>2008-04-17T15:00:00.010-04:00</published><updated>2008-05-05T14:15:17.312-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Servlet'/><category scheme='http://www.blogger.com/atom/ns#' term='Glassfish'/><category scheme='http://www.blogger.com/atom/ns#' term='Tomcat'/><title type='text'>A sample servlet that dynamically creates images</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;This is a sample servlet that dynamically generates JPEG images.  Currently all image properties are hard-coded, but it should be trivial to provide a jsp form to collect them (e.g., color, font, dimensions, messages).  The generated image contains dynamic data such as the appserver name, and OS name.&lt;br /&gt;&lt;pre&gt;package javahowto;&lt;br /&gt;&lt;br /&gt;import com.sun.image.codec.jpeg.JPEGCodec;&lt;br /&gt;import java.awt.Color;&lt;br /&gt;import java.awt.Font;&lt;br /&gt;import java.awt.Graphics;&lt;br /&gt;import java.awt.image.BufferedImage;&lt;br /&gt;import java.io.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;&lt;br /&gt;public class ImageServlet extends HttpServlet {&lt;br /&gt;private static final int WIDTH = 450;&lt;br /&gt;private static final int HEIGHT = 200;&lt;br /&gt;private static final Color BACKGROUND_COLOR = new Color(100,149,237);&lt;br /&gt;private static final Color COLOR = new Color(0,0,139);&lt;br /&gt;private static final Font FONT = new Font("Times New Roman", Font.BOLD, 46);&lt;br /&gt;private static final Font FOOT_FONT = new Font("Courier", Font.ITALIC, 14);&lt;br /&gt;private static final Color FOOT_COLOR = Color.BLACK;&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {&lt;br /&gt;   response.setContentType("image/jpg");&lt;br /&gt;   ServletOutputStream out = response.getOutputStream();&lt;br /&gt;   BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_BYTE_INDEXED);&lt;br /&gt;   Graphics graphics = image.getGraphics();&lt;br /&gt;   graphics.setColor(BACKGROUND_COLOR);&lt;br /&gt;   graphics.fillRect(0, 0, image.getWidth(), image.getHeight());&lt;br /&gt;   graphics.setColor(COLOR);&lt;br /&gt;   graphics.setFont(FONT);&lt;br /&gt;   graphics.drawString("Hello World!", 10, HEIGHT/2);&lt;br /&gt;   graphics.setFont(FOOT_FONT);&lt;br /&gt;   graphics.setColor(FOOT_COLOR);&lt;br /&gt;   graphics.drawString("Created by " + getServletContext().getServerInfo(), 10, HEIGHT - 30);&lt;br /&gt;   graphics.drawString("for http://javahowto.blogspot.com/ on " + System.getProperty("os.name"), 10, HEIGHT - 10);&lt;br /&gt;   JPEGCodec.createJPEGEncoder(out).encode(image);&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;The web.xml file is as simple as declaring and mapping a servlet:&lt;pre&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;image&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;servlet-class&amp;gt;javahowto.ImageServlet&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;image&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;   &amp;lt;url-pattern&amp;gt;/&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/pre&gt;Build the project and deploy the image.war to any web server or appserver.  Enter the URL &lt;code&gt;http://localhost:8080/image/&lt;/code&gt; to view the generated image.  Here we are using the .war file base name as the default context-root and a / servlet path. I tested it on Glassfish v2 update 1, Tomcat 6, and JBoss-5.0.0.Beta4 successfully, except some redeployment errors on JBoss, which was resolved by deleting the .war and restarting server.&lt;br /&gt;&lt;br /&gt;If the appserver is running on a headless server, you may need to set the system property java.awt.headless to true.  Also note that a Sun-specific encoder class (&lt;code&gt;com.sun.image.codec.jpeg.JPEGCodec&lt;/code&gt;) is used.  It is in rt.jar of Sun's JDK, but may not be available in other vendors' JDK like IBM's JDK or BEA's (now Oracle's) JRockit.  If a non-Sun Java is used, you will need to use the appropriate encoder class.  Unfortunately, there seems to be no portable JPEG encoder class as of JDK 6.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://javahow.googlepages.com/hello-tc.jpg" style="max-width: 800px;" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://javahow.googlepages.com/hello-gf.jpg" style="max-width: 800px;" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1229174747793124137?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1229174747793124137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1229174747793124137' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1229174747793124137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1229174747793124137'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/04/sample-servlet-that-dynamically-creates.html' title='A sample servlet that dynamically creates images'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-5581616001256245115</id><published>2008-04-13T18:02:00.006-04:00</published><updated>2009-10-05T10:07:56.410-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java/JDK'/><title type='text'>Java enum examples</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;span style="font-weight: bold;"&gt;Simple enum&lt;/span&gt;.  The ; after the last element is optional, when this is the end of enum definition.&lt;br /&gt;&lt;pre&gt;public enum Color {&lt;br /&gt; WHITE, BLACK, RED, YELLOW, BLUE;  //; is optional&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Enum embedded inside a class&lt;/span&gt;.  Outside the enclosing class, elements are referenced as &lt;code&gt;Outter.Color.RED, Outter.Color.BLUE,&lt;/code&gt; etc.&lt;br /&gt;&lt;pre&gt;public class Outter {&lt;br /&gt; public enum Color {&lt;br /&gt;   WHITE, BLACK, RED, YELLOW, BLUE&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Enum that overrides toString method&lt;/span&gt;.  A semicolon after the last element is required to be able to compile it.  More details on overriding enum toString method can be found &lt;a href="http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;pre&gt;public enum Color {&lt;br /&gt; WHITE, BLACK, RED, YELLOW, BLUE;  //; is required here.&lt;br /&gt;&lt;br /&gt; @Override public String toString() {&lt;br /&gt;   //only capitalize the first letter&lt;br /&gt;   String s = super.toString();&lt;br /&gt;   return s.substring(0, 1) + s.substring(1).toLowerCase();&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Enum with additional fields and custom constructor&lt;/span&gt;.  Enum constructors must be either private or package default, and protected or public access modifier is not allowed.  When custom constructor is declared, all elements declaration must match that constructor.&lt;pre&gt;public enum Color {&lt;br /&gt; WHITE(21), BLACK(22), RED(23), YELLOW(24), BLUE(25);&lt;br /&gt;&lt;br /&gt; private int code;&lt;br /&gt;&lt;br /&gt; private Color(int c) {&lt;br /&gt;   code = c;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public int getCode() {&lt;br /&gt;   return code;&lt;br /&gt; }&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;Enum that implements interfaces&lt;/span&gt;.  Enum can implement any interfaces.  All enum types implicitly implements &lt;code&gt;java.io.Serializable&lt;/code&gt;, and &lt;code&gt;java.lang.Comparable&lt;/code&gt;.&lt;pre&gt;public enum Color implements Runnable {&lt;br /&gt; WHITE, BLACK, RED, YELLOW, BLUE;&lt;br /&gt;&lt;br /&gt; public void run() {&lt;br /&gt;   System.out.println("name()=" + name() +&lt;br /&gt;       ", toString()=" + toString());&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;A sample test program to invoke this run() method:&lt;br /&gt;&lt;pre&gt;for(Color c : Color.values()) {&lt;br /&gt; c.run();&lt;br /&gt;}&lt;/pre&gt;Or,&lt;br /&gt;&lt;pre&gt;for(Runnable r : Color.values()) {&lt;br /&gt; r.run();&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-5581616001256245115?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/5581616001256245115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=5581616001256245115' title='27 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5581616001256245115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5581616001256245115'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/04/java-enum-examples.html' title='Java enum examples'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>27</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-1389493586193313596</id><published>2008-04-13T16:54:00.004-04:00</published><updated>2008-04-13T16:58:14.075-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java/JDK'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Is the main method inherited?</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Is the &lt;code&gt;public static void main &lt;/code&gt;method on the superclass inherited by subclasses?  Yes, it can be accessed by all subclasses directly.  So it is possible to have a main method just on the superclass, and be able to run each subclass that doesn't itself declare the &lt;code&gt;main &lt;/code&gt;method.  For example:&lt;br /&gt;&lt;pre&gt;public class Main {&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;   System.out.println("In Main.main(String[])");&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Main2 extends Main {&lt;br /&gt; public void m2() {&lt;br /&gt;   main(null);  //access the main method in superclass&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Main3 extends Main2 {}&lt;/pre&gt;Running Main, Main2, Main3 have the same effect:&lt;br /&gt;&lt;pre&gt;C:\tmp&amp;gt; java Main&lt;br /&gt;In Main.main(String[])&lt;br /&gt;&lt;br /&gt;C:\tmp&amp;gt; java Main2&lt;br /&gt;In Main.main(String[])&lt;br /&gt;&lt;br /&gt;C:\tmp&amp;gt; java Main3&lt;br /&gt;In Main.main(String[])&lt;br /&gt;&lt;/pre&gt;When running Main2 and Main3 inside NetBeans 6.1 beta, I got the error &lt;code&gt;Class "Main2" does not have a main method&lt;/code&gt;.  Note this error is not from java runtime.  It seems NetBeans is doing some validation and being too restrictive.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-1389493586193313596?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/1389493586193313596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=1389493586193313596' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1389493586193313596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/1389493586193313596'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/04/is-main-method-inherited.html' title='Is the main method inherited?'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2061565668272706355</id><published>2008-03-30T22:57:00.003-04:00</published><updated>2008-03-30T23:13:04.260-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><category scheme='http://www.blogger.com/atom/ns#' term='JBoss'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>A servlet-EJB3 sample on JBoss AS 5 beta</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;This is a simple project illustrating how to deploy and run an EAR that contains an ejb-jar and .war on JBoss 5 beta 4.  This project is completely portable and contains no JBoss-specific configurations.  It should also work on any other JavaEE application servers (Glassfish v1, v2, WebLogic 10, etc).&lt;br /&gt;&lt;br /&gt;I will take advantage of the sample projects bundled inside NetBeans 6.1 beta (earlier versions should also have them, though I haven't checked).  Download the NetBeans bundle that includesJavaEE and Glassfish.&lt;br /&gt;&lt;br /&gt;1. Inside NetBeans, press Ctrl-Shift-N to create a new project.  In the popup window, under Categories choose Samples | Enterprise, then under Projects on the right panel choose Servlet Stateless.&lt;br /&gt;&lt;br /&gt;2. On the next window, accept defaults for Name and Location, then click Finish.&lt;br /&gt;&lt;br /&gt;3. Under Project tab, you will see a new enterprise project called ServletStateless, which contains 2 sub-projects: ServletStateless-ejb and ServletStateless-war.  Everything for this project is already in place.&lt;br /&gt;&lt;br /&gt;4. Right click the project ServletStateless (the parent project) and choose build.  You will see this output: Building jar: C:\javahowto\ServletStateless\dist\ServletStateless.ear&lt;br /&gt;&lt;br /&gt;5. Start JBoss AS all config (not default config).  You can also do it inside NetBeans if JBoss has been set as the target server for this project.&lt;br /&gt;&lt;pre&gt;cd %JBOSS_HOME%\bin&lt;br /&gt;run.bat -c all&lt;/pre&gt;6. Deploy the EAR to JBoss AS.  Or inside NetBeans, right click the project node and choose Undeploy and Deploy&lt;br /&gt;&lt;pre&gt;cd %JBOSS_HOME%\server\all\deploy&lt;br /&gt;copy C:\javahowto\ServletStateless\dist\ServletStateless.ear .&lt;/pre&gt;Make sure it's correctly deployed, checking the output on JBoss console:&lt;br /&gt;&lt;pre&gt;22:27:15,859 INFO  [MCKernelAbstraction] installing bean: jboss.j2ee:ear=ServletStateless.ear,jar=ServletState&lt;br /&gt;less-ejb.jar,name=StatelessSessionBean,service=EJB3 with dependencies:&lt;br /&gt;22:27:15,859 INFO  [MCKernelAbstraction]   and demands:&lt;br /&gt;22:27:15,859 INFO  [MCKernelAbstraction]        jboss.ejb:service=EJBTimerService&lt;br /&gt;22:27:15,859 INFO  [MCKernelAbstraction]   and supplies:&lt;br /&gt;22:27:15,859 INFO  [MCKernelAbstraction]        Class:enterprise.servlet_stateless_ejb.StatelessSession&lt;br /&gt;22:27:16,843 INFO  [EJBContainer] STARTED EJB: enterprise.servlet_stateless_ejb.StatelessSessionBean ejbName:&lt;br /&gt;StatelessSessionBean&lt;br /&gt;22:27:16,984 INFO  [TomcatDeployment] deploy, ctxPath=/ServletStateless-war, vfsUrl=ServletStateless.ear/Servl&lt;br /&gt;etStateless-war.war&lt;/pre&gt;7. Enter the following URL in the browser.  Or inside NetBeans right click project node and choose Run.&lt;br /&gt;&lt;code&gt;http://localhost:8080/ServletStateless-war/servlet&lt;/code&gt;, you will see this:&lt;br /&gt;&lt;pre&gt; Servlet2Stateless:: Please enter your name&lt;/pre&gt;Some notes:&lt;br /&gt;&lt;br /&gt;1. Deploying this simple EAR to JBoss default config doesn't work.  I had these errors:&lt;br /&gt;&lt;pre&gt;22:22:27,937 INFO  [EJBContainer] STARTED EJB: enterprise.servlet_stateless_ejb.StatelessSessionBean ejbName:&lt;br /&gt;StatelessSessionBean&lt;br /&gt;22:22:28,171 WARN  [HDScanner] Failed to process changes&lt;br /&gt;org.jboss.deployers.client.spi.IncompleteDeploymentException: Summary of incomplete deployments (SEE PREVIOUS&lt;br /&gt;ERRORS FOR DETAILS):&lt;br /&gt;&lt;br /&gt;*** CONTEXTS MISSING DEPENDENCIES: Name - Dependency{Required State:Actual State}&lt;br /&gt;&lt;br /&gt;jboss.web.deployment:war=/ServletStateless-war&lt;br /&gt;- jboss.cache:service=TomcatClusteringCache{Start:** NOT FOUND **}&lt;br /&gt;- jboss.cache:service=TomcatClusteringCache{Create:** NOT FOUND **}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*** CONTEXTS IN ERROR: Name - Error&lt;br /&gt;&lt;br /&gt;jboss.cache:service=TomcatClusteringCache - ** NOT FOUND **&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      at org.jboss.deployers.plugins.deployers.DeployersImpl.checkComplete(DeployersImpl.java:576)&lt;br /&gt;      at org.jboss.deployers.plugins.main.MainDeployerImpl.checkComplete(MainDeployerImpl.java:559)&lt;br /&gt;      at org.jboss.system.server.profileservice.hotdeploy.HDScanner.scan(HDScanner.java:291)&lt;br /&gt;      at org.jboss.system.server.profileservice.hotdeploy.HDScanner.run(HDScanner.java:221)&lt;br /&gt;      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)&lt;br /&gt;      at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)&lt;br /&gt;      at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)&lt;/pre&gt;Maybe because JBoss 5 is still at beta 4?&lt;br /&gt;&lt;br /&gt;2. In my NetBeans, I set Glassfish as my default target appserver.  Your NetBeans should have one target appserver, and I remember NetBeans also supports JBoss, Webspere, WebLogic with plugins.  In my projects I also see various deployment descriptors auto-generated by NetBeans.  For this simple project you only need web.xml (to specify servlet mapping) and other *.xml files are all redundant.&lt;br /&gt;&lt;br /&gt;3. This is the line that injects bean reference to servlet class:&lt;pre&gt;&lt;br /&gt;@EJB private StatelessSession sless;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2061565668272706355?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2061565668272706355/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2061565668272706355' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2061565668272706355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2061565668272706355'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/03/servlet-ejb3-sample-on-jboss-as-5-beta.html' title='A servlet-EJB3 sample on JBoss AS 5 beta'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-2758490150228784726</id><published>2008-03-24T13:44:00.002-04:00</published><updated>2008-03-24T13:46:35.957-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Install FindBugs plugin in NetBeans 6</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;To install FindBugs in NetBeans 6, the basic idea is to add an updatecenter configuration to NetBeans plugin manager.  It will then periodically keep your installed plugin updated.  These are the steps that worked for me.  Note that these steps will install FindBugs + PMD + CheckStyle co-bundled plugins.&lt;br/&gt;&lt;br/&gt;1, Go to NetBeans Tools -&amp;gt; plugins, click Settings tab.  It shows a list of existing update centers like 3rd Party Plugins, NetBeans, NetBeans Beta, Plugin Portal.  &lt;br/&gt;&lt;br/&gt;2, Click Add button on the right side.  You will see a Update Center Customizer popup, asking for Name and URL.  Enter the following values.  You may also enable Check for updates automatically.&lt;br/&gt;&lt;br/&gt;Name: SQE Update Center&lt;br/&gt;URL:    &lt;a href='https://sqe.dev.java.net/updatecenters/sqe/updates.xml'&gt;https://sqe.dev.java.net/updatecenters/sqe/updates.xml&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;3, Click OK and you will see it is added the the list of update centers.  Otherwise, most likely your network proxy is not properly configured.  You can also manually verify the above URL in the browser.&lt;br/&gt;&lt;br/&gt;4, Click Available Plugins tab, and then click the Reload Catalog button beneath the tab.  After a short while, you will see a long list (close to 100) plugins.  Plugins that are already installed are not included here.&lt;br/&gt;&lt;br/&gt;5, Click Category column head to sort them.  Notice 3 plugins under Quality category: SQE Java, SQE Update Center, SQE Platform.  &lt;br/&gt;&lt;br/&gt;6, Select all 3 plugins and click Install button.  The rest is just clicking a few OK buttons.  At the end, you will see 4 new icons on your tool bar: Check Quality, Run FindBugs, Run PMD, Run CheckStyle.&lt;br/&gt;&lt;br/&gt;&lt;a href='https://sqe.dev.java.net/'&gt;sqe &lt;/a&gt;(Software Quality Environment) is a java.net project.  It also has instructions for integrate these tools with NetBeans &lt;a href='https://sqe.dev.java.net/public/docs/tutorials/setup_for_nb6.html'&gt;here&lt;/a&gt;.  But this page is slightly dated, with an invalid updatecenter URL (https://sqe.dev.java.net/updatecenters/sqe/catalog.xml).  That page consists largely of screen shots and no way to copy that URL, which is the most critical data. &lt;br/&gt;&lt;br/&gt;In &lt;a href='https://sqe.dev.java.net/'&gt;sqe home page&lt;/a&gt; under Announcement section, it does mention that:&lt;br/&gt;&lt;blockquote&gt;There is a new updatecenter url for NetBeans6 Beta 1 or later compatible development builds (pre-alpha) https://sqe.dev.java.net/updatecenters/sqe/updates.xml.This should allow the PluginManager to detect SQE as as 3 plugins (all other modules are hidden)!&lt;br/&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-2758490150228784726?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/2758490150228784726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=2758490150228784726' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2758490150228784726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/2758490150228784726'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/03/install-findbugs-plugin-in-netbeans-6.html' title='Install FindBugs plugin in NetBeans 6'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-3028906756779748362</id><published>2008-03-23T10:25:00.005-04:00</published><updated>2008-04-11T11:54:09.238-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java/JDK'/><title type='text'>Enum wrapper for javax.transaction.Status (2)</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;In &lt;a href="http://javahowto.blogspot.com/2007/12/enum-wrapper-for-javaxtransactionstatus.html"&gt;this previous post&lt;/a&gt;, I wrote about a enum type wrapper around javax.transaction.Status.  It uses a static map to hold the mapping between integer status code and enum type.  Here is a slightly shorter (better) implementation without using a static mapping.  The commented lines are original code:&lt;pre&gt;package javahowto;&lt;br /&gt;import java.util.&lt;span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;"&gt;EnumSet&lt;/span&gt;;&lt;br /&gt;import javax.transaction.Status;&lt;br /&gt;&lt;br /&gt;public enum TransactionStatusEnum {&lt;br /&gt;   STATUS_ACTIVE           (Status.STATUS_ACTIVE),&lt;br /&gt;   STATUS_COMMITTED        (Status.STATUS_COMMITTED),&lt;br /&gt;   STATUS_COMMITTING       (Status.STATUS_COMMITTING),&lt;br /&gt;   STATUS_MARKED_ROLLBACK  (Status.STATUS_MARKED_ROLLBACK),&lt;br /&gt;   STATUS_NO_TRANSACTION   (Status.STATUS_NO_TRANSACTION),&lt;br /&gt;   STATUS_PREPARED         (Status.STATUS_PREPARED),&lt;br /&gt;   STATUS_PREPARING        (Status.STATUS_PREPARING),&lt;br /&gt;   STATUS_ROLLEDBACK       (Status.STATUS_ROLLEDBACK),&lt;br /&gt;   STATUS_ROLLING_BACK     (Status.STATUS_ROLLING_BACK),&lt;br /&gt;   STATUS_UNKNOWN          (Status.STATUS_UNKNOWN);&lt;br /&gt;  &lt;br /&gt;//    private static Map&amp;lt;Integer, TransactionStatusEnum&amp;gt; codeToEnums&lt;br /&gt;//        = new HashMap&amp;lt;Integer, TransactionStatusEnum&amp;gt;();&lt;br /&gt;//   &lt;br /&gt;//    static {&lt;br /&gt;//        codeToEnums.put(Status.STATUS_ACTIVE, STATUS_ACTIVE);&lt;br /&gt;//        codeToEnums.put(Status.STATUS_COMMITTED, STATUS_COMMITTED);&lt;br /&gt;//        codeToEnums.put(Status.STATUS_COMMITTING, STATUS_COMMITTING);&lt;br /&gt;//        codeToEnums.put(Status.STATUS_MARKED_ROLLBACK, STATUS_MARKED_ROLLBACK);&lt;br /&gt;//        codeToEnums.put(Status.STATUS_NO_TRANSACTION, STATUS_NO_TRANSACTION);&lt;br /&gt;//        codeToEnums.put(Status.STATUS_PREPARED, STATUS_PREPARED);&lt;br /&gt;//        codeToEnums.put(Status.STATUS_PREPARING, STATUS_PREPARING);&lt;br /&gt;//        codeToEnums.put(Status.STATUS_ROLLEDBACK, STATUS_ROLLEDBACK);&lt;br /&gt;//        codeToEnums.put(Status.STATUS_ROLLING_BACK, STATUS_ROLLING_BACK);&lt;br /&gt;//        codeToEnums.put(Status.STATUS_UNKNOWN, STATUS_UNKNOWN);&lt;br /&gt;//    }&lt;br /&gt;  &lt;br /&gt;   private Integer statusCode;&lt;br /&gt;  &lt;br /&gt;   public Integer getStatusCode() {&lt;br /&gt;       return statusCode;&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   public static TransactionStatusEnum getEnumFor(Integer i) {&lt;br /&gt;//        return codeToEnums.get(i);&lt;br /&gt;       for(TransactionStatusEnum t : &lt;span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;"&gt;EnumSet&lt;/span&gt;.allOf(TransactionStatusEnum.class)) {&lt;br /&gt;           if(t.statusCode == i) {&lt;br /&gt;               return t;&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;       throw new IllegalArgumentException("Invalid transaction status code: " + i);&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   @Override public String toString() {&lt;br /&gt;       return super.toString() + "(" + statusCode + ")";&lt;br /&gt;   }&lt;br /&gt;  &lt;br /&gt;   private TransactionStatusEnum(int statusCode) {&lt;br /&gt;       this.statusCode = statusCode;&lt;br /&gt;   }&lt;br /&gt;}&lt;/pre&gt;The output from the testcase in &lt;a href="http://javahowto.blogspot.com/2007/12/enum-wrapper-for-javaxtransactionstatus.html"&gt;the previous post&lt;/a&gt;:&lt;pre&gt;status code -&amp;gt; enum:&lt;br /&gt;STATUS_ACTIVE(0)&lt;br /&gt;STATUS_MARKED_ROLLBACK(1)&lt;br /&gt;STATUS_PREPARED(2)&lt;br /&gt;STATUS_COMMITTED(3)&lt;br /&gt;STATUS_ROLLEDBACK(4)&lt;br /&gt;STATUS_UNKNOWN(5)&lt;br /&gt;STATUS_NO_TRANSACTION(6)&lt;br /&gt;STATUS_PREPARING(7)&lt;br /&gt;STATUS_COMMITTING(8)&lt;br /&gt;STATUS_ROLLING_BACK(9)&lt;br /&gt;&lt;br /&gt;enum -&amp;gt; status code:&lt;br /&gt;STATUS_ACTIVE(0) 0&lt;br /&gt;STATUS_COMMITTED(3) 3&lt;br /&gt;STATUS_COMMITTING(8) 8&lt;br /&gt;STATUS_MARKED_ROLLBACK(1) 1&lt;br /&gt;STATUS_NO_TRANSACTION(6) 6&lt;br /&gt;STATUS_PREPARED(2) 2&lt;br /&gt;STATUS_PREPARING(7) 7&lt;br /&gt;STATUS_ROLLEDBACK(4) 4&lt;br /&gt;STATUS_ROLLING_BACK(9) 9&lt;br /&gt;STATUS_UNKNOWN(5) 5&lt;/pre&gt;A third approach is to combine the above 2 approaches by building the mapping inside &lt;code&gt;getEnumFor&lt;/code&gt; method so that subsequent calls may not need to iterate over all elements.  This can be useful if the enum type has many elements.  &lt;code&gt;getEnumFor&lt;/code&gt; can be rewritten as:&lt;pre&gt;public static synchronized TransactionStatusEnum getEnumFor(Integer i) {&lt;br /&gt;   TransactionStatusEnum en = codeToEnums.get(i);&lt;br /&gt;   if (en == null) {&lt;br /&gt;       for (TransactionStatusEnum t : &lt;span id="__firefox-findbar-search-id" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;"&gt;values()&lt;/span&gt;) {&lt;br /&gt;           if (t.statusCode == i) {&lt;br /&gt;               en = t;&lt;br /&gt;               codeToEnums.put(i, t);&lt;br /&gt;               break;&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;   if (en == null) {&lt;br /&gt;       throw new IllegalArgumentException("Invalid transaction status code: " + i);&lt;br /&gt;   }&lt;br /&gt;   return en;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-3028906756779748362?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/3028906756779748362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=3028906756779748362' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3028906756779748362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3028906756779748362'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/03/enum-wrapper-for-javaxtransactionstatus.html' title='Enum wrapper for javax.transaction.Status (2)'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-5049051710205092410</id><published>2008-03-11T15:11:00.005-04:00</published><updated>2008-05-11T13:35:39.826-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java/JDK'/><title type='text'>How to initialize a list when declaring it</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;With array, we can easily declare and initialize it at the same time:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;String[] favorites = new String[] {"EJB", "JPA", "Glassfish", "NetBeans"};&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Or even simpler: &lt;br /&gt;&lt;br /&gt;&lt;code&gt;String[] favorites = {"EJB", "JPA", "Glassfish", "NetBeans"};&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;/code&gt;We can do the same with a &lt;code&gt;List&lt;/code&gt; using &lt;code&gt;java.util.Arrays.asList &lt;/code&gt;method.  For example:&lt;br /&gt;&lt;pre&gt;package javahowto;&lt;br /&gt;&lt;br /&gt;import java.util.Arrays;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;public class ListTest {&lt;br /&gt;  public static final List&amp;lt;String&amp;gt; favorites =&lt;br /&gt;&lt;strong&gt;        Arrays.asList("EJB", "JPA", "Glassfish", "NetBeans");&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args){&lt;br /&gt;      System.out.println("favorites: " + favorites);&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-5049051710205092410?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/5049051710205092410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=5049051710205092410' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5049051710205092410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5049051710205092410'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/03/how-to-initialize-list-when-declaring.html' title='How to initialize a list when declaring it'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-3219932318945013026</id><published>2008-03-09T17:02:00.002-04:00</published><updated>2008-03-11T14:56:25.996-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java/JDK'/><title type='text'>UnsupportedOperationException and OperationNotSupportedException</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;For some unimplemented methods, I want to throw some exception instead of leaving it blank.  I know there is already such a class in Java but don't know its exact name.  So I typed "Operation" and then Ctrl-Space to let NetBeans to complete it.  But only javax.naming.OperationNotSupportedException showed up, which is not what I want.  After some search, it turns out the right class is java.lang.UnsupportedOperationException.  Description from its &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/UnsupportedOperationException.html"&gt;javadoc&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html" title="class in java.lang"&gt;java.lang.Object&lt;/a&gt;&lt;br /&gt; &lt;img src="http://java.sun.com/j2se/1.5.0/docs/api/resources/inherit.gif" alt="extended by " /&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Throwable.html" title="class in java.lang"&gt;java.lang.Throwable&lt;/a&gt;&lt;br /&gt;     &lt;img src="http://java.sun.com/j2se/1.5.0/docs/api/resources/inherit.gif" alt="extended by " /&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Exception.html" title="class in java.lang"&gt;java.lang.Exception&lt;/a&gt;&lt;br /&gt;         &lt;img src="http://java.sun.com/j2se/1.5.0/docs/api/resources/inherit.gif" alt="extended by " /&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/RuntimeException.html" title="class in java.lang"&gt;java.lang.RuntimeException&lt;/a&gt;&lt;br /&gt;             &lt;img src="http://java.sun.com/j2se/1.5.0/docs/api/resources/inherit.gif" alt="extended by " /&gt;&lt;b&gt;java.lang.UnsupportedOperationException&lt;/b&gt; &lt;/pre&gt; &lt;dl&gt;&lt;dt&gt;&lt;b&gt;All Implemented Interfaces:&lt;/b&gt; &lt;/dt&gt;&lt;dd&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/io/Serializable.html" title="interface in java.io"&gt;Serializable&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt; &lt;dl&gt;&lt;dt&gt;&lt;b&gt;Direct Known Subclasses:&lt;/b&gt; &lt;/dt&gt;&lt;dd&gt;&lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/awt/HeadlessException.html" title="class in java.awt"&gt;HeadlessException&lt;/a&gt;, &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/nio/ReadOnlyBufferException.html" title="class in java.nio"&gt;ReadOnlyBufferException&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt; &lt;hr /&gt; &lt;dl&gt;&lt;dt&gt;&lt;pre&gt;public class &lt;b&gt;UnsupportedOperationException&lt;/b&gt;&lt;dt&gt;extends &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/RuntimeException.html" title="class in java.lang"&gt;RuntimeException&lt;/a&gt;&lt;/dt&gt;&lt;/pre&gt;&lt;/dt&gt;&lt;/dl&gt;   &lt;p&gt; Thrown to indicate that the requested operation is not supported.&lt;/p&gt;&lt;p&gt;   This class is a member of the  &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/collections/index.html"&gt;  Java Collections Framework&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;  &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;b&gt;Since:&lt;/b&gt;&lt;/dt&gt;&lt;dd&gt;1.2&lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-3219932318945013026?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/3219932318945013026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=3219932318945013026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3219932318945013026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/3219932318945013026'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2008/03/unsupportedoperationexception-and.html' title='UnsupportedOperationException and OperationNotSupportedException'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-8962280139453714777</id><published>2007-12-11T14:16:00.001-05:00</published><updated>2008-02-11T21:07:29.313-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='JRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='JNDI'/><title type='text'>Access Weblogic DataSource remotely from Java and JRuby client</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;In previous posts, I wrote how to access JBoss or Glassfish DataSource remotely from a java client (&lt;a href='http://javahowto.blogspot.com/2006/08/access-jboss-datasource-remotely-from.html'&gt;JBoss example&lt;/a&gt; and &lt;a href='http://javahowto.blogspot.com/2006/08/access-glassfish-datasource-remotely.html'&gt;Glassfish example&lt;/a&gt;).  Here is a simple program in Java and JRuby, how to do it in Weblogic 10, using the same appserver setup as &lt;a href='http://javahowto.blogspot.com/2007/12/calling-weblogic-ejb-3-from-jruby-and.html'&gt;Calling Weblogic EJB 3 from JRuby and java client&lt;/a&gt;.&lt;br /&gt;&lt;pre&gt;package foo;&lt;br /&gt;import javax.naming.Context;&lt;br /&gt;import javax.naming.InitialContext;&lt;br /&gt;import javax.sql.DataSource;&lt;br /&gt;import java.sql.Connection;&lt;br /&gt;import java.sql.Statement;&lt;br /&gt;import java.sql.ResultSet;&lt;br /&gt;&lt;br /&gt;public class DataSourceClient {&lt;br /&gt;    public static void main(String[] args) throws Exception {&lt;br /&gt;        String sql = "SELECT id FROM MEDRECWLSTORE";&lt;br /&gt;        Context ic = new InitialContext();&lt;br /&gt;        DataSource dataSource = &lt;br /&gt;          (DataSource) ic.lookup("jdbc/MedRecGlobalDataSource");&lt;br /&gt;        System.out.println("lookup dataSource returned " + dataSource);&lt;br /&gt;        Connection connection = dataSource.getConnection();&lt;br /&gt;        System.out.println("Got connection: " + connection);&lt;br /&gt;&lt;br /&gt;        Statement stmt = connection.createStatement();&lt;br /&gt;        ResultSet rs = stmt.executeQuery(sql);&lt;br /&gt;        while(rs.next()) {&lt;br /&gt;            System.out.print(rs.getString(1) + " ");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;To do the equivalent in JRuby with less code (&lt;code&gt;testDataSourceWeblogic.rb&lt;/code&gt;):&lt;br /&gt;&lt;pre&gt;require 'java'&lt;br /&gt;include_class 'javax.naming.InitialContext'&lt;br /&gt;&lt;br /&gt;sql = "SELECT id FROM MEDRECWLSTORE"&lt;br /&gt;ic = InitialContext.new&lt;br /&gt;data_source = ic.lookup("jdbc/MedRecGlobalDataSource")&lt;br /&gt;puts "lookup DataSource returned #{data_source}"&lt;br /&gt;connection = data_source.getConnection&lt;br /&gt;puts "Got connection #{connection}"&lt;br /&gt;stmt = connection.createStatement&lt;br /&gt;rs = stmt.executeQuery(sql)&lt;br /&gt;while rs.next&lt;br /&gt;    print rs.getString(1) + " "&lt;br /&gt;end&lt;/pre&gt;Set environment variable &lt;code&gt;CLASSPATH&lt;/code&gt; for JRuby.  Currently this is the only way to pass java classpath to JRuby (jruby1.0.2).  Since I need to set &lt;code&gt;CLASSPATH&lt;/code&gt; anyway, I will use it for compiling and running java client as well.&lt;pre&gt;set CLASSPATH=%WL_HOME%\server\lib\weblogic.jar;%WL_HOME%\server\lib\api.jar;C:\simple-ejb3\classes&lt;/pre&gt;prepare jndi.properties somewhere in client classpath, e.g., &lt;code&gt;simple-ejb3\classes&lt;/code&gt; directory:&lt;pre&gt;java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory&lt;br /&gt;java.naming.provider.url=t3://localhost:7011&lt;/pre&gt;7011 is the default port for t3, iiop, ldap and http for the sample  MedRecServer.  Your port number may be different.&lt;br /&gt;&lt;br /&gt;Compile and run java client:&lt;br /&gt;&lt;pre&gt;C:\simple-ejb3\classes &amp;gt; javac -d . ..\src\foo\DataSourceClient.java&lt;br /&gt;C:\simple-ejb3\classes &amp;gt; java foo.DataSourceClient&lt;/pre&gt;Run JRuby client:&lt;br /&gt;&lt;pre&gt;jruby testDataSourceWeblogic.rb&lt;/pre&gt;Both clients will produce the following output, if run successfully:&lt;pre&gt;lookup DataSource returned ClusterableRemoteRef(-4637547633404831470S:localhost:[7011,7011,-1,-1,-1,-1,-1]:medrec:MedRecServer [-4637547633404831470S:localhost:[7011,7011,-1,-1,-1,-1,-1]:medrec:MedRecServer/286])/286&lt;br /&gt;Got connection weblogic.jdbc.rmi.SerialConnection_weblogic_jdbc_rmi_internal_ConnectionImpl_weblogic_jdbc_wrapper_PoolConnection_com_pointbase_net_netJDBCConnection30_1001_WLStub@1&lt;br /&gt;-1 1 2 3 4 5 6 7 8 9 10 134217727 268435454 402653181 536870908 671088635 805306362 939524089 1073741816 1207959543 1342177270 1476394997 1610612724 1744830451 1879048178 2013265905 214748363&lt;br /&gt;&lt;/pre&gt;Note that iiop protocol is not supported when accessing remote DataSource on Weblogic.  Using iiop will cause the following failure:&lt;br /&gt;&lt;pre&gt;Exception in thread "main" java.lang.ClassCastException: weblogic.jdbc.common.internal.ConnectionEnv cannot be cast to java.io.Serializable&lt;br /&gt;        at weblogic.iiop.InboundResponseImpl.unmarshalReturn(InboundResponseImpl.java:103)&lt;br /&gt;        at weblogic.rmi.cluster.ClusterableRemoteRef.invoke(ClusterableRemoteRef.java:338)&lt;br /&gt;        at weblogic.rmi.cluster.ClusterableRemoteRef.invoke(ClusterableRemoteRef.java:252)&lt;br /&gt;        at weblogic.jdbc.common.internal.RemoteDataSource_IIOP_WLStub.getConnection(Unknown Source)&lt;br /&gt;        at foo.DataSourceClient.main(DataSourceClient.java:12)&lt;br /&gt;Caused by: java.lang.ClassCastException: weblogic.jdbc.common.internal.ConnectionEnv cannot be cast to java.io.Serializable&lt;br /&gt;        at weblogic.iiop.IIOPOutputStream.writeObject(IIOPOutputStream.java:2253)&lt;/pre&gt;Technorati Tags: &lt;a rel='tag' href='http://technorati.com/tag/weblogic' class='performancingtags'&gt;weblogic&lt;/a&gt;, &lt;a rel='tag' href='http://technorati.com/tag/DataSource' class='performancingtags'&gt;DataSource&lt;/a&gt;, &lt;a rel='tag' href='http://technorati.com/tag/JRuby' class='performancingtags'&gt;JRuby&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-8962280139453714777?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/8962280139453714777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=8962280139453714777' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8962280139453714777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/8962280139453714777'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2007/12/access-weblogic-datasource-remotely.html' title='Access Weblogic DataSource remotely from Java and JRuby client'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-28228406.post-5121826400145576054</id><published>2007-12-07T15:11:00.001-05:00</published><updated>2008-01-29T12:56:07.634-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WebLogic'/><category scheme='http://www.blogger.com/atom/ns#' term='JRuby'/><category scheme='http://www.blogger.com/atom/ns#' term='EJB3'/><title type='text'>Calling Weblogic EJB 3 from JRuby and java client</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;This is a continuation of &lt;a href='http://javahowto.blogspot.com/2007/11/calling-ejb-3-from-jruby-client.html'&gt;Calling EJB 3 from JRuby client&lt;/a&gt; and &lt;a href='http://javahowto.blogspot.com/2007/11/calling-jboss-ejb-3-from-jruby-client.html'&gt;Calling JBoss EJB 3 from JRuby client&lt;/a&gt;.  This post will show how to do it with Weblogic application server 10.&lt;br /&gt;&lt;br /&gt;1. project directory structure:&lt;pre&gt;C:\simple-ejb3&amp;gt; tree /A /F&lt;br /&gt;+---classes&lt;br /&gt;|   \---foo&lt;br /&gt;\---src&lt;br /&gt;   \---foo&lt;br /&gt;          Client.java&lt;br /&gt;          FooBean.java&lt;br /&gt;          FooRemote.java&lt;/pre&gt;2. create EJB remote business interface and bean class under src\foo:&lt;pre&gt;package foo;&lt;br /&gt;import javax.ejb.*;&lt;br /&gt;&lt;br /&gt;@Remote&lt;br /&gt;public interface FooRemote {&lt;br /&gt;public String echo(String s);&lt;br /&gt;}&lt;br /&gt;------------&lt;br /&gt;package foo;&lt;br /&gt;import javax.ejb.*;&lt;br /&gt;&lt;br /&gt;@Stateless&lt;br /&gt;public class FooBean implements FooRemote {&lt;br /&gt;public String echo(String s) {&lt;br /&gt; return s;&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;3 createJRuby script (&lt;code&gt;testEJBWeblogic.rb&lt;/code&gt;) or java client, which is almost identical to the one for glassfish and JBoss, except the default jndi name.  &lt;br /&gt;&lt;br /&gt;Note that the jndi name I'm using below is not user-friendly, but I found this is the one that always worked.  I also tried using the default jndi name for weblogic EJB3 but didn't find any in admin console's View JNDI Tree.  Weblogic doesn't seem to fully honor &lt;code&gt;mappedName&lt;/code&gt; either.  When I specified mappedName="FooBean", the actual jndi name after deployment is FooBean/foo.FooRemote, with the remote business interface name appended to mappedName value.&lt;pre&gt;package foo;&lt;br /&gt;import javax.ejb.*;&lt;br /&gt;import javax.naming.*;&lt;br /&gt;&lt;br /&gt;public class Client {&lt;br /&gt;    public static void main(String[] args) throws Exception {&lt;br /&gt;        Context ic = new InitialContext();&lt;br /&gt;        Object obj = ic.lookup("_appsdir_foo-ejb_jarfoo-ejb_jarFooBean_FooRemote");&lt;br /&gt;&lt;br /&gt;        //the above jndi name is the default one used by weblogic server.&lt;br /&gt;        //You can check ejb jndi-name in &lt;br /&gt;        //admin console | environment | servers | MedRecServer(admin) | view JNDI tree&lt;br /&gt;        //You can also customize the jndi name with @Stateless(mappedName="myname")&lt;br /&gt;&lt;br /&gt;        FooRemote foo = (FooRemote) obj;&lt;br /&gt;        String s = foo.echo("Hello Foo!");&lt;br /&gt;        System.out.println(foo + " echo returned " + s);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;==== testEJBWeblogic.rb ====&lt;br /&gt;require 'java'&lt;br /&gt;include_class 'javax.naming.InitialContext'&lt;br /&gt;&lt;br /&gt;ic = InitialContext.new&lt;br /&gt;foo = ic.lookup("_appsdir_foo-ejb_jarfoo-ejb_jarFooBean_FooRemote")&lt;br /&gt;result = foo.echo("This is foo!")&lt;br /&gt;puts "Calling the EJB 3 : #{foo} returned #{result}"&lt;br /&gt;&lt;/pre&gt;4. compile java src. An environment variable WL_HOME is set for convenience but it's not required.&lt;pre&gt;C:\simple-ejb3\classes&amp;gt; set WL_HOME=C:\bea\wlserver_10.0&lt;br /&gt;C:\simple-ejb3\classes&amp;gt; javac -d . -classpath %WL_HOME%\server\lib\weblogic.jar;%WL_HOME%\server\lib\api.jar;. ..\src\foo\*.java&lt;/pre&gt;5. start Weblogic server.  I will use the sample medrec server to deploy the EJB:&lt;pre&gt;%WL_HOME%\samples\domains\medrec\startWebLogic&lt;/pre&gt;6. package and autodeploy ejb-jar. We can combine the 2 steps in 1 by using %WL_HOME%\samples\domains\medrec\autodeploy as the destdir:&lt;pre&gt;C:\simple-ejb3\classes&amp;gt; &lt;br /&gt;jar cvf %WL_HOME%\samples\domains\medrec\autodeploy\foo-ejb.jar&lt;br /&gt;foo\FooBean.class foo\FooRemote.class&lt;/pre&gt;7. start the EJB3 in the admin console http://localhost:7011/console, login with username "weblogic" and password "weblogic". Select Deployments on the left, then _appsdir_foo-ejb_jar (autodeployed) on the right, and click start button.&lt;br /&gt;&lt;br /&gt;Alternatively, you can deploy and start the ejb app with weblogic.Deployer class:&lt;pre&gt;java -cp %WL_HOME%\server\lib\weblogic.jar weblogic.Deployer -adminurl t3://localhost:7011 -username weblogic -password weblogic -deploy foo-ejb.jar &lt;/pre&gt;8. prepare jndi.properties somewhere in client classpath, e.g., simple-ejb3\classes directory:&lt;pre&gt;java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory&lt;br /&gt;java.naming.provider.url=iiop://localhost:7011&lt;/pre&gt;Note that weblogic server listens on port 7011 for iiop, t3 and http protocols.  So using t3://localhost:7011 works as well.  If you use the sample wl_server instead of medrec server, the default port is 7001.&lt;br /&gt;&lt;br /&gt;9. run JRuby client.  Before running the script, we need to set the environment variable CLASSPATH, which is of course different from the one for glassfish and JBoss.&lt;pre&gt;set CLASSPATH=%WL_HOME%\server\lib\weblogic.jar;%WL_HOME%\server\lib\api.jar;C:\simple-ejb3\classes&lt;br /&gt;jruby testEJB.rb&lt;/pre&gt;The test output:&lt;pre&gt;Calling the EJB 3 : Delegate(602878) [weblogic.iiop.IOR[RMI:foo.FooBean_my4bwg_FooRemoteIntf:0000000000000000] @localhost:7011, &amp;lt;337, null&amp;gt;] returned This is foo!&lt;/pre&gt;The command to run java client (no -cp nor -classpath is needed since we already set CLASSPATH:&lt;pre&gt;java foo.Client&lt;/pre&gt;Technorati Tags: &lt;a rel='tag' href='http://technorati.com/tag/EJB3' class='performancingtags'&gt;EJB3&lt;/a&gt;, &lt;a rel='tag' href='http://technorati.com/tag/weblogic' class='performancingtags'&gt;weblogic&lt;/a&gt;, &lt;a rel='tag' href='http://technorati.com/tag/JRuby' class='performancingtags'&gt;JRuby&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/28228406-5121826400145576054?l=javahowto.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javahowto.blogspot.com/feeds/5121826400145576054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=28228406&amp;postID=5121826400145576054' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5121826400145576054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/28228406/posts/default/5121826400145576054'/><link rel='alternate' type='text/html' href='http://javahowto.blogspot.com/2007/12/calling-weblogic-ejb-3-from-jruby-and.html' title='Calling Weblogic EJB 3 from JRuby and java client'/><author><name>javahowto</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry></feed>
