<?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-2439782663440463327</id><updated>2011-11-27T16:15:11.232-08:00</updated><category term='Windows Mobile'/><category term='Visual Studio'/><category term='junit 4'/><category term='eclipse plugins'/><category term='javascript'/><category term='html escape'/><category term='h2'/><category term='junit'/><category term='map'/><category term='ring profile'/><category term='gwt'/><category term='ADSL'/><category term='cxf'/><category term='google gadget'/><category term='tomcat'/><category term='dump'/><category term='wine'/><category term='wappalyzer'/><category term='incompatible addons'/><category term='maven 2'/><category term='Cab installation'/><category term='psql'/><category term='Postgres'/><category term='Syntax Highlighting'/><category term='http get'/><category term='jar'/><category term='mount partition'/><category term='stackoverflow'/><category term='firefox'/><category term='Neobee'/><category term='update-rc.d'/><category term='multipart'/><category term='xulrunner'/><category term='commons'/><category term='shift with numeric keys'/><category term='ram drive'/><category term='jetty'/><category term='resources'/><category term='spring'/><category term='Command line'/><category term='inner classes'/><category term='web service'/><category term='open id'/><category term='windows'/><category term='servlet'/><category term='scp'/><category term='code reuse'/><category term='eclipse'/><category term='dos'/><category term='grub2'/><category term='http post'/><category term='repository'/><category term='linux'/><category term='alias'/><category term='i18n'/><category term='OutlookSession'/><category term='mysql'/><category term='metak'/><category term='sorting'/><category term='restore database'/><category term='ssh'/><category term='xslt'/><category term='eclipse crash'/><category term='jvm'/><category term='Java'/><category term='Blogger'/><category term='chart'/><category term='l11n'/><category term='log4j'/><category term='C#'/><category term='source'/><category term='short url'/><category term='jsni'/><category term='Conacts'/><category term='shared memory'/><category term='backup database'/><category term='gxt'/><category term='sql'/><category term='Icon'/><category term='unix'/><category term='generics'/><category term='lombok'/><category term='expect'/><category term='gwt 2'/><category term='exception'/><category term='unix commands'/><category term='testing'/><category term='ubuntu'/><category term='connection pool'/><category term='winamp'/><category term='usb connect'/><category term='json'/><title type='text'>Milan Dinic's blog</title><subtitle type='html'>This blog is about software development and tech problems and solutions. It is not restricted to any technology, although I guess it will contain more posts related to java and java based technologies, since I'm quite a fan of java.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-8788821775203266731</id><published>2011-03-23T13:33:00.000-07:00</published><updated>2011-03-24T00:27:13.146-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='expect'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='scp'/><category scheme='http://www.blogger.com/atom/ns#' term='unix'/><category scheme='http://www.blogger.com/atom/ns#' term='unix commands'/><title type='text'>Automate ssh login and copy</title><content type='html'>Expect is a unix tool that can be used for automating ssh operations such as login, switch user, secure copy etc.&lt;br /&gt;&lt;br /&gt;expect tool can be installed with command:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sudo apt-get install expect&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Expect tool has own commands that can be used in its scripts, here is the list of the ones that are essential:&lt;br /&gt;spawn - to execute another program&lt;br /&gt;expect - to wait for text on the screen&lt;br /&gt;send - simulate typing on keyboard, e.g. typing password&lt;br /&gt;interact - leave the expect mode and allow user to continue work&lt;br /&gt;&lt;br /&gt;Expect tool can be used with input file, and it ca be called like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;expect -f script_name&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here is the example of script for remote login:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;set user "your_user_name"&lt;br /&gt;set pass "secret"&lt;br /&gt;spawn ssh ${user}@${server}&lt;br /&gt;expect ": $"&lt;br /&gt;send "$pass\n"&lt;br /&gt;interact&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And here is the example of script for secure copy of several files to a remove machine that are in different directories:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;set timeout 1200&lt;br /&gt;set src "/home/user/workspace/"&lt;br /&gt;set user "your_user_name"&lt;br /&gt;set pass "secret"&lt;br /&gt;set paths {path1/file1.war path2/file2.war}&lt;br /&gt;set server 192.168.0.100&lt;br /&gt;set spath :~/&lt;br /&gt;&lt;br /&gt;foreach {p} $paths {&lt;br /&gt; spawn scp ${src}/${p} ${user}@${server}${spath}&lt;br /&gt; expect ": $" {&lt;br /&gt; send "$pass\n"&lt;br /&gt; }&lt;br /&gt;expect ":~" &lt;br /&gt;puts "\r\n"&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/2439782663440463327-8788821775203266731?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/8788821775203266731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2011/03/automate-ssh-login-and-copy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8788821775203266731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8788821775203266731'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2011/03/automate-ssh-login-and-copy.html' title='Automate ssh login and copy'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-5639794130432945886</id><published>2011-02-20T01:17:00.000-08:00</published><updated>2011-02-21T00:56:41.620-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='update-rc.d'/><category scheme='http://www.blogger.com/atom/ns#' term='ram drive'/><category scheme='http://www.blogger.com/atom/ns#' term='shared memory'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Speed up MySql on Ubuntu Linux for devs</title><content type='html'>MySql can usually be fast enough for development, but when project become huge and you have a lot of tests that require database access in their execution, you might consider moving mysql datadir to a &lt;a href="http://en.wikipedia.org/wiki/RAM_disk" target="_blank"&gt;ram drive&lt;/a&gt;. Anyway, who does not want a faster development environment.&lt;br /&gt;&lt;br /&gt;Ubuntu linux, by default has a ram drive (shared memory drive) that can be found at /dev/shm. This drive is mounted as read/write drive, with permission to execute programs. More information about &lt;a href="https://help.ubuntu.com/community/StricterDefaults" target="_blank"&gt;shared memory drive&lt;/a&gt; can be found on ubuntu community site.&lt;br /&gt;&lt;br /&gt;Here is a detailed &lt;a href="http://www.ubuntugeek.com/how-to-change-the-mysql-data-default-directory.html" target="_blank"&gt;how to move data folder on mysql&lt;/a&gt;, on ubuntu linux.&lt;br /&gt;the only step that I would skip is removing original data directory, here's why.&lt;br /&gt;&lt;br /&gt;The problem with this kind of setup is that each time you reboot or shutdown the OS, data from database will be gone and next time you start the OS, mysql will not work at all.&lt;br /&gt;The solution is to make a startup script that creates copy of original data directory on ram drive. All startup and shutdown scripts should be created in /etc/init.d directory.&lt;br /&gt;&lt;br /&gt;content of my2shm script&lt;br /&gt;cp -R -p /var/lib/mysql /dev/shm&lt;br /&gt;&lt;br /&gt;my2shm can be set to run on system startup by executing:&lt;br /&gt;sudo update-rc.d my2shm defaults&lt;br /&gt;&lt;br /&gt;Now, only one more thing is left to do, save data from ram drive to hard drive on shutdown. Here is the content of the script that does this work:&lt;br /&gt;&lt;br /&gt;content of my2original script:&lt;br /&gt;cd /var/lib/mysql&lt;br /&gt;rm -rf *&lt;br /&gt;cp -R -p -f /dev/shm/mysql /var/lib/&lt;br /&gt;&lt;br /&gt;Script my2original can be set to run on system shutdown by executing:&lt;br /&gt;sudo update-rc.d my2original defaults 21&lt;br /&gt;&lt;br /&gt;By defaults &lt;a href="http://www.debuntu.org/how-to-manage-services-with-update-rc.d"  target="_blank"&gt;update-rc.d&lt;/a&gt; will set priority to 20, that is why shutdown script needs to have higher value e.g. 21.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-5639794130432945886?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/5639794130432945886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2011/02/speed-up-mysql-on-ubuntu-linux-for-devs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5639794130432945886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5639794130432945886'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2011/02/speed-up-mysql-on-ubuntu-linux-for-devs.html' title='Speed up MySql on Ubuntu Linux for devs'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-3076333928176244783</id><published>2009-12-06T13:33:00.000-08:00</published><updated>2009-12-07T06:18:13.425-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maven 2'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt 2'/><title type='text'>GWT 2.0 rc1 build with maven</title><content type='html'>I have already &lt;a href="http://milandinic.blogspot.com/2009/10/gwt-20-is-here.html"&gt;blogged&lt;/a&gt; how to build gwt 2 m1 project using eclipse plugin, there I also wrote that I'm going to try to make gwt-maven project, and I did, try, but I failed, that's why I haven't posted anything on that subject yet, but now &lt;a href="http://mojo.codehaus.org/gwt-maven-plugin/"&gt;gwt-maven-plugin&lt;/a&gt; has a support for GWT 2.0(currently RC1), and it is time to setup this kind od project. A project can be generated using plugin version 1.1. But later on, version of this plugin must be changed to 1.2, right now, only snapshot version is available and 1.2-SNAPSHOT is the one that must be used. It can be found at maven 2 repository &lt;a href="http://snapshots.repository.codehaus.org"&gt;http://snapshots.repository.codehaus.org&lt;/a&gt;. GWT 2.0.0-rc1 is available at &lt;a href="http://repo1.maven.org/maven2/"&gt;central repo&lt;/a&gt;, so there is no need to  explicitly add any repository for its artifacts. By the way, RC2 is out too, but it is not yet available at central repo, that's why RC1 will be used for this demo.&lt;br /&gt;Here is how to generate the project itself (&lt;a href="http://mojo.codehaus.org/gwt-maven-plugin/1.1-SNAPSHOT/user-guide/archetype.html"&gt;source&lt;/a&gt;):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mvn archetype:generate \&lt;br /&gt;   -DarchetypeGroupId=org.codehaus.mojo \&lt;br /&gt;   -DarchetypeArtifactId=gwt-maven-plugin \&lt;br /&gt;   -DarchetypeVersion=1.1 \&lt;br /&gt;   -DgroupId=myGroupId \&lt;br /&gt;   -DartifactId=myArtifactId&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;e.g.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mvn archetype:generate -DarchetypeGroupId=org.codehaus.mojo \&lt;br /&gt;-DarchetypeArtifactId=gwt-maven-plugin -DarchetypeVersion=1.1 \&lt;br /&gt;-DgroupId=com.google.gwt.demo -DartifactId=gwt-demo&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There are only few thing needed to be done:&lt;br /&gt;change gwt version from 1.6.4 to 2.0.0-rc1&lt;br /&gt;remove dependency for gwt-servlet&lt;br /&gt;add plugin repository:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt; &amp;lt;pluginRepositories&amp;gt;&lt;br /&gt;  &amp;lt;pluginRepository&amp;gt;&lt;br /&gt;   &amp;lt;id&amp;gt;codehaus-snapshots-repository&amp;lt;/id&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;codehaus snapshots repository&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;url&amp;gt;http://snapshots.repository.codehaus.org&amp;lt;/url&amp;gt;&lt;br /&gt;  &amp;lt;/pluginRepository&amp;gt;&lt;br /&gt; &amp;lt;/pluginRepositories&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and add configuration tag to gwt-maven-plugin&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt; &amp;lt;disableCastChecking&amp;gt;true&amp;lt;/disableCastChecking&amp;gt;&lt;br /&gt; &amp;lt;disableClassMetadata&amp;gt;true&amp;lt;/disableClassMetadata&amp;gt;&lt;br /&gt; &amp;lt;runTarget&amp;gt;/com.google.gwt.demo.Application/Application.html&amp;lt;/runTarget&amp;gt;&lt;br /&gt; &amp;lt;extraJvmArgs&amp;gt;-Xmx1024m -Xss4024k&amp;lt;/extraJvmArgs&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After this changes, mvn gwt:run should start the gwt development mode window.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/soX6Wywg6B3rUTpMTQZXDA?authkey=Gv1sRgCIi1qr3whrXG3AE&amp;feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_a0imbbK4r5U/Sxwd1oVpXiI/AAAAAAAAAjc/gsRkQUn9kZI/s144/gwt-dev-mode.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;&lt;br /&gt;&lt;br /&gt;Now, gwt development mode window should appear. By clicking last line in log window, details should appear with link &lt;i&gt;Launch default browser&lt;/i&gt;. Just click it. If you have not yet installed GWT plugin for your browser, browser will ask you to, because development Mode requires that you install the GWT Developer Plugin in your browser.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/ygUe-iXMRvyY46qIAywLnA?authkey=Gv1sRgCIi1qr3whrXG3AE&amp;feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_a0imbbK4r5U/SxwgPIXMAuI/AAAAAAAAAjg/b0H5Xcdyczg/s144/gwt-ff.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;&lt;br /&gt;&lt;br /&gt;Here is the whole pom.xml after updates:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&lt;br /&gt; xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"&amp;gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt;    GWT-Maven archetype generated POM&lt;br /&gt;  --&amp;gt;&lt;br /&gt; &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;com.google.gwt.demo&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;gwt-demo&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;name&amp;gt;gwt-maven-archetype-project&amp;lt;/name&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;properties&amp;gt;&lt;br /&gt;  &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;&lt;br /&gt;  &amp;lt;!-- convenience to define GWT version in one place --&amp;gt;&lt;br /&gt;  &amp;lt;gwt.version&amp;gt;2.0.0-rc1&amp;lt;/gwt.version&amp;gt;&lt;br /&gt;  &amp;lt;!--  tell the compiler we can use 1.5 --&amp;gt;&lt;br /&gt;  &amp;lt;maven.compiler.source&amp;gt;1.5&amp;lt;/maven.compiler.source&amp;gt;&lt;br /&gt;  &amp;lt;maven.compiler.target&amp;gt;1.5&amp;lt;/maven.compiler.target&amp;gt;&lt;br /&gt; &amp;lt;/properties&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;dependencies&amp;gt;&lt;br /&gt;  &amp;lt;!--  GWT dependencies (from central repo) --&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;com.google.gwt&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;gwt-user&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;${gwt.version}&amp;lt;/version&amp;gt;&lt;br /&gt;   &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;!-- test --&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;4.4&amp;lt;/version&amp;gt;&lt;br /&gt;   &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;/dependencies&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;build&amp;gt;&lt;br /&gt;  &amp;lt;outputDirectory&amp;gt;war/WEB-INF/classes&amp;lt;/outputDirectory&amp;gt;&lt;br /&gt;  &amp;lt;plugins&amp;gt;&lt;br /&gt;   &amp;lt;plugin&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;gwt-maven-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;1.2-SNAPSHOT&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;configuration&amp;gt;&lt;br /&gt;     &amp;lt;disableCastChecking&amp;gt;true&amp;lt;/disableCastChecking&amp;gt;&lt;br /&gt;     &amp;lt;disableClassMetadata&amp;gt;true&amp;lt;/disableClassMetadata&amp;gt;&lt;br /&gt;     &amp;lt;runTarget&amp;gt;/com.google.gwt.demo.Application/Application.html&amp;lt;/runTarget&amp;gt;&lt;br /&gt;     &amp;lt;extraJvmArgs&amp;gt;-Xmx1024m&amp;lt;/extraJvmArgs&amp;gt;&lt;br /&gt;    &amp;lt;/configuration&amp;gt;&lt;br /&gt;    &amp;lt;executions&amp;gt;&lt;br /&gt;     &amp;lt;execution&amp;gt;&lt;br /&gt;      &amp;lt;goals&amp;gt;&lt;br /&gt;       &amp;lt;goal&amp;gt;compile&amp;lt;/goal&amp;gt;&lt;br /&gt;       &amp;lt;goal&amp;gt;generateAsync&amp;lt;/goal&amp;gt;&lt;br /&gt;      &amp;lt;/goals&amp;gt;&lt;br /&gt;     &amp;lt;/execution&amp;gt;&lt;br /&gt;    &amp;lt;/executions&amp;gt;&lt;br /&gt;   &amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;plugin&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;2.0.2&amp;lt;/version&amp;gt;&lt;br /&gt;    &amp;lt;configuration&amp;gt;&lt;br /&gt;     &amp;lt;source&amp;gt;${maven.compiler.source}&amp;lt;/source&amp;gt;&lt;br /&gt;     &amp;lt;target&amp;gt;${maven.compiler.target}&amp;lt;/target&amp;gt;&lt;br /&gt;    &amp;lt;/configuration&amp;gt;&lt;br /&gt;   &amp;lt;/plugin&amp;gt;&lt;br /&gt;  &amp;lt;/plugins&amp;gt;&lt;br /&gt; &amp;lt;/build&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;pluginRepositories&amp;gt;&lt;br /&gt;  &amp;lt;pluginRepository&amp;gt;&lt;br /&gt;   &amp;lt;id&amp;gt;codehaus-snapshots-repository&amp;lt;/id&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;codehaus snapshots repository&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;url&amp;gt;http://snapshots.repository.codehaus.org&amp;lt;/url&amp;gt;&lt;br /&gt;  &amp;lt;/pluginRepository&amp;gt;&lt;br /&gt; &amp;lt;/pluginRepositories&amp;gt;&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That's it, for now, only helloworld, but it is enough to get you going.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-3076333928176244783?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/3076333928176244783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/12/gwt-20-rc1-build-with-maven.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3076333928176244783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3076333928176244783'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/12/gwt-20-rc1-build-with-maven.html' title='GWT 2.0 rc1 build with maven'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_a0imbbK4r5U/Sxwd1oVpXiI/AAAAAAAAAjc/gsRkQUn9kZI/s72-c/gwt-dev-mode.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-7354824174087013890</id><published>2009-12-01T10:50:00.000-08:00</published><updated>2009-12-01T10:50:47.624-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dos'/><category scheme='http://www.blogger.com/atom/ns#' term='alias'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Alias like command for DOS</title><content type='html'>Unix has one great command that can ease a lot use of &lt;a href="http://en.wikipedia.org/wiki/Unix_shell"&gt;shell&lt;/a&gt;, especially when you need to use same commands over and over again. That would be &lt;a href="http://en.wikipedia.org/wiki/Alias_%28command%29"&gt;alias&lt;/a&gt; command. I was wondering is there a similar command for &lt;a href="http://en.wikipedia.org/wiki/MS-DOS"&gt;DOS&lt;/a&gt;, and I thought, there must be one, just need to find it. And I did, command is called doskey and here is the small guide how to use it. doskey commands are normally only visible to the current CMD session. That's why it would be good idea to make a &lt;a href="http://en.wikipedia.org/wiki/Batch_file"&gt;.bat&lt;/a&gt; file containing doskey commands, and put is somewhere on system &lt;a href="http://en.wikipedia.org/wiki/Path_%28computing%29"&gt;path&lt;/a&gt; (e.g. c:\windows) and call it ali.bat. Then it would be possible to use doskey commands after typing ali in command line. Here's the content of ali.bat file:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;@echo off&lt;br /&gt;doskey mee=mvn eclipse:eclipse&lt;br /&gt;doskey meeds=mvn eclipse:eclipse -DdownloadSources=true&lt;br /&gt;doskey mec=mvn eclipse:clean&lt;br /&gt;doskey mci=mvn clean install&lt;br /&gt;doskey ls=dir&lt;br /&gt;doskey ab=ant build&lt;br /&gt;echo DONE!&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Of course file containing doskey commands does not have to be called ali.bat, but is should be something short and catchy, because you'll need to call this file each time when you open a new CMD window if you want to use commands that are declared inside.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-7354824174087013890?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/7354824174087013890/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/12/alias-like-command-for-dos.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/7354824174087013890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/7354824174087013890'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/12/alias-like-command-for-dos.html' title='Alias like command for DOS'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-8134041833788728413</id><published>2009-11-30T10:55:00.000-08:00</published><updated>2009-11-30T10:55:00.145-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='log4j'/><category scheme='http://www.blogger.com/atom/ns#' term='exception'/><title type='text'>Log4j - do not make log for specific exception</title><content type='html'>There is no way to turn off the logger only when some specific exception occurs, and e.g. in catch block LOG.error(e) is called, by configuration of &lt;a href="http://logging.apache.org/log4j/"&gt;log4j&lt;/a&gt;. But this is possible by extending specific logging class. E.g if ConsoleAppender class is used for logging and log4j configuration &lt;a href="http://en.wikipedia.org/wiki/XML"&gt;XML&lt;/a&gt; looks like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; &amp;lt;appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"&amp;gt; &lt;br /&gt;    &amp;lt;param name="Encoding" value="UTF-8" /&amp;gt;&lt;br /&gt;    &amp;lt;layout class="org.apache.log4j.PatternLayout"&amp;gt;&lt;br /&gt;      &amp;lt;param name="ConversionPattern" value="%d %-5p [%c] - %m%n" /&amp;gt;&lt;br /&gt;    &amp;lt;/layout&amp;gt;&lt;br /&gt;  &amp;lt;/appender&amp;gt;&lt;br /&gt;  &amp;lt;root&amp;gt;&lt;br /&gt;    &amp;lt;priority value="DEBUG" /&amp;gt;&lt;br /&gt;    &amp;lt;appender-ref ref="ConsoleAppender" /&amp;gt;&lt;br /&gt;  &amp;lt;/root&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Two steps are needed to apply this custom logger. Change the log4j.xml and extend class ConsoleAppender.&lt;br /&gt;&lt;br /&gt;Here is the example how to make logger that skips logging of specific exception:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package org.apache.log4j;&lt;br /&gt;&lt;br /&gt;import org.apache.log4j.ConsoleAppender;&lt;br /&gt;import org.apache.log4j.spi.LoggingEvent;&lt;br /&gt;import org.apache.log4j.spi.ThrowableInformation;&lt;br /&gt;/**&lt;br /&gt; * Specific logger appender that do not log MyException.&lt;br /&gt; * &lt;br /&gt; * @author mile&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;public class MyConsoleAppender extends ConsoleAppender {&lt;br /&gt;&lt;br /&gt;    private final String skipExceptionName = "MyException";&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void append(final LoggingEvent event) {&lt;br /&gt;        final ThrowableInformation information = event.getThrowableInformation();&lt;br /&gt;&lt;br /&gt;        if (information != null) {&lt;br /&gt;            final Throwable throwable = information.getThrowable();&lt;br /&gt;            if (throwable != null) {&lt;br /&gt;                final String className = throwable.getClass().getName();&lt;br /&gt;&lt;br /&gt;                if (skipExceptionName.indexOf(className) != -1) {&lt;br /&gt;                    return;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        super.append(event);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And now, to use MyConsoleAppender just change appender class in log4j.xml to point to specific appender implementation. In this case, that would be org.apache.log4j.MyConsoleAppender.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-8134041833788728413?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/8134041833788728413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/11/log4j-do-not-make-log-for-specific.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8134041833788728413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8134041833788728413'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/11/log4j-do-not-make-log-for-specific.html' title='Log4j - do not make log for specific exception'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-8003070067582900396</id><published>2009-11-27T10:14:00.000-08:00</published><updated>2009-11-27T10:59:07.060-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='lombok'/><title type='text'>Lombok - great extension for java language</title><content type='html'>I found one nice library that extends Java's functionally. It is meant to remove need of writing getters and setters, toString, hashCode and equals methods. I deliberately said to remove need, because it will generate them for you. Those methods will not be visible in .java file but those methods can be used anywhere in the code. There is not reflection use, as I've said this code is generated on the fly and added to .class files. I will use User class to demonstrate how to use this library by example.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;/**&lt;br /&gt; * User bean for demonstration of Labmok library use. &lt;br /&gt; * &lt;br /&gt; * @author mile&lt;br /&gt; */&lt;br /&gt;@Data&lt;br /&gt;public class User {&lt;br /&gt;&lt;br /&gt;    private String name;&lt;br /&gt;    private String address;&lt;br /&gt;&lt;br /&gt;    private int age;&lt;br /&gt;&lt;br /&gt;    @NonNull&lt;br /&gt;    private String email;&lt;br /&gt;&lt;br /&gt;    public User() {&lt;br /&gt;        super();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @SneakyThrows(IOException.class)&lt;br /&gt;    public void createIOException() {&lt;br /&gt;        throw new IOException();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @SneakyThrows(UnsupportedEncodingException.class)&lt;br /&gt;    public String createString() {&lt;br /&gt;        return new String(new byte[] {1, 2, 3, 4}, "UTF-8");&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, no getters or setters are declared. But they are visible from &lt;a href="http://en.wikipedia.org/wiki/Eclipse_%28software%29"&gt;Eclipse IDE&lt;/a&gt;. This feature will not be enabled without adding lombok to the &lt;a href="http://en.wikipedia.org/wiki/Classpath_%28Java%29"&gt;classpath&lt;/a&gt; of the eclipse. This can be easily done by running java -jar lombok.jar, assuming that there is java installed. It will open &lt;a href="http://en.wikipedia.org/wiki/Graphical_user_interface"&gt;GUI&lt;/a&gt; which will help you to do this operation, actually it will do it for you.&lt;br /&gt;After using &lt;a href="http://en.wikipedia.org/wiki/JAD_%28JAva_Decompiler%29"&gt;JAD&lt;/a&gt; I've got the code that will be used at run-time. This is the output:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.&lt;br /&gt;// Jad home page: http://www.kpdus.com/jad.html&lt;br /&gt;// Decompiler options: packimports(3) &lt;br /&gt;// Source File Name:   User.java&lt;br /&gt;&lt;br /&gt;package com.lombok.demo;&lt;br /&gt;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.UnsupportedEncodingException;&lt;br /&gt;import lombok.Lombok;&lt;br /&gt;&lt;br /&gt;public class User&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;    public User()&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void createIOException()&lt;br /&gt;    {&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            throw new IOException();&lt;br /&gt;        }&lt;br /&gt;        catch(IOException $ex)&lt;br /&gt;        {&lt;br /&gt;            throw Lombok.sneakyThrow($ex);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String createString()&lt;br /&gt;    {&lt;br /&gt;        try&lt;br /&gt;        {&lt;br /&gt;            return new String(new byte[] {&lt;br /&gt;                1, 2, 3, 4&lt;br /&gt;            }, "UTF-8");&lt;br /&gt;        }&lt;br /&gt;        catch(UnsupportedEncodingException $ex)&lt;br /&gt;        {&lt;br /&gt;            throw Lombok.sneakyThrow($ex);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getName()&lt;br /&gt;    {&lt;br /&gt;        return name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setName(String name)&lt;br /&gt;    {&lt;br /&gt;        this.name = name;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getAddress()&lt;br /&gt;    {&lt;br /&gt;        return address;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setAddress(String address)&lt;br /&gt;    {&lt;br /&gt;        this.address = address;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int getAge()&lt;br /&gt;    {&lt;br /&gt;        return age;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setAge(int age)&lt;br /&gt;    {&lt;br /&gt;        this.age = age;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String getEmail()&lt;br /&gt;    {&lt;br /&gt;        return email;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void setEmail(String email)&lt;br /&gt;    {&lt;br /&gt;        if(email == null)&lt;br /&gt;        {&lt;br /&gt;            throw new NullPointerException("email");&lt;br /&gt;        } else&lt;br /&gt;        {&lt;br /&gt;            this.email = email;&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public String toString()&lt;br /&gt;    {&lt;br /&gt;        return (new StringBuilder("User(name=")).append(name).append(", address=").append(address).append(", age=").append(age).append(", email=").append(email).append(")").toString();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public int hashCode()&lt;br /&gt;    {&lt;br /&gt;        int PRIME = 31;&lt;br /&gt;        int result = 1;&lt;br /&gt;        result = result * 31 + (name != null ? name.hashCode() : 0);&lt;br /&gt;        result = result * 31 + (address != null ? address.hashCode() : 0);&lt;br /&gt;        result = result * 31 + age;&lt;br /&gt;        result = result * 31 + (email != null ? email.hashCode() : 0);&lt;br /&gt;        return result;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean equals(Object o)&lt;br /&gt;    {&lt;br /&gt;        if(o == this)&lt;br /&gt;            return true;&lt;br /&gt;        if(o == null)&lt;br /&gt;            return false;&lt;br /&gt;        if(o.getClass() != getClass())&lt;br /&gt;            return false;&lt;br /&gt;        User other = (User)o;&lt;br /&gt;        if(name != null ? !name.equals(other.name) : other.name != null)&lt;br /&gt;            return false;&lt;br /&gt;        if(address != null ? !address.equals(other.address) : other.address != null)&lt;br /&gt;            return false;&lt;br /&gt;        if(age != other.age)&lt;br /&gt;            return false;&lt;br /&gt;        return email != null ? email.equals(other.email) : other.email == null;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private String name;&lt;br /&gt;    private String address;&lt;br /&gt;    private int age;&lt;br /&gt;    private String email;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here are some tests that can be run from eclipse or from &lt;a href="http://maven.apache.org/"&gt;maven&lt;/a&gt;.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;/**&lt;br /&gt; * Tests for class {@link User}.&lt;br /&gt; * &lt;br /&gt; * @author mile&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;public class UserTest {&lt;br /&gt;    /**&lt;br /&gt;     * Test &amp;lt;code&amp;gt;@Data&amp;lt;/code&amp;gt; annotation.&lt;br /&gt;     */&lt;br /&gt;    @Test&lt;br /&gt;    public void testUser() {&lt;br /&gt;        final User user = new User();&lt;br /&gt;        final String name = "milan";&lt;br /&gt;        final int age = 26;&lt;br /&gt;        final String address = "some address";&lt;br /&gt;        final String email = "someone@gmail.com";&lt;br /&gt;&lt;br /&gt;        user.setName(name);&lt;br /&gt;        user.setAge(age);&lt;br /&gt;        user.setEmail(email);&lt;br /&gt;        user.setAddress(address);&lt;br /&gt;&lt;br /&gt;        Assert.assertEquals(name, user.getName());&lt;br /&gt;        Assert.assertEquals(age, user.getAge());&lt;br /&gt;        Assert.assertEquals(address, user.getAddress());&lt;br /&gt;        Assert.assertEquals(email, user.getEmail());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Test &amp;lt;code&amp;gt;@NonNull&amp;lt;/code&amp;gt; annotation.&lt;br /&gt;     */&lt;br /&gt;    @Test(expected = NullPointerException.class)&lt;br /&gt;    public void testNonNull() {&lt;br /&gt;        final User user = new User();&lt;br /&gt;        final String email = null;&lt;br /&gt;        user.setEmail("someone@gmail.com");&lt;br /&gt;        user.setEmail(email);&lt;br /&gt;        Assert.fail("NullPointerException was not thrown");&lt;br /&gt;    }&lt;br /&gt;    /**&lt;br /&gt;     * Test &amp;lt;code&amp;gt;@SneakyThrows&amp;lt;/code&amp;gt; annotation.&lt;br /&gt;     */&lt;br /&gt;    @Test(expected = IOException.class)&lt;br /&gt;    public void testSneakyThrowsPropagate() {&lt;br /&gt;        final User user = new User();&lt;br /&gt;        user.createIOException();&lt;br /&gt;        Assert.fail("IOException was not thrown");&lt;br /&gt;    }&lt;br /&gt;    /**&lt;br /&gt;     * Test &amp;lt;code&amp;gt;@SneakyThrows&amp;lt;/code&amp;gt; annotation.&lt;br /&gt;     */&lt;br /&gt;    @Test&lt;br /&gt;    public void testSneakyThrows() {&lt;br /&gt;        final User user = new User();&lt;br /&gt;        user.createString();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I encountered the problem when I tried to use &lt;i&gt;@SneakyThrows&lt;/i&gt; without declaring exception parameter. Java docs says : @SneakyThrows without a parameter defaults to allowing &lt;i&gt;every&lt;/i&gt; checked exception.&lt;br /&gt;I was able to compile this within eclipse, but compiling failed with maven. After I changed @SneakyThrows to @SneakyThrows(IOException.class), problem disappeared. I guess this might be a bug.&lt;br /&gt;&lt;br /&gt;Here is an example how to use &lt;i&gt;@Cleanup&lt;/i&gt; annotation versus the use of &lt;a href="http://commons.apache.org/io/"&gt;commons-io&lt;/a&gt;. Again I find the advantage of using lombok, because we are avoiding to reassign value of local variable.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class StreamDemo {&lt;br /&gt;&lt;br /&gt;    public void createStreamAndCloseByLombok(final byte[] bytes) {&lt;br /&gt;        try {&lt;br /&gt;            @Cleanup&lt;br /&gt;            final OutputStream out = new FileOutputStream("test.txt");&lt;br /&gt;            out.write(new byte[] {1, 2, 3, 4});&lt;br /&gt;        } catch (final IOException e) {&lt;br /&gt;            // TODO: handle exception, do some logging&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    public void createStreamAndCloseByCommons(final byte[] bytes) {&lt;br /&gt;&lt;br /&gt;        OutputStream out = null;&lt;br /&gt;        try {&lt;br /&gt;            out = new FileOutputStream("test.txt");&lt;br /&gt;            out.write(new byte[] {1, 2, 3, 4});&lt;br /&gt;        } catch (final IOException e) {&lt;br /&gt;            // TODO: handle exception, do some logging&lt;br /&gt;        } finally {&lt;br /&gt;            IOUtils.closeQuietly(out);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here are the dependencies used:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;commons-io&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;commons-io&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;1.4&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;0.9.1&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Additional repository needs to be declared to use lombok:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;repository&amp;gt;&lt;br /&gt; &amp;lt;id&amp;gt;projectlombok.org&amp;lt;/id&amp;gt;&lt;br /&gt;        &amp;lt;url&amp;gt;http://projectlombok.org/mavenrepo&amp;lt;/url&amp;gt;&lt;br /&gt;&amp;lt;/repository&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Although I find this tool very useful, I found few downsides:&lt;br /&gt;1. you need to have lombok.jar on your &lt;a href="http://en.wikipedia.org/wiki/IDE"&gt;IDE's&lt;/a&gt; classpath.&lt;br /&gt;2. java code formatter gets stuck is classes that have lombok annotations, actually formatter works, but only when explicitly called, not as save action.&lt;br /&gt;3. if you put your code to be processed by quality tool like &lt;a href="http://sonar.codehaus.org/"&gt;sonar&lt;/a&gt; it will show a lots of errors like unused private field, no default construcotr, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To get lambok visit web site : &lt;a href="http://projectlombok.org/"&gt;http://projectlombok.org/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-8003070067582900396?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/8003070067582900396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/11/lombok-great-extension-for-java.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8003070067582900396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8003070067582900396'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/11/lombok-great-extension-for-java.html' title='Lombok - great extension for java language'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-3609941232921702754</id><published>2009-11-20T11:08:00.000-08:00</published><updated>2009-11-22T13:57:08.303-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='maven 2'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><title type='text'>Jackson - Marshaller for JSON</title><content type='html'>A while ago I was &lt;a href="http://milandinic.blogspot.com/2009/03/json-in-java.html"&gt;writing &lt;/a&gt;how to handle json in java. It was a low level approach, now I found much more sophisticated way to handle json in Java. Of course, it is a library, it is called jackson, and it is capable of serializing json to java class instance and vice versa. I'll show how easy it is to work with this library by example. Lets assume we have maven 2 project, then all that is it needed to run jackson are two extra dependencies:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;org.codehaus.jackson&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;jackson-core-lgpl&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;1.3.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;org.codehaus.jackson&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;jackson-mapper-lgpl&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;1.3.0&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here is a simple model that will be marshaled and un-marshaled:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class User {&lt;br /&gt;    public enum Gender {&lt;br /&gt;        MALE, FEMALE&lt;br /&gt;    };&lt;br /&gt;    public Name name;&lt;br /&gt;    public boolean verified;&lt;br /&gt;    public Gender gender;&lt;br /&gt;    public byte[] userImage;&lt;br /&gt;&lt;br /&gt;    //getters and setters&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Name {&lt;br /&gt;    private String first;&lt;br /&gt;    private String last;&lt;br /&gt;&lt;br /&gt;    //getters and setters&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Jackson does not require any XML or any other kind of mappings or annotations to perform serialization. Here is the example how simple it is to work with jackson library:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;        ObjectMapper mapper = new ObjectMapper();&lt;br /&gt;        final User user = new User();&lt;br /&gt;        user.setVerified(false);&lt;br /&gt;        user.setGender(Gender.MALE);&lt;br /&gt;        user.setUserImage(new byte[] {0, 1, 2, 3});&lt;br /&gt;        final Name name = new Name();&lt;br /&gt;        name.setFirst("John");&lt;br /&gt;        name.setLast("Smith");&lt;br /&gt;        user.setName(name);&lt;br /&gt;&lt;br /&gt;        //write to file&lt;br /&gt;        mapper.writeValue(new File("/tmp/user.json"), user);&lt;br /&gt;&lt;br /&gt;        //read form file&lt;br /&gt;        final User newUser = mapper.readValue(new File("/tmp/user.json"), User.class);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After executing this code content of the file '/tmp/user.json' will be:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;{"verified":false,"gender":"MALE","userImage":"AAECAw==","name":{"first":"John","last":"smith"}}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Find out more about jackson at &lt;a href="http://jackson.codehaus.org/"&gt;jackson web site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-3609941232921702754?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/3609941232921702754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/11/jackson-marshaller-for-json.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3609941232921702754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3609941232921702754'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/11/jackson-marshaller-for-json.html' title='Jackson - Marshaller for JSON'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-4336277254638748711</id><published>2009-11-11T06:37:00.000-08:00</published><updated>2009-11-11T14:52:29.064-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='resources'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='jar'/><title type='text'>Resources within jar file</title><content type='html'>Let's say we have as class App in package com.java.resource. And we need to have some resource inside a jar.&lt;br /&gt;Running next code from eclipse (classes and resources on file system) or from jar will work (assuming that dilbert.jpg is present in same package as App class):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;App app = new App();&lt;br /&gt;final ImageIcon imageIcon = new ImageIcon(app.getClass().getResource("dilbert.jpg"));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now if you want to fetch this image as array of bytes, you might try with:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;App app=new App();&lt;br /&gt;URL resource = app.getClass().getResource("dilbert.jpg");&lt;br /&gt;File file = new File(resource.toURI());&lt;br /&gt;byte[] bytes = FileUtils.readFileToByteArray(file);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and this will work while files are present on files system, but it will fail for jar with error:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;java.lang.IllegalArgumentException: URI is not hierarchical at java.io.File.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Another try could be:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;URL resource = app.getClass().getResource("dilbert.jpg");&lt;br /&gt;File file = new File(resource.getFile());&lt;br /&gt;byte[] bytes = FileUtils.readFileToByteArray(file);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and this will also work while files are present on files system, but again, it will fail for jar with error: File does not exist.&lt;br /&gt;&lt;br /&gt;This will happen because the file located in jar, e.g.:&lt;br /&gt;jar:file:/temp/resource-demo/target/resource-demo-1.0-SNAPSHOT.jar!/com/java/resource/dilbert.jpg&lt;br /&gt;But using the 'new File()' resource will lose original protocol and will become:&lt;br /&gt;file:/temp/resource-demo/target/resource-demo-1.0-SNAPSHOT.jar!/com/java/resource/dilbert.jpg'&lt;br /&gt;&lt;br /&gt;And here is actual solution for 'resources in jar' issue: &lt;br /&gt;using method getResourceAsStream from Class will provide InputStream which will work both in mode when files are on file system and when files are in jar. Here is the example:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;byte[] bytes = null;&lt;br /&gt;InputStream in = null;&lt;br /&gt;try {&lt;br /&gt;   in = getClass().getResourceAsStream("dilbert.jpg");&lt;br /&gt;   bytes = IOUtils.toByteArray(in);&lt;br /&gt;} finally {&lt;br /&gt;   IOUtils.closeQuietly(in);&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/2439782663440463327-4336277254638748711?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/4336277254638748711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/11/resources-within-jar-file.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/4336277254638748711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/4336277254638748711'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/11/resources-within-jar-file.html' title='Resources within jar file'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-6834430993575016705</id><published>2009-10-31T09:01:00.000-07:00</published><updated>2009-10-31T11:51:58.177-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='maven 2'/><category scheme='http://www.blogger.com/atom/ns#' term='repository'/><title type='text'>Maven repository duplication</title><content type='html'>I've been looking a tool a sync my local repository to some remote e.g. repo1 or codehous, but I did not find any. I found a few tools that are able to search through local repository, to do some tasks like remove all SNAPSHOT etc. These are the repository managers that I found:&lt;br /&gt;nexus  &lt;a href="http://nexus.sonatype.org/"&gt;http://nexus.sonatype.org/&lt;/a&gt;&lt;br /&gt;archiva &lt;a href="http://archiva.apache.org/"&gt;http://archiva.apache.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Since none of them did the job for me I made a simple class that does that. It can be started by providing two arguments: remote url and path to local repository and that's it. The algorithm goes through web pages and fetches file and folder names. It will skip the download of files that are already in local repository. I'm sure this process can be optimized (maybe using threads), but I'm happy with it for now. Here is the code:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class Application {&lt;br /&gt;&lt;br /&gt;    private static Logger logger = Logger.getLogger(Application.class);&lt;br /&gt;&lt;br /&gt;    public void update(final String startLocation, final String localFolder) {&lt;br /&gt;&lt;br /&gt;        final List&amp;lt;String&amp;gt; lines = readUrlContent(startLocation);&lt;br /&gt;&lt;br /&gt;        final List&amp;lt;String&amp;gt; folders = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;&lt;br /&gt;        for (final String inputLine : lines) {&lt;br /&gt;&lt;br /&gt;            if (inputLine.contains("href")) {&lt;br /&gt;&lt;br /&gt;                if (inputLine.contains("..")) {&lt;br /&gt;                    continue;&lt;br /&gt;                } else if (inputLine.contains("/\"&amp;gt;")) {&lt;br /&gt;                    final int startIndex = inputLine.indexOf("href") + 6;&lt;br /&gt;                    final int endIndex = inputLine.indexOf("/\"&amp;gt;");&lt;br /&gt;                    final String filename = inputLine.substring(startIndex, endIndex);&lt;br /&gt;                    if (filename.startsWith("?")) {&lt;br /&gt;                        continue;&lt;br /&gt;                    }&lt;br /&gt;                    folders.add(inputLine.substring(startIndex, endIndex));&lt;br /&gt;                    final File dir = new File(localFolder + "/" + filename);&lt;br /&gt;                    if (!dir.exists()) {&lt;br /&gt;                        logger.info("mk dir: " + dir.getPath());&lt;br /&gt;                        dir.mkdirs();&lt;br /&gt;                    }&lt;br /&gt;                } else if (inputLine.contains("\"&amp;gt;")) {&lt;br /&gt;                    try {&lt;br /&gt;&lt;br /&gt;                        final int startIndex = inputLine.indexOf("href") + 6;&lt;br /&gt;                        final int endIndex = inputLine.substring(startIndex).indexOf("\"&amp;gt;");&lt;br /&gt;                        final String filename = inputLine.substring(startIndex, startIndex + endIndex);&lt;br /&gt;                        final String nameWithFix = "/" + filename;&lt;br /&gt;                        final File file = new File(localFolder + nameWithFix);&lt;br /&gt;                        if (!file.exists()) {&lt;br /&gt;                            logger.info("dl file " + startLocation + nameWithFix);&lt;br /&gt;                            FileUtils.copyURLToFile(new URL(startLocation + nameWithFix), file);&lt;br /&gt;                        }&lt;br /&gt;                    } catch (final MalformedURLException e) {&lt;br /&gt;                        logger.error(e.getMessage(), e);&lt;br /&gt;                    } catch (final IOException e) {&lt;br /&gt;                        logger.error(e.getMessage(), e);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        for (final String folder : folders) {&lt;br /&gt;            final String subLocation = "/" + folder;&lt;br /&gt;            final String subStartLocation = startLocation + subLocation;&lt;br /&gt;            final String subFolder = localFolder + subLocation;&lt;br /&gt;            logger.info("go to : " + subFolder);&lt;br /&gt;            update(subStartLocation, subFolder);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private List&amp;lt;String&amp;gt; readUrlContent(final String location) {&lt;br /&gt;        final List&amp;lt;String&amp;gt; lines = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;&lt;br /&gt;        BufferedReader in = null;&lt;br /&gt;        try {&lt;br /&gt;            final URL url = new URL(location);&lt;br /&gt;            final URLConnection yc = url.openConnection();&lt;br /&gt;            in = new BufferedReader(new InputStreamReader(yc.getInputStream()));&lt;br /&gt;            String inputLine;&lt;br /&gt;            while ((inputLine = in.readLine()) != null) {&lt;br /&gt;                lines.add(inputLine);&lt;br /&gt;            }&lt;br /&gt;        } catch (final MalformedURLException e) {&lt;br /&gt;            logger.error(e.getMessage(), e);&lt;br /&gt;        } catch (final IOException e) {&lt;br /&gt;            logger.error(e.getMessage(), e);&lt;br /&gt;        } finally {&lt;br /&gt;            IOUtils.closeQuietly(in);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return lines;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static void main(final String[] args) {&lt;br /&gt;        logger.info("started at " + new Date());&lt;br /&gt;        final Application a = new Application();&lt;br /&gt;        try {&lt;br /&gt;            a.update("http://repository.codehaus.org", "/home/mile/m2_repo");&lt;br /&gt;        } catch (final Exception e) {&lt;br /&gt;            logger.error(e.getMessage(), e);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Maven2 project with this class in it can be downloaded &lt;a href="http://www.mediafire.com/?gmzg132nz3t"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-6834430993575016705?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/6834430993575016705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/10/maven-repository-duplication.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6834430993575016705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6834430993575016705'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/10/maven-repository-duplication.html' title='Maven repository duplication'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-2768487597105165087</id><published>2009-10-16T02:34:00.000-07:00</published><updated>2009-10-18T10:21:09.391-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>XSL Transformation from java code</title><content type='html'>I have written a post how to do XSLT using a browser &lt;a href="http://milandinic.blogspot.com/2009/10/xsl-transformation-using-browser.html"&gt;here&lt;/a&gt;, now, I'm writing an example example how to do that from java code. Here is the similar template as one used in previous post about &lt;a href="http://en.wikipedia.org/wiki/XSL_Transformations"&gt;XSLT&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;content of file template.html&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match="/"&amp;gt;&lt;br /&gt; &amp;lt;html&amp;gt;&lt;br /&gt; &amp;lt;body&amp;gt; &lt;br /&gt; &amp;lt;hr /&amp;gt;&lt;br /&gt; &amp;lt;table&amp;gt;&lt;br /&gt;  &amp;lt;xsl:for-each select="users/user"&amp;gt;&lt;br /&gt;   &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='@id' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='name' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='address/city' /&amp;gt;&lt;br /&gt;    (&amp;lt;xsl:value-of select='address/street' /&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt; &amp;lt;/table&amp;gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&lt;br /&gt; &amp;lt;/html&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here is the XML file that will be used as data source for this transformation. You might notice that there is a line that defines stylesheet missing. This is because we don't need it for XSLT from java code.&lt;br /&gt;&lt;br /&gt;content of file data.xml&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;br /&gt;&amp;lt;users&amp;gt;&lt;br /&gt; &amp;lt;user id="1"&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;User 1&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;type&amp;gt;user&amp;lt;/type&amp;gt;&lt;br /&gt;  &amp;lt;address id="1"&amp;gt;&lt;br /&gt;   &amp;lt;street&amp;gt;street name&amp;lt;/street&amp;gt;&lt;br /&gt;   &amp;lt;city id="1"&amp;gt;some city 1&amp;lt;/city&amp;gt;&lt;br /&gt;  &amp;lt;/address&amp;gt;&lt;br /&gt; &amp;lt;/user&amp;gt;&lt;br /&gt;&amp;lt;/users&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And here is the code that does the job. Notice that I'm using FileUtils class from &lt;a href="http://commons.apache.org/io/"&gt;commons-io&lt;/a&gt; library to fetch the content of the files.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;final String xml = FileUtils.readFileToString(new File("data.xml"), "utf-8");&lt;br /&gt;final StringReader reader = new StringReader(xml);&lt;br /&gt;final String xsl = FileUtils.readFileToString(new File("template.html"), "utf-8");&lt;br /&gt;final StringReader xsltFile = new StringReader(xsl);&lt;br /&gt;&lt;br /&gt;final Source xmlSource = new StreamSource(reader);&lt;br /&gt;final Source xsltSource = new StreamSource(xsltFile);&lt;br /&gt;&lt;br /&gt;final TransformerFactory transFact = TransformerFactory.newInstance();&lt;br /&gt;final StringWriter stringWriter = new StringWriter();&lt;br /&gt;&lt;br /&gt;Transformer trans = transFact.newTransformer(xsltSource);&lt;br /&gt;trans.transform(xmlSource, new StreamResult(stringWriter));&lt;br /&gt;&lt;br /&gt;System.out.println(stringWriter.getBuffer().toString());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;After running this code the output on the console will be:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;hr&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;User 1&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;some city 1&lt;br /&gt;    (street name)&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&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;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-2768487597105165087?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/2768487597105165087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/10/xsl-transformation-from-java-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2768487597105165087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2768487597105165087'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/10/xsl-transformation-from-java-code.html' title='XSL Transformation from java code'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-6479603031600929997</id><published>2009-10-15T14:10:00.000-07:00</published><updated>2009-10-15T14:41:59.139-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='dump'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='backup database'/><category scheme='http://www.blogger.com/atom/ns#' term='restore database'/><category scheme='http://www.blogger.com/atom/ns#' term='Postgres'/><title type='text'>Backup and restore mysql and postgre databases</title><content type='html'>To make a dump of postgre database command pg_dump can be used:&lt;br /&gt;e.g.&lt;br /&gt;pg_dump -c -Uuser db_name &gt; dump.sql&lt;br /&gt;&lt;br /&gt;option -c stands for clean and it will add (drop) schema prior to create&lt;br /&gt;use -a for data only&lt;br /&gt;use -s for schema without data&lt;br /&gt;for more options type pg_dump -?&lt;br /&gt;&lt;br /&gt;to restore postgre database from sql file, operator &amp;lt; can be used to redirect input&lt;br /&gt;e.g.&lt;br /&gt;psql -Uuser db_name &lt; dump.sql&lt;br /&gt;&lt;br /&gt;To make a dump of mysql database command mysqldump can be used:&lt;br /&gt;mysqldump --add-drop-database --add-drop-table -u username -p dn_name &gt; dump.sql&lt;br /&gt;use -t for data only&lt;br /&gt;use -d for schema without data&lt;br /&gt;&lt;br /&gt;for more options type mysqldump --help&lt;br /&gt;&lt;br /&gt;to restore mysql database from sql file, operator &amp;lt; can be used to redirect input&lt;br /&gt;e.g.&lt;br /&gt;mysql -u user db_name &lt; dump.sql&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-6479603031600929997?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/6479603031600929997/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/10/backup-and-restore-mysql-and-postgre.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6479603031600929997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6479603031600929997'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/10/backup-and-restore-mysql-and-postgre.html' title='Backup and restore mysql and postgre databases'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-5557813459309799236</id><published>2009-10-06T11:05:00.002-07:00</published><updated>2009-12-06T13:59:48.763-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt 2'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><title type='text'>GWT 2.0 is here</title><content type='html'>For the start I must say: Woooohooo! GWT2 is here!&lt;br /&gt;GWT 2.0 can be download here &lt;a href="http://google-web-toolkit.googlecode.com/files/gwt-2.0.0-ms1.zip"&gt;gwt-2.0.0-ms1&lt;/a&gt;. This is a version for all platforms. When it is about the project building, I'm a fan of maven2 but I'm to anxious to see gwt2.0 in action so I decided to try to build hello world with &lt;a href="http://code.google.com/eclipse/docs/getting_started.html"&gt;Google's Eclipse plug-in&lt;/a&gt;, witch I find a bit faster, when it is about setting up the project. I'm using Eclipse 3.5 (Galileo) with plugin: http://dl.google.com/eclipse/plugin/3.5 and it worked. This how I setup the project.&lt;br /&gt;First download GWT2.0, extract the content of zip file somewhere on local drive.&lt;br /&gt;Browse to that folder, and make a copy gwt-dev.jar as gwt-dev-linux.jar (for linux users). I guess windows users should make a copy with name gwt-dev-windows.jar.&lt;br /&gt;&lt;br /&gt;Then start the wizard for 'Web Application Project', &lt;br /&gt;-type project name and package&lt;br /&gt;-uncheck Use Google App Engine&lt;br /&gt;-set Google SDKs to use specific SDK by clicking on 'Configure SDKs...&lt;br /&gt;-add new GWT SDK location by clicking on 'Add...' button&lt;br /&gt;-browse to the directory where you extracted gwt2.0 files&lt;br /&gt;-give a display name for this SDK e.g. GWT2.0m1&lt;br /&gt;-click finish&lt;br /&gt;&lt;br /&gt;Since gwt eclipse plugin is generateing hello word application it can be started by right-clicking on application in package explorer Run As-&gt;Web Application&lt;br /&gt;You should see now development mode window:&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/U8WhJqOjr2a82GHBr16ybQ?authkey=Gv1sRgCIi1qr3whrXG3AE&amp;feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_a0imbbK4r5U/SsuPnpnWxqI/AAAAAAAAAhs/j8xIE4kF4aQ/s144/gwt-dev-mode.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/milandinic83/BloggerPictures?authkey=Gv1sRgCIi1qr3whrXG3AE&amp;feat=embedwebsite"&gt;Blogger Pictures&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;From this window you can read address where you can find gwt application. You must open the browser and enter this address manually, since there is no more nasty hosted mode. In my case it is http://localhost:8080/Hello_gwt2.html?gwt.hosted=127.0.1.1:9997&lt;br /&gt;Then my FireFox complained that add-on is missing. I respected is't wish and download it.&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/hJRbtf7Va_bFvUCkLs5RVg?authkey=Gv1sRgCIi1qr3whrXG3AE&amp;feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_a0imbbK4r5U/SsuPL0I2eWI/AAAAAAAAAho/HpZop_uQZk8/s144/gwt-plugin-missing.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/milandinic83/BloggerPictures?authkey=Gv1sRgCIi1qr3whrXG3AE&amp;feat=embedwebsite"&gt;Blogger Pictures&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;And one more restart away from seeing hello world...&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/x1agOtHTbWRemGAJJPayUA?authkey=Gv1sRgCIi1qr3whrXG3AE&amp;feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_a0imbbK4r5U/SsuM_5C6eAI/AAAAAAAAAhk/fXsqrJTnalc/s144/ff-plugin.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/milandinic83/BloggerPictures?authkey=Gv1sRgCIi1qr3whrXG3AE&amp;feat=embedwebsite"&gt;Blogger Pictures&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Type the word world and....&lt;br /&gt;&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/BIw2AXE3rTp9tuC2zDsHwg?authkey=Gv1sRgCIi1qr3whrXG3AE&amp;feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_a0imbbK4r5U/SsuT8HQnLZI/AAAAAAAAAh4/FItkZSnn9lE/s144/gwt2-in-firefox.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;From &lt;a href="http://picasaweb.google.com/milandinic83/BloggerPictures?authkey=Gv1sRgCIi1qr3whrXG3AE&amp;feat=embedwebsite"&gt;Blogger Pictures&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;One very important information can be seen on this last screen shot, it is version of browser, and it is firefox 3.5.4.&lt;br /&gt;&lt;br /&gt;I have also tried debugging, it worked fine. Next thing to try is to make a maven2-gwt2 project that compiles and to try it with with GXT framework. That's all for now.&lt;br /&gt;&lt;br /&gt;UPDATE:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://milandinic.blogspot.com/2009/12/gwt-20-rc1-build-with-maven.html"&gt;http://milandinic.blogspot.com/2009/12/gwt-20-rc1-build-with-maven.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-5557813459309799236?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/5557813459309799236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/10/gwt-20-is-here.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5557813459309799236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5557813459309799236'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/10/gwt-20-is-here.html' title='GWT 2.0 is here'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_a0imbbK4r5U/SsuPnpnWxqI/AAAAAAAAAhs/j8xIE4kF4aQ/s72-c/gwt-dev-mode.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-4478427371264098843</id><published>2009-10-05T13:23:00.001-07:00</published><updated>2009-10-06T02:32:15.744-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>XSL Transformation using a browser</title><content type='html'>XSL stands for EXtensible Stylesheet Language, and is a style sheet language for XML documents.&lt;br /&gt;XSLT stands for XSL Transformations. I will show you how to do common transformations.&lt;br /&gt;Here is the xsl file, extension is not important so I named file with next content template.html&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match="/"&amp;gt;&lt;br /&gt; &amp;lt;html&amp;gt;&lt;br /&gt; &amp;lt;body&amp;gt;&lt;br /&gt; &amp;lt;xsl:variable name="my_name" select='"milan"'/&amp;gt;&lt;br /&gt; Hi my name is &amp;lt;xsl:value-of select='$my_name' /&amp;gt;&lt;br /&gt; &amp;lt;br /&amp;gt;&lt;br /&gt; &amp;lt;hr /&amp;gt;&lt;br /&gt; &amp;lt;table&amp;gt;&lt;br /&gt;  &amp;lt;xsl:for-each select="users/user"&amp;gt;&lt;br /&gt;   &amp;lt;tr&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='@id' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='name' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='address/city' /&amp;gt;&lt;br /&gt;    (&amp;lt;xsl:value-of select='address/street' /&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt; &amp;lt;/table&amp;gt;&lt;br /&gt; &amp;lt;hr /&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;table&amp;gt;&lt;br /&gt;  &amp;lt;xsl:for-each select="users/user"&amp;gt;&lt;br /&gt;   &amp;lt;xsl:if test="type != 'super-user'"&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='@id' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='name' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='address/city' /&amp;gt; &lt;br /&gt;     (&amp;lt;xsl:value-of select='address/street' /&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;   &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt; &amp;lt;/table&amp;gt;&lt;br /&gt; &amp;lt;hr /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;table&amp;gt;&lt;br /&gt;  &amp;lt;xsl:for-each select="users/user"&amp;gt;&lt;br /&gt;   &amp;lt;xsl:if test="@id &amp;amp;lt; 3 and address/@id &amp;gt;1"&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='@id' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='name' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='address/city' /&amp;gt; &lt;br /&gt;     (&amp;lt;xsl:value-of select='address/street' /&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;   &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt; &amp;lt;/table&amp;gt;&lt;br /&gt; &amp;lt;hr /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;table&amp;gt;&lt;br /&gt;  &amp;lt;xsl:for-each select="users/user[position() = 3 or position()&amp;amp;lt;2]"&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='@id' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='name' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='address/city' /&amp;gt;&lt;br /&gt;     (&amp;lt;xsl:value-of select='address/street' /&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt; &amp;lt;/table&amp;gt;&lt;br /&gt; &amp;lt;hr /&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;table&amp;gt;&lt;br /&gt;  &amp;lt;xsl:for-each select="users/user[type='user' and address[@id=5]]"&amp;gt;&lt;br /&gt;    &amp;lt;tr&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='@id' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='name' /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select='address/city' /&amp;gt; &lt;br /&gt;     (&amp;lt;xsl:value-of select='address/street' /&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt; &amp;lt;/table&amp;gt;&lt;br /&gt; &amp;lt;hr /&amp;gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&lt;br /&gt; &amp;lt;/html&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Next content should be saved to XML file and opened using any Internet browser. Since location of stylesheet is set to template.html, this file should be in same 'folder' as this XML file. Note that condition signs for lower and higher needs to be escaped.&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&amp;gt;&lt;br /&gt;&amp;lt;?xml-stylesheet type='text/xsl' href='template.html'?&amp;gt;&lt;br /&gt;&amp;lt;users&amp;gt;&lt;br /&gt; &amp;lt;user id="1"&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;User 1&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;type&amp;gt;user&amp;lt;/type&amp;gt;&lt;br /&gt;  &amp;lt;address id="1"&amp;gt;&lt;br /&gt;   &amp;lt;street&amp;gt;street name&amp;lt;/street&amp;gt;&lt;br /&gt;   &amp;lt;city id="1"&amp;gt;some city 1&amp;lt;/city&amp;gt;&lt;br /&gt;  &amp;lt;/address&amp;gt;&lt;br /&gt; &amp;lt;/user&amp;gt;&lt;br /&gt; &amp;lt;user id="2"&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;User 2&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;type&amp;gt;user&amp;lt;/type&amp;gt;&lt;br /&gt;  &amp;lt;address id="2"&amp;gt;&lt;br /&gt;   &amp;lt;street&amp;gt;street name&amp;lt;/street&amp;gt;&lt;br /&gt;   &amp;lt;city id="2"&amp;gt;some city 2&amp;lt;/city&amp;gt;&lt;br /&gt;  &amp;lt;/address&amp;gt;&lt;br /&gt; &amp;lt;/user&amp;gt;&lt;br /&gt; &amp;lt;user id="3"&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;User 3&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;type&amp;gt;user&amp;lt;/type&amp;gt;&lt;br /&gt;  &amp;lt;address id="3"&amp;gt;&lt;br /&gt;   &amp;lt;street&amp;gt;street name&amp;lt;/street&amp;gt;&lt;br /&gt;   &amp;lt;city id="3"&amp;gt;some city 3&amp;lt;/city&amp;gt;&lt;br /&gt;  &amp;lt;/address&amp;gt;&lt;br /&gt; &amp;lt;/user&amp;gt;&lt;br /&gt; &amp;lt;user id="4"&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;User 4&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;type&amp;gt;user&amp;lt;/type&amp;gt;&lt;br /&gt;  &amp;lt;address id="5"&amp;gt;&lt;br /&gt;   &amp;lt;street&amp;gt;street name&amp;lt;/street&amp;gt;&lt;br /&gt;   &amp;lt;city id="1"&amp;gt;some city 1&amp;lt;/city&amp;gt;&lt;br /&gt;  &amp;lt;/address&amp;gt;&lt;br /&gt; &amp;lt;/user&amp;gt;&lt;br /&gt; &amp;lt;user id="5"&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;User 5&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;type&amp;gt;user&amp;lt;/type&amp;gt;&lt;br /&gt;  &amp;lt;address id="5"&amp;gt;&lt;br /&gt;   &amp;lt;street&amp;gt;street name&amp;lt;/street&amp;gt;&lt;br /&gt;   &amp;lt;city id="1"&amp;gt;some city 1&amp;lt;/city&amp;gt;&lt;br /&gt;  &amp;lt;/address&amp;gt;&lt;br /&gt; &amp;lt;/user&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;user id="6"&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;User 6&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;type&amp;gt;super-user&amp;lt;/type&amp;gt;&lt;br /&gt;  &amp;lt;address id="5"&amp;gt;&lt;br /&gt;   &amp;lt;street&amp;gt;street name&amp;lt;/street&amp;gt;&lt;br /&gt;   &amp;lt;city id="1"&amp;gt;some city 1&amp;lt;/city&amp;gt;&lt;br /&gt;  &amp;lt;/address&amp;gt;&lt;br /&gt; &amp;lt;/user&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/users&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;First, there is a demonstration how to use variable and after that there are examples of for and if statements.&lt;br /&gt;&lt;br /&gt;As a result of this loops we will get 5 tables:&lt;br /&gt;1. with all users&lt;br /&gt;2. without super users&lt;br /&gt;3. users that for fulfill condition: lower user id then 3 and street id greater then 1&lt;br /&gt;4. show 3th user and with position lower then 2 (note that in condition stands or, this is not a mistake)&lt;br /&gt;5. show users who have type 'user' and address with id 5&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This is what we get after loading this XML file in browser:&lt;br /&gt;&lt;br /&gt; Hi my name is milan&lt;br&gt;&lt;hr&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;User 1&lt;/td&gt;&lt;td&gt;some city 1&lt;br /&gt;    (street name)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;User 2&lt;/td&gt;&lt;td&gt;some city 2&lt;br /&gt;    (street name)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;User 3&lt;/td&gt;&lt;td&gt;some city 3&lt;br /&gt;    (street name)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;User 4&lt;/td&gt;&lt;td&gt;some city 1&lt;br /&gt;    (street name)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;User 5&lt;/td&gt;&lt;td&gt;some city 1&lt;br /&gt;    (street name)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;User 6&lt;/td&gt;&lt;td&gt;some city 1&lt;br /&gt;    (street name)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;User 1&lt;/td&gt;&lt;td&gt;some city 1 &lt;br /&gt;     (street name)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;User 2&lt;/td&gt;&lt;td&gt;some city 2 &lt;br /&gt;     (street name)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;User 3&lt;/td&gt;&lt;td&gt;some city 3 &lt;br /&gt;     (street name)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;User 4&lt;/td&gt;&lt;td&gt;some city 1 &lt;br /&gt;     (street name)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;User 5&lt;/td&gt;&lt;td&gt;some city 1 &lt;br /&gt;     (street name)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;User 2&lt;/td&gt;&lt;td&gt;some city 2 &lt;br /&gt;     (street name)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;User 1&lt;/td&gt;&lt;td&gt;some city 1&lt;br /&gt;     (street name)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;User 3&lt;/td&gt;&lt;td&gt;some city 3&lt;br /&gt;     (street name)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;User 4&lt;/td&gt;&lt;td&gt;some city 1 &lt;br /&gt;     (street name)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;User 5&lt;/td&gt;&lt;td&gt;some city 1 &lt;br /&gt;     (street name)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-4478427371264098843?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/4478427371264098843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/10/xsl-transformation-using-browser.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/4478427371264098843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/4478427371264098843'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/10/xsl-transformation-using-browser.html' title='XSL Transformation using a browser'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-2441456724512715086</id><published>2009-09-28T09:28:00.000-07:00</published><updated>2009-09-28T14:52:52.316-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='i18n'/><category scheme='http://www.blogger.com/atom/ns#' term='l11n'/><title type='text'>Smart way to localize GWT application</title><content type='html'>Standard way of creating i18n interface is to create interface in client package and extend com.google.gwt.i18n.client.Constants. &lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.google.gwt.i18n.demo.client;&lt;br /&gt;&lt;br /&gt;import com.google.gwt.core.client.GWT;&lt;br /&gt;import com.google.gwt.i18n.client.Constants;&lt;br /&gt;&lt;br /&gt;public interface DemoI18N extends Constants {&lt;br /&gt;&lt;br /&gt;    public static final DemoI18N I18N = GWT.create(DemoI18N.class);&lt;br /&gt;&lt;br /&gt;    String goodDay();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then create properties files with translations like this:&lt;br /&gt;&lt;br /&gt;File DemoI18N.properties in same package with content:&lt;br /&gt;goodDay='day to you&lt;br /&gt;&lt;br /&gt;File DemoI18N_fr_FR.properties in same package with content:&lt;br /&gt;goodDay=bonne journée&lt;br /&gt;&lt;br /&gt;It is important to edit .gwt.xml file and add which languages (translations) are supported by application. Here I'll support fr_FR (French), default file will be in file without _x_X name sufix.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  &amp;lt;extend-property name="locale" values="fr_FR" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here is the example of the I18N use:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import static com.google.gwt.i18n.demo.client.DemoI18N.I18N;&lt;br /&gt;&lt;br /&gt;import com.google.gwt.core.client.EntryPoint;&lt;br /&gt;import com.google.gwt.user.client.ui.HTML;&lt;br /&gt;import com.google.gwt.user.client.ui.RootPanel;&lt;br /&gt;&lt;br /&gt;public class I18nDemo implements EntryPoint {&lt;br /&gt;&lt;br /&gt;    public void onModuleLoad() {&lt;br /&gt;        RootPanel.get().add(new HTML(I18N.goodDay()));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You are now able to access application in different language using address bar by appending url with parameter locale and locale value e.g. http://localhost:8080/I18nDemo.html?locale=fr_FR&lt;br /&gt;&lt;br /&gt;If you don't want to append locale to url you can use the java script code below. Edit head section of .html file and add this lines:&lt;br /&gt;&lt;pre name="code" class="js"&gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;var search = location.search;&lt;br /&gt;  if(search.indexOf("locale") == -1){&lt;br /&gt;    var lang = navigator.language!=null ? navigator.language : navigator.browserLanguage;&lt;br /&gt;    var lang = lang.replace("-", "_");&lt;br /&gt;    document.write("&amp;lt;meta name='gwt:property' content='locale="+lang +"'&amp;gt;"); &lt;br /&gt;  }&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;What this code does is checks is there a locale parameter in url, if it is not there, this js will create tag that will be read by GWT to apply i18n. This way your GWT application will be able to detect language on you browser and if that language is among translations it will display pages translated without need of declaring locale parameter. But if there is a locale parameter it will have advantage, and meta tag for gwt i18n will not be added to html.&lt;br /&gt;It is important to add this js code before js import of file .nocache.js.&lt;br /&gt;&lt;br /&gt;Btw i18n is the abbreviation of internationalization, and the 18 stands for 18 letters 'nternationalizatio', so when we add I at beginning and N at the end we get the word internationalization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-2441456724512715086?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/2441456724512715086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/09/smart-way-to-localize-gwt-application.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2441456724512715086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2441456724512715086'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/09/smart-way-to-localize-gwt-application.html' title='Smart way to localize GWT application'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-5071854937559853120</id><published>2009-09-24T09:06:00.000-07:00</published><updated>2009-09-24T09:16:41.645-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='mount partition'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Mount ntfs partition on Ubuntu startup</title><content type='html'>List of all available partitions can be seen using command:&lt;br /&gt;&lt;br /&gt;sudo fdisk -l&lt;br /&gt;&lt;br /&gt;In my case I've got:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Disk /dev/sda: 160.0 GB, 160041885696 bytes&lt;br /&gt;255 heads, 63 sectors/track, 19457 cylinders&lt;br /&gt;Units = cylinders of 16065 * 512 = 8225280 bytes&lt;br /&gt;Disk identifier: 0x13e413e3&lt;br /&gt;&lt;br /&gt;   Device Boot      Start         End      Blocks   Id  System&lt;br /&gt;/dev/sda1   *           1        3291    26434926    7  HPFS/NTFS&lt;br /&gt;/dev/sda2            3292       19457   129853395    f  W95 Ext'd (LBA)&lt;br /&gt;/dev/sda5            3292       15626    99080856    7  HPFS/NTFS&lt;br /&gt;/dev/sda6           15627       19214    28820578+  83  Linux&lt;br /&gt;/dev/sda7           19215       19457     1951866   82  Linux swap / Solaris&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Setting partition to automatically mount can be done using next steps:&lt;br /&gt;create folder:&lt;br /&gt;sudo mkdir /media/windows &lt;br /&gt;&lt;br /&gt;make a copy of file system table:&lt;br /&gt;sudo cp /etc/fstab /etc/fstab.bak&lt;br /&gt;&lt;br /&gt;edit file system table:&lt;br /&gt;sudo nano /etc/fstab&lt;br /&gt;&lt;br /&gt;add next line to the fstab file assuming your hda1 filesystem is ntfs:&lt;br /&gt;/dev/sda1 /media/windows ntfs defaults 0 0&lt;br /&gt;&lt;br /&gt;we got sda1 using fdisk -l, while /media/windows is the directory we have created before.&lt;br /&gt;&lt;br /&gt;refresh the file system table:&lt;br /&gt;sudo mount -a&lt;br /&gt;&lt;br /&gt;try to enter /media/hda1 by using dir command.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-5071854937559853120?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/5071854937559853120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/09/mount-ntfs-partition-on-ubuntu-startup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5071854937559853120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5071854937559853120'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/09/mount-ntfs-partition-on-ubuntu-startup.html' title='Mount ntfs partition on Ubuntu startup'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-5211584436995879896</id><published>2009-09-15T15:12:00.001-07:00</published><updated>2009-09-16T00:16:08.479-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='jsni'/><title type='text'>Calling a private method from super class in GWT</title><content type='html'>Let say we have a class that we want to extend e.g Messenger class. And this class contains private methods. And we want to use them to set of get some value. In java this would be possible only using reflection, but since I'm talking about GWT client side code reflection is not an option. Since GWT compiles java to javascript, and javascript does not have visibility modifiers we can use JavaScript Native Interface GWT (JSNI) to access this methods. Here is the example how to use private methods and fields from super class.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class Messenger {&lt;br /&gt;&lt;br /&gt;    private double secretNumber;&lt;br /&gt;&lt;br /&gt;    public Messenger() {&lt;br /&gt;        super();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void setSecretNumber(final double number) {&lt;br /&gt;        this.secretNumber = number;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private String sayHi(final String name, final int number) {&lt;br /&gt;        return "Hi " + name + " I've got number " + number;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class MyMessenger extends Messenger {&lt;br /&gt;&lt;br /&gt;    public MyMessenger() {&lt;br /&gt;        super();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    public native String sayHiFromMessenger(final String name, int number)&lt;br /&gt;    /*-{&lt;br /&gt;        return this.@com.google.gwt.client.MyMessenger::sayHi(Ljava/lang/String;I)(name,number);&lt;br /&gt;    }-*/;&lt;br /&gt;&lt;br /&gt;    public native void setSecretNumberToSuper(final double number)&lt;br /&gt;    /*-{&lt;br /&gt;        this.@com.google.gwt.client.MyMessenger::setSecretNumber(D)(number);&lt;br /&gt;    }-*/;&lt;br /&gt;&lt;br /&gt;    public native double getSecretNumberFromSuper()&lt;br /&gt;    /*-{&lt;br /&gt;        return this.@com.google.gwt.client.MyMessenger::secretNumber;&lt;br /&gt;    }-*/;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This is JNI format:&lt;br /&gt;-for static methods:&lt;br /&gt;@className::methodName(signatures)(args)&lt;br /&gt;-for instance methods&lt;br /&gt;this.@className::methodName(signatures)(args)&lt;br /&gt;-for fields&lt;br /&gt;this.@className::fieldName&lt;br /&gt;&lt;br /&gt;Here are the signatures used in JSNI:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Real type - Signature&lt;/b&gt;&lt;br /&gt;int - I&lt;br /&gt;boolean - Z&lt;br /&gt;double - D&lt;br /&gt;String - Ljava/lang/String&lt;br /&gt;FooBar - Lpackage/of/FooBar&lt;br /&gt;FooBar[] - [Lpackage/of/FooBar&lt;br /&gt;&lt;br /&gt;Use ; as signature separator, without commas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-5211584436995879896?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/5211584436995879896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/09/calling-private-method-from-super-class.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5211584436995879896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5211584436995879896'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/09/calling-private-method-from-super-class.html' title='Calling a private method from super class in GWT'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-3031751606842698943</id><published>2009-09-02T14:19:00.000-07:00</published><updated>2009-09-02T14:39:19.578-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='h2'/><title type='text'>How to access H2 database</title><content type='html'>There are two way to access &lt;a href="http://en.wikipedia.org/wiki/H2_%28DBMS%29"&gt;h2&lt;/a&gt; without api:&lt;br /&gt;&lt;br /&gt;Pre-requirement is that JRE is installed and that current directory contains jar with h2.&lt;br /&gt;&lt;br /&gt;First is to execute this command :&lt;br /&gt;java -jar h2-1.1.116.jar&lt;br /&gt;&lt;br /&gt;This will open browser window with login window. And with click on Connect button, without changing any parameter, browser will be redirected to page where queries can be executed and existing tables can be seen on UI.&lt;br /&gt;&lt;br /&gt;Second is to execute this command :&lt;br /&gt;java -classpath h2-1.1.116.jar org.h2.tools.Shell&lt;br /&gt;&lt;br /&gt;This way we are able to access h2 database thought shell, which is great if manipulation with h2 is needed on remote computer. H2 will offer you to change access parameters such as URL, Driver, User and Password, but Enter key can be hit instead of entering any specific data and this will be enough to log in. Password needs to be retyped I guess, so 2x Enter for password is needed.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mile@mile-laptop:~/javatools/m2_repo/com/h2database/h2/1.1.116$ java -classpath h2-1.1.116.jar org.h2.tools.Shell &lt;br /&gt;&lt;br /&gt;Welcome to H2 Shell 1.1.116 (2009-07-18)&lt;br /&gt;Exit with Ctrl+C&lt;br /&gt;[Enter]   jdbc:h2:~/test&lt;br /&gt;URL       &lt;br /&gt;[Enter]   org.h2.Driver&lt;br /&gt;Driver    &lt;br /&gt;[Enter]   sa&lt;br /&gt;User      &lt;br /&gt;[Enter]   Hide&lt;br /&gt;Password  &lt;br /&gt;Password  &lt;br /&gt;Connected&lt;br /&gt;Commands are case insensitive; SQL statements end with ';'&lt;br /&gt;help or ?      Display this help&lt;br /&gt;list           Toggle result list mode&lt;br /&gt;maxwidth       Set maximum column width (default is 100)&lt;br /&gt;show           List all tables&lt;br /&gt;describe       Describe a table&lt;br /&gt;quit or exit   Close the connection and exit&lt;br /&gt;&lt;br /&gt;sql&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/2439782663440463327-3031751606842698943?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/3031751606842698943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/09/how-to-access-h2-database.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3031751606842698943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3031751606842698943'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/09/how-to-access-h2-database.html' title='How to access H2 database'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-6074711195907474545</id><published>2009-08-29T01:28:00.000-07:00</published><updated>2009-08-29T01:42:02.459-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>How to Install MySql on Ubuntu Linux</title><content type='html'>Install server itself by using shell command:&lt;br /&gt;sudo apt-get install mysql-server&lt;br /&gt;&lt;br /&gt;Stop the server:&lt;br /&gt;sudo /etc/init.d/mysql stop&lt;br /&gt;&lt;br /&gt;Start the mysqld configuration:&lt;br /&gt;sudo mysqld --skip-grant-tables &amp;&lt;br /&gt;&lt;br /&gt;Login to MySQL as root:&lt;br /&gt;mysql -u root mysql&lt;br /&gt;&lt;br /&gt;Change the root password (replace newpassword with new password):&lt;br /&gt;UPDATE user SET Password=PASSWORD('newpassword') WHERE User='root'; FLUSH PRIVILEGES; exit;&lt;br /&gt;&lt;br /&gt;You can login into mysql like this:&lt;br /&gt;mysql -u root -p&lt;br /&gt;&lt;enter password and you are there&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://img198.imageshack.us/img198/6364/mysqle.png" alt="Image Hosted by ImageShack.us"/&gt;&lt;br /&gt;&lt;br /&gt;You can install MySql Query Browser by using add remove from Applications menu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-6074711195907474545?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/6074711195907474545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/08/how-to-install-mysql-on-ubuntu-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6074711195907474545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6074711195907474545'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/08/how-to-install-mysql-on-ubuntu-linux.html' title='How to Install MySql on Ubuntu Linux'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-6932524385204228259</id><published>2009-08-24T12:15:00.000-07:00</published><updated>2009-08-24T12:44:20.492-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='winamp'/><category scheme='http://www.blogger.com/atom/ns#' term='wine'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>WinAmp on Ubuntu Linux</title><content type='html'>For a lot of people this might be an old news. But for me it is a new step forward in using ubuntu os. It is possibility to use window applications under linux environment, without need of virtual machine. First step is to install Wine.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Think of Wine as a compatibility layer for running Windows programs. Wine does not require Microsoft Windows, as it is a completely free alternative implementation of the Windows API consisting of 100% non-Microsoft code, however Wine can optionally use native Windows DLLs if they are available. Wine provides both a development toolkit for porting Windows source code to Unix as well as a program loader, allowing many unmodified Windows programs to run on x86-based Unixes, including Linux, FreeBSD, and Solaris.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;You can install it from Add/remove programs or by using shell command:&lt;br /&gt;sudo apt-get install wine winecfg&lt;br /&gt;&lt;br /&gt;The fact that I want to use WinAmp implicates that I already used it. And I still have it installed under windows. Now navigate to C:\Program Files, and copy the WinAmp folder to Ubuntu /home/username/.wine/drive_c/Program Files folder.&lt;br /&gt;&lt;br /&gt;If you cannot find /.wine folder in your home directory, run Configure Wine e.g. from Apllications menu. Wine-&gt;Configure Wine.&lt;br /&gt;&lt;br /&gt;WinAmp can be start with command:&lt;br /&gt;&lt;br /&gt;wine /home/mile/.wine/drive_c/Program\ Files/Winamp/Winamp.exe&lt;br /&gt;&lt;br /&gt;Of course it is better to make shortcut on desktop instead of this command.&lt;br /&gt;&lt;br /&gt;And that's it. You can see winamp running on my desktop.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://img34.imageshack.us/img34/2397/winamponlinux.png" alt="Image Hosted by ImageShack.us"/&gt;&lt;br /&gt;&lt;br /&gt;It is really nice to have this possibility, but it does not mean that I will use WinAmp all the time, but right now it is really interesting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-6932524385204228259?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/6932524385204228259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/08/winamp-on-ubuntu-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6932524385204228259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6932524385204228259'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/08/winamp-on-ubuntu-linux.html' title='WinAmp on Ubuntu Linux'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-8187935048781220744</id><published>2009-07-30T09:20:00.000-07:00</published><updated>2009-07-30T09:53:36.558-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shift with numeric keys'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Shift with numeric keys on Ubuntu Linux</title><content type='html'>The way operating system interprets keyboard key presses and combination of keys is very important to me. I've been using windows os for years, and I've created some habits and I'm really trying to leave windows behind but it is not easy to leave habits behind and I'm trying to adjust Ubuntu to behave as I wish, and for now, I'm on the right track. &lt;br /&gt;The critical key combination is shift+end (or home), home and and keys are on numeric pad. What I expected to get is current line selected from cursor position to the end of the line, for end; and current line selected from cursor position to the beginning of the line, for home. By default this was not happening, I'm getting 7 for shift+home and 1 for shift+end.&lt;br /&gt;It is because I have a laptop with keyboard that has home and end keys on numeric pad, and this keys should only be active when num lock is on, but combination with shift has somehow changed this behavior.&lt;br /&gt;&lt;br /&gt;I found the solution for this trouble, and it can be found in 'Keyboard Preferences' window. &lt;br /&gt;Go to:&lt;br /&gt;System-&gt;Prefrences-&gt;Keyboard&lt;br /&gt;Select Layouts tab&lt;br /&gt;Press 'Layout Options...'&lt;br /&gt;Select 'Miscellaneous compatibility options'&lt;br /&gt;Check 'Shift witch numeric keys works as in MS Windows'&lt;br /&gt;&lt;br /&gt;This works on Ubuntu 9.04. It is possible that there is a same option on other versions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-8187935048781220744?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/8187935048781220744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/07/shift-witch-numeric-keys-on-ubuntu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8187935048781220744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8187935048781220744'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/07/shift-witch-numeric-keys-on-ubuntu.html' title='Shift with numeric keys on Ubuntu Linux'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-7117923423765914643</id><published>2009-07-28T09:10:00.000-07:00</published><updated>2009-07-30T09:51:56.753-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='xulrunner'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse crash'/><title type='text'>Eclipse keeps crashing</title><content type='html'>I have just started to use FireFox 3.6a1pre aka Minefield on Ubuntu. As you can see it is alfa, but i like to latest software. It is not always completely stable but it is good enough to use it. Installing this software also installed xulrunner-1.9.1.2pre. It was not that obvious that some other software, e.g. eclipse ide, may stop working.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;XULRunner is a Mozilla runtime package that can be used to bootstrap XUL+XPCOM applications that are as rich as Firefox and Thunderbird. It will provide mechanisms for installing, upgrading, and uninstalling these applications. XULRunner will also provide libxul, a solution which allows the embedding of Mozilla technologies in other projects and products.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;My problem was: always when I tried to see javadoc by hovering the cursor over the class name or anything that has javadoc, IDE just disappeared. Leaving the nasty hs_err_pidxxxx.log files behind.&lt;br /&gt;E.g.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Stack: [0xbf9ac000,0xbf9fc000],  sp=0xbf9f9f9c,  free space=311k&lt;br /&gt;Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)&lt;br /&gt;C  0x4f4d0045&lt;br /&gt;C  [libxul.so+0x187204]&lt;br /&gt;C  [libxul.so+0x993bb4]  NS_InitXPCOM3_P+0x148&lt;br /&gt;C  [libxul.so+0x1a67e5]  XRE_InitEmbedding+0x102&lt;br /&gt;C  [libswt-xulrunner-gtk-3549.so+0x6038]  Java_org_eclipse_swt_internal_mozilla_XPCOM__1Call__IIIIII+0x18&lt;br /&gt;j  org.eclipse.swt.internal.mozilla.XPCOM._Call(IIIIII)I+0&lt;br /&gt;j  org.eclipse.swt.internal.mozilla.XPCOM.Call(IIIIII)I+15&lt;br /&gt;j  org.eclipse.swt.browser.Mozilla.create(Lorg/eclipse/swt/widgets/Composite;I)V+1523&lt;br /&gt;j  org.eclipse.swt.browser.Browser.&lt;init&gt;(Lorg/eclipse/swt/widgets/Composite;I)V+227&lt;br /&gt;j  org.eclipse.jface.internal.text.html.BrowserInformationControl.isAvailable(Lorg/eclipse/swt/widgets/Composite;)Z+12&lt;br /&gt;j  org.eclipse.jdt.internal.ui.text.java.hover.JavadocHover$HoverControlCreator.doCreateInformationControl(Lorg/eclipse/swt/widgets/Shell;)Lorg/eclipse/jface/text/IInformationControl;+18&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Searching the web for 'libswt-xulrunner-gtk-3549.so+0x6038' or similar did not gave me any good answer, but libswt-xulrunner-gtk rang my bell. I remember that xulrunner can be set for eclipse in eclipse.ini. I did this configuration before, I can't recall why, but I know i did it.&lt;br /&gt;I have tried older version of xulrunner, and it works. This is the content of the eclipse.ini that works for me. &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;-showsplash&lt;br /&gt;org.eclipse.platform&lt;br /&gt;-framework&lt;br /&gt;plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030.jar&lt;br /&gt;-vmargs&lt;br /&gt;-Dorg.eclipse.swt.browser.XULRunnerPath=/usr/lib/xulrunner-1.9.0.12&lt;br /&gt;-Dosgi.requiredJavaVersion=1.5&lt;br /&gt;-Xms40m&lt;br /&gt;-Xmx256m&lt;br /&gt;-XX:MaxPermSize=256m&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Of course you path does not have to be '/usr/lib/xulrunner-1.9.0.12', check which versions you have installed in /usr/lib folder. Now I can again enjoy the use of FireFox 3.6 and Eclipse on My Ubuntu.&lt;br /&gt;&lt;br /&gt;How to get FireFox 3.6 on Ubuntu, check out on &lt;a href="http://webupd8.blogspot.com/2009/06/firefox-35-rc-1-ubuntu-repository-deb.html"&gt;this blog&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-7117923423765914643?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/7117923423765914643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/07/eclipse-keeps-chrashing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/7117923423765914643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/7117923423765914643'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/07/eclipse-keeps-chrashing.html' title='Eclipse keeps crashing'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-2537120372050305989</id><published>2009-07-14T14:31:00.000-07:00</published><updated>2009-07-14T15:01:08.305-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='junit 4'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><title type='text'>What's new in JUnit 4 (at least for me)</title><content type='html'>I've been using junit 4 for a while, but only the stuff (annotations) that I needed like @Test, @Before, @After, @BeforeClass and @AfterClass. New annotations, for me are:&lt;br /&gt;&lt;br /&gt;@Igonre, this one is great whe you want to skip test, there is not reason to remove some tests, that I don't want to run at the moment. Just add @Ignore (below or under @Test) and test result will be ignored. A class can be also annotated with this annotation, and all tests that are in this class will be skipped.&lt;br /&gt;@Parameters, run same test with different values. This one is great for reducing code duplicity and to increase maintainability of the tests.&lt;br /&gt;@Parameters annotation needs to be used along with annotation for runner @RunWith(value = Parameterized.class)&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;import org.junit.After;&lt;br /&gt;import org.junit.AfterClass;&lt;br /&gt;import org.junit.Assert;&lt;br /&gt;import org.junit.Before;&lt;br /&gt;import org.junit.BeforeClass;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;import org.junit.runner.RunWith;&lt;br /&gt;import org.junit.runners.Parameterized;&lt;br /&gt;import org.junit.runners.Parameterized.Parameters;&lt;br /&gt;&lt;br /&gt;@RunWith(value = Parameterized.class)&lt;br /&gt;public class DemoTest {&lt;br /&gt;&lt;br /&gt; private int number;&lt;br /&gt;&lt;br /&gt; public DemoTest(int number) {&lt;br /&gt;  super();&lt;br /&gt;  this.number = number;&lt;br /&gt;  System.out.println("DemoTest.DemoTest()");&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @Before&lt;br /&gt; public void before(){&lt;br /&gt;  System.out.println("DemoTest.before()");&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @After&lt;br /&gt; public void after(){&lt;br /&gt;  System.out.println("DemoTest.after()");&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; @BeforeClass&lt;br /&gt; public static void beforeClass(){&lt;br /&gt;  System.out.println("DemoTest.beforeClass()");&lt;br /&gt; } &lt;br /&gt; &lt;br /&gt; @AfterClass&lt;br /&gt; public static void afterClass(){&lt;br /&gt;  System.out.println("DemoTest.afterClass()");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Test&lt;br /&gt; public void testOne() {&lt;br /&gt;  Assert.assertTrue(number &lt; 3);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Test&lt;br /&gt; public void testTwo() {&lt;br /&gt;  Assert.assertTrue(number &gt; 0);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Parameters&lt;br /&gt; public static Collection data() {&lt;br /&gt;  Object[][] data = new Object[][] { { 1 }, { 2 } };&lt;br /&gt;  return Arrays.asList(data);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Execution of this tests have trace like this&lt;br /&gt;&lt;br /&gt;DemoTest.beforeClass()&lt;br /&gt;DemoTest.DemoTest()&lt;br /&gt;DemoTest.before()&lt;br /&gt;DemoTest.after()&lt;br /&gt;DemoTest.DemoTest()&lt;br /&gt;DemoTest.before()&lt;br /&gt;DemoTest.after()&lt;br /&gt;DemoTest.DemoTest()&lt;br /&gt;DemoTest.before()&lt;br /&gt;DemoTest.after()&lt;br /&gt;DemoTest.DemoTest()&lt;br /&gt;DemoTest.before()&lt;br /&gt;DemoTest.after()&lt;br /&gt;DemoTest.afterClass()&lt;br /&gt;&lt;br /&gt;So cool, isn't it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-2537120372050305989?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/2537120372050305989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/07/whats-new-in-junit-4-atleast-for-me.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2537120372050305989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2537120372050305989'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/07/whats-new-in-junit-4-atleast-for-me.html' title='What&apos;s new in JUnit 4 (at least for me)'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-7415076190323438961</id><published>2009-07-10T02:09:00.000-07:00</published><updated>2009-07-10T02:32:10.222-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='usb connect'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><title type='text'>Connect Windows Mobile to Linux OS via USB</title><content type='html'>Best way I found to connect my device (HTC 3600p) to Ubuntu using USB cable is by using application wm5torage for the device, it can be downloaded &lt;a href="http://freewareppc.com/communication/wm5torage.shtml"&gt;form this site&lt;/a&gt;. It will show your storage card from device as removable drive, which is by mine opinion the best way to show it. For me this application did not work until I checked both 'Disable concurrency' and 'Disable RNDIS on Activate' as shown on next image. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://img11.imageshack.us/img11/9282/sshot001o.png" alt="Image Hosted by ImageShack.us"/&gt;&lt;br /&gt;&lt;br /&gt;After connecting the device, lunching wm5torage, and click on activate, mini sd card showed as removable drive:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://img268.imageshack.us/img268/4393/drive.png" alt="Image Hosted by ImageShack.us"/&gt;&lt;br /&gt;&lt;br /&gt;I guess this should work on windows also. I will try it as soon as reboot my laptop and boot windows, but I do do that more the once a week so it can take a while.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-7415076190323438961?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/7415076190323438961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/07/connect-windows-mobile-to-linux-os-via.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/7415076190323438961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/7415076190323438961'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/07/connect-windows-mobile-to-linux-os-via.html' title='Connect Windows Mobile to Linux OS via USB'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-1557885944988708474</id><published>2009-06-21T04:15:00.000-07:00</published><updated>2009-06-21T07:46:22.186-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='wappalyzer'/><category scheme='http://www.blogger.com/atom/ns#' term='incompatible addons'/><title type='text'>Wappalyzer addon on Firefox 3.5</title><content type='html'>Because of poor performance I've upgraded FireFox 3.x to 3.5x and now its much better. I deliberately said 'much better' since there is always more room for performance upgrade. What I like about Firefox is that it has a bunch of plugins, and without them, surfing is just not the same. E.g. I just can't image web surfing without this addon &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/10229"&gt;wappalyzer&lt;/a&gt; which shows you which software technologies and tools are used on the page you're currently at. And since FireFox 3.5x is still release candidate there is compatibility issue with some add-ons. One of the add-ons that I use and that are not compatible is wappalyzer. But there is a way to override this compatibility constraint and see is this add-on really incompatible. &lt;br /&gt;&lt;br /&gt;Enter advanced setting by typing 'about:config' into address bar &lt;br /&gt;Click the “I’ll be careful, I promise!” button.&lt;br /&gt;Right-click on the Firefox window. Select New -&gt; Boolean.&lt;br /&gt;For name, type 'extensions.checkCompatibility' and click OK.&lt;br /&gt;Select false for value, and click OK.&lt;br /&gt;&lt;br /&gt;Now restart Firefox and wappalyzer works on Firefox 3.5x.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://img265.imageshack.us/img265/1262/wapp.png" alt="Image Hosted by ImageShack.us"/&gt;&lt;br /&gt;&lt;br /&gt;Although Firefox states that wappalyzer is not compatible, it works fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-1557885944988708474?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/1557885944988708474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/06/wappalyzer-addon-on-firefox-35.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/1557885944988708474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/1557885944988708474'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/06/wappalyzer-addon-on-firefox-35.html' title='Wappalyzer addon on Firefox 3.5'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-9158401311321992880</id><published>2009-06-12T08:48:00.000-07:00</published><updated>2009-06-12T08:49:23.959-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='grub2'/><title type='text'>Upgrade grub to grub2</title><content type='html'>I have just upgraded grub to grub2 using the instructions on blog &lt;a href="http://www.ubuntu-inside.me/"&gt;http://www.ubuntu-inside.me/&lt;/a&gt;. Exact post can be found &lt;a href="http://www.ubuntu-inside.me/2009/06/howto-upgrade-to-grub2-on-ubuntu-jaunty.html"&gt;here&lt;/a&gt;.&lt;br /&gt;And then changed look of grub2 using post form same blog, this post can be found &lt;a href="http://www.ubuntu-inside.me/2009/06/howto-change-grub2-grub-pc-splash-image.html"&gt;here&lt;/a&gt;.&lt;br /&gt;The tutorial for look upgrade does not say that you will probably need to change color of font, to make is more visible. I have changed text color and highlighted text color, like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# set the background if possible&lt;br /&gt;if ${use_bg} ; then&lt;br /&gt;  prepare_grub_to_access_device `${grub_probe} --target=device ${bg}`&lt;br /&gt;  cat &lt;&lt; EOF&lt;br /&gt;insmod ${reader}&lt;br /&gt;if background_image `make_system_path_relative_to_its_root ${bg}` ; then&lt;br /&gt;  #change colors here&lt;br /&gt;  set color_normal=white/black&lt;br /&gt;  set color_highlight=green/black&lt;br /&gt;else&lt;br /&gt;EOF&lt;br /&gt;fi&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I have set background to be matrix like. Here is the picture of my boot loader now:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://img26.imageshack.us/img26/6783/dsc06770.png" alt="Image Hosted by ImageShack.us"/&gt;&lt;br /&gt;&lt;br /&gt;It looks great, doesn't it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-9158401311321992880?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/9158401311321992880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/06/upgrade-grub-to-grub2.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/9158401311321992880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/9158401311321992880'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/06/upgrade-grub-to-grub2.html' title='Upgrade grub to grub2'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-4130136583144874258</id><published>2009-06-12T06:53:00.000-07:00</published><updated>2009-06-12T07:14:43.015-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>Another great firefox add-on for web developers</title><content type='html'>I have already written about Firefox add-ons &lt;a href="http://milandinic.blogspot.com/2009/03/firefox-add-ons.html"&gt;here&lt;/a&gt;. Now I have found another one that has joined mine Firefox essentials add-ons for web development.&lt;br /&gt;&lt;br /&gt;This add-on enables you to view and delete cookies form Firefox. It is called Firecookie, and it is actually extension of &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt; add-on.&lt;br /&gt;Firecookie can be downloaded &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6683"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It is shown as new tab in Firebug. &lt;br /&gt;Here is the image how it displays cookies:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://img151.imageshack.us/img151/8471/firecoockie.png" alt="Image Hosted by ImageShack.us"/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-4130136583144874258?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/4130136583144874258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/06/another-great-firefox-add-on-for-web.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/4130136583144874258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/4130136583144874258'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/06/another-great-firefox-add-on-for-web.html' title='Another great firefox add-on for web developers'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-5477404804411727380</id><published>2009-06-04T07:08:00.000-07:00</published><updated>2009-06-04T11:38:41.494-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stackoverflow'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='maven 2'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='chart'/><category scheme='http://www.blogger.com/atom/ns#' term='gxt'/><title type='text'>GWT 1.6 with GXT 2.0-M2</title><content type='html'>I was playing with GWT 1.6.4 and GXT 2.0-M2 in combination with maven 2, this is the way I used to setup project and overcome problems that occurred on the way.&lt;br /&gt;First lets create project using the 'mvn archetype' command:&lt;br /&gt;&lt;br /&gt;mvn archetype:create -DarchetypeGroupId=com.totsp.gwt -DremoteRepositories=http://gwt-maven.googlecode.com/svn/trunk/mavenrepo  -DarchetypeArtifactId=maven-googlewebtoolkit2-archetype -DgroupId=com.gwt.demo -DartifactId=gwt-demo -DarchetypeVersion=1.0.4&lt;br /&gt;&lt;br /&gt;Then download &lt;a href='http://extjs.com/products/gxt/download2.php?dl=extgwt2m2'&gt;Ext GWT 2.0 M2 SDK&lt;/a&gt; and extract the content to a temp directory, lets call this temp directory a tmp.&lt;br /&gt;Then navigate shell to tmp/gxt-2.0-m2 directory and install gxt.jar into local repository, using the 'mvn install' command:&lt;br /&gt;&lt;br /&gt;call mvn install:install-file -Dfile=gxt.jar -DgroupId=com.extjs -DartifactId=gxt -Dversion=2.0-M2 -Dpackaging=jar&lt;br /&gt;&lt;br /&gt;Then add dependency to pom.xml of gwt-demo project. This dependency looks like this:&lt;br /&gt;&lt;pre name='code' class='xml'&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;com.extjs&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;gxt&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;2.0-M2&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then copy tmp/gxt-2.0-m2/resources to gwt-demo/src/main/java/com/gwt/demo/public/gxt/, meaning that ....public/gxt folder will contain chart, css, etc directories.&lt;br /&gt;Three more things needs to be done:&lt;br /&gt;Add next code to Application.gwt.xml:&lt;br /&gt;&lt;pre name='code' class='xml'&gt;&lt;br /&gt;&amp;lt;inherits name='com.extjs.gxt.ui.GXT'/&amp;gt;&lt;br /&gt;&amp;lt;inherits name='com.extjs.gxt.charts.Chart' /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and next line in head section of Application.html:&lt;br /&gt;&lt;pre name='code' class='xml'&gt;&lt;br /&gt;&amp;lt;script type="text/javascript" language="javascript" src="gxt/flash/swfobject.js"&amp;gt;&amp;lt;&lt;br /&gt;/script&amp;gt;&lt;br /&gt;&amp;lt;link  rel="stylesheet" type="text/css" href="gxt/css/gxt-all.css" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Update pom.xml with gwtVersion to 1.6.4 and and maven-compiler-plugin from 1.5 to 1.6.&lt;br /&gt;&lt;br /&gt;And that should be enough to run the application. Try to run application with command:&lt;br /&gt;&lt;br /&gt;mvn com.totsp.gwt:maven-googlewebtoolkit2-plugin:gwt&lt;br /&gt;&lt;br /&gt;But then I wanted more then just running the helloworld, I wanted to add a chart to application, e.g. from example: BasicChartExample.java and I got stuck with this exception:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Compiling module com.gwt.demo.Application&lt;br /&gt;   Compiling 5 permutations&lt;br /&gt;   Worker permutation 1 of 5&lt;br /&gt;      [ERROR] Unexpected internal compiler error&lt;br /&gt;java.lang.StackOverflowError&lt;br /&gt; at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1928)&lt;br /&gt; at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:480)&lt;br /&gt; at java.util.ArrayList.readObject(ArrayList.java:585)&lt;br /&gt; at sun.reflect.GeneratedMethodAccessor57.invoke(Unknown Source)&lt;br /&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt; at java.lang.reflect.Method.invoke(Method.java:597)&lt;br /&gt; at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)&lt;br /&gt; ....&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The soultion is to append -Xss4024k to java virtual machine arguments. I did this in pom.xml like this&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;extraJvmArgs&amp;gt;-Xmx1024m -Xss4024k&amp;lt;/extraJvmArgs&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This will increase stack size of virutal machine and prevent stack overflow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-5477404804411727380?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/5477404804411727380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/06/gwt-16-with-gxt-20-m2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5477404804411727380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5477404804411727380'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/06/gwt-16-with-gxt-20-m2.html' title='GWT 1.6 with GXT 2.0-M2'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-4237267045328388761</id><published>2009-06-03T06:51:00.000-07:00</published><updated>2009-06-03T07:07:15.438-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='open id'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>OpenId implementations in java - part 1</title><content type='html'>While searching for java frameworks/libraries that support openId authentication, I ran across this site &lt;a href='http://wiki.openid.net/Libraries'&gt;http://wiki.openid.net/Libraries&lt;/a&gt;. And I will try some of them, or all of them, if I find time for that. The libraries that support java found on this wiki site are:&lt;br /&gt;-OpenID4Java&lt;br /&gt;-WSO2 OpenID Library&lt;br /&gt;-joid&lt;br /&gt;-dyuproject-openid&lt;br /&gt;-JOpenID&lt;br /&gt;&lt;br /&gt;Hmmm, where to start. My choice is always the smallest one, of course, the smallest one that is good enough to do the job that needs to be done. Following that logic, I started with &lt;a href='http://code.google.com/p/jopenid/'&gt;jopenid&lt;/a&gt;. Description of this library got my attention, and it that says 'Lightweight implementation on JDK 5.0 or above. (48KB)'.&lt;br /&gt;Here is the concept that I want to achieve:&lt;br /&gt;-make a login page with that is using openID as input, for this purpose I'll user &lt;a href='http://code.google.com/p/openid-selector/'&gt;openid-selector&lt;/a&gt;; why make a new one when there is already one the is working and it is open source&lt;br /&gt;-this pages sends request to openIdRedirect servlet&lt;br /&gt;-we fill out credentials on open id provider page and this page redirect our browser to authentication servlet&lt;br /&gt;-authentication servlet is processing response from open id provider, and redirects browser to welcome(success) or login page(fail), depending of this response&lt;br /&gt;-this login procedure must work on all open id providers.&lt;br /&gt;&lt;br /&gt;Although I like small (light) libraries, this one disappointed me at start. There are no wiki pages with examples, only one code snippet at start page.&lt;br /&gt;&lt;pre name='code' class='java'&gt;&lt;br /&gt;OpenIdManager manager = new OpenIdManager();&lt;br /&gt;manager.setReturnTo("http://www.example.com/openid_auth");&lt;br /&gt;manager.setRealm("http://*.example.com");&lt;br /&gt;Endpoint endpoint = manager.lookupEndpoint("https://www.google.com/accounts/o8/id");&lt;br /&gt;Association association = manager.lookupAssociation(endpoint);&lt;br /&gt;String url = manager.getAuthenticationUrl(endpoint, association);&lt;br /&gt;// Copy the authentication URL in browser,&lt;br /&gt;// And after successfully sign on in browser,&lt;br /&gt;// enter the URL from address bar of browser:&lt;br /&gt;String ret = readLine();&lt;br /&gt;HttpServletRequest request = createRequest(ret);&lt;br /&gt;Authentication authentication = manager.getAuthentication(request, association.getRawMacKey());&lt;br /&gt;// Print authentication information:&lt;br /&gt;System.out.println(authentication);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;From start I realized that example is strange. When I run it, it generates url, i need to past this url to browser, that authenticate on page that has opened, than copy paste new url from browser to command line where the example is waiting for input, hit enter, and there it is, successful authentication. &lt;br /&gt;Yeah, but how to implement this in web application. I need two servlets and first of them would do response.sendRedirect( ) to navigate browser to openId providers page. That means we are loosing the session. The session would be desired holder for instance of Authentication class, that is needed for:&lt;br /&gt;&lt;pre name='code' class='java'&gt;&lt;br /&gt;Authentication authentication = manager.getAuthentication(request, association.getRawMacKey());&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Since session is not available, we can simulate one, with static volatile field of utility class, this is an ugly solution, but it works. &lt;br /&gt;&lt;br /&gt;I've managed to login using Google as open id provider, but when I tried Yahoo or Blogger, I got the NullPointerException from library.&lt;br /&gt;Here is the code snippet that does the logic:&lt;br /&gt;&lt;pre name='code' class='java'&gt;&lt;br /&gt;//AuthServlet&lt;br /&gt;@Override&lt;br /&gt;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;    final OpenIdManager manager = new OpenIdManager();&lt;br /&gt;    manager.setRealm(Constants.SERVER);&lt;br /&gt;&lt;br /&gt;    Association association = SharedSession.getAssociation(request.getParameter("openid.assoc_handle"));&lt;br /&gt;    try {&lt;br /&gt;        manager.getAuthentication(request, association.getRawMacKey());&lt;br /&gt;        getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/jsp/index.jsp").forward(request,&lt;br /&gt;                response);&lt;br /&gt;    } catch (Exception e) {&lt;br /&gt;        response.sendRedirect(response.encodeURL(request.getContextPath() + "/openid-selector/login.html"));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//OpenIdRequestServlet&lt;br /&gt;@Override&lt;br /&gt;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {&lt;br /&gt;    final OpenIdManager manager = new OpenIdManager();&lt;br /&gt;    manager.setRealm(Constants.SERVER);&lt;br /&gt;    final String openidIdentifier = request.getParameter("openid_identifier");&lt;br /&gt;&lt;br /&gt;    if (openidIdentifier != null) {&lt;br /&gt;        final Endpoint endpoint = manager.lookupEndpoint(openidIdentifier);&lt;br /&gt;        final Association association = manager.lookupAssociation(endpoint);&lt;br /&gt;        SharedSession.addAssociation(association.getAssociationHandle().trim(), association);&lt;br /&gt;        manager.setReturnTo(Constants.RETURN_PATH);&lt;br /&gt;        response.sendRedirect(response.encodeURL(manager.getAuthenticationUrl(endpoint, association)));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public final class Constants {&lt;br /&gt;&lt;br /&gt;    private Constants() {&lt;br /&gt;    }&lt;br /&gt;    public static String SERVER = "http://localhost:8080";&lt;br /&gt;    public static String RETURN_PATH = SERVER + "/openid-demo/auth";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public final class SharedSession {&lt;br /&gt;    private SharedSession() {&lt;br /&gt;        super();&lt;br /&gt;    }&lt;br /&gt;    private static volatile Map&amp;lt;String, Association&amp;gt; associations = new HashMap&amp;lt;String, Association&amp;gt;();&lt;br /&gt;    public static Association getAssociation(String associationId) {&lt;br /&gt;        final Association association = associations.get(associationId);&lt;br /&gt;        associations.remove(association);&lt;br /&gt;        return association;&lt;br /&gt;    }&lt;br /&gt;    public static void addAssociation(String associationId, Association value) {&lt;br /&gt;        associations.put(associationId, value);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;My impression is that this library has aimed only at Google as open id provider, and although it is light it is currently unusable. My next try to make this open id concept work, will be &lt;a href='http://code.google.com/p/dyuproject/'&gt;dyuproject&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-4237267045328388761?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/4237267045328388761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/05/openid-implementations-in-java-part-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/4237267045328388761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/4237267045328388761'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/05/openid-implementations-in-java-part-1.html' title='OpenId implementations in java - part 1'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-569933133444625760</id><published>2009-05-29T04:03:00.000-07:00</published><updated>2009-05-29T04:20:00.151-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='maven 2'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='source'/><title type='text'>Using libraries with sources</title><content type='html'>Usually I like to have source code of all used frameworks used in applications that I'm working on. This does not mean I will have time to review them all, but I'll be able to review any of the libraries, if problem occurs, which I don't know why is happening, or I need to investigate library that is poorly documented or completely undocumented.&lt;br /&gt;When using maven 2 for handling project dependencies, sources can be easily downloaded using -DdownloadSources=true argument when running mvn command. I usually append this argument to eclipse:eclipse argument like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mvn eclipse:eclipse -DdownloadSources=true&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The sources that were not included in my projects are the ones from java core itself. Of course I have JDK with sources installed, but by default Eclipse adds JRE to all projects, not JDK, so I completely overlook this fact. This was easy to fix. There is a list of installed JRE's which can be found @ Window-&gt;Preferances-&gt;Java-&gt;Installed JRE's.&lt;br /&gt;After clicking on Add button, wizard dialog will appeared, I've chosen Standard VM, found JRE home using the 'Directory...' button, and click Finish button. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://img507.imageshack.us/img507/7752/eclipsejdk.png" alt="Image Hosted by ImageShack.us"/&gt;&lt;br /&gt;&lt;br /&gt;Newly created JRE appeared in installed JREs list. Then, I've deleted old one(JRE without sources) and that's it. Java core sources are now present for all projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-569933133444625760?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/569933133444625760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/05/are-you-using-jre-or-jdk.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/569933133444625760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/569933133444625760'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/05/are-you-using-jre-or-jdk.html' title='Using libraries with sources'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-2099600705399175083</id><published>2009-05-26T10:49:00.000-07:00</published><updated>2009-05-27T01:02:05.979-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='html escape'/><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><title type='text'>Html code escape tool for blogger</title><content type='html'>In most of my posts there is code on pages, for a better look, I'm using a Syntax Highlighter, how to add it to your blog, you may read &lt;a href="http://milandinic.blogspot.com/2009/02/code-in-blog-posts.html"&gt;here&lt;/a&gt;. But there is one problem when using sings '&amp;lt;' and '&amp;gt;' in your code, they do not appear on page. Solution is to escape this characters. You can use or &lt;a href="http://www.htmlescape.net/htmlescape_tool.html"&gt;http://www.htmlescape.net/htmlescape_tool.html&lt;/a&gt; or the tool I've created: &lt;a href="http://milan-storage.110mb.com/blogger-code-escaper/convert.html"&gt;http://milan-storage.110mb.com/blogger-code-escaper/convert.html&lt;/a&gt;&lt;br /&gt;Advantage of my converter is that it can be downloaded (saved) and used offline.&lt;br /&gt;&lt;br /&gt;You can check here how it works:&lt;br /&gt;&lt;iframe style="border: none" src="http://milan-storage.110mb.com/blogger-code-escaper/convert.html" width="620px" height="650px"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Whatever you choose, I wish you happy posting!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-2099600705399175083?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/2099600705399175083/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/05/html-code-escape-tool-for-blogger.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2099600705399175083'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2099600705399175083'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/05/html-code-escape-tool-for-blogger.html' title='Html code escape tool for blogger'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-3302222099092331330</id><published>2009-05-25T15:50:00.000-07:00</published><updated>2009-05-25T15:55:36.526-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='multipart'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='servlet'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><title type='text'>Testing upload servlet under spring</title><content type='html'>For testing upload servlets with SpringJUnit4ClassRunner there is class called MockMultipartFile, and it should be working, but it does not. At least I have not found a way to make it work. I've browsed the web and I have not found any working example how to test upload servlet with spring-enabled project. I've blogged how to test regular servlet &lt;a href=”http://milandinic.blogspot.com/2009/05/testing-servlets-under-spring.html”&gt;here&lt;/a&gt;, now I will give an example how can upload servlet be tested.&lt;br /&gt;&lt;br /&gt;To handle upload in servlet I've used library commons-fileupload. This libraty can be added to maven project by adding next dependencies:&lt;br /&gt;&lt;br /&gt;&lt;pre name='code' class='xml'&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;commons-fileupload&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;commons-fileupload&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;1.2&amp;lt;/version&amp;gt;  &lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;commons-io&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;commons-io&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;1.4&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;!-- this one is required for upload too--&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;2.5.4&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The business part of the servlet is shown below:&lt;br /&gt;&lt;pre name='code' class='java'&gt;&lt;br /&gt;if (ServletFileUpload.isMultipartContent(request)) {&lt;br /&gt;&lt;br /&gt;    final ServletFileUpload upload = new ServletFileUpload(factory);&lt;br /&gt;    upload.setFileSizeMax(MAX_IMG_SIZE);&lt;br /&gt;    upload.setSizeMax(MAX_IMG_SIZE);&lt;br /&gt;    try {&lt;br /&gt;        final List&lt;FileItem&gt; items = upload.parseRequest(request);&lt;br /&gt;        for (final FileItem item : items) {&lt;br /&gt;            // process only file uploads&lt;br /&gt;            if (!item.isFormField()) {&lt;br /&gt;                // do something with item&lt;br /&gt;                final PrintWriter writer = response.getWriter();&lt;br /&gt;                writer.print(new String(item.get()));&lt;br /&gt;                writer.close();&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    } catch (final FileUploadException e) {&lt;br /&gt;        e.printStackTrace();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It first performs check does this upload request contains multipart content, then file size limit is set, and after that parsing of request in search for files that are being uploaded. Then iterating through list of received files is being done. And here is where content of uploaded files is printed to response. This content will be used for testing, to prove that file content has arrived on servlet.&lt;br /&gt;&lt;br /&gt;To test the servlet I've manually created content of the request to match needs of upload servlet. Here is the example of happy flow test:&lt;br /&gt;&lt;pre name='code' class='java'&gt;&lt;br /&gt;private static final String ENDLINE = "\r\n";&lt;br /&gt;private static final String TWO_HYPHENS = "--";&lt;br /&gt;private static final String BOUNDARY = "qWeRtY";&lt;br /&gt;private static final String FILE_NAME = "index.html";&lt;br /&gt;private static final String FILE_CONTENT = "&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;servlet test&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;";&lt;br /&gt;&lt;br /&gt;@Test&lt;br /&gt;public void testServlet() throws ServletException, IOException {&lt;br /&gt;&lt;br /&gt;    final StringBuilder content = new StringBuilder();&lt;br /&gt;    content.append(TWO_HYPHENS + BOUNDARY + ENDLINE);&lt;br /&gt;    content.append("Content-Disposition: form-data; name=\"myfile\";"&lt;br /&gt;                        + " filename=\"" + FILE_NAME + "\""+ ENDLINE);&lt;br /&gt;    content.append(ENDLINE);&lt;br /&gt;    content.append(FILE_CONTENT);&lt;br /&gt;    content.append(ENDLINE);&lt;br /&gt;    content.append(TWO_HYPHENS + BOUNDARY + TWO_HYPHENS + ENDLINE);&lt;br /&gt;&lt;br /&gt;    request.setParameter("name", "upoad servlet test");&lt;br /&gt;    request.setContentType("multipart/form-data; boundary=" + BOUNDARY);&lt;br /&gt;    request.setMethod("POST");&lt;br /&gt;    request.setContent(content.toString().getBytes());&lt;br /&gt;&lt;br /&gt;    mySevlet.doPost(request, response);&lt;br /&gt;    final String responseContent = response.getContentAsString().trim();&lt;br /&gt;    Assert.assertEquals(FILE_CONTENT, responseContent);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Since servlet sends response as text, from received (uploaded) file, the only assert is made to check is servlet response equal to uploaded file content.&lt;br /&gt;&lt;br /&gt;Complete source of this demo can be found &lt;a href="http://www.mediafire.com/?3invdbkjydz"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-3302222099092331330?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/3302222099092331330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/05/testing-upload-servlet-under-spring.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3302222099092331330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3302222099092331330'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/05/testing-upload-servlet-under-spring.html' title='Testing upload servlet under spring'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-8867347832634616199</id><published>2009-05-17T04:26:00.000-07:00</published><updated>2009-05-17T04:27:19.928-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='spring'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='servlet'/><category scheme='http://www.blogger.com/atom/ns#' term='junit'/><title type='text'>Testing servlets under spring</title><content type='html'>The idea is to make junit test for servlet. This servlet uses spring injected bean. When in use by servlet container&lt;br /&gt;this servlet is not createad as spring bean, when used in test it is instatiated as spring bean. For this purpose, there has to be&lt;br /&gt;one spring context, for runttime, and ahother for test purposes, since we do not want to have servlets instantiated as spring beans in runtime.&lt;br /&gt;Spring bean that will be used in servlet will have interface DemoSpringBean&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;/**&lt;br /&gt;* Interface for demo purposes of spring bean injection.&lt;br /&gt;*&lt;br /&gt;* @author Milan Dinic&lt;br /&gt;*/&lt;br /&gt;public interface DemoSpringBean {&lt;br /&gt;   /**&lt;br /&gt;    * Spring bean id.&lt;br /&gt;    */&lt;br /&gt;   public static final String NAME = "demoSpringBean";&lt;br /&gt;&lt;br /&gt;   /**&lt;br /&gt;    * CReates greeting message.&lt;br /&gt;    *&lt;br /&gt;    * @param name&lt;br /&gt;    *            your name&lt;br /&gt;    * @return greetings message&lt;br /&gt;    */&lt;br /&gt;   String sayHello(final String name);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Servlet itself is trivial, goPost is calling doGet, so it does not mather waht kind of methid is used GET or POST.&lt;br /&gt;In runtime, demoSpringBean will set when init method is called, this method will be called first time tis servlet receives request.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class MyServlet extends HttpServlet {&lt;br /&gt;&lt;br /&gt;   private DemoSpringBean demoSpringBean;&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   public void init() throws ServletException {&lt;br /&gt;       super.init();&lt;br /&gt;       // init method will be used in runtime, while setDemoSpringBean will be&lt;br /&gt;       // used by spring for testing purposes&lt;br /&gt;       final ApplicationContext CONTEXT = new ClassPathXmlApplicationContext(&lt;br /&gt;               new String[] { "classpath*:META-INF/applicationContext.xml" });&lt;br /&gt;       setDemoSpringBean((DemoSpringBean) CONTEXT.getBean(DemoSpringBean.NAME));&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void doGet(HttpServletRequest req, HttpServletResponse response)&lt;br /&gt;           throws ServletException, IOException {&lt;br /&gt;&lt;br /&gt;       final String name = req.getParameter("name");&lt;br /&gt;       String greeting;&lt;br /&gt;       if (name == null) {&lt;br /&gt;           greeting = "there was no name";&lt;br /&gt;       } else {&lt;br /&gt;           greeting = demoSpringBean.sayHello(name);&lt;br /&gt;       }&lt;br /&gt;       response.setContentType("text/html");&lt;br /&gt;       response.setCharacterEncoding("UTF-8");&lt;br /&gt;&lt;br /&gt;       final PrintWriter out = response.getWriter();&lt;br /&gt;&lt;br /&gt;       out.println(greeting);&lt;br /&gt;       out.close();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   protected void doPost(HttpServletRequest req, HttpServletResponse resp)&lt;br /&gt;           throws ServletException, IOException {&lt;br /&gt;       doGet(req, resp);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public void setDemoSpringBean(DemoSpringBean demoSpringBean) {&lt;br /&gt;       this.demoSpringBean = demoSpringBean;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When running tests, init method will not be called, demoSpringBean will be injected using testApplicationContext.xml.&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;bean id="myServlet" class="com.spring.demo.MyServlet"&amp;gt;&lt;br /&gt;   &amp;lt;property name="demoSpringBean" ref="demoSpringBean" /&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Test itself was performed using mocking classes MockHttpServletResponse and MockHttpServletResponse for request and response.&lt;br /&gt;Just add some parameters and check for result in response.&lt;br /&gt;And here is the test example:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;/**&lt;br /&gt;* Test For {@link MyServlet} servlet.&lt;br /&gt;*&lt;br /&gt;* @author Milan Dinic&lt;br /&gt;*/&lt;br /&gt;@RunWith(SpringJUnit4ClassRunner.class)&lt;br /&gt;@ContextConfiguration(locations = { "classpath*:testApplicationContext.xml" })&lt;br /&gt;public class MyServletTest extends AbstractSingleSpringContextTests {&lt;br /&gt;&lt;br /&gt;   @Resource(name = "myServlet")&lt;br /&gt;   private MyServlet mySevlet;&lt;br /&gt;   private MockHttpServletRequest request;&lt;br /&gt;   private MockHttpServletResponse response;&lt;br /&gt;&lt;br /&gt;   @Before&lt;br /&gt;   public void before() {&lt;br /&gt;       request = new MockHttpServletRequest();&lt;br /&gt;       response = new MockHttpServletResponse();&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Test&lt;br /&gt;   public void testServlet() throws ServletException, IOException {&lt;br /&gt;       request.setMethod("post");&lt;br /&gt;       final String name = "Milan";&lt;br /&gt;       request.addParameter("name", name);&lt;br /&gt;       mySevlet.doGet(request, response);&lt;br /&gt;&lt;br /&gt;       final String responseContent = response.getContentAsString().trim();&lt;br /&gt;       Assert.assertEquals("Hello " + name, responseContent);&lt;br /&gt;       Assert.assertEquals("UTF-8", response.getCharacterEncoding());&lt;br /&gt;   }&lt;br /&gt;   ....&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When run on application server (e.g. tomcat), servlet can be found on url:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;http://localhost:8080/spring-junit-demo-1.0-SNAPSHOT/myServlet?name=asd&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Complete source of this demo can be found &lt;a href="http://www.mediafire.com/?mz5ynzdmtmm"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-8867347832634616199?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/8867347832634616199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/05/testing-servlets-under-spring.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8867347832634616199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8867347832634616199'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/05/testing-servlets-under-spring.html' title='Testing servlets under spring'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-7641125974901348556</id><published>2009-05-12T14:12:00.000-07:00</published><updated>2009-05-12T14:44:09.138-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='inner classes'/><category scheme='http://www.blogger.com/atom/ns#' term='generics'/><title type='text'>Java inner classes and generics</title><content type='html'>Usually I avoid writing inner classes, this one, I wrote just for fun :-)&lt;br /&gt;The first code snippet is showing how inner classes can be instantiated, pretty weird isn't it? And the second how A and C classes are implemented.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;A&amp;lt;ArrayList&amp;lt;Integer&amp;gt;&amp;gt;.C&amp;lt;ArrayList&amp;lt;Double&amp;gt;&amp;gt; instance=&lt;br /&gt;new A&amp;lt;ArrayList&amp;lt;Integer&amp;gt;&amp;gt;().new C&amp;lt;ArrayList&amp;lt;Double&amp;gt;&amp;gt;(new ArrayList&amp;lt;Double&amp;gt;());&lt;br /&gt;&lt;br /&gt;final ArrayList&amp;lt;Double&amp;gt; value = &lt;br /&gt;new A&amp;lt;ArrayList&amp;lt;Integer&amp;gt;&amp;gt;().new C&amp;lt;ArrayList&amp;lt;Double&amp;gt;&amp;gt;(new ArrayList&amp;lt;Double&amp;gt;()).getValue();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class A&amp;lt;T&amp;gt; {&lt;br /&gt;&lt;br /&gt;    public class C&amp;lt;F&amp;gt; {&lt;br /&gt;        private F f;&lt;br /&gt;&lt;br /&gt;        public C( F f ) {&lt;br /&gt;            this.f = f;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public F getValue() {&lt;br /&gt;            return f;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Of course you can just use this inner class inside of parent and then there wouldn't be much confusion. Generally, I don't like to see inner classes anywhere!&lt;br /&gt;Well, except for demonstration purposes, how &lt;b&gt;not&lt;/b&gt; to code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-7641125974901348556?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/7641125974901348556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/05/java-inner-classes-and-generics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/7641125974901348556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/7641125974901348556'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/05/java-inner-classes-and-generics.html' title='Java inner classes and generics'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-8012676385649811103</id><published>2009-05-10T12:37:00.000-07:00</published><updated>2009-05-10T12:38:50.660-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ring profile'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><title type='text'>C# Windows mobile ring profiles</title><content type='html'>To access ringing profiles use library aygshell.dll, which contains method SndSetSound. Two enumerations need to be defined SoundEvent and SoundType, and one class named SoundFileInfo. This class and enums will be used as paramters for SndSetSound method.&lt;br /&gt;Here is the implementation of this class and enums:&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;namespace SmartRinging&lt;br /&gt;{&lt;br /&gt;   internal static class SoundControl&lt;br /&gt;   {&lt;br /&gt;       [DllImport("aygshell.dll", SetLastError = true)]&lt;br /&gt;       public static extern uint SndSetSound(SoundEvent seSoundEvent, SoundFileInfo pSoundFileInfo, bool fSuppressUI);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   enum SoundEvent&lt;br /&gt;   {&lt;br /&gt;       All = 0,&lt;br /&gt;       RingLine1,&lt;br /&gt;       RingLine2,&lt;br /&gt;       KnownCallerLine1,&lt;br /&gt;       RoamingLine1,&lt;br /&gt;       RingVoip&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   enum SoundType&lt;br /&gt;   {&lt;br /&gt;       On = 0,&lt;br /&gt;       File,&lt;br /&gt;       Vibrate,&lt;br /&gt;       None&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;namespace SmartRinging&lt;br /&gt;{&lt;br /&gt;   class SoundFileInfo&lt;br /&gt;   {&lt;br /&gt;       [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]&lt;br /&gt;       private string szPathNameNative;&lt;br /&gt;       [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]&lt;br /&gt;       private string szDisplayNameNative;&lt;br /&gt;       public SoundType sstType;&lt;br /&gt;&lt;br /&gt;       public string szPathName&lt;br /&gt;       {&lt;br /&gt;           get&lt;br /&gt;           {&lt;br /&gt;               return szPathNameNative.Substring(0,&lt;br /&gt;                   szPathNameNative.IndexOf('\0'));&lt;br /&gt;           }&lt;br /&gt;           set { szPathNameNative = value; }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       public string szDisplayName&lt;br /&gt;       {&lt;br /&gt;           get&lt;br /&gt;           {&lt;br /&gt;               return szDisplayNameNative.Substring(0,&lt;br /&gt;                   szDisplayNameNative.IndexOf('\0'));&lt;br /&gt;           }&lt;br /&gt;           set { szDisplayNameNative = value; }&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now using method SndSetSound from SoundControl class can done like this&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;SoundFileInfo sfi = new SoundFileInfo();&lt;br /&gt;sfi.sstType = SoundType.None;&lt;br /&gt;uint ret = SoundControl.SndSetSound(SoundEvent.All, sfi, true);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This code snippet will set the 'silent' profile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-8012676385649811103?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/8012676385649811103/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/05/c-windows-mobile-ring-profiles.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8012676385649811103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8012676385649811103'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/05/c-windows-mobile-ring-profiles.html' title='C# Windows mobile ring profiles'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-3430747621768523551</id><published>2009-04-27T11:17:00.000-07:00</published><updated>2009-04-27T11:33:11.840-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='maven 2'/><category scheme='http://www.blogger.com/atom/ns#' term='gwt'/><category scheme='http://www.blogger.com/atom/ns#' term='short url'/><title type='text'>Gwt remove nasty long url</title><content type='html'>GWT project can be created with maven 2 command:&lt;br /&gt;&lt;br /&gt;mvn archetype:create -DarchetypeGroupId=com.totsp.gwt -DarchetypeArtifactId=maven-googlewebtoolkit2-archetype -DarchetypeVersion=1.0.4 -DremoteRepositories=http://gwt-maven.googlecode.com/svn/trunk/mavenrepo -DgroupId=myGroupId -DartifactId=myArtifactId&lt;br /&gt;&lt;br /&gt;Starting project can be compile with command:&lt;br /&gt;&lt;br /&gt;mvn com.totsp.gwt:maven-googlewebtoolkit2-plugin:gwt&lt;br /&gt;&lt;br /&gt;URL will be really long, like this: http://localhost:8888/com.gwt.demo.Application/Application.html&lt;br /&gt;&lt;br /&gt;This is OK while developing, but when development is done, and you want to see your application somewhere online, it's really ugly to see this long URL anywhere online.&lt;br /&gt;Removing this nasty long url can be done like this:&lt;br /&gt;&lt;br /&gt;In generated pom.xml find plugin maven-war-plugin.&lt;br /&gt;&lt;pre name='code' class='xml'&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;maven-war-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;configuration&amp;gt;&lt;br /&gt;        &amp;lt;!-- &amp;lt;webXml&amp;gt;target/web.xml&amp;lt;/webXml&amp;gt;--&amp;gt;&lt;br /&gt;        &amp;lt;warSourceExcludes&amp;gt;.gwt-tmp/**&amp;lt;/warSourceExcludes&amp;gt;                  &lt;br /&gt;    &amp;lt;/configuration&amp;gt;                &lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Change it to look like this:&lt;br /&gt;&lt;pre name='code' class='xml'&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;maven-war-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;configuration&amp;gt;&lt;br /&gt;        &amp;lt;webxml&amp;gt;target/web.xml&amp;lt;/webxml&amp;gt;&lt;br /&gt; &amp;lt;webresources&amp;gt;&lt;br /&gt;     &amp;lt;resource&amp;gt;&lt;br /&gt;     &amp;lt;directory&amp;gt;src/main/java/com/gwt/demo/public&amp;lt;/directory&amp;gt;&lt;br /&gt;     &amp;lt;excludes&amp;gt;&lt;br /&gt;         &amp;lt;exclude&amp;gt;Application.html&amp;lt;/exclude&amp;gt;&lt;br /&gt;     &amp;lt;/excludes&amp;gt;       &lt;br /&gt;     &amp;lt;/resource&amp;gt;&lt;br /&gt; &amp;lt;/webresources&amp;gt;     &lt;br /&gt;        &amp;lt;warsourceexcludes&amp;gt;.gwt-tmp/**&amp;lt;/warsourceexcludes&amp;gt;&lt;br /&gt;    &amp;lt;/configuration&amp;gt;    &lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Of course change&lt;br /&gt;src/main/java/com/gwt/demo/public and Application.html, to path and html file that correspond to your application.&lt;br /&gt;&lt;br /&gt;Now set welcome-file in web.xml to correspond to entry point HTML file like this&lt;br /&gt;&lt;pre name='code' class='xml'&gt;&lt;br /&gt;&amp;lt;welcome-file-list&amp;gt;&lt;br /&gt; &amp;lt;welcome-file&amp;gt;Application.html&amp;lt;/welcome-file&amp;gt;  &lt;br /&gt;&amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Make a copy of Application.html from src/main/java/com/gwt/demo/public to src/main/webapp.&lt;br /&gt;src/main/java/com/gwt/demo/public/Application.html is used for development, and src/main/webapp/Application.html is used for deployment (war).&lt;br /&gt;Open Application.html that will be used for war and edit all source attributes by adding application package as directory e.g.&lt;br /&gt;change&lt;br /&gt;&lt;pre name='code' class='xml'&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; language=&amp;quot;javascript&amp;quot; src=&amp;quot;com.gwt.demo.Application.nocache.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;to&lt;br /&gt;&lt;pre name='code' class='xml'&gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; language=&amp;quot;javascript&amp;quot; src=&amp;quot;com.gwt.demo.Application/com.gwt.demo.Application.nocache.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now build project with command:&lt;br /&gt;mvn clean install&lt;br /&gt;Deploy it to a web server (e.g tomcat), run server, and you can find application at url:&lt;br /&gt;http://localhost:8080/gwt-demo-1.0-SNAPSHOT/&lt;br /&gt;If you want to host application on root of tomcat, name your war ROOT.war, do a deploy, and you'll find your application at URL http://localhost:8080/&lt;br /&gt;&lt;br /&gt;Making a short url for gwt framefork gwt-ext, needs another tweak, change&lt;br /&gt;&lt;pre name='code' class='xml'&gt;&lt;br /&gt;&amp;lt;meta name='gwt:module' content='com.gwt.demo.Application'&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;to&lt;br /&gt;&lt;pre name='code' class='xml'&gt;&lt;br /&gt;&amp;lt;meta name='gwt:module' content='com.gwt.demo.Application=com.gwt.demo.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/2439782663440463327-3430747621768523551?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/3430747621768523551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/03/gwt-remove-nasty-long-url.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3430747621768523551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3430747621768523551'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/03/gwt-remove-nasty-long-url.html' title='Gwt remove nasty long url'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-7492847108797076482</id><published>2009-04-11T01:25:00.000-07:00</published><updated>2009-05-28T00:28:09.129-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='google gadget'/><category scheme='http://www.blogger.com/atom/ns#' term='metak'/><title type='text'>Developing Google desktop gadget</title><content type='html'>Well have tried to develop under linux and windows, and both of them had advantages and disadvantages. E.g windows has a build in editor for main.js file with auto complete feature, while under Linux u can use any text editor that is available. I recommend using Aptana studio. It might sound like overkill, but having a good working environment is vary important. So I don't think using &lt;a href="http://aptana.com/"&gt;Aptana &lt;/a&gt;is overkill.&lt;br /&gt;&lt;br /&gt;For Windows use &lt;a href="http://desktop.google.com/"&gt;Google desktop&lt;/a&gt; as runtime.&lt;br /&gt;&lt;br /&gt;While on &lt;a href="http://desktop.google.com/linux/index.html"&gt;linux Google desktop&lt;/a&gt; only supports search of files on your computer, and not &lt;a href="http://desktop.google.com/plugins/"&gt;Google gadgets&lt;/a&gt;. To run Google gadgets under Linux use &lt;a href="http://code.google.com/p/google-gadgets-for-linux/"&gt;An open source implementation of Google gadgets for linux&lt;/a&gt;. I recommend  downloading binary version from &lt;a href="http://code.google.com/p/google-gadgets-for-linux/wiki/BinaryPackages"&gt;here&lt;/a&gt;, because it is a bit easier to install binaries from compiling from source.&lt;br /&gt;&lt;br /&gt;When you install Google gadgets for Linux, you automatically get Gadget designer, while on Windows, you'll have to download it from &lt;a href="http://desktop.google.com/downloadsdksubmit?hl=en"&gt;here&lt;/a&gt;. I recommend downloading it anyway because it contains example gadgets.&lt;br /&gt;Very useful page is &lt;a href="http://code.google.com/apis/desktop/docs/gadget_apiref.html"&gt;Gadget API reference page&lt;/a&gt;.&lt;br /&gt;Another difference between Linux and Windows, on Linux gadget is always deployed when you try to run it, while in Windows it is run under designer, which is a bit faster (can be run with shortcut F5), but if you like to use helper window (window that shows next to your gadget) it is not be possible to see it in designer. Well, you can always do a build (shortcut F7) and then double click on build gadget, and install it this way, and be able to test helper window.&lt;br /&gt;&lt;br /&gt;For my test gadget, an idea was to use service of site &lt;a href="http://www.metak.com/"&gt;www.metak.com&lt;/a&gt;, which is a great Serbian-English dictionary, and make a desktop gadget that uses it.&lt;br /&gt;&lt;br /&gt;A spent a few hours per day, and after a few days I've got the solution. The tricky part was figuring out how to convert text got server to xml and then parse it. Language that is available for development is javascript, but not all objects from js are available, it is actually a sub set of javascript. E.g DOMParser is not availble. Since server is responding with html (text), and there is no render that can handle html in GG api, except details in helper window. But it would be annoying to see it popup, and search field is loosing focus, and foucs could not be fetch until the helper window is closed. So at the end I decided to parse response without any tool or library, which is the worst solution, but it works.&lt;br /&gt;&lt;br /&gt;Here is a screen shot of what I've created:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://img515.imageshack.us/img515/6931/metakgg.png" alt="Image Hosted by ImageShack.us" /&gt;&lt;br /&gt;&lt;br /&gt;Here is the gadget:&lt;br /&gt;&lt;a href="http://www.mediafire.com/?2n2gdtiuyid"&gt;Metak-gg.gg&lt;/a&gt;&lt;br /&gt;GG extension is actually a zip format so you can change extension to zip, and see source, or just open it with designer.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disclaimer&lt;/b&gt;&lt;br /&gt;This gadget is made for education purposes only, I don't encourage anyone to download or use it. Using it you might be breaking some copyright law.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-7492847108797076482?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/7492847108797076482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/04/developing-google-desktop-gadget.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/7492847108797076482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/7492847108797076482'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/04/developing-google-desktop-gadget.html' title='Developing Google desktop gadget'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-9076106247206100359</id><published>2009-04-07T04:46:00.000-07:00</published><updated>2009-04-08T09:11:14.147-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='map'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='sorting'/><title type='text'>Sorting Map in Java</title><content type='html'>Getting a sorted map can be done by sorting a key values of the map. This can be done manually but is recommend using a &lt;b&gt;java.util.Collections&lt;/b&gt; to do sorting of list.&lt;br /&gt;&lt;br /&gt;This is how it goes:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;Map&amp;lt;String, Object&amp;gt; map = new HashMap&amp;lt;String, Object&amp;gt;();&lt;br /&gt;List&lt;String&gt; list = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;list.addAll(map.keySet());&lt;br /&gt;Collections.sort(list);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now we can create a list of sorted items, or do whatever with element from map, one by one.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;List&amp;lt;Object&amp;gt; sortedList = new ArrayList&amp;lt;Object&amp;gt;();&lt;br /&gt;for (String key : list) {&lt;br /&gt;    sortedList.add(map.get(key));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You may notice that map is empty, this is because this is just a demonstration.&lt;br /&gt;Another thing, you are sorting a map in a java code! Think again why are you doing this. This kind of sorting should be done by database server, if there is one in application architecture.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-9076106247206100359?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/9076106247206100359/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/04/sorting-map-in-java.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/9076106247206100359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/9076106247206100359'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/04/sorting-map-in-java.html' title='Sorting Map in Java'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-716117026530647937</id><published>2009-04-01T14:22:00.000-07:00</published><updated>2009-04-01T15:05:41.313-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Problem with sound on Ubuntu with laptop speekers</title><content type='html'>I recently installed Ubuntu 8.10 and first impression was as expected, not all devices will work without users help (that's me). Since I run Ubuntu on laptop (MSI vr700x-036e) sound was sent only on headphones plug, but not to internal speakers. Since right now I don't have any external speakers to plug into headphones plug, and I'm not planning to bay them soon, I've started Google-ing for solution. And I've tried so many guides found on Internet, and failed, until now, on many forums there is a partial solution. This one worked for me.&lt;br /&gt;&lt;br /&gt;1) Take a look at content of file /proc/asound/cards&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mile@mile-ubuntu:~$ cat /proc/asound/cards&lt;br /&gt; 0 [Intel          ]: HDA-Intel - HDA Intel&lt;br /&gt;                      HDA Intel at 0xfb5f8000 irq 16&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Here we can find name of sound card. Mine is hda-intel.&lt;br /&gt;&lt;br /&gt;2) We are looking for first lines of codec files in folder /proc/asound/card0/ &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mile@mile-ubuntu:~$ head -n 1 /proc/asound/card0/codec*&lt;br /&gt;==&amp;gt; /proc/asound/card0/codec#0 &amp;lt;==&lt;br /&gt;Codec: Realtek ALC883&lt;br /&gt;&lt;br /&gt;==&amp;gt; /proc/asound/card0/codec#1 &amp;lt;==&lt;br /&gt;Codec: LSI Si3054&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Information that was needed is 'ALC883'. That's the code of sound card.&lt;br /&gt;&lt;br /&gt;3) Now find model of sound card based on sound card code in file /usr/share/doc/alsa-base/driver/ALSA-Configuration.txt.gz. File is gzipped, unpack it and find model based on sound card code.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt; ALC883/888&lt;br /&gt;   3stack-dig 3-jack with SPDIF I/O&lt;br /&gt;   6stack-dig 6-jack digital with SPDIF I/O&lt;br /&gt;   3stack-6ch    3-jack 6-channel&lt;br /&gt;   3stack-6ch-dig 3-jack 6-channel with SPDIF I/O&lt;br /&gt;   6stack-dig-demo  6-jack digital for Intel demo board&lt;br /&gt;   acer  Acer laptops (Travelmate 3012WTMi, Aspire 5600, etc)&lt;br /&gt;   acer-aspire Acer Aspire 9810&lt;br /&gt;   medion Medion Laptops&lt;br /&gt;   medion-md2 Medion MD2&lt;br /&gt;   targa-dig Targa/MSI&lt;br /&gt;   targa-2ch-dig Targs/MSI with 2-channel&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;For me right one model was 'targa-2ch-dig'. I have not found it from first try.&lt;br /&gt;&lt;br /&gt;4) Edit both files /etc/modprobe.d/options and /etc/modprobe.d/alsa-base by adding &lt;br /&gt;options snd-[sound sard name] model=[found model]&lt;br /&gt;e.g &lt;br /&gt;options snd-hda-intel model=targa-2ch-dig&lt;br /&gt;&lt;br /&gt;Editing can be done with nano command. You will need to do sudo before nano. e.g&lt;br /&gt;sudo nano /etc/modprobe.d/alsa-base&lt;br /&gt;sudo nano /etc/modprobe.d/options&lt;br /&gt;&lt;br /&gt;5) Restart Ubuntu&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-716117026530647937?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/716117026530647937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/04/problem-with-sound-on-ubuntu-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/716117026530647937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/716117026530647937'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/04/problem-with-sound-on-ubuntu-with.html' title='Problem with sound on Ubuntu with laptop speekers'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-3183030280251723266</id><published>2009-03-30T04:34:00.001-07:00</published><updated>2009-04-01T02:35:16.892-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><title type='text'>C# Windows Mobile API for registry</title><content type='html'>Registry itself can be accessed using class Registry. To be able to use it, it is necessary to add namespace Microsoft.Win32.&lt;br /&gt;&lt;br /&gt;Adding new value to registry can be done with this code:&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;public static void save(String valuename, object value)&lt;br /&gt;{&lt;br /&gt;   Registry.SetValue(PATH, valuename, value);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;First attribute is PATH, its value can be a field of class that is used to access registy.&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;private String PATH = Registry.CurrentUser + "\\Software\\YourAppName\\";&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Since second parameter has object as parameter type, any kind of primitive object as be used as argument.&lt;br /&gt;&lt;br /&gt;Reading value from registry can be done with:&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;object obj = Registry.GetValue(PATH, valuename, null);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;First parameter is same as in SetValue method.&lt;br /&gt;Second parameter is name of registry entry that we need, and third is the default value that will be return by method GetValue if searched value is not found.&lt;br /&gt;&lt;br /&gt;Here is the example that I've used to access registry on windows mobile:&lt;br /&gt;&lt;pre name="code" class="csharp"&gt;&lt;br /&gt;public static class LocalSettings&lt;br /&gt;{&lt;br /&gt;    private static String PATH = Registry.CurrentUser + "\\Software\\TestApp\\";&lt;br /&gt;&lt;br /&gt;    public static void save(String valuename, object value)&lt;br /&gt;    {&lt;br /&gt;        Registry.SetValue(PATH, valuename, value);&lt;br /&gt;    }&lt;br /&gt;    public static string loadString(String valuename)&lt;br /&gt;    {&lt;br /&gt;        object obj = Registry.GetValue(PATH, valuename, null);&lt;br /&gt;        if (obj == null)&lt;br /&gt;        {&lt;br /&gt;            return "";&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            return (string)obj;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    public static long loadDateTime(String valuename)&lt;br /&gt;    {&lt;br /&gt;        object obj = Registry.GetValue(PATH, valuename, null);&lt;br /&gt;        if(obj==null){&lt;br /&gt;            return System.DateTime.Now.Ticks;&lt;br /&gt;        }else{&lt;br /&gt;            return long.Parse((string)obj);                 &lt;br /&gt;        }            &lt;br /&gt;    }&lt;br /&gt;    public static bool loadBool(String valuename)&lt;br /&gt;    {&lt;br /&gt;        object obj = Registry.GetValue(PATH, valuename, null);&lt;br /&gt;        if (obj == null)&lt;br /&gt;        {&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            return bool.Parse((string)obj);&lt;br /&gt;        }                  &lt;br /&gt;    }&lt;br /&gt;    public static int loadInt(String valuename)&lt;br /&gt;    {&lt;br /&gt;        object obj = Registry.GetValue(PATH, valuename, null);&lt;br /&gt;        if (obj == null)&lt;br /&gt;        {&lt;br /&gt;            return 0;&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            return (int)obj; &lt;br /&gt;        }    &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You may notice that returning a value was done somewhere with cast and somewhere with Parse method. This was done because int.Parse threw exception while parsing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-3183030280251723266?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/3183030280251723266/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/03/c-windows-mobile-api-for-registy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3183030280251723266'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3183030280251723266'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/03/c-windows-mobile-api-for-registy.html' title='C# Windows Mobile API for registry'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-3129238916952811203</id><published>2009-03-24T02:11:00.000-07:00</published><updated>2009-03-27T09:59:53.929-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='json'/><title type='text'>Json in Java</title><content type='html'>Json is abbreviation from JavaScript Object Notation. So it is meant to be generated on backend of application and used in java script on web pages. &lt;br /&gt;&lt;br /&gt;This is simple procedure, use some tool (e.g. JSONObject ) to convert java object to json and use it like this:&lt;br /&gt;&lt;pre name="code" class="js"&gt;&lt;br /&gt;var person={ "age":22,&lt;br /&gt;   "lastname":"Smith",&lt;br /&gt;   "firstname":"John",&lt;br /&gt;   "addresses":[&lt;br /&gt;   {"street":"1st","number":11,"city":"some city"},&lt;br /&gt;   {"street":"2nd","number":22,"city":"some city 2"}]&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt;person.age // 22&lt;br /&gt;person.addresses[1].street // "2nd"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;But what it is needed to be used in backend? There is open source library that is capable of parsing json and it can be downloaded at &lt;a target="_blank" href="http://www.json.org/java/"&gt;http://www.json.org/java/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I will create two classes that will be used for testing: Person and Address.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class Person {&lt;br /&gt;    public String firstname;&lt;br /&gt;    public String lastname;&lt;br /&gt;    public int age;&lt;br /&gt;    private List&amp;lt;Address&amp;gt; addresses;&lt;br /&gt;//getters and setter&lt;br /&gt;}&lt;br /&gt;public class Address {&lt;br /&gt;    private int number;&lt;br /&gt;    private String street;&lt;br /&gt;    private String city;&lt;br /&gt;//getters and setter&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now lets add some test data:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;final Person person = new Person();&lt;br /&gt;person.setAge(22);&lt;br /&gt;person.setFirstname("John");&lt;br /&gt;person.setLastname("Smith");&lt;br /&gt;final List&amp;lt;Address&amp;gt; list = new ArrayList&amp;lt;Address&amp;gt;();&lt;br /&gt;list.add(new Address(11, "1st", "some city"));&lt;br /&gt;list.add(new Address(22, "2nd", "some city 2"));&lt;br /&gt;person.setAddresses(list);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Creating json string from person object is easy and can be done like this:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;JSONObject jsonPerson = new JSONObject(person);&lt;br /&gt;// json string representation of person object&lt;br /&gt;String stringPerson = jsonPerson.toString();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Content of string person is:&lt;br /&gt;{"age":22,"lastname":"Smith","firstname":"John","addresses":[{"street":"1st","number":11,"city":"some city"},{"street":"2nd","number":22,"city":"some city 2"}]}&lt;br /&gt;Converting json string back to object does not come out-of-box. String has to be parsed. I have used constructors as methods for parsing.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public Address(String json) throws JSONException {&lt;br /&gt;    super();&lt;br /&gt;    this.number = new JSONObject(json).getInt("number");&lt;br /&gt;    this.street = new JSONObject(json).getString("street");&lt;br /&gt;    this.city = new JSONObject(json).getString("city");&lt;br /&gt;}&lt;br /&gt;public Person(String json) throws JSONException {&lt;br /&gt;    super();&lt;br /&gt;    firstname = new JSONObject(json).getString("firstname");&lt;br /&gt;    lastname = new JSONObject(json).getString("lastname");&lt;br /&gt;    age = new JSONObject(json).getInt("age");&lt;br /&gt;    addresses = new ArrayList&amp;lt;Address&amp;gt;();&lt;br /&gt;    JSONArray array = new JSONArray(new JSONObject(json).getString("addresses"));&lt;br /&gt;    for (int i = 0; i &amp;lt; array.length(); i++) {&lt;br /&gt;        addresses.add(new Address(array.get(i).toString()));&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now when this kind of constructors are available, converting json string to Person object can be done with calling one line of code&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;// person object from json&lt;br /&gt;final Person personFromJson = new Person(newJsonPerson);&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/2439782663440463327-3129238916952811203?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/3129238916952811203/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/03/json-in-java.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3129238916952811203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3129238916952811203'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/03/json-in-java.html' title='Json in Java'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-1398532308808622791</id><published>2009-03-19T09:59:00.000-07:00</published><updated>2009-03-28T04:59:53.725-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse plugins'/><title type='text'>Eclipse plugins - must use</title><content type='html'>Eclemma - Eclemma is a free Java code coverage tool that visually shows code coverage with JUnits.&lt;br /&gt;&lt;a href="http://update.eclemma.org/"&gt;http://update.eclemma.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PMD - PMD scans Java source code and looks for potential problems.&lt;br /&gt;&lt;a href="http://pmd.sourceforge.net/eclipse"&gt;http://pmd.sourceforge.net/eclipse&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Check style - Checkstyle is a development tool to help programmers wjavascript:void(0)rite Java code that follows a coding standard.&lt;br /&gt;&lt;a href="http://eclipse-cs.sourceforge.net/update"&gt;http://eclipse-cs.sourceforge.net/update&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Findbugs - Findbugs is a program which uses static analysis to look for bugs in Java code.&lt;br /&gt;&lt;a href="http://findbugs.cs.umd.edu/eclipse"&gt;http://findbugs.cs.umd.edu/eclipse&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Subclipse - Subclipse gives support for Subversion&lt;br /&gt;&lt;a href="http://subclipse.tigris.org/update_1.6.x"&gt;http://subclipse.tigris.org/update_1.6.x&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How to install eclipse plugin from update site (for eclipse ganymede).&lt;br /&gt;&lt;br /&gt;1. Start Eclipse.&lt;br /&gt;2. Start the installation procedure : select the Help&gt;Software Updates&lt;br /&gt;3. Select tab Available software.&lt;br /&gt;4. Click Add Site... button&lt;br /&gt;5. Enter the update site URL&lt;br /&gt;6. Click OK button.&lt;br /&gt;7. Select just added URL from list and select check box on plug-in that you want to install.&lt;br /&gt;8. Right click on it and select install from pop-up menu.&lt;br /&gt; 9. Click Next.&lt;br /&gt;10. Accept the terms of the license agreements and click Finish.&lt;br /&gt;11. You might be asked to restart eclipse, please do so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-1398532308808622791?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/1398532308808622791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/03/eclipse-plugins-must-use.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/1398532308808622791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/1398532308808622791'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/03/eclipse-plugins-must-use.html' title='Eclipse plugins - must use'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-3827321243823203050</id><published>2009-03-18T09:44:00.000-07:00</published><updated>2009-03-18T10:36:06.609-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><category scheme='http://www.blogger.com/atom/ns#' term='cxf'/><title type='text'>CXF Web service client generation</title><content type='html'>Client can be generated from WSDL using maven2 and cxf-codegen-plugin.&lt;br /&gt;&lt;br /&gt;First create project with:&lt;br /&gt;mvn archetype:create -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId=org.ws.client -DartifactId=ws-client&lt;br /&gt;&lt;br /&gt;Add maven-compiler-plugin to pom.xml:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;configuration&amp;gt;&lt;br /&gt;  &amp;lt;source&amp;gt;1.6&amp;lt;/source&amp;gt;&lt;br /&gt;  &amp;lt;target&amp;gt;1.6&amp;lt;/target&amp;gt;&lt;br /&gt; &amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Add cxf-codegen-plugin to pom.xml:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt;&amp;lt;groupId&amp;gt;org.apache.cxf&amp;lt;/groupId&amp;gt;&lt;br /&gt;&amp;lt;artifactId&amp;gt;cxf-codegen-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;2.0.9&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;executions&amp;gt;&lt;br /&gt;&amp;lt;execution&amp;gt;&lt;br /&gt;&amp;lt;id&amp;gt;generate-sources&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;phase&amp;gt;generate-sources&amp;lt;/phase&amp;gt;&lt;br /&gt;&amp;lt;configuration&amp;gt;&lt;br /&gt; &amp;lt;sourceRoot&amp;gt;${basedir}/src/main/java&amp;lt;/sourceRoot&amp;gt;&lt;br /&gt; &amp;lt;wsdlOptions&amp;gt;&lt;br /&gt;  &amp;lt;wsdlOption&amp;gt;&lt;br /&gt;   &amp;lt;wsdl&amp;gt;${basedir}/wsdl/HelloWorld.wsdl&amp;lt;/wsdl&amp;gt;&lt;br /&gt;  &amp;lt;/wsdlOption&amp;gt;&lt;br /&gt; &amp;lt;/wsdlOptions&amp;gt;&lt;br /&gt;&amp;lt;/configuration&amp;gt;&lt;br /&gt;&amp;lt;goals&amp;gt;&lt;br /&gt; &amp;lt;goal&amp;gt;wsdl2java&amp;lt;/goal&amp;gt;&lt;br /&gt;&amp;lt;/goals&amp;gt;&lt;br /&gt;&amp;lt;/execution&amp;gt;&lt;br /&gt;&amp;lt;/executions&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;Create directory ws-client/wsdl, copy HelloWorld.wsdl file to this folder. Now change working directory to ws-client, and run&lt;br /&gt;mvn package&lt;br /&gt;&lt;br /&gt;Web service client will be generated in /src/main/java with packages.&lt;br /&gt;&lt;br /&gt;How to test is it working?&lt;br /&gt;Update dependency version for JUnit tests in pom.xml to 4.4 from 3.8.1&lt;br /&gt;&lt;br /&gt;Create eclipse project with:&lt;br /&gt;mvn eclipse:eclipse&lt;br /&gt;Open this project in eclipse&lt;br /&gt;&lt;br /&gt;Add new test class HelloWorldServiceTest&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.test;&lt;br /&gt;&lt;br /&gt;import junit.framework.TestCase;&lt;br /&gt;&lt;br /&gt;import org.junit.Test;&lt;br /&gt;&lt;br /&gt;public class HelloWorldServiceTest extends TestCase {&lt;br /&gt;&lt;br /&gt; @Test&lt;br /&gt; public void testHelloWorld() {&lt;br /&gt;     final HelloWorldImplService service = new HelloWorldImplService();&lt;br /&gt;     final HelloWorld helloWorld = service.getHelloWorldImplPort();&lt;br /&gt;     assertNotNull(helloWorld);&lt;br /&gt;     final Address addrees = helloWorld.getAddreesByUserId(123);&lt;br /&gt;     assertNotNull(addrees.getCity());&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Make sure that web service server is running, and run the test.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-3827321243823203050?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/3827321243823203050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/03/cxf-web-service-client-generation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3827321243823203050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3827321243823203050'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/03/cxf-web-service-client-generation.html' title='CXF Web service client generation'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-515847455540940366</id><published>2009-03-17T10:15:00.000-07:00</published><updated>2009-06-02T04:18:18.779-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='jetty'/><category scheme='http://www.blogger.com/atom/ns#' term='web service'/><category scheme='http://www.blogger.com/atom/ns#' term='cxf'/><title type='text'>CXF Web service server with Spring</title><content type='html'>As a build tool I’ve used maven2, because there is an existing &lt;a target="_blank" href="http://maven.apache.org/guides/introduction/introduction-to-archetypes.html"&gt;archetype&lt;/a&gt; cxf-http-basic that has all needed dependencies, and basic structure that is required to run web service.&lt;br /&gt;&lt;br /&gt;Example of cxf project creation (I assume maven2 is installed):&lt;br /&gt;mvn archetype:create -DarchetypeGroupId=org.apache.cxf -DarchetypeArtifactId=cxf-http-basic -DgroupId=org.apache.cxf -DartifactId=cxf-ws-server&lt;br /&gt;&lt;br /&gt;If you want to add web service to existing project, all dependencies that are deeded are:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;org.apache.cxf&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;cxf-rt-frontend-jaxws&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;2.0.10&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;org.apache.cxf&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;cxf-rt-transports-http&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;2.0.10&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To expose a web service, several modifications have to be in spring beans xml.&lt;br /&gt;&lt;br /&gt;Append xsi:schemaLocation with http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd.&lt;br /&gt;Append ns in beans tag with xmlns:jaxws="http://cxf.apache.org/jaxws"&lt;br /&gt;Add imports for cxf XMLs&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;import resource="classpath:META-INF/cxf/cxf.xml" /&gt;&lt;br /&gt;&amp;lt;import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /&gt;&lt;br /&gt;&amp;lt;import resource="classpath:META-INF/cxf/cxf-servlet.xml" /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Add a jaxws tag to expose web service:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;jaxws:endpoint&lt;br /&gt;id="helloWorld"&lt;br /&gt;implementor="org.apache.cxf.HelloWorldImpl"&lt;br /&gt;address="/HelloWorld" /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;CXFServlet has to be mapped as a servlet in web.xml, like this:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt; &amp;lt;servlet-name&amp;gt;CXFServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt; &amp;lt;display-name&amp;gt;CXF Servlet&amp;lt;/display-name&amp;gt;&lt;br /&gt; &amp;lt;servlet-class&amp;gt;&lt;br /&gt;  org.apache.cxf.transport.servlet.CXFServlet&lt;br /&gt;&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;CXFServlet&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;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;All modificatinos mentioned above, are already in archetype cxf-http-basic. So for new project there is nothing to be done except running archetype:create.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Web service, consists of, interface annotated with @WebService, and implemetation annotated with @WebService(endpointInterface = interfaceClassName).&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;@WebService&lt;br /&gt;public interface HelloWorld {&lt;br /&gt;/**&lt;br /&gt;* Spring interface name.&lt;br /&gt;*/&lt;br /&gt;String NAME = "org.apache.cxf.HelloWorld"; //has to be the class name of interface&lt;br /&gt;Address getAddreesByUserId(long userId);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;@WebService(endpointInterface = HelloWorld.NAME)&lt;br /&gt;public class HelloWorldImpl implements HelloWorld {&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public Address getAddreesByUserId(long userId) {&lt;br /&gt;  final Address address = new Address();&lt;br /&gt;  address.setCity("NY city");&lt;br /&gt;  address.setNumber(123);&lt;br /&gt;  address.setStreet("1. street 2. avenue");&lt;br /&gt;  return address;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Address is a pojo class.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class Address implements Serializable {&lt;br /&gt;&lt;br /&gt;private String street;&lt;br /&gt;private int number;&lt;br /&gt;private String city;&lt;br /&gt;&lt;br /&gt;//default constructor and getters and setters&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You cold see that web service is there by making war with maven, but quicker solution is to add &lt;a target="_blank" href="http://docs.codehaus.org/display/JETTY/Maven+Jetty+Plugin"&gt;jetty plugin&lt;/a&gt; to pom.xml.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;maven-jetty-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;version&amp;gt;6.1.10&amp;lt;/version&amp;gt;&lt;br /&gt; &amp;lt;configuration&amp;gt;&lt;br /&gt;  &amp;lt;scanIntervalSeconds&amp;gt;10&amp;lt;/scanIntervalSeconds&amp;gt;&lt;br /&gt;  &amp;lt;stopKey&amp;gt;foo&amp;lt;/stopKey&amp;gt;&lt;br /&gt;  &amp;lt;stopPort&amp;gt;9999&amp;lt;/stopPort&amp;gt;&lt;br /&gt; &amp;lt;/configuration&amp;gt;&lt;br /&gt; &amp;lt;executions&amp;gt;&lt;br /&gt;  &amp;lt;execution&amp;gt;&lt;br /&gt;   &amp;lt;id&amp;gt;start-jetty&amp;lt;/id&amp;gt;&lt;br /&gt;   &amp;lt;phase&amp;gt;pre-integration-test&amp;lt;/phase&amp;gt;&lt;br /&gt;   &amp;lt;goals&amp;gt;&lt;br /&gt;    &amp;lt;goal&amp;gt;run&amp;lt;/goal&amp;gt;&lt;br /&gt;   &amp;lt;/goals&amp;gt;&lt;br /&gt;   &amp;lt;configuration&amp;gt;&lt;br /&gt;    &amp;lt;scanIntervalSeconds&amp;gt;0&amp;lt;/scanIntervalSeconds&amp;gt;&lt;br /&gt;    &amp;lt;daemon&amp;gt;true&amp;lt;/daemon&amp;gt;&lt;br /&gt;   &amp;lt;/configuration&amp;gt;&lt;br /&gt;  &amp;lt;/execution&amp;gt;&lt;br /&gt;  &amp;lt;execution&amp;gt;&lt;br /&gt;   &amp;lt;id&amp;gt;stop-jetty&amp;lt;/id&amp;gt;&lt;br /&gt;   &amp;lt;phase&amp;gt;post-integration-test&amp;lt;/phase&amp;gt;&lt;br /&gt;   &amp;lt;goals&amp;gt;&lt;br /&gt;    &amp;lt;goal&amp;gt;stop&amp;lt;/goal&amp;gt;&lt;br /&gt;   &amp;lt;/goals&amp;gt;&lt;br /&gt;  &amp;lt;/execution&amp;gt;&lt;br /&gt; &amp;lt;/executions&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Jetty web server must be started with:&lt;br /&gt;&lt;br /&gt;mvn jetty:run-war&lt;br /&gt;&lt;br /&gt;instead with jetty:run, because war needs to be assembled first.&lt;br /&gt;&lt;br /&gt;WSDL can be accessed on url http://localhost:8080/{project artifact name}/{address from jaxws endpoint definition}?wsdl&lt;br /&gt;e.g. http://localhost:8080/cxf-ws-server/HelloWorld?wsdl&lt;br /&gt;&lt;br /&gt;When you fetch WSDL from web sevices, it means that web service is active. There is a great tool called soapui that can be used to test web services. soapui can be downloaded from &lt;a targer="_blank" href="http://www.soapui.org/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;WSDL can be also generated during the project build with cxf-java2ws-plugin.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;plugin&amp;gt;&lt;br /&gt; &amp;lt;groupId&amp;gt;org.apache.cxf&amp;lt;/groupId&amp;gt;&lt;br /&gt; &amp;lt;artifactId&amp;gt;cxf-java2ws-plugin&amp;lt;/artifactId&amp;gt;&lt;br /&gt; &amp;lt;dependencies&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;org.apache.cxf&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;cxf-rt-frontend-jaxws&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;2.1.3&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt;  &amp;lt;dependency&amp;gt;&lt;br /&gt;   &amp;lt;groupId&amp;gt;org.apache.cxf&amp;lt;/groupId&amp;gt;&lt;br /&gt;   &amp;lt;artifactId&amp;gt;cxf-rt-frontend-simple&amp;lt;/artifactId&amp;gt;&lt;br /&gt;   &amp;lt;version&amp;gt;2.1.3&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/dependency&amp;gt;&lt;br /&gt; &amp;lt;/dependencies&amp;gt;&lt;br /&gt; &amp;lt;executions&amp;gt;&lt;br /&gt;  &amp;lt;execution&amp;gt;&lt;br /&gt;   &amp;lt;id&amp;gt;process-classes&amp;lt;/id&amp;gt;&lt;br /&gt;   &amp;lt;phase&amp;gt;process-classes&amp;lt;/phase&amp;gt;&lt;br /&gt;   &amp;lt;configuration&amp;gt;&lt;br /&gt;    &amp;lt;className&amp;gt;org.apache.cxf.HelloWorld&amp;lt;/className&amp;gt;&lt;br /&gt;    &amp;lt;genWsdl&amp;gt;true&amp;lt;/genWsdl&amp;gt;&lt;br /&gt;    &amp;lt;verbose&amp;gt;true&amp;lt;/verbose&amp;gt;&lt;br /&gt;   &amp;lt;/configuration&amp;gt;&lt;br /&gt;   &amp;lt;goals&amp;gt;&lt;br /&gt;    &amp;lt;goal&amp;gt;java2ws&amp;lt;/goal&amp;gt;&lt;br /&gt;   &amp;lt;/goals&amp;gt;&lt;br /&gt;  &amp;lt;/execution&amp;gt;&lt;br /&gt; &amp;lt;/executions&amp;gt;&lt;br /&gt;&amp;lt;/plugin&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-515847455540940366?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/515847455540940366/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/03/cxf-web-service-server-with-spring.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/515847455540940366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/515847455540940366'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/03/cxf-web-service-server-with-spring.html' title='CXF Web service server with Spring'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-220469661389700488</id><published>2009-03-14T01:17:00.000-07:00</published><updated>2009-03-14T01:18:00.824-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='jvm'/><title type='text'>JVM loaded classes</title><content type='html'>If you ever need to check which classes are loaded in your JVM, you can do that with use of VM argument -verbose:class.&lt;br /&gt;&lt;br /&gt;I made a small simple java project that contains only one class, HelloWorld, with main method that contains only console print command.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;    System.out.println("Hello world");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Added -verbose:class to VM arguments and run this class. And there is was, desired output, list of loaded classes in VM.&lt;br /&gt;&lt;br /&gt;[Loaded java.lang.Object from shared objects file]&lt;br /&gt;[Loaded java.io.Serializable from shared objects file]&lt;br /&gt;[Loaded java.lang.Comparable from shared objects file]&lt;br /&gt;[Loaded java.lang.CharSequence from shared objects file]&lt;br /&gt;[Loaded java.lang.String from shared objects file]&lt;br /&gt;[Loaded java.lang.reflect.GenericDeclaration from shared objects file]&lt;br /&gt;[Loaded java.lang.reflect.Type from shared objects file]&lt;br /&gt;[Loaded java.lang.reflect.AnnotatedElement from shared objects file]&lt;br /&gt;[Loaded java.lang.Class from shared objects file]&lt;br /&gt;.....&lt;br /&gt;[Loaded java.util.LinkedHashSet from shared objects file]&lt;br /&gt;[Loaded java.util.HashMap$KeySet from shared objects file]&lt;br /&gt;[Loaded java.util.LinkedHashMap$LinkedHashIterator from shared objects file]&lt;br /&gt;[Loaded java.util.LinkedHashMap$KeyIterator from shared objects file]&lt;br /&gt;&lt;br /&gt;Result was 331 loaded classes. Yep, 331 classes just to print hello world in console.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-220469661389700488?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/220469661389700488/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/03/jvm-loaded-classes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/220469661389700488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/220469661389700488'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/03/jvm-loaded-classes.html' title='JVM loaded classes'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-3802766569017352512</id><published>2009-03-13T11:17:00.000-07:00</published><updated>2009-03-13T11:18:18.446-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='psql'/><title type='text'>Manage psql users</title><content type='html'>Statement marked with [ ] can be left out and | represents OR.  All statements should be executed from psql.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Remove user:&lt;/b&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;DROP USER username&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Update user:&lt;/b&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;ALTER USER username&lt;br /&gt;         [WITH PASSWORD 'password']&lt;br /&gt;         [CREATEDB | NOCREATEDB]&lt;br /&gt;         [CREATEUSER | NOCREATEUSER]&lt;br /&gt;         [VALID UNTIL 'time']&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Create user:&lt;/b&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;CREATE USER username&lt;br /&gt;[WITH [SYSID uid]&lt;br /&gt;      [PASSWORD 'password']]&lt;br /&gt;[CREATEDB | NOCREATEDB]&lt;br /&gt;[CREATEUSER | NOCREATEUSER]&lt;br /&gt;[IN GROUP groupname [, ...]]&lt;br /&gt;[VALID UNTIL 'abstime']&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;List users:&lt;/b&gt;&lt;br /&gt;&lt;pre name="code" class="sql"&gt;&lt;br /&gt;SELECT * FROM pg_user;&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/2439782663440463327-3802766569017352512?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/3802766569017352512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/03/manage-psql-users.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3802766569017352512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3802766569017352512'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/03/manage-psql-users.html' title='Manage psql users'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-2760180014396109300</id><published>2009-03-06T08:46:00.000-08:00</published><updated>2009-03-06T11:57:00.825-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>Firefox add-ons</title><content type='html'>Here is the list of my favorite Firefox add-ons. I have divided them into ones that are have business purpose and ones that are used for fun or to make browsing more pleasant.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;For web development&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/1843/1233876264" /&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Firebug is essential add-on for web development. It enables you to inspect and edit html, javascript and css in real time.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/10229/1235601133" /&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/10229"&gt;Wappalyzer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This add-on gives you ability to inspect page that you are currently on, and show technologies that are used on it.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://addons.mozilla.org/img/default_icon.png" /&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/5792"&gt;Firesizer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This add-on gives you ability to resize your Firefox to a particular size (e.g. 800x600) with two clicks. Can be used to check how does you page look on smaller screens.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3829/1210629121" /&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/3829"&gt;Live HTTP Headers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This add-on gives you ability to overview http headers (requests and responses) .&lt;br /&gt;&lt;br /&gt;&lt;img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/1333/1234208703" /&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/1333"&gt;Quick Locale Switcher&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This add-on gives you ability to change locale of you browser without restarting it. This is really good for testing i18n support on web applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;My personal favorites&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/2410/1234569176" /&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/2410"&gt;Foxmarks Bookmark Synchronizer&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This add-on keeps your bookmarks synchronized on on or more  computers, keeps them safe and also available online on any computer (even on those that don't have this add-on installed) using &lt;a href="http://my.foxmarks.com/"&gt;my.foxmarks.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/398/1230331022" /&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/398"&gt;Forecastfox&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;See weather forecast for you region and current weather conditions.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/1557/1231133278" /&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/1557"&gt;QuickProxy&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Turn on  and off your proxy by one click.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/4810/1232545318" /&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/4810"&gt;Speed Dial&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This add-on gives you ability to have some nine visual bookmarks on each new tab that you open.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3818/1213347471" /&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/3818"&gt;Resizeable Textarea&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This add-on gives you ability to resize textareas on web pages just by pulling edge their edge.&lt;br /&gt;&lt;br /&gt;&lt;img src="https://addons.mozilla.org/en-US/firefox/images/addon_icon/3006/1236030709" /&gt; &lt;a target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/3006"&gt;Video DownloadHelper&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This add-on gives you ability to download videos from &lt;a target="_blank" href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt; like sites.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-2760180014396109300?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/2760180014396109300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/03/firefox-add-ons.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2760180014396109300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2760180014396109300'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/03/firefox-add-ons.html' title='Firefox add-ons'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-5111046498622300384</id><published>2009-03-03T14:50:00.000-08:00</published><updated>2009-03-16T10:13:49.935-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http post'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='commons'/><category scheme='http://www.blogger.com/atom/ns#' term='http get'/><category scheme='http://www.blogger.com/atom/ns#' term='code reuse'/><title type='text'>Use common code libraries</title><content type='html'>How many times did you need to load a file from file system and read it's content to a string, I needed it a lot of times, and usually what people do is Google for solution e.g &lt;a target="_blank" href="http://www.google.com/search?q=java+read+file+into+a+string"&gt;http://www.google.com/search?q=java+read+file+into+a+string&lt;/a&gt;. And the solution is there, just copy-paste the method, and you're good to go. Then you'll need to use this method on a 2 or more places in a code. What is next? Make an utility class for files. All seams reasonable, doesn't it? It is reasonable. But, can it be true that, no one else made utility class like this already? And, I could just include it, and use it? No, it's not true, there are bunch of java utilities called &lt;a target="_blank" href="http://commons.apache.org/"&gt;commons&lt;/a&gt;. Purpose of this utilities is reuse. Don't write something that is already written.&lt;br /&gt;&lt;br /&gt;For this specific problem, I/O commons can be used:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;final String result = FileUtils.readFileToString(new File(path));&lt;br /&gt;&lt;/pre&gt;Here is example of http GET and POST requests. For this requests HttpClient can be used.&lt;br /&gt;&lt;br /&gt;Making a HTTP request with method GET:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;ResponseHandler&amp;lt;string&amp;gt; responseHandler = new BasicResponseHandler();&lt;br /&gt;try {&lt;br /&gt;// execute request&lt;br /&gt;final String responseBody = httpclient.execute(httpget, responseHandler);&lt;br /&gt;// print result&lt;br /&gt;System.out.println(responseBody);&lt;br /&gt;} catch (ClientProtocolException e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;httpclient.getConnectionManager().shutdown();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Making a HTTP request with method POST:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;final HttpClient httpclient = new DefaultHttpClient();&lt;br /&gt;final HttpPost httpPost = new HttpPost("http://localhost:8080/myapp/search");&lt;br /&gt;try {&lt;br /&gt;MultipartEntity entity = new MultipartEntity();&lt;br /&gt;entity.addPart("word", new StringBody("home", Charset.forName("UTF-8")));&lt;br /&gt;httpPost.setEntity(entity);&lt;br /&gt;final ResponseHandler&amp;lt;string&amp;gt; handler = new BasicResponseHandler();&lt;br /&gt;// execute request&lt;br /&gt;final String responseBody = httpclient.execute(httpPost, handler);&lt;br /&gt;httpclient.execute(httpPost, handler);&lt;br /&gt;// print result&lt;br /&gt;System.out.println(responseBody);&lt;br /&gt;} catch (ClientProtocolException e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;} catch (IOException e) {&lt;br /&gt;e.printStackTrace();&lt;br /&gt;}&lt;br /&gt;httpclient.getConnectionManager().shutdown();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Use this dependencies for http commons:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.apache.httpcomponents&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;httpmime&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;4.0-beta2&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;org.apache.httpcomponents&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;httpclient&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;4.0-beta2&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;For more information visit &lt;a target="_blank" href="http://hc.apache.org/httpclient-3.x/"&gt;HttpClient home&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;One quite interesting tool within the commons is Object JXPath. It allows you to use &lt;a target="_blank" href="http://www.w3schools.com/XPath/default.asp"&gt;XPath&lt;/a&gt; on java objects.&lt;br /&gt;&lt;br /&gt;Here is the example with JXPath:&lt;br /&gt;&lt;br /&gt;class Application has field List&amp;lt;group&amp;gt;&lt;br /&gt;class Group has field List&amp;lt;user&amp;gt;&lt;br /&gt;class User contains fields username and password&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;String username = "1c";&lt;br /&gt;&lt;br /&gt;try {&lt;br /&gt;final String xpathPassword = "groups/users[username='" + username + "']/password";&lt;br /&gt;final String password = (String) JXPathContext.newContext(application).getValue(xpathPassword);&lt;br /&gt;System.out.println(password);&lt;br /&gt;} catch (JXPathNotFoundException e) {&lt;br /&gt;System.out.println("element not found");&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here is the example without JXPath:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;String username = "1c";&lt;br /&gt;final List&amp;lt;group&amp;gt; groups = application.getGroups();&lt;br /&gt;for (Group group : groups) {&lt;br /&gt;final List&amp;lt;user&amp;gt; users = group.getUsers();&lt;br /&gt;for (User user : users) {&lt;br /&gt;if (user.getUsername().equals(username)) {&lt;br /&gt;  System.out.println(user.getPassword());&lt;br /&gt;  break;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;There are many more utility libraries, that can be found at &lt;a target="_blank" href="http://commons.apache.org/"&gt;http://commons.apache.org/&lt;/a&gt;. It's not crucial to know how all common libraries work and how to use them, but it is crucial to know that they exist, and this way be able to use them, or learn how to use them when needed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-5111046498622300384?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/5111046498622300384/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/03/use-commons-dont-reinvent-wheel.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5111046498622300384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5111046498622300384'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/03/use-commons-dont-reinvent-wheel.html' title='Use common code libraries'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-5908999971506489217</id><published>2009-03-02T14:13:00.000-08:00</published><updated>2009-03-02T14:37:36.830-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><title type='text'>Speed up FireFox</title><content type='html'>There are two things that you can speed up on your firefox, and that is start up time (windows only)  and page loading time.&lt;br /&gt;&lt;br /&gt;Start up time can be reduced to minimum by using filefox preloader, with can be found &lt;a target='_blank' href="http://sourceforge.net/projects/ffpreloader/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;While page loading speed by advanced configuration. It will not increase your internet speed, but it will enable firefox to use maximum of you internet connection.&lt;br /&gt;&lt;br /&gt;Type "about:config" into the address bar and hit return.&lt;br /&gt;Click button 'I'll be careful, I promise!'&lt;br /&gt;&lt;br /&gt;Find next reference names and change their values like this:&lt;br /&gt;(name=value)&lt;br /&gt;&lt;br /&gt;network.http.pipelining=true&lt;br /&gt;network.http.proxy.pipelining=true&lt;br /&gt;network.http.pipelining.maxrequests=30&lt;br /&gt;&lt;br /&gt;This will allow browser to simultaneously load upto 30 connections instead of only one.&lt;br /&gt;&lt;br /&gt;Set the number of milliseconds to wait before first displaying the page. (Default: 250)&lt;br /&gt;&lt;br /&gt;Add new integer property. Right-click anywhere , then click New-&gt; Integer.&lt;br /&gt;(name=value)&lt;br /&gt;nglayout.initialpaint.delay=0&lt;br /&gt;&lt;br /&gt;Enjoy&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-5908999971506489217?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/5908999971506489217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/03/speed-up-firefox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5908999971506489217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/5908999971506489217'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/03/speed-up-firefox.html' title='Speed up FireFox'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-8949022182460149665</id><published>2009-03-01T22:57:00.000-08:00</published><updated>2009-03-02T14:18:38.705-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unix commands'/><title type='text'>Unix essential commands</title><content type='html'>&lt;span style="font-size:130%;"&gt;file system&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ls&lt;br /&gt;shows list of files in present directory&lt;br /&gt;&lt;br /&gt;ls -l&lt;br /&gt;shows list of files with details in present directory&lt;br /&gt;&lt;br /&gt;ls -a&lt;br /&gt;shows list of files (also hidden) in present directory&lt;br /&gt;&lt;br /&gt;cd pathname&lt;br /&gt;changes active directory&lt;br /&gt;&lt;br /&gt;cd ..&lt;br /&gt;moves you up a directory&lt;br /&gt;&lt;br /&gt;cp file1 file2&lt;br /&gt;copies file file1 into file2&lt;br /&gt;&lt;br /&gt;cp -r dir1 dir2&lt;br /&gt;copies the directory dir1 and renames it dir2&lt;br /&gt;&lt;br /&gt;mv  file1 file2&lt;br /&gt;Renames file file1 as file2&lt;br /&gt;&lt;br /&gt;mv file1 dir1&lt;br /&gt;moves the file called file1 to the directory dir1&lt;br /&gt;&lt;br /&gt;rm file1&lt;br /&gt;deletes the file file1&lt;br /&gt;&lt;br /&gt;rm -r dir1&lt;br /&gt;deletes recursively dir dir1 with its sub directories&lt;br /&gt;&lt;br /&gt;mkdir dir1&lt;br /&gt;creates a new directory called dir1&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;users - roles&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;su root&lt;br /&gt;switchs user to root. instead of root can be used any other username that exists on system.&lt;br /&gt;&lt;br /&gt;sudo root command&lt;br /&gt;executes a command as root.&lt;br /&gt;&lt;br /&gt;instead of root - can be used.&lt;br /&gt;&lt;br /&gt;chmod ### file&lt;br /&gt;changes file (directory) permissions&lt;br /&gt;&lt;br /&gt;chmod &lt;tt&gt;-R &lt;/tt&gt;### pathname&lt;br /&gt;changes directory permissions recursively for all sub directories and files in them&lt;br /&gt;&lt;br /&gt;###  - three digits that represent permissions(owner,group,other)&lt;br /&gt;&lt;br /&gt;each digit is from 0 to 7.&lt;br /&gt;&lt;br /&gt;0 no permission&lt;br /&gt;1 execute&lt;br /&gt;2 write&lt;br /&gt;3 write and execute&lt;br /&gt;4 read&lt;br /&gt;5 read and execute&lt;br /&gt;6 read and write&lt;br /&gt;7 read, write and execute&lt;br /&gt;&lt;br /&gt;chown username filename&lt;br /&gt;changes the owner of a file&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;chown -R username pathname&lt;br /&gt;changes the owner of a directory recursively to all sub directories and files in them&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;processes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;^-c (ctrl-c)&lt;br /&gt;kills a running process&lt;br /&gt;&lt;br /&gt;ps -u root&lt;br /&gt;shows processes running for user root&lt;br /&gt;&lt;br /&gt;ps -flu root&lt;br /&gt;shows detailed description of processes running for user root&lt;br /&gt;&lt;br /&gt;kill processid&lt;br /&gt;kills a running process&lt;br /&gt;&lt;br /&gt;kill -9 processid&lt;br /&gt;uses force to kills a running process&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;editing text files&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;vi filename&lt;br /&gt;opens vi text editor&lt;br /&gt;&lt;br /&gt;vi editor has 3 modes:&lt;br /&gt;normal mode. can be accessed by pressing esc key.&lt;br /&gt;insert mode. can be accessed by pressing i form normal mode.&lt;br /&gt;command mode. can be accessed by pressing shift+q.&lt;br /&gt;&lt;br /&gt;when in command mode use:&lt;br /&gt;q!&lt;br /&gt;exits without saving&lt;br /&gt;wq&lt;br /&gt;saves changes and exits vi&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;log (text) viewer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;tail filename&lt;br /&gt;displays several lines at the  end of file&lt;br /&gt;&lt;br /&gt;tail -f filename&lt;br /&gt;follows (live update) the several last lines at the  end of file&lt;br /&gt;&lt;br /&gt;tail -f -n 30 filename&lt;br /&gt;follows (live update) last 30 lines at the  end of file&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-8949022182460149665?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/8949022182460149665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/02/unix-essential-commands.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8949022182460149665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/8949022182460149665'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/02/unix-essential-commands.html' title='Unix essential commands'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-914612839351741938</id><published>2009-02-26T11:18:00.000-08:00</published><updated>2009-02-26T13:43:15.358-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='Syntax Highlighting'/><title type='text'>Code in blog posts</title><content type='html'>I was wondering this days how to add code blocks in blog posts... Today I was enlighten by one of my colleagues, he gave a hint about syntax highlighting...&lt;br /&gt;&lt;br /&gt;And I Googled right away a java script tool called "syntax highlighter" which can be found &lt;a target='_blank' href="http://code.google.com/p/syntaxhighlighter"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;It is quite easy to use, I'll show you how in a few steps:&lt;br /&gt;&lt;br /&gt;You'll need to host for this tool somewhere where it will available on internet. I created free account on &lt;a target='_blank' href="http://www.110mb.com/"&gt; http://www.110mb.com/&lt;/a&gt; and uploaded files there.&lt;br /&gt;&lt;br /&gt;Feel free to use them, I'm not intending to move or remove them.&lt;br /&gt;&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Styles/SyntaxHighlighter.css&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/clipboard.swf&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushJScript.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shCore.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushCSharp.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushJava.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushPython.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushRuby.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushXml.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushVb.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushDelphi.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushSql.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushCpp.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushPhp.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shBrushCss.js&lt;br /&gt;http://milan-storage.110mb.com/dp.SyntaxHighlighter/Scripts/shCore.js&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Add this code to your page, just before &amp;lt;/body&amp;gt; tag. If you have e.g. Google analysts js there, put it just above this js.&lt;br /&gt;&lt;br /&gt;&amp;lt;link type="text/css" rel="stylesheet" href="Style/SyntaxHighlighter.css" /&amp;gt;&lt;br /&gt;&amp;lt;script language="javascript" src="Scripts/shCore.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script language="javascript" src="Scripts/shBrushJava.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script language="javascript" src="Scripts/shBrushXml.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script language="javascript"&amp;gt;&lt;br /&gt;dp.SyntaxHighlighter.ClipboardSwf = 'Scripts/clipboard.swf';&lt;br /&gt;dp.SyntaxHighlighter.BloggerMode(); //fix for blogger adding &lt;/br&gt; to lines&lt;br /&gt;dp.SyntaxHighlighter.HighlightAll('code');&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;Update URLs for style and java scripts to point to existing files.&lt;br /&gt;&lt;br /&gt;Now you are ready to use this java script tool on your blog.&lt;br /&gt;&lt;br /&gt;With inserting this code:&lt;br /&gt;&lt;br /&gt;&amp;lt;pre name="code" class="java"&amp;gt;&lt;br /&gt;System.out.println("Hello World!");&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;br /&gt;You'll get this:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;System.out.println("Hello World!");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;And another example:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;package com.net.adsl;&lt;br /&gt;&lt;br /&gt;import java.io.BufferedInputStream;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.io.InputStream;&lt;br /&gt;import java.net.MalformedURLException;&lt;br /&gt;import java.net.URL;&lt;br /&gt;/**&lt;br /&gt; * Utility class that can try to connect to given URL.&lt;br /&gt; * &lt;br /&gt; * @author Milan Dinic&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;public final class ConnectionCheck {&lt;br /&gt;&lt;br /&gt; private ConnectionCheck() {&lt;br /&gt;  super();&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;List of supported languages:&lt;br /&gt;&lt;table style="border-collapse: collapse;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="border: 0px none ;"&gt;&lt;b&gt;Language&lt;/b&gt;&lt;/td&gt;&lt;td style="border: 0px none ;"&gt;&lt;b&gt;Aliases&lt;/b&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; C++ &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;cpp&lt;/tt&gt;, &lt;tt&gt;c&lt;/tt&gt;, &lt;tt&gt;c++&lt;/tt&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; C# &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;c#&lt;/tt&gt;, &lt;tt&gt;c-sharp&lt;/tt&gt;, &lt;tt&gt;csharp&lt;/tt&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; CSS &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;css&lt;/tt&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; Delphi &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;delphi&lt;/tt&gt;, &lt;tt&gt;pascal&lt;/tt&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; Java &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;java&lt;/tt&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; Java Script &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;js&lt;/tt&gt;, &lt;tt&gt;jscript&lt;/tt&gt;, &lt;tt&gt;javascript&lt;/tt&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; PHP &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;php&lt;/tt&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; Python &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;py&lt;/tt&gt;, &lt;tt&gt;python&lt;/tt&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; Ruby &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;rb&lt;/tt&gt;, &lt;tt&gt;ruby&lt;/tt&gt;, &lt;tt&gt;rails&lt;/tt&gt;, &lt;tt&gt;ror&lt;/tt&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; Sql &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;sql&lt;/tt&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; VB &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;vb&lt;/tt&gt;, &lt;tt&gt;vb.net&lt;/tt&gt; &lt;/td&gt;&lt;/tr&gt; &lt;tr&gt;&lt;td style="border: 0px none ;"&gt; XML/HTML &lt;/td&gt;&lt;td style="border: 0px none ;"&gt; &lt;tt&gt;xml&lt;/tt&gt;, &lt;tt&gt;html&lt;/tt&gt;, &lt;tt&gt;xhtml&lt;/tt&gt;, &lt;tt&gt;xslt&lt;/tt&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;For more information visit syntax hlighter &lt;a target='_blank' href="http://code.google.com/p/syntaxhighlighter"&gt;site&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-914612839351741938?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/914612839351741938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/02/code-in-blog-posts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/914612839351741938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/914612839351741938'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/02/code-in-blog-posts.html' title='Code in blog posts'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-6393541183902598253</id><published>2009-02-23T12:24:00.001-08:00</published><updated>2009-03-04T01:32:39.136-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Command line'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ADSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Neobee'/><title type='text'>ADSL connection problem</title><content type='html'>I'm using ADSL at home, my ISP is &lt;a target="_blank" href="http://www.neobee.net/"&gt;neobee&lt;/a&gt;, and lately I'm not too happy with it. My connection keeps on dying. I don't get disconnected, the data just stops to flow. I tried to contact their support service, although I was skeptic about that they will provide me any solution. The answer I got from them was expected: it's your firewall, it's your antivirus, your operating system is corrupted. With other words, it's my fault, not theirs, but I don't think so. I was tempted to change my ISP, but, how can I be sure that it will be any better. And changing ISP is a procedure, that as long it is not completely necessary, I don't want go through. Then since I can not find a source of problem, I cannot find a cure, but I can make some patch for it. If i can not stop connection from dying, I can make application that will restart connection for me, weather I'm in front of my pc or not.&lt;br /&gt;&lt;br /&gt;This is the idea:&lt;br /&gt;-create command line tool using Java as technology&lt;br /&gt;-create small finite state machine with states CONNECTED (regular state), DISCONNECTED (connection died) and CONNECTING (trying to reconnect)&lt;br /&gt;-detect when connection died&lt;br /&gt;-disconnect internet connection&lt;br /&gt;-make new connection&lt;br /&gt;&lt;br /&gt;To to discover it there active connection, I've used:&lt;br /&gt;address can be any URL. e.g. http://www.google.com&lt;br /&gt;&lt;br /&gt;final URL url = new URL(address);&lt;br /&gt;final InputStream in = url.openStream();&lt;br /&gt;final BufferedInputStream bufIn = new BufferedInputStream(in);&lt;br /&gt;bufIn.close();&lt;br /&gt;in.close();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If there is no exception during execution of this code, there is active internet connection.&lt;br /&gt;&lt;br /&gt;Since I'm using Windows Xp, application rasdail.exe can be used to establish an break intenet connection, but connection with exact same name must exist in 'Network connections'.&lt;br /&gt;&lt;br /&gt;To disconnect connection form command line call it is sufficient to call:&lt;br /&gt;rasdail "My Connection name" /d&lt;br /&gt;&lt;br /&gt;To dail a connection from command line call it is sufficient to call:&lt;br /&gt;rasdail "My Connection name" my_username my_password&lt;br /&gt;&lt;br /&gt;Command line command can be called from java with:&lt;br /&gt;final Runtime rt = Runtime.getRuntime();&lt;br /&gt;final Process pr = rt.exec("calc");&lt;br /&gt;&lt;br /&gt;Implementation of this idea can be downloaded below:&lt;br /&gt;&lt;br /&gt;Source: &lt;a href="http://www.mediafire.com/?2mjz42zhezy" target=_blank&gt;adsl-fix-source.zip&lt;/a&gt;&lt;br /&gt;Jar: &lt;a href="http://www.mediafire.com/?htzmihn5v5y" target=_blank&gt;adsl-fix.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-6393541183902598253?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/6393541183902598253/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/02/adsl-connection-problem.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6393541183902598253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6393541183902598253'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/02/adsl-connection-problem.html' title='ADSL connection problem'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-2923876743061518432</id><published>2009-02-22T10:45:00.000-08:00</published><updated>2009-02-22T14:28:38.609-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='connection pool'/><title type='text'>Tomcat connection pool</title><content type='html'>In 6 easy steps I'll show you how to setup  Tomcat database connection pool and how to fetch  a connection from it.&lt;br /&gt;&lt;br /&gt;Preconditions:&lt;br /&gt;-tomcat installed&lt;br /&gt;-postgres installed (may be any other database server)&lt;br /&gt;-created java web application,  e.g.'test-webapp', that will use tomcats connection pool&lt;br /&gt;&lt;br /&gt;1. Shut down tomcat if it is working&lt;br /&gt;&lt;br /&gt;2. Add postgres java database connector&lt;br /&gt;postgres jdbc can be found at &lt;a target="_blank" href="http://jdbc.postgresql.org/download.html"&gt;download page&lt;/a&gt;&lt;br /&gt;on tomcat 6.x, copy jdbc driver to %tomcat%/lib folder&lt;br /&gt;on tomcat 5.x, copy jdbc driver to %tomcat%/common/lib folder&lt;br /&gt;&lt;br /&gt;3. Add resource to tomcat's server.xml. This file is located at %tomcat%/conf/server.xml.&lt;br /&gt;&lt;br /&gt;E.g.&lt;br /&gt;&lt;br /&gt;&amp;lt;server port="8005" shutdown="SHUTDOWN"&amp;gt;&lt;br /&gt;.....&lt;br /&gt;&lt;br /&gt;&amp;lt;globalnamingresources&amp;gt;&lt;br /&gt;....&lt;br /&gt;&amp;lt;Resource&lt;br /&gt;auth="Container"&lt;br /&gt;name="jdbc/GlobalSQL"&lt;br /&gt;type="javax.sql.DataSource"&lt;br /&gt;driverClassName="org.postgresql.Driver"&lt;br /&gt;url="jdbc:postgresql://localhost/postgres"&lt;br /&gt;username="postgres"&lt;br /&gt;password="postgres"&lt;br /&gt;initialSize="16"&lt;br /&gt;maxActive="32"&lt;br /&gt;maxIdle="8"&lt;br /&gt;minIdle="4"&lt;br /&gt;maxWait="5000"&lt;br /&gt;validationQuery="SELECT 1"&lt;br /&gt;minEvictableIdleTimeMillis="1800000"&lt;br /&gt;timeBetweenEvictionRunsMillis="60000"&lt;br /&gt;testWhileIdle="true"&lt;br /&gt;removeAbandoned="true"&lt;br /&gt;removeAbandonedTimeout="10"&lt;br /&gt;logAbandoned="true" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/globalnamingresources&amp;gt;&lt;br /&gt;.....&lt;br /&gt;&lt;br /&gt;&amp;lt;/server&amp;gt;&lt;br /&gt;&lt;br /&gt;Username and password for your database should be set instead of postgres/postgres.&lt;br /&gt;&lt;br /&gt;4. Add or update src/main/webapp/META-INF/context.xml file with content:&lt;br /&gt;(this file may have a different location, anyway, after deployment META-INF folder  must be on root of 'test-webapp' directory)&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;Context crossContext="true"&amp;gt;&lt;br /&gt;&amp;lt;ResourceLink&lt;br /&gt;global="jdbc/GlobalSQL"&lt;br /&gt;name="jdbc/TestSQL"&lt;br /&gt;type="javax.sql.DataSource"/&amp;gt;&lt;br /&gt;&amp;lt;WatchedResource&amp;gt;WEB-INF/web.xml&amp;lt;/WatchedResource&amp;gt;&lt;br /&gt;&amp;lt;/Context&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. Update web.xml with&lt;br /&gt;&lt;br /&gt;&amp;lt;web-app&amp;gt;&lt;br /&gt;.....&lt;br /&gt;&lt;br /&gt;&amp;lt;resource-ref&amp;gt;&lt;br /&gt;  &amp;lt;description&amp;gt;DataSource&amp;lt;/description&amp;gt;&lt;br /&gt;  &amp;lt;res-ref-name&amp;gt;jdbc/TestSQL&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;res-auth&amp;gt;Container&amp;lt;/res-auth&amp;gt;&lt;br /&gt;&amp;lt;/resource-ref&amp;gt;&lt;br /&gt;&lt;br /&gt;.....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;br /&gt;6. Use this code to fetch database connections.&lt;br /&gt;&lt;br /&gt;Context initCtx = new InitialContext();&lt;br /&gt;Context envCtx = (Context) initCtx.lookup("java:comp/env");&lt;br /&gt;DataSource source = (DataSource) envCtx.lookup(myJNDIName);&lt;br /&gt;connection = source.getConnection();&lt;br /&gt;connection.setAutoCommit(false);            connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);&lt;br /&gt;.....&lt;br /&gt;connection.close();&lt;br /&gt;&lt;br /&gt;Sample application: &lt;a href="http://www.mediafire.com/?odiajynjjyz"&gt;test-webap.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-2923876743061518432?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/2923876743061518432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/02/tomcat-connection-pool.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2923876743061518432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/2923876743061518432'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/02/tomcat-connection-pool.html' title='Tomcat connection pool'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-3547088704686909236</id><published>2009-02-18T09:48:00.001-08:00</published><updated>2009-02-18T13:39:31.909-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='psql'/><category scheme='http://www.blogger.com/atom/ns#' term='Postgres'/><title type='text'>Postgres basics</title><content type='html'>&lt;b&gt;How to login to psql&lt;/b&gt;&lt;ol&gt;&lt;li&gt;open cmd line&lt;/li&gt;&lt;li&gt;if you have psql on path, then you can be on any location on your file system, if not, then change your working directory to one where psql is located&lt;/li&gt;&lt;li&gt;psql -Uusername db_name&lt;br /&gt;e.g. psql -Upostgres my_db_name&lt;br /&gt;if you don't specify database name you'll be in default database for this user. For user postgres it's postgres.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to create a new database with encoding&lt;/b&gt;&lt;br /&gt;CREATE DATABASE my_new_db ENCODING 'Unicode';&lt;br /&gt;&lt;br /&gt;List of encodings can be found &lt;a target="_blank" href="http://www.postgresql.org/docs/8.1/interactive/multibyte.html#MULTIBYTE-CHARSET-SUPPORTED"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Also it can be done from cmd line:&lt;br /&gt;&lt;br /&gt;createdb -Upostgres -EUNICODE my_new_db&lt;br /&gt;(where postgres is the psql user and my_new_db is name of database; createdb needs to be on classpath)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;How to delete a database&lt;/b&gt;&lt;br /&gt;DROP DATABASE my_new_db;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Commonly used psql commands&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;\d [NAME]&lt;br /&gt;describe table, index, sequence, or view&lt;br /&gt;\l&lt;br /&gt;list all databases&lt;br /&gt;\d{t|i|s|v|S}&lt;br /&gt;list tables/indexes/sequences/views/system tables&lt;br /&gt;\q&lt;br /&gt;quit psql&lt;br /&gt;\i FILE&lt;br /&gt;execute commands from file&lt;br /&gt;&lt;br /&gt;Commands from file can be executed from cmd line also:&lt;br /&gt;&lt;br /&gt;psql -Upostgres -f crebas.sql my_new_db&lt;br /&gt;(where postgres is the psql user, crebas.sql is file with sql commands and my_new_db is name of database; psql needs to be on classpath)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-3547088704686909236?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/3547088704686909236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/02/postgres-basics.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3547088704686909236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/3547088704686909236'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/02/postgres-basics.html' title='Postgres basics'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-1980797782376623772</id><published>2009-02-11T09:08:00.000-08:00</published><updated>2009-04-27T09:35:34.462-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cab installation'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Conacts'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><title type='text'>Contacts Backup Applicatiom for Windows Mobile</title><content type='html'>I have &lt;a href="http://www.mypocketpcmobile.com/HTCP3600Review/tabid/208/Default.aspx"&gt;HTC p3600&lt;/a&gt; for a while, which by the way has WM6 OS, and until now, I never started sync process from Microsoft ActiveSync. And a was very surprised when I found out that this process synchronized my mobile device with PC (which had no data in Outlook address book). Yes, it deleted all my contacts!&lt;br /&gt;Luckily I had a backup of my contacts from my old phone, Nokia 6600. It is a more then 6 months old but it's better then nothing. This backup is in vCard format, version 2.1.&lt;br /&gt;It should be enough to double click this file and to restore all contacts.  Yeah, there's always BUT. But it reads only for first contact from this file. With other words there should be only one contact per file. Solution to divide this this file into a few hundreds of files would be a bad idea.&lt;br /&gt;This is why I started to get interest for importing contacts using  code, proof of concept was described in &lt;a href="http://milandinic.blogspot.com/2009/02/c-windows-mobile-api-for-contacts.html"&gt;previous post&lt;/a&gt;, and sure, it is possible to manipulate contacts from code. Why stop there, I made import and export, so this could never happen again.  After I made functional core of application I started to play a bit with UI and I realized that I'll need threads to give user some feedback while core is working.&lt;br /&gt;&lt;br /&gt;To use threading add namespace:&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;using&lt;/span&gt; System.Threading;&lt;br /&gt;&lt;br /&gt;Threads can be created like this:&lt;br /&gt;Thread thread = new Thread(new ThreadStart(myFunc));&lt;br /&gt;where myFunc is a name of method.&lt;br /&gt;&lt;br /&gt;And startred with call of method Start.&lt;br /&gt;thread.Start();&lt;br /&gt;&lt;br /&gt;Next &lt;span id="query" class="query"&gt;obstacle&lt;/span&gt; was nasty exception I got: NotSupportedException "Control.Invoke must be used to interact with controls created on a separate thread". It was caused by trying to update UI from another thread directly. Problem was solved using delegates. To understand delegates this pages helped a lot:&lt;br /&gt;&lt;a href="http://www.akadia.com/services/dotnet_delegates_and_events.html"&gt;dotnet_delegates_and_events&lt;/a&gt; and&lt;a href="http://www.dailycode.net/blog/post/Control.Invoke-must-be-used-to-interact-with-controls-created-on-a-separate-thread.aspx"&gt; Control.Invoke-must-be-used-to-interact-with-controls-created-on-a-separate-thread.&lt;/a&gt; Everything was there except installation. Following instructions on this great blog post &lt;a href="http://www.mobilepractices.com/2008/02/how-to-create-windows-mobile-smart.html"&gt;how-to-create-windows-mobile-smart&lt;/a&gt; I've created installation for this application. And Contact Backup was born.&lt;br /&gt;&lt;br /&gt;Screen shot of fancy icon, how to set it, was described in &lt;a href="http://milandinic.blogspot.com/2009/02/setting-icon-for-windows-mobile.html"&gt;previous post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://img24.imageshack.us/img24/1394/sshot003ts7.jpg" alt="Image Hosted by ImageShack.us" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;A few application screens:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img style="width: 219px; height: 290px;" src="http://img11.imageshack.us/img11/9566/sshot001ux9.jpg" alt="Image Hosted by ImageShack.us" /&gt;    &lt;img style="width: 218px; height: 290px;" src="http://img18.imageshack.us/img18/2671/sshot002pi9.jpg" alt="Image Hosted by ImageShack.us" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now I can import and export my contacts on storage card without PC, and send it later to PC using bluetooth or WiFi, without using ActiveSync :) .&lt;br /&gt;&lt;br /&gt;Source: &lt;a href="http://www.mediafire.com/?gtyt2jdmvqy"&gt;Contacts.zip&lt;/a&gt;&lt;br /&gt;Installation: &lt;a href="http://www.mediafire.com/?0yhij3jwjmy"&gt;ContactsBackupInstaller.CAB&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-1980797782376623772?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/1980797782376623772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/02/contacts-backup-applicatiom-for-windows.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/1980797782376623772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/1980797782376623772'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/02/contacts-backup-applicatiom-for-windows.html' title='Contacts Backup Applicatiom for Windows Mobile'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-6163656891886772417</id><published>2009-02-09T11:53:00.000-08:00</published><updated>2009-02-09T12:46:18.042-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Icon'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><title type='text'>Setting Icon for Windows Mobile Application</title><content type='html'>I have assumed that setting icon for window mobile application could be done by clicking on form (marked with red) ...&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://img15.imageshack.us/img15/6991/formoe4.png" alt="Image Hosted by ImageShack.us" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;...and just by setting icon property. &lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://img8.imageshack.us/img8/7650/iconpropertiesxn0.png" alt="Image Hosted by ImageShack.us" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;To me it was obvious, but after I build the project, I was disappointing. There was still ugly looking default icon.  After a short clicking on VS2008 IDE, I found two ways to set an icon.&lt;br /&gt;&lt;br /&gt;First I found is longer, select for main menu Project-&gt;Add existing item and browse to your icon. Then  select for main menu Project-&gt;&lt;project&gt; Properties. Find on screen icon combo box and previously added item (icon)  should be in this list. Select it.&lt;br /&gt;Second and easiest is: go directly to main menu Project-&gt;&lt;project&gt; Properties. Use browse button next to the icon combo box to 'find' your icon, and that it, icon is set.&lt;/project&gt;&lt;/project&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-6163656891886772417?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/6163656891886772417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/02/setting-icon-for-windows-mobile.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6163656891886772417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6163656891886772417'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/02/setting-icon-for-windows-mobile.html' title='Setting Icon for Windows Mobile Application'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2439782663440463327.post-6685254482655590332</id><published>2009-02-07T12:43:00.000-08:00</published><updated>2009-02-08T02:19:50.566-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OutlookSession'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Conacts'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows Mobile'/><title type='text'>C# Windows Mobile API for contacts</title><content type='html'>This is my first post, and its odd, it is about C#, the odd thing is that I'm a Java developer. Maybe because this (C#)  is new to me, I've decided to write down my findings and share them with others.&lt;br /&gt;&lt;br /&gt;First make a new project:&lt;br /&gt;File-&gt;New Project&lt;br /&gt;&lt;br /&gt;In 'New Project' window choose Other Languages-&gt;Visual C#-&gt;Smart Device-&gt;Smart Device Project&lt;br /&gt;&lt;br /&gt;Now project is open. Lets just make a button on a form (by dragging it from Device controls to form)  and double click on it.&lt;br /&gt;&lt;br /&gt;private void button1_Click(object sender, EventArgs e)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Now, window has opened with on click method selected. The code written here will be executed on button click. Next step is to find appropriate API for contacts.&lt;br /&gt;&lt;br /&gt;Class that is used to manipulate with contact items is &lt;span style="font-weight: bold;"&gt;OutlookSession&lt;/span&gt;. To be able to use it in your code you will have to do two things:&lt;br /&gt;&lt;br /&gt;1 . add a Namespace:&lt;br /&gt;using Microsoft.WindowsMobile.PocketOutlook;&lt;br /&gt;&lt;br /&gt;2. add an Assembly:&lt;br /&gt;Microsoft.WindowsMobile.PocketOutlook&lt;br /&gt;&lt;br /&gt;Accembly can be added from Solution explorer.  By default Solution explorer is located on top right of VS2008 IDE. Right click on References and select Add Reference. On .NET tab find and select Microsoft.WindowsMobile.PocketOutlook and click Ok.&lt;br /&gt;&lt;br /&gt;Now instance of class &lt;span style="font-weight: bold;"&gt;OutlookSession&lt;/span&gt; can be made.&lt;br /&gt;&lt;br /&gt;Here is the example how to add a contact:&lt;br /&gt;&lt;br /&gt;OutlookSession mySession = new OutlookSession();&lt;br /&gt;Contact con = mySession.Contacts.Items.AddNew();&lt;br /&gt;con.MobileTelephoneNumber =  "0800123456";&lt;br /&gt;con.FileAs = "some name";&lt;br /&gt;con.Update();&lt;br /&gt;&lt;br /&gt;and contact is added.&lt;br /&gt;&lt;br /&gt;Here is the example how to iterate throught all contacts:&lt;br /&gt;&lt;br /&gt;OutlookSession mySession = new OutlookSession();&lt;br /&gt;ContactCollection collection = mySession.Contacts.Items;&lt;br /&gt;   foreach (Contact contact in collection)&lt;br /&gt;   {&lt;br /&gt;          //do something with contact details, e.g. write to file           or update&lt;br /&gt;   }&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2439782663440463327-6685254482655590332?l=milandinic.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://milandinic.blogspot.com/feeds/6685254482655590332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://milandinic.blogspot.com/2009/02/c-windows-mobile-api-for-contacts.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6685254482655590332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2439782663440463327/posts/default/6685254482655590332'/><link rel='alternate' type='text/html' href='http://milandinic.blogspot.com/2009/02/c-windows-mobile-api-for-contacts.html' title='C# Windows Mobile API for contacts'/><author><name>Milan Dinic</name><uri>http://www.blogger.com/profile/15893906724530331407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/-gKhPGnnOSyc/TWDyxcdw-fI/AAAAAAAACJ4/lM5s2fq8cnI/s220/mile.png'/></author><thr:total>1</thr:total></entry></feed>
