<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEYARXY8eyp7ImA9WhRVEEw.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731</id><updated>2012-01-08T11:49:04.873+02:00</updated><category term="proxy" /><category term="jdbc" /><category term="web-services" /><category term="jndi" /><category term="registry" /><category term="junit" /><category term="my projects" /><category term="maven" /><category term="unit-testing" /><category term="tomcat" /><category term="coding guidelines" /><category term="about" /><category term="http" /><category term="mssql" /><category term="wink" /><category term="encoder" /><category term="testng" /><category term="windows tricks" /><category term="git" /><category term="jetty" /><category term="spring" /><category term="windows" /><category term="eclipse" /><category term="axis2" /><category term="jax-ws" /><category term="xml" /><category term="hibernate" /><category term="java" /><category term="webdav" /><category term="security" /><category term="cifs" /><category term="jvm" /><category term="oracle" /><category term="httpclient" /><category term="rest" /><category term="kindle" /><category term="interview" /><category term="replace-file-plugin" /><category term="sql" /><category term="jpa" /><category term="tarlog-plugins" /><category term="javac" /><category term="unix" /><category term="surveys" /><category term="webos" /><category term="digital signatures" /><category term="palm" /><category term="saml" /><category term="axis" /><category term="utilities" /><category term="google" /><title>Tarlog on Java</title><subtitle type="html">My blog on Java and other technical issues.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://tarlogonjava.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>86</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/tarlogonjava" /><feedburner:info uri="tarlogonjava" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0MCQn8zfSp7ImA9WhRQF0U.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-305353193369926005</id><published>2011-12-08T17:26:00.002+02:00</published><updated>2011-12-13T16:11:03.185+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-13T16:11:03.185+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="rest" /><category scheme="http://www.blogger.com/atom/ns#" term="httpclient" /><category scheme="http://www.blogger.com/atom/ns#" term="unit-testing" /><title>Integration Testing of RESTful Application</title><content type="html">In the previous posts I have described &lt;a href="http://tarlogonjava.blogspot.com/2011/12/running-integration-test-using-with.html"&gt;how to start Jetty from code in the beginning of the unit tests&lt;/a&gt; and &lt;a href="http://tarlogonjava.blogspot.com/2011/12/running-integration-tests-using-with.html"&gt;how to initialize the in-memory HSQL database once Jetty is started&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you have completed the steps from these posts, you should have a running application in the beginning of your tests. And now you are ready to start the actual testing of the application.&lt;br /&gt;
&lt;br /&gt;
I believe that the best way to test RESTful API is to issue actual HTTP requests and since we have a Jetty server running, it becomes possible.&lt;br /&gt;
&lt;br /&gt;
There are a lot of HTTP Clients available in Java. The examples below use Apache HTTP Client.&lt;br /&gt;
But as always first let's add a maven dependency:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="width: 550px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;&amp;lt;dependency&amp;gt;
         &amp;lt;groupId&amp;gt;org.apache.httpcomponents&amp;lt;/groupId&amp;gt;
         &amp;lt;artifactId&amp;gt;httpclient&amp;lt;/artifactId&amp;gt;
         &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
Now some convenient static methods that can be used:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="width: 550px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.AbstractHttpMessage;
import org.apache.http.message.BasicHeader;
...
   static HttpResponse executeGet(String url) throws IOException {
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet get = new HttpGet(url);
        return httpclient.execute(get);
    }

    static HttpResponse executeDelete(String url) throws IOException {
        HttpClient httpclient = new DefaultHttpClient();
        HttpDelete delete = new HttpDelete(url);
        return httpclient.execute(delete);
    }

    static HttpResponse executePost(String url, byte[] body) throws IOException {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);
        post.setEntity(new ByteArrayEntity(body));
        return httpclient.execute(post);
    }

    static HttpResponse executePut(String url, byte[] body) throws IOException {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPut put = new HttpPut(url);
        put.setEntity(new ByteArrayEntity(body));
        return httpclient.execute(put);
    }
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
So your test can be something like:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="width: 550px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;@Test
    public void testGet() throws Exception {
        HttpResponse response = executeGet(url, null, null, null);
        assertEquals(response.getStatusLine().getStatusCode(), 200);
    }
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;hr /&gt;&lt;h3&gt;Recommended Reading&lt;/h3&gt;1. &lt;a href="http://www.amazon.com/Next-Generation-Java-Testing-Advanced/dp/0321503104/?tag=tarlog-20"&gt;Next Generation Java Testing: TestNG and Advanced Concepts&lt;/a&gt;&lt;br /&gt;
2. &lt;a href="http://www.amazon.com/Apache-Maven-3-Cookbook-Srirangan/dp/1849512442/?tag=tarlog-20"&gt;Apache Maven 3 Cookbook&lt;/a&gt;&lt;br /&gt;
3. &lt;a href="http://www.amazon.com/Spring-Recipes-Problem-Solution-Gary-Mak/dp/1430224991/?tag=tarlog-20"&gt;Spring Recipes: A Problem-Solution Approach&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-305353193369926005?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/305353193369926005/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=305353193369926005" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/305353193369926005?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/305353193369926005?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/AKJQHBSHLpU/integration-testing-of-restful.html" title="Integration Testing of RESTful Application" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/12/integration-testing-of-restful.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MMR344cSp7ImA9WhRQF0U.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-8286880515378210727</id><published>2011-12-08T10:48:00.006+02:00</published><updated>2011-12-13T16:11:26.039+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-13T16:11:26.039+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="testng" /><category scheme="http://www.blogger.com/atom/ns#" term="jetty" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><category scheme="http://www.blogger.com/atom/ns#" term="unit-testing" /><category scheme="http://www.blogger.com/atom/ns#" term="jndi" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title>Automated Integration Tests Using with Jetty, Maven and Other Neat Freameworks - 2</title><content type="html">In the &lt;a href="http://tarlogonjava.blogspot.com/2011/12/running-integration-test-using-with.html"&gt;previous post&lt;/a&gt;, I have started a Jetty server in the beginning of a unit test with a configured external data-source.&lt;br /&gt;
&lt;br /&gt;
Let's talk about it a little bit more. The assumption here was that the application on a regular basis uses an external data-source that is accessed via JNDI. In general it's a good practice to keep a data-source external to the application:&lt;br /&gt;
1. It's always possible to change the data-source without touching the application - let's say a bug was found in a data-source you are using. Or it should be configured differently. If a data-source embedded into an application and such a change is required, you will probably need to release patch. If the datasource is external, it would be enough just to change/reconfigure it.&lt;br /&gt;
2. In some deployments several applications can use the same datasource. Consider a Tomcat running with several wars: quite a common case, right? If a datasoure is embedded, each war has its own data-source. Usually this would be a waste of resources and duplication of a configuration.&lt;br /&gt;
3. And finally it would be possible to change a data-source for unit tests, which is exactly our use case.&lt;br /&gt;
&lt;br /&gt;
For unit tests it's really convenient to use in-memory database. There are few databases implemented in java that provides this capability. My favorite are H2 and HSQL. In this example I have used HSQL, so here comes the jetty-ds-test.xml:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="width: 550px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;&amp;lt;Configure id=&amp;quot;Server&amp;quot; class=&amp;quot;org.eclipse.jetty.server.Server&amp;quot;&amp;gt;
    &amp;lt;New id=&amp;quot;DSTest&amp;quot; class=&amp;quot;org.eclipse.jetty.plus.jndi.Resource&amp;quot;&amp;gt;
        &amp;lt;Arg&amp;gt;&amp;lt;/Arg&amp;gt;
        &amp;lt;Arg&amp;gt;jdbc/my_ds&amp;lt;/Arg&amp;gt;
        &amp;lt;Arg&amp;gt;
            &amp;lt;New class=&amp;quot;org.hsqldb.jdbc.JDBCDataSource&amp;quot;&amp;gt;
                &amp;lt;Set name=&amp;quot;Url&amp;quot;&amp;gt;jdbc:hsqldb:mem:test;sql.syntax_ora=true&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&amp;quot;User&amp;quot;&amp;gt;sa&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&amp;quot;Password&amp;quot;&amp;gt;sa&amp;lt;/Set&amp;gt;
            &amp;lt;/New&amp;gt;
        &amp;lt;/Arg&amp;gt;
    &amp;lt;/New&amp;gt;
&amp;lt;/Configure&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
This is configuration of HSQL in memory. Notice &lt;i&gt;sql.syntax_ora=true&lt;/i&gt;, which makes HSQL to use Oracle syntax. This is useful if you are using Oracle in production, but you want to use HSQL for unit testing or development. &lt;br /&gt;
&lt;br /&gt;
So now you have at the beginning of a unit-test you have a Jetty server running with your application connected to in-memory HSQL database via JNDI. But something is still missing. This something is a database schema: to remind you, we have just started a new database in memory and it's empty. You probably already have a script that generates schema, tables, indexes and may be some data. Now you need to run it.&lt;br /&gt;
&lt;br /&gt;
Actually there are several options how do it. One of the easiest is to use Springs's SimpleJdbcTestUtils. But first we'll need to add a dependency on spring-test in our pom.xml:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="width: 550px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;&amp;lt;dependency&amp;gt;
         &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
         &amp;lt;artifactId&amp;gt;spring-test&amp;lt;/artifactId&amp;gt;
         &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
         &amp;lt;version&amp;gt;${spring-version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
And here comes the code that runs the sql script:&lt;br /&gt;
&lt;div style="width: 550px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.test.jdbc.SimpleJdbcTestUtils;
...
    @BeforeClass(dependsOnMethods = { "startJetty" })
    public void initiateDatabase() throws Exception {       
        InitialContext initialContext = new InitialContext();
        DataSource ds = (DataSource) initialContext.lookup("jdbc/my_ds");
        SimpleJdbcTemplate simpleJdbcTemplate = new SimpleJdbcTemplate(ds);
        Resource resource = new ClassPathResource(sqlScriptFileName);
        SimpleJdbcTestUtils.executeSqlScript(simpleJdbcTemplate, resource, false);
    }
&lt;/pre&gt;&lt;/div&gt;In this snippet I load the &lt;i&gt;sqlScriptFileName&lt;/i&gt; from the classpath. Usually it's convenient to place the script in &lt;i&gt;src/test/resources&lt;/i&gt;, but if you don't like it, you can always load it from a different place by using other Resource implementations (e.g. URLResource is quite convenient).&lt;br /&gt;
&lt;br /&gt;
As I have already said in this snippet I used Spring. If you are familiar with Spring, it is probably natural to you. If you don't - don't be afraid. Only the unit tests become dependent on Spring, but the actual application did not. &lt;br /&gt;
&lt;br /&gt;
And now you are ready to start the testing.&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;&lt;h3&gt;Recommended Reading&lt;/h3&gt;1. &lt;a href="http://www.amazon.com/Next-Generation-Java-Testing-Advanced/dp/0321503104/?tag=tarlog-20"&gt;Next Generation Java Testing: TestNG and Advanced Concepts&lt;/a&gt;&lt;br /&gt;
2. &lt;a href="http://www.amazon.com/Apache-Maven-3-Cookbook-Srirangan/dp/1849512442/?tag=tarlog-20"&gt;Apache Maven 3 Cookbook&lt;/a&gt;&lt;br /&gt;
3. &lt;a href="http://www.amazon.com/Spring-Recipes-Problem-Solution-Gary-Mak/dp/1430224991/?tag=tarlog-20"&gt;Spring Recipes: A Problem-Solution Approach&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-8286880515378210727?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/8286880515378210727/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=8286880515378210727" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8286880515378210727?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8286880515378210727?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/yPcleb0dBmQ/running-integration-tests-using-with.html" title="Automated Integration Tests Using with Jetty, Maven and Other Neat Freameworks - 2" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/12/running-integration-tests-using-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IFR3k_cCp7ImA9WhRQF0U.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-8087805693324856463</id><published>2011-12-08T10:02:00.008+02:00</published><updated>2011-12-13T16:11:56.748+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-13T16:11:56.748+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rest" /><category scheme="http://www.blogger.com/atom/ns#" term="testng" /><category scheme="http://www.blogger.com/atom/ns#" term="jetty" /><category scheme="http://www.blogger.com/atom/ns#" term="unit-testing" /><category scheme="http://www.blogger.com/atom/ns#" term="junit" /><category scheme="http://www.blogger.com/atom/ns#" term="jndi" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title>Automated Integration Tests Using with Jetty, Maven and Other Neat Freameworks</title><content type="html">Let's say that you have a web application (aka war) that exposes RESTful API and connects to a database. Now you want to do some automation tests (and I'm not going to describe here why actually you must have automation tests that run regularly on your API).&lt;br /&gt;
&lt;br /&gt;
One of the best solutions to do it, in my opinion, is running your application on a  Jetty server that is embedded in your unit test with some in-memory database.&lt;br /&gt;
&lt;br /&gt;
But let's do it step-by-step:&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Step1: Start Jetty from a Unit Test&lt;/h3&gt;(In this guide I have used TestNG, but I see no reason why the same functionality cannot be achieved in JUnit)&lt;br /&gt;
&lt;br /&gt;
So first we need to start Jetty in our test. But before we actually do that, we need to make sure that our Maven project contains the relevant dependencies. So first we need Jetty:&lt;br /&gt;
&lt;div style="width: 550px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;&amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.eclipse.jetty&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;jetty-server&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${jetty-version}&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.eclipse.jetty&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;jetty-webapp&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${jetty-version}&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.eclipse.jetty&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;jetty-jndi&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${jetty-version}&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.eclipse.jetty&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;jetty-plus&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${jetty-version}&amp;lt;/version&amp;gt;
            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
        &amp;lt;/dependency&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
&lt;i&gt;The Jetty dependencies in this guide already contains the JNDI support. It will be needed later. But if JNDI support is not required, they can be omitted. &lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
And then let's start it before the tests start:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="width: 550px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.webapp.WebAppContext;
import org.eclipse.jetty.xml.XmlConfiguration;
import org.testng.annotations.BeforeClass;

public class MyTest {

    private static final String RESOURCES_URL = "/rs";
    private static final String CONTEXT       = "/app_context";
    private static final String DS_CONFIG     = "/jetty-ds-test.xml";
    private String              baseResourceUrl;

    @BeforeClass
    public void startJetty() throws Exception {
        Server server = new Server(0);   // see notice 1
        server.setHandler(new WebAppContext("src/main/webapp", CONTEXT)); // see notice 2

        // see notice 3
        InputStream jettyConfFile = InboxTest.class.getResourceAsStream(DS_CONFIG);
        if (jettyConfFile == null) {
            throw new FileNotFoundException(DS_CONFIG);
        }
        XmlConfiguration config = new XmlConfiguration(jettyConfFile);
        config.configure(server);

        server.start();
        
        // see notice 1
        int actualPort = server.getConnectors()[0].getLocalPort();
        baseResourceUrl = "http://localhost:" + actualPort + CONTEXT + RESOURCES_URL;
    }
&lt;/pre&gt;&lt;/div&gt;Please notice that:&lt;br /&gt;
1. Jetty is started on a random port. The actual url with the actual port is saved to baseResourceUrl to be used later by tests.&lt;br /&gt;
2. Web application context points to maven's src/main/webapp.&lt;br /&gt;
3. Jetty is started with a data source configuration. (See &lt;a href="http://tarlogonjava.blogspot.com/2011/12/runnig-jetty-from-maven-using-jndi-data.html"&gt;Runnig Jetty from Maven using JNDI Data Source&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;a href="http://tarlogonjava.blogspot.com/2011/12/running-integration-tests-using-with.html"&gt;Part 2&lt;/a&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;&lt;h3&gt;Recommended Reading&lt;/h3&gt;1. &lt;a href="http://www.amazon.com/Next-Generation-Java-Testing-Advanced/dp/0321503104/?tag=tarlog-20"&gt;Next Generation Java Testing: TestNG and Advanced Concepts&lt;/a&gt;&lt;br /&gt;
2. &lt;a href="http://www.amazon.com/Apache-Maven-3-Cookbook-Srirangan/dp/1849512442/?tag=tarlog-20"&gt;Apache Maven 3 Cookbook&lt;/a&gt;&lt;br /&gt;
3. &lt;a href="http://www.amazon.com/Spring-Recipes-Problem-Solution-Gary-Mak/dp/1430224991/?tag=tarlog-20"&gt;Spring Recipes: A Problem-Solution Approach&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-8087805693324856463?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/8087805693324856463/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=8087805693324856463" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8087805693324856463?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8087805693324856463?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/7wUqwcffXg0/running-integration-test-using-with.html" title="Automated Integration Tests Using with Jetty, Maven and Other Neat Freameworks" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/12/running-integration-test-using-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cGSX0yfyp7ImA9WhRQE04.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-4169830768797871867</id><published>2011-12-05T09:50:00.005+02:00</published><updated>2011-12-08T11:03:48.397+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-08T11:03:48.397+02:00</app:edited><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="jndi" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><category scheme="http://www.blogger.com/atom/ns#" term="jdbc" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Runnig Jetty from Maven with JNDI Data Source</title><content type="html">During the development of a java web component (aka war) it can be very useful to run the application as quick as possible. Jetty provides a Maven plugin that allows running it directly from maven build or explicitly using "mvn jetty:run" from the command line.&lt;br /&gt;
&lt;br /&gt;
But what happens if the war uses external database? Especially when the datasource is defined externally to the war and accessed vie the JNDI?&lt;br /&gt;
&lt;br /&gt;
Actually the solution if quite simple:&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Step 1 - Define the Data-source&lt;/h3&gt;Create the file defining the data-source:&lt;br /&gt;
(The example below is for Oracle. See &lt;a href="http://wiki.eclipse.org/Jetty/Howto/Configure_JNDI_Datasource"&gt;this page&lt;/a&gt; for examples of the other databases.&lt;br /&gt;
&lt;div style="width: 550px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;&amp;lt;Configure id=&amp;quot;Server&amp;quot; class=&amp;quot;org.eclipse.jetty.server.Server&amp;quot;&amp;gt;
    &amp;lt;New id=&amp;quot;DSTest&amp;quot; class=&amp;quot;org.eclipse.jetty.plus.jndi.Resource&amp;quot;&amp;gt;
        &amp;lt;Arg&amp;gt;&amp;lt;/Arg&amp;gt;
        &amp;lt;Arg&amp;gt;jdbc/my_ds&amp;lt;/Arg&amp;gt;
        &amp;lt;Arg&amp;gt;
            &amp;lt;New class=&amp;quot;oracle.jdbc.pool.OracleDataSource&amp;quot;&amp;gt;
                &amp;lt;Set name=&amp;quot;DriverType&amp;quot;&amp;gt;thin&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&amp;quot;URL&amp;quot;&amp;gt;jdbc:oracle:thin:@(DESCRIPTION=(ENABLE=BROKEN)(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=something_to_replace)))
                &amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&amp;quot;User&amp;quot;&amp;gt;my_user&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&amp;quot;Password&amp;quot;&amp;gt;my_password&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&amp;quot;connectionCachingEnabled&amp;quot;&amp;gt;true&amp;lt;/Set&amp;gt;
                &amp;lt;Set name=&amp;quot;connectionCacheProperties&amp;quot;&amp;gt;
                    &amp;lt;New class=&amp;quot;java.util.Properties&amp;quot;&amp;gt;
                        &amp;lt;Call name=&amp;quot;setProperty&amp;quot;&amp;gt;
                            &amp;lt;Arg&amp;gt;MinLimit&amp;lt;/Arg&amp;gt;
                            &amp;lt;Arg&amp;gt;10&amp;lt;/Arg&amp;gt;
                        &amp;lt;/Call&amp;gt;
                        &amp;lt;Call name=&amp;quot;setProperty&amp;quot;&amp;gt;
                            &amp;lt;Arg&amp;gt;InactivityTimeout&amp;lt;/Arg&amp;gt;
                            &amp;lt;Arg&amp;gt;600&amp;lt;/Arg&amp;gt;
                        &amp;lt;/Call&amp;gt;
                    &amp;lt;/New&amp;gt;
                &amp;lt;/Set&amp;gt;
            &amp;lt;/New&amp;gt;
        &amp;lt;/Arg&amp;gt;
    &amp;lt;/New&amp;gt;
&amp;lt;/Configure&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
Pay attention to "jdbc/my_ds". It's the datasource JNDI name. Make sure to put there the actual JNDI name used by your application.&lt;br /&gt;
&lt;br /&gt;
Place this file under your maven project. In my opinion the best is to place this file under &lt;b&gt;src/dev/resources&lt;/b&gt;, but basically it can be anywhere.&lt;br /&gt;
&lt;br /&gt;
To continue the example, I'll name the file: &lt;b&gt;jetty-ds-dev.xml&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Step 2 - Define the Jetty Maven Plugin&lt;/h3&gt;&lt;div style="width: 550px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;&amp;lt;build&amp;gt;
...
        &amp;lt;plugins&amp;gt;
...
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;jetty-maven-plugin&amp;lt;/artifactId&amp;gt;
                &amp;lt;version&amp;gt;${jetty-version}&amp;lt;/version&amp;gt;
                &amp;lt;configuration&amp;gt;
                    &amp;lt;jettyConfig&amp;gt;src/dev/resources/jetty-ds-dev.xml&amp;lt;/jettyConfig&amp;gt;
                &amp;lt;/configuration&amp;gt;
                &amp;lt;dependencies&amp;gt;
                    &amp;lt;dependency&amp;gt;
                        &amp;lt;groupId&amp;gt;com.oracle&amp;lt;/groupId&amp;gt;
                        &amp;lt;artifactId&amp;gt;ojdbc14&amp;lt;/artifactId&amp;gt;
                        &amp;lt;version&amp;gt;${oracle-ojdbc-version}&amp;lt;/version&amp;gt;
                    &amp;lt;/dependency&amp;gt;
                &amp;lt;/dependencies&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
Pay attention to the configuration of jetty-ds-dev.xml.&lt;br /&gt;
Also pay attention that Jetty must be able to find the relevant JDBC driver in its classpath!&lt;br /&gt;
&lt;br /&gt;
And basically that's all. Run "mvn jetty:run" and your application should work with the provided database.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-4169830768797871867?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/4169830768797871867/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=4169830768797871867" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/4169830768797871867?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/4169830768797871867?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/oFYE7ES0qeE/runnig-jetty-from-maven-using-jndi-data.html" title="Runnig Jetty from Maven with JNDI Data Source" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/12/runnig-jetty-from-maven-using-jndi-data.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cHSHY9eSp7ImA9WhdUEU4.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-6199372259684889914</id><published>2011-09-27T17:47:00.003+03:00</published><updated>2011-09-27T17:50:39.861+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-27T17:50:39.861+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="cifs" /><category scheme="http://www.blogger.com/atom/ns#" term="unix" /><title>Mount external path using cifs</title><content type="html">How to mount Windows server from Unix using Cifs:&lt;br /&gt;
&lt;div style="width: 520px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;mount -t cifs //host:port/path /mnt -o user=username,pass=password
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;
Don't forget to replace host, port, path, mnt, username and password.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-6199372259684889914?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/6199372259684889914/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=6199372259684889914" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/6199372259684889914?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/6199372259684889914?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/1BujkGJ-r3w/mount-external-path-using-cifs.html" title="Mount external path using cifs" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/09/mount-external-path-using-cifs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk4EQHk8fyp7ImA9WhdUEU4.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-3936077841328241899</id><published>2011-09-26T18:25:00.006+03:00</published><updated>2011-09-27T17:48:21.777+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-27T17:48:21.777+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tomcat" /><title>Simple Batch Script to Run Tomcat</title><content type="html">Sometimes it's a good idea to separate the actual Tomcat installation from the running configuration. Actually Tomcat comes with this ability built-in:&lt;br /&gt;
&lt;pre&gt;catalina.base&lt;/pre&gt;system property defines the location of the configuration, while &lt;pre&gt;catalina.home&lt;/pre&gt;system property defines the location of the Tomcat installation.&lt;br /&gt;
And here comes the basic script that runs the Tomcat:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="width: 520px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;@echo off
setlocal

SET TOMCAT_BASE=c:\work\tomcats\tomcat1
SET TOMCAT_HOME=C:\tps\apache-tomcat-7.0.16
SET TOMCAT_CLASSPATH=%TOMCAT_HOME%\bin\bootstrap.jar;%TOMCAT_HOME%\bin\tomcat-juli.jar;%JAVA_HOME%\lib\tools.jar
SET JAVA_ENDORSED_DIRS=%TOMCAT_HOME%\endorsed
SET JAVA_OPTS=
SET JAVA_OPTS=%JAVA_OPTS% -Djava.util.logging.config.file="%TOMCAT_BASE%\logging.properties" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
SET JAVA_OPTS=%JAVA_OPTS% -Djava.io.tmpdir="%TOMCAT_BASE%\temp"
SET JAVA_OPTS=%JAVA_OPTS% -Dcatalina.base="%TOMCAT_BASE%" -Dcatalina.home="%TOMCAT_HOME%"
SET JAVA_OPTS=%JAVA_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%"

REM SET JAVA_OPTS=%JAVA_OPTS% -Xdebug -Xrunjdwp:transport=dt_socket,address=7878,server=y,suspend=n

%JAVA_HOME%\bin\java %JAVA_OPTS% -classpath %TOMCAT_CLASSPATH% org.apache.catalina.startup.Bootstrap start

endlocal&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-3936077841328241899?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/3936077841328241899/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=3936077841328241899" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/3936077841328241899?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/3936077841328241899?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/-1JqVCBo388/batch-script-to-run-tomcat.html" title="Simple Batch Script to Run Tomcat" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/09/batch-script-to-run-tomcat.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0AESHs4eCp7ImA9WhRQF0U.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-8422456769482207854</id><published>2011-06-24T22:28:00.003+03:00</published><updated>2011-12-13T16:15:09.530+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-12-13T16:15:09.530+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="kindle" /><title>Kindle with Special Offers</title><content type="html">Amazon now sells the &lt;a href="http://www.amazon.com/gp/product/B004HFS6Z0/ref=as_li_ss_tl?ie=UTF8&amp;tag=tarlog-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399373&amp;creativeASIN=B004HFS6Z0"&gt;Kindle with Special Offers&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=&amp;l=as2&amp;o=1&amp;a=B004HFS6Z0&amp;camp=217145&amp;creative=399373" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; for just $114 without 3G ($164 with 3G). It's $25 less then the original price.&lt;br /&gt;
The idea that it shows sponsored screen savers, when a Kindle is not in use.&lt;br /&gt;
&lt;br /&gt;
I'll probably buy another one.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe src="http://rcm.amazon.com/e/cm?t=tarlog-20&amp;o=1&amp;p=12&amp;l=ur1&amp;category=kindlerotating&amp;f=ifr" width="300" height="250" scrolling="no" border="0" marginwidth="0" style="border:none;" frameborder="0"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-8422456769482207854?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/8422456769482207854/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=8422456769482207854" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8422456769482207854?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8422456769482207854?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/tnNlbgcWhsk/kindle-with-special-offers.html" title="Kindle with Special Offers" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/06/kindle-with-special-offers.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYCRXozfip7ImA9WhZbGUk.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-8983014335357706341</id><published>2011-05-30T14:43:00.004+03:00</published><updated>2011-06-24T22:02:44.486+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-24T22:02:44.486+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>Cookiejacking</title><content type="html">&lt;a href="http://sites.google.com/site/tentacoloviola/cookiejacking"&gt;Pretty nice vulnerability in IE&lt;/a&gt; (could reproduce it easily in IE 7)&lt;br /&gt;
&lt;br /&gt;
In short: stealing cookies in IE is pretty easy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-8983014335357706341?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/8983014335357706341/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=8983014335357706341" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8983014335357706341?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8983014335357706341?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/hg3wp0sZS7I/cookiejacking.html" title="Cookiejacking" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/05/cookiejacking.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcESHwyfip7ImA9WhZSFUU.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-455843040040367771</id><published>2011-03-31T17:38:00.001+02:00</published><updated>2011-03-31T17:40:09.296+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-31T17:40:09.296+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><category scheme="http://www.blogger.com/atom/ns#" term="javac" /><category scheme="http://www.blogger.com/atom/ns#" term="jvm" /><title>Method has the same erasure bug in javac</title><content type="html">Interesting bug in javac. Consider the two cases:&lt;br /&gt;
Case 1:&lt;br /&gt;
&lt;pre&gt;class Case1 {
    public String foo(Set&amp;lt;String&amp;gt; str) {
        return null;
    }

    public String foo(Set&amp;lt;Integer&amp;gt; str) {
        return null;
    }
}
&lt;/pre&gt;&lt;br /&gt;
Case 2:&lt;br /&gt;
&lt;pre&gt;class Case2 {
    public String foo(Set&amp;lt;String&amp;gt; str) {
        return null;
    }

    public Integer foo(Set&amp;lt;Integer&amp;gt; str) {
        return null;
    }
}
&lt;/pre&gt;&lt;br /&gt;
What do you think about them? Should Class1 compile? What about Class2?&lt;br /&gt;
In my opinion both of classes should not compile, since methods have the same erasure. In this is exactly what happens in Eclipse.&lt;br /&gt;
But, in IntelliJ the Class2 compiles just fine. And Maven also compiles the Class2 without problem.&lt;br /&gt;
So how does it happen?&lt;br /&gt;
It appears that Eclipse uses it own compiler, while Maven and IntelliJ use javac.&lt;br /&gt;
So where is the bug, in Eclipse or javac?&lt;br /&gt;
&lt;a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=317719"&gt;Here&lt;/a&gt; the bug that was opened in Eclipse community.&lt;br /&gt;
And &lt;a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950"&gt;here&lt;/a&gt; the bug in Sun (or should I say Oracle?)  &lt;br /&gt;
So as you can see, both of them agree with me: the bug is in javac and not in Eclipse. Actually Sun marked it as fixed at 7(b55). Does it mean Java 7?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-455843040040367771?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/455843040040367771/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=455843040040367771" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/455843040040367771?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/455843040040367771?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/9_Iu0IT5SHg/method-has-same-erasure-bug-in-javac.html" title="Method has the same erasure bug in javac" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/03/method-has-same-erasure-bug-in-javac.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08BRnw4eCp7ImA9WhZSE0k.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-5327667895884061022</id><published>2011-03-28T21:50:00.000+02:00</published><updated>2011-03-28T21:50:57.230+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-28T21:50:57.230+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="replace-file-plugin" /><category scheme="http://www.blogger.com/atom/ns#" term="my projects" /><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title>Maven - Hotswap Plugin</title><content type="html">For many years I was missing the following feature of Maven: In a multi-module project, when I build a single module in a jar, I want it to be installed into the running environment (app server) seamlessly. During these years I created various scripts for this tasks, why none of them lasted too long: it's very hard to create a generic script, while nongeneric scripts need to be maintained and actually each module must have had its own script. Duh.&lt;br /&gt;
&lt;br /&gt;
Thinking about it, I decided that it should be a Maven plugin, which is very simple - during the install phase, search some predefined location and hotswap the found jars. That's it. So I thought that somebody probably already thought about it and asked a &lt;a href="http://stackoverflow.com/questions/5410831/find-and-replace-a-jar-file-using-maven"&gt;question at Stackoverflow&lt;/a&gt;. I received few interesting answers, but not a simple plugin I needed.&lt;br /&gt;
&lt;br /&gt;
So I decided to implement it myself. It took me few hours, since it was my first Maven plugin, so I had some "doing it for the first time" troubles. But finally I &lt;a href="http://code.google.com/p/replace-file-plugin/"&gt;did it&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
You are welcome to use it, and as always any feedback is appreciated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-5327667895884061022?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/5327667895884061022/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=5327667895884061022" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/5327667895884061022?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/5327667895884061022?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/rIQzrVPAOXc/maven-hotswap-plugin.html" title="Maven - Hotswap Plugin" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/03/maven-hotswap-plugin.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkUNQHo4cSp7ImA9WhZUFk8.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-7173130343880752358</id><published>2011-03-23T16:55:00.002+02:00</published><updated>2011-06-09T15:58:11.439+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-09T15:58:11.439+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="interview" /><category scheme="http://www.blogger.com/atom/ns#" term="google" /><title>How I didn't get even a job interview in Google</title><content type="html">This is going to be a very different post and it is not going to be technical. &lt;br /&gt;
&lt;a href="http://www.youtube.com/watch?v=npjOSLCR2hE"&gt;I wish to register a complaint&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
But first some history: Once upon a time I have sent my resume to Google. I did it via the Google web site, got an automatic reply and was never contacted. You may say that sending the resume via the company web site is not effective way to find a job, and you are right. But actually I was not really looking for a job, I saw a Google advertisement on the web, and decided to apply.&lt;br /&gt;
&lt;br /&gt;
About a month ago, I got the following mail:&lt;br /&gt;
&lt;blockquote&gt;Subject: Hello from Google/Google Opportunities&lt;br /&gt;
&lt;br /&gt;
Hi Michael,&lt;br /&gt;
&lt;br /&gt;
My name is ****** ***** and I am an Engineering Recruiter for Google.  Your name was passed to me confidentially by an engineer at our Mountain View headquarters.  &lt;br /&gt;
&lt;br /&gt;
I see that you have applied, via our website, to opportunities in our offices in Israel, but nothing materialized.  If you are interested in positions in those offices I can pass your information to someone who supports that office and can make sure that you are given serious consideration for those positions.  Otherwise, I support our HQ and other offices in the US and if you are interested in a major relocation I can assist.  If you are interested in opportunities with us please send me an updated copy of your resume along with your reply.&lt;br /&gt;
&lt;br /&gt;
Best regards,&lt;br /&gt;
&lt;br /&gt;
******&lt;/blockquote&gt;&lt;br /&gt;
To tell the truth my first idea was to say "Yes! I want to come to an interview to Mountain View. Please, make sure that I fly business/first and live in a nice hotel."&lt;br /&gt;
But I'm probably too shy to ask for traveling, while I'm not actually interested in a relocation. While position in Tel-Aviv could be interesting, so I replied:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;Hi ******,&lt;br /&gt;
&lt;br /&gt;
Thank you for your mail.&lt;br /&gt;
I'm really curious to know, who is the person who passed you my name.&lt;br /&gt;
I'm asking, since I don't think that I know anyone, who works at Mountain View...&lt;br /&gt;
&lt;br /&gt;
Anyway, I'm interested in the positions at Google offices in Israel. However, if it does not succeed, I won't be available for the relocation, since *********************************.&lt;br /&gt;
&lt;br /&gt;
My updated resume is attached.&lt;br /&gt;
Thank you,&lt;br /&gt;
&lt;br /&gt;
Michael.&lt;/blockquote&gt;&lt;br /&gt;
And very quickly I received the following two mails:&lt;br /&gt;
&lt;br /&gt;
Mail 1:&lt;br /&gt;
&lt;blockquote&gt;Michael,&lt;br /&gt;
&lt;br /&gt;
Thanks for your response and for sending me your resume.  We currently have Software Engineering openings in Haifa and Tel Aviv.  I can get your resume and information over to a colleague of mine that supports those locations.   I will forward your information over today.&lt;br /&gt;
&lt;br /&gt;
The person that referred you definitely works in Mountain View, but I can't disclose their name.&lt;br /&gt;
&lt;br /&gt;
Let me know if you have any questions and hopefully something with us in Israel will work out for you.&lt;br /&gt;
&lt;br /&gt;
Best,&lt;br /&gt;
&lt;br /&gt;
******&lt;/blockquote&gt;&lt;br /&gt;
Mail 2:&lt;br /&gt;
&lt;blockquote&gt;Hi Tal,&lt;br /&gt;
&lt;br /&gt;
My name is ****** and I work for the  Google recruitment team.&lt;br /&gt;
&lt;br /&gt;
I got your info  from *********** from the USA Google Staffing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
I would like to ask if you would be interested in having an open conversation about current job opportunities to see if we have anything available that may interest you?&lt;br /&gt;
&lt;br /&gt;
If you would like to discuss this further then please send me a convenient time/date and your telephone number.&lt;br /&gt;
&lt;br /&gt;
I look forward to hearing from you.&lt;br /&gt;
&lt;br /&gt;
Best Regards,&lt;br /&gt;
&lt;br /&gt;
-- &lt;br /&gt;
*************** &lt;/blockquote&gt;&lt;br /&gt;
My name is not Tal, but who cares :) So I replied with a phone number and few days later I got a phone call from the Google recruiter in Tel-Aviv. She asked me few questions about what I'm doing and what I'm interested to do and then said the following (this is not the exact quote, but this is how I remember it): "We don't invite to an interview the candidates who have such a low degree and such a low GPA, and I'm calling you only since a colleague from the USA team has recommended you. If you are interested I will send you an online programming exam and if you successfully complete it, I'll invite you to an interview."&lt;br /&gt;
&lt;br /&gt;
Few points here: I own a BA degree in a Computer Science with GPA 85. I graduated in 2004 and have 7 years of an experience. I can hardly understand the recruiter who is interested in GPA of a person, who has graduated 7 years ago.&lt;br /&gt;
Anyway, she didn't reply and didn't send me any exam. I believe she forgot about me the second the phone was disconnected. May be even a second before.&lt;br /&gt;
&lt;br /&gt;
So I do understand that she called me only because she got my resume from her colleague. The thing I don't understand: Is there such a difference between the requirements for Google in US and in Israel? I mean, I don't believe that the US recruited wrote me mail knowing that my degree is not high enough.&lt;br /&gt;
&lt;br /&gt;
Anyway, I'm pretty sure that even if I was getting to an interview, &lt;a href="http://www.youtube.com/watch?v=zP0sqRMzkwo"&gt;my chances to pass it probably are not high&lt;/a&gt;, so I didn't have any real expectations. It's just a nasty feeling that I have after this a very short recruitment process that wasn't even initiated by me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-7173130343880752358?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/7173130343880752358/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=7173130343880752358" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/7173130343880752358?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/7173130343880752358?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/cdsgHXJgqec/how-i-didnt-get-even-job-interview-in.html" title="How I didn't get even a job interview in Google" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/03/how-i-didnt-get-even-job-interview-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EHQ38-fCp7ImA9WhZTE0s.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-1546422924597964909</id><published>2011-03-17T15:31:00.001+02:00</published><updated>2011-03-17T15:47:12.154+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-17T15:47:12.154+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sql" /><category scheme="http://www.blogger.com/atom/ns#" term="hibernate" /><title>Hibernate -  How to Insert Data During the Create/Create-drop</title><content type="html">And here comes something I was missing for years.&lt;br /&gt;
It appears that it's possible to execute additional SQLs during the Hibernates create/create-drop. It's very useful for the unit testing.&lt;br /&gt;
&lt;br /&gt;
In short: Hibernate will run "import.sql" file from the classpath.&lt;br /&gt;
&lt;br /&gt;
I found it &lt;a href="http://stackoverflow.com/questions/5338914/jpa-hibernate-default-data/5339014#5339014"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-1546422924597964909?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/1546422924597964909/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=1546422924597964909" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/1546422924597964909?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/1546422924597964909?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/2V0wnV1BdJQ/hibernate-how-to-insert-data-during.html" title="Hibernate -  How to Insert Data During the Create/Create-drop" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/03/hibernate-how-to-insert-data-during.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QMRX45cSp7ImA9WhZTEU0.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-7231032297829847494</id><published>2011-03-14T15:29:00.001+02:00</published><updated>2011-03-14T15:29:44.029+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-14T15:29:44.029+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sql" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Oracle: How to find last query executed</title><content type="html">One more sql script to remember - How to find the last query executed:&lt;br /&gt;
&lt;pre&gt;select sql_text from v$sql 
where first_load_time=(select max(first_load_time) from v$sql)&lt;/pre&gt;&lt;br /&gt;
Or may be in a bit more useful way: &lt;br /&gt;
&lt;pre&gt;select * from v$sql order by first_load_time desc&lt;/pre&gt;&lt;br /&gt;
And even more useful, show only queries that contain MY_TABLE:&lt;br /&gt;
&lt;pre&gt;select * from v$sql where sql_text like '%MY_TABLE%' order by first_load_time desc&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-7231032297829847494?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/7231032297829847494/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=7231032297829847494" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/7231032297829847494?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/7231032297829847494?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/8SSK1JSt-74/oracle-how-to-find-last-query-executed.html" title="Oracle: How to find last query executed" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/03/oracle-how-to-find-last-query-executed.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04NSHk-cCp7ImA9WhZbGUo.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-4715608631910199005</id><published>2011-02-24T14:05:00.001+02:00</published><updated>2011-06-25T07:26:39.758+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-25T07:26:39.758+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sql" /><category scheme="http://www.blogger.com/atom/ns#" term="mssql" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>DB Creation Scripts</title><content type="html">Two scripts to remember:&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;MS-SQL Create Database&lt;/h2&gt;&lt;div style="width: 500px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;CREATE DATABASE ${dbName}
GO

DECLARE @size int
SELECT @size = size*8 
FROM ${dbName}..sysfiles WHERE name = N'${dbName}'

IF @size &lt; 5000
BEGIN
ALTER DATABASE [${dbName}] MODIFY FILE(NAME=N'${dbName}', SIZE=5MB)
END
ALTER DATABASE [${dbName}] MODIFY FILE(NAME=N'${dbName}', FILEGROWTH=5MB)

SELECT @size = size*8 
FROM ${dbName}..sysfiles WHERE name = N'${dbName}_log'

IF @size &lt; 10000
BEGIN
ALTER DATABASE [${dbName}] MODIFY FILE(NAME=N'${dbName}_log', SIZE=10MB)
END
ALTER DATABASE [${dbName}] MODIFY FILE(NAME=N'${dbName}_log', FILEGROWTH=50MB)
ALTER DATABASE [${dbName}] ADD FILEGROUP userdata001

DECLARE @FilePath nvarchar(250)
SELECT @FilePath = LEFT(filename, LEN(filename) - CHARINDEX(N'\', REVERSE(filename))) FROM master.dbo.sysdatabases WHERE name = N'${dbName}'
SET @FilePath = @FilePath+ '\${dbName}_data001.ndf'
EXEC ('ALTER DATABASE [${dbName}] ADD FILE (NAME = N''${dbName}_data001'',FILENAME = '''+@FilePath+''',SIZE = 200MB,FILEGROWTH = 50MB) TO FILEGROUP userdata001')
ALTER DATABASE [${dbName}] MODIFY FILEGROUP userdata001 DEFAULT

GO&lt;/pre&gt;
&lt;/div&gt;&lt;h2&gt;Oracle - Create User&lt;/h2&gt;&lt;div style="width: 500px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;CREATE USER TEST_USER IDENTIFIED BY TEST_USER
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP;

GRANT "CONNECT" TO TEST_USER;
GRANT CREATE SEQUENCE TO TEST_USER;
GRANT CREATE TABLE TO TEST_USER;
GRANT CREATE TRIGGER TO TEST_USER;
GRANT UNLIMITED TABLESPACE TO TEST_USER;
GRANT CREATE VIEW TO TEST_USER;
GRANT CREATE PROCEDURE TO TEST_USER;
ALTER USER TEST_USER DEFAULT ROLE ALL;
&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-4715608631910199005?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/4715608631910199005/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=4715608631910199005" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/4715608631910199005?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/4715608631910199005?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/fj6GMuoMAZw/db-creation-scripts.html" title="DB Creation Scripts" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2011/02/db-creation-scripts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4CQng4eCp7ImA9Wx5aE0Q.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-3845319744798376166</id><published>2010-11-09T17:24:00.002+02:00</published><updated>2010-11-10T16:22:43.630+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-10T16:22:43.630+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="palm" /><title>Palm Pre Plus</title><content type="html">So yesterday, after months of waiting I got my &lt;a href="http://www.palm.com/us/products/phones/preplus/index.html"&gt;Palm Pre Plus&lt;/a&gt;.&lt;br /&gt;
Meanwhile cool! :)&lt;br /&gt;
&lt;br /&gt;
But! I could not activate it without data service from my cellular provider. Ughm :(&lt;br /&gt;
So I purchased it. Most of the day I have some kind of internet connection around: either wired or wireless. The only time I don't have such, is when I'm driving, and I don't really need it - I should drive. So currently I have a feeling that I'm going to pay for something I'm not going to use...&lt;br /&gt;
&lt;br /&gt;
Anyway, I purchased the data plan and activated my phone, and even managed to make/receive few calls.&lt;br /&gt;
&lt;br /&gt;
But it has not Hebrew or Russian. Why?? Some internet search discovered the &lt;a href="http://www.palmpreacher.com/wordpress/?p=1961"&gt;following guide&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Another problem: it seems that I cannot connect to App Catalog even for free apps. Why??! If you know how to solve it, please let me know...&lt;br /&gt;
&lt;br /&gt;
Another problem: Skype doesn't support it... Well, it becomes really annoying now. I hoped that a new Palm Pre will replace the outdated Asus pocket-pc, but currently it doesn't :(&lt;br /&gt;
&lt;br /&gt;
Actually currently my feeling is a sort of disappointment: I waited to get this gadget for a loooong time, and now it seems that it doesn't covers my very basic needs for some cool applications and Skype. May be I should have go for some cool &lt;a href="http://www.amazon.com/gp/product/B0038JDF3E?ie=UTF8&amp;tag=tarlog-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B0038JDF3E"&gt;HTC device&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=tarlog-20&amp;l=as2&amp;o=1&amp;a=B0038JDF3E" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; with Android? Rhetorical question.&lt;br /&gt;
&lt;br /&gt;
P.S. In &lt;a href="http://tarlog.livejournal.com/208883.html"&gt;these comments&lt;/a&gt; (Russian) you'll find another discussion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-3845319744798376166?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/3845319744798376166/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=3845319744798376166" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/3845319744798376166?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/3845319744798376166?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/fpR1oi5IpX0/palm-pre-plus.html" title="Palm Pre Plus" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2010/11/palm-pre-plus.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUESH45fyp7ImA9Wx5SEE8.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-535516198409334525</id><published>2010-08-05T18:46:00.000+03:00</published><updated>2010-08-05T18:46:49.027+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-05T18:46:49.027+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><title>Spring - Which resources are actually loaded in Spring Context?</title><content type="html">Today I got a really weird behavior: some spring context file was loaded into the same context twice. This caused exception, since some beans are expected to be singletons, while I got two instances.&lt;br /&gt;
&lt;br /&gt;
In this post I'm not going to describe what exactly was the problem. But rather how I investigated it.&lt;br /&gt;
&lt;br /&gt;
So in order to see what are the actual files being loaded and what is the source of the definition that caused them to be loaded I put a breakpoint in &lt;b&gt;org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(InputSource, Resource)&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
That's all. Try it yourself :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-535516198409334525?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/535516198409334525/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=535516198409334525" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/535516198409334525?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/535516198409334525?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/DooictITaAM/spring-which-resources-are-actually.html" title="Spring - Which resources are actually loaded in Spring Context?" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2010/08/spring-which-resources-are-actually.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUDRX08fSp7ImA9WxFUFk8.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-6463571038111373965</id><published>2010-06-27T10:04:00.000+03:00</published><updated>2010-06-27T10:04:34.375+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-27T10:04:34.375+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tarlog-plugins" /><title>tarlog-plugins 1.4.1</title><content type="html">I'm happy to announce the 1.4.1 release of the &lt;a href="http://code.google.com/p/tarlog-plugins/"&gt;tarlog-plugins&lt;/a&gt;.&lt;br /&gt;
The main feature of this release is an ability to customize the actual commands being run via the preferences page.&lt;br /&gt;
This may make the plugin useful for non-Windows environments.&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/5239535491482352731-6463571038111373965?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/6463571038111373965/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=6463571038111373965" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/6463571038111373965?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/6463571038111373965?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/hZfl4EBWKC8/tarlog-plugins-141.html" title="tarlog-plugins 1.4.1" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2010/06/tarlog-plugins-141.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkADQHg5eip7ImA9WxFUEUQ.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-5973128160330631008</id><published>2010-06-22T08:52:00.003+03:00</published><updated>2010-06-22T11:19:31.622+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-22T11:19:31.622+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><title>Eclipse Helios RC4 Review</title><content type="html">Some time ago I have downloaded the JEE edition of the &lt;a href="http://www.eclipse.org/downloads/packages/release/helios/rc4"&gt;Eclipse Helios RC4&lt;/a&gt;.&lt;br /&gt;
And here comes a review in order to &lt;a href="http://www.eclipse.org/helios/blogathon/guidelines.php"&gt;win a Helios t-shirt&lt;/a&gt;.&lt;br /&gt;
I'll start with bugs I found till now. I didn't find many. Continue with features I still miss, and try to end with some positive note about the features I liked.&lt;br /&gt;
&lt;h2&gt;Bugs&lt;/h2&gt;For a RC release there are really few bugs I found till now.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;In &lt;b&gt;Html Editor&lt;/b&gt; the &lt;b&gt;div&lt;/b&gt; element does not get idented. Really annoying...&lt;/li&gt;
&lt;li&gt;Sometimes the key bindings does not work in &lt;b&gt;Package Explorer&lt;/b&gt;. For example, when I press F5 I expect "Refresh" to run. Sometimes it happens, sometimes it doesn't.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Missing Features&lt;/h2&gt;And not the features I still miss. Please notice: I'm a Java Developer. Meaning I'm talking here about features I miss mainly as a Java Developer and it may be irrelevant for the C/C++/Php and other users. So if you are not a Java Developer, you can probably skip this section.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Built-in Maven Support&lt;/b&gt; - It's 2010. Most projects I'm involved in the last 5 (five!) years, use Maven for builds, but Eclipse till today ships with Ant plugin only. Hey! Wake up! Almost nobody uses it anymore! And if even some does, there are a lot of Maven users, who need to install the Maven plugins manually. So can you do a favor and add it Maven plugin at least to the distributions for Java and JEE developers?&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Subversion/Git support&lt;/b&gt; - same as Maven: most of the open source projects I know, use Subversion or Git. So may be it's time to include these plugins in the Eclipse distributions?&lt;/li&gt;
&lt;li&gt;I'm really fond of the &lt;b&gt;"Quick Fix" (Ctrl+1)&lt;/b&gt; feature of Eclipse. One suggestion that can be quite easily added to this feature: when there are not initialized final fields in the class, the following error is displayed: "The blank final field may not have been initialized". The quick fix may be to open "Generate Constructor using Fields" dialog.&lt;/li&gt;
&lt;li&gt;It would be cool to &lt;b&gt;collapse the generics&lt;/b&gt; in the fields declaration&lt;br /&gt;
Instead of:&lt;br /&gt;
&lt;pre&gt;private Map&amp;lt;String, Set&amp;lt;String&amp;gt;&amp;gt; map = new HashMap&amp;lt;String, Set&amp;lt;String&amp;gt;&amp;gt;();&lt;/pre&gt;it could be:&lt;br /&gt;
&lt;pre&gt;private Map&amp;lt;String, Set&amp;lt;String&amp;gt;&amp;gt; map = new HashMap&amp;lt;~&amp;gt;();&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;New Cool Features&lt;/h2&gt;Actually I didn't find many cool features in this release.&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I'm really fond of &lt;b&gt;"Quick Fix" (Ctrl+1)&lt;/b&gt; feature. One of the most annoying "bugs" that is had till now, was placing @SuppressWarnings annotation only on the method level. So now it has two options: place it on method and place it on variable.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Refactoring: Move Type to a New File&lt;/b&gt; - finally! I was missing this feature for a loooong time!&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Java debugger&lt;/b&gt; has two new neat features: Breakpoints view now contains more details, like "hit count", "conditions" and so on. Variables view contains "instance count", so it is easy to check how many instances of the specific type were created.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;I didn't find any new really cool features in this version of Eclipse. 3.5 was a great release, and this release looks like mainly bug fixes. Don't get me wrong: having a stable SDK without bugs is more important than having unstable one with a lot of features. &lt;br /&gt;
&lt;b&gt;So nice work, guys! You are doing a great job!&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you got that far and read all this, you may be interested in the plugins I developed for Eclipse:&lt;br /&gt;
&lt;a href="http://tarlogonjava.blogspot.com/search/label/tarlog-plugins"&gt;Tarlog plugins&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://tarlogonjava.blogspot.com/search/label/encoder"&gt;Encoder Tool&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Thanks for reading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-5973128160330631008?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/5973128160330631008/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=5973128160330631008" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/5973128160330631008?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/5973128160330631008?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/rJxRqJYl-FY/eclipse-helios-rc4-review.html" title="Eclipse Helios RC4 Review" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2010/06/eclipse-helios-rc4-review.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4HQXcyeyp7ImA9WxFWE04.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-2852537729787770091</id><published>2010-05-31T21:35:00.000+03:00</published><updated>2010-05-31T21:35:30.993+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-31T21:35:30.993+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="webos" /><category scheme="http://www.blogger.com/atom/ns#" term="palm" /><title>Palm: Game of Life - Reading the Comments</title><content type="html">Getting the data about the published application is somewhat annoying. From the developer's portal you can see the amount of downloads and the average user rating.&lt;br /&gt;
From the rss feed you can additionally see the number of comments, but you cannot read them.&lt;br /&gt;
Fortunately, http://www.myappbox.com shows the comments, once you find your application.&lt;br /&gt;
&lt;br /&gt;
I don't know if there is any normal way to answer the user comments and I will be really surprised, if any of the users bumps into my blog, but currently I see no other way to post replies. &lt;br /&gt;
&lt;br /&gt;
First, all the guys who said that the game is cool: thank you!!! It's really a pleasure to read your comments ;-)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Aaron B&lt;/b&gt; and &lt;b&gt;Stanley T&lt;/b&gt;: you both mentioned that "Ability to save favorite initial conditions would be a great feature." I'm totally agree with you. Moreover, I developed it in a very first version and even mentioned it in "Help". Yes, it's on the last help's screen that talks about shortcuts.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Stanley T&lt;/b&gt;: "The builtin ability to share saved starting patterns would be very cool." Totally agree. I'll think about it :-)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Michael M&lt;/b&gt;: "Not playable at all on the Pixi due to the screen formatting. Please fix." What does this mean? Are cells too small? The cell's size is adjustable. Once again: reading "Help" may help.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-2852537729787770091?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/2852537729787770091/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=2852537729787770091" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/2852537729787770091?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/2852537729787770091?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/SBIRS-M2u5s/palm-game-of-life-reading-comments.html" title="Palm: Game of Life - Reading the Comments" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2010/05/palm-game-of-life-reading-comments.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAASXsyfCp7ImA9WxFXF00.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-8991963112535013578</id><published>2010-05-23T08:28:00.001+03:00</published><updated>2010-05-24T14:32:28.594+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-24T14:32:28.594+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="webos" /><category scheme="http://www.blogger.com/atom/ns#" term="palm" /><title>Conway's Game of Life for PALM WebOS</title><content type="html">And here comes my first WebOS application: &lt;a href="http://developer.palm.com/webChannel/index.php?packageid=com.hpalm.weboslife.free.beta"&gt;Conway's Game of Life&lt;/a&gt;.&lt;br /&gt;
Actually I don't own palm myself and I developed it using emulator, so all of you, who own palm: please! please! please! Download it and see if it runs, how is your experience, and what are the bugs.&lt;br /&gt;
&lt;br /&gt;
The project is open source at &lt;a href="http://code.google.com/p/webos-life/"&gt;Google Code&lt;/a&gt;. You are welcome to &lt;a href="http://code.google.com/p/webos-life/issues/list"&gt;report bugs&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-8991963112535013578?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/8991963112535013578/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=8991963112535013578" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8991963112535013578?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8991963112535013578?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/nx98SGDhoB4/conways-game-of-life-for-palm-webos.html" title="Conway's Game of Life for PALM WebOS" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2010/05/conways-game-of-life-for-palm-webos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUUDRn48fip7ImA9WxBaFUw.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-1321167414965433452</id><published>2010-03-25T13:17:00.001+02:00</published><updated>2010-03-25T13:41:17.076+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-25T13:41:17.076+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="security" /><title>Security Questions</title><content type="html">I hate the sites that require you to insert the security question that must be chosen out of an enumeration. My problem with an enumeration is simple: most of the answers to these questions can be googled very easily (in my case they extremely easily if you are Russian speaking).&lt;br /&gt;
It's very easy to know what primary school I've attended, which city I currently live in  (or was born) and what is my nickname.&lt;br /&gt;
Why is it such a difficult task to allow custom security questions? After all these questions intend to provide a security and not a security breach...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-1321167414965433452?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/1321167414965433452/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=1321167414965433452" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/1321167414965433452?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/1321167414965433452?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/O4pPwVpHGOM/security-questions.html" title="Security Questions" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2010/03/security-questions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcFQ3g6fip7ImA9WhZUFk0.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-6561060925271750574</id><published>2010-03-24T11:04:00.002+02:00</published><updated>2011-06-09T11:26:52.616+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-09T11:26:52.616+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="hibernate" /><category scheme="http://www.blogger.com/atom/ns#" term="jpa" /><category scheme="http://www.blogger.com/atom/ns#" term="coding guidelines" /><title>Hibernate/JPA Best Practices</title><content type="html">Here come some of Hibernate/JPA best practices. &lt;br /&gt;
Please notice that this guide does not intend to cover Hibernate/JPA at all, but only to provide some best practices. Personally I learned Hibernate using &lt;a target="_blank"  href="http://www.amazon.com/Hibernate-Action-Christian-Bauer/dp/193239415X?ie=UTF8&amp;tag=tarlog-20&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;Hibernate in Action&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=tarlog-20&amp;l=btl&amp;camp=213689&amp;creative=392969&amp;o=1&amp;a=193239415X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;I really appreciate any comments saying what do you think about this practice, why it's wrong, and what additional practices should be added.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
So let's start:&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Override hashCode() and equals()&lt;/h3&gt;The Hibernate reference states that "It is recommended that you implement equals() and hashCode() to compare the natural key properties of the entity." &lt;br /&gt;
The reason is simple: different instances of the class may represent the same record in the database. Therefore, when comparing these two instances, you'd like to get equal result, while default equals implementation will return not-equal since it's not the same instance.&lt;br /&gt;
&lt;br /&gt;
This becomes really important, when working with collections, especially with Sets. You don't want the same object to appear twice in set, right?&lt;br /&gt;
&lt;br /&gt;
Overriding the hashCode() and equals() is not a very complex goal, but you must be very careful:&lt;br /&gt;
1. Remember that two equal objects must return the same hash code. Therefore, you cannot use auto-generated Hibernate id in hashCode() - this value is not assigned for the newly created objects. After persistence occurs, the value is assigned, so the hashCode will change, when the object actually wasn't changed!&lt;br /&gt;
2. Changing the fields that participate in hashCode() will change the hash code value. So if your object is stored in a Set (or it's key of a Map), you won't be able to retrieve it from the set anymore - one hash was used for insert and another one was used for retrieve. &lt;br /&gt;
So basically you'll need to remember &lt;b&gt;not to change objects that are stored in sets!&lt;/b&gt; And this is really important!&lt;br /&gt;
So you may ask: how will I know who stored my object in a set?&lt;br /&gt;
My answer is simple: you cannot know this, unless you don't give your objects out. So you are the only person who is using these objects, so you know how they are kept, right?&lt;br /&gt;
Storing the objects without giving them out is not so weird idea: keep the persistence layer away from the business logic and return a copy of object when required.&lt;br /&gt;
Another option: return immutable objects to the business tier. So the business tier won't be able to change them. When the change is required - provide a special API. Thus the objects won't change accidentally.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Try to Make All Object Immutable&lt;/h3&gt;This may sound weird, how exactly the persistent objects can be immutable. But in the previous part I described why it's important. And actually it can be quite easily achieved:&lt;br /&gt;
1. Make all setters private. Thus it will be impossible to call them without using reflection. (Hibernate will use reflection and populate the properties during the object retrieval)&lt;br /&gt;
2. When returning collections, wrap them with Collections.unmodifiable. So the user won't be able to modify your collections.&lt;br /&gt;
3. Allow changes only via special methods.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Return Copy of Persistent Objects to the Business Tier&lt;/h3&gt;So no accidental change in hash code may occur.&lt;br /&gt;
Additionally when filling the business objects, a lot of potential problems may be resolved. Consider that the persistent object contains a lazy collection. If the object is returned as is to the business tier, the lazy elements in the collections can be accessed after the transaction was closed, therefore the query to the database will fail and user will get an exception.&lt;br /&gt;
&lt;br /&gt;
h3. Change Data in Collections Only via Special Methods&lt;br /&gt;
When having associations, take care of this association via special method: for example, Parent class will have method addChild(Child child).&lt;br /&gt;
When returning the values of collections wrap them using Collections.unmodifiable to prevent accidental changes.&lt;br /&gt;
This is useful both to handle bidirectional associations correctly and to prevent accidental changes in hash code.  &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Summary&lt;/h3&gt;1. Override hashCode() and equals() of the entities using the natural key properties of the entity. &lt;br /&gt;
2. Don't compare auto-generated id in hashCode().&lt;br /&gt;
3. Don't change the properties that participate in the hashCode() for objects stored in collections that use hash code (especially Sets or Maps). If such a change must occur, reinsert object into collection. Remember that remove must occur before the property is updated.&lt;br /&gt;
4. Keep the persistence tier away from the business logic as much as possible. Don't pass the persistence objects to the business at all.&lt;br /&gt;
5. Make your objects immutable (or semi-immutable): make all setters private, return collection values only wrapped with Collections.unmodifiable, make changes in collections only via special methods.&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;&lt;h3&gt;Recommended Reading&lt;/h3&gt;1. &lt;a href="http://www.amazon.com/gp/product/193239415X/ref=as_li_ss_tl?ie=UTF8&amp;tag=tarlog-20&amp;linkCode=as2&amp;camp=217153&amp;creative=399349&amp;creativeASIN=193239415X"&gt;Hibernate in Action (In Action series)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=&amp;l=as2&amp;o=1&amp;a=193239415X&amp;camp=217153&amp;creative=399349" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;
2. &lt;a href="http://www.amazon.com/gp/product/1932394885/ref=as_li_ss_tl?ie=UTF8&amp;tag=tarlog-20&amp;linkCode=as2&amp;camp=217153&amp;creative=399349&amp;creativeASIN=1932394885"&gt;Java Persistence with Hibernate&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=&amp;l=as2&amp;o=1&amp;a=1932394885&amp;camp=217153&amp;creative=399349" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;
3.&lt;a href="http://www.amazon.com/gp/product/1590595009/ref=as_li_ss_tl?ie=UTF8&amp;tag=tarlog-20&amp;linkCode=as2&amp;camp=217153&amp;creative=399349&amp;creativeASIN=1590595009"&gt;The Best Software Writing I: Selected and Introduced by Joel Spolsky (v. 1)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=&amp;l=as2&amp;o=1&amp;a=1590595009&amp;camp=217153&amp;creative=399349" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-6561060925271750574?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/6561060925271750574/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=6561060925271750574" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/6561060925271750574?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/6561060925271750574?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/JBoHStQrGew/hibernatejpa-best-practices.html" title="Hibernate/JPA Best Practices" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>6</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2010/03/hibernatejpa-best-practices.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMHSXs-eip7ImA9WhZUFk0.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-3206935081052503404</id><published>2010-03-07T15:32:00.007+02:00</published><updated>2011-06-09T11:17:18.552+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-09T11:17:18.552+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="maven" /><title>Maven: Copy Dependencies to a folder</title><content type="html">So if you need to copy all project dependencies to a folder using Maven, just type&lt;br /&gt;
&lt;pre&gt;mvn dependency:copy-dependencies -DoutputDirectory=&amp;lt;folder name&amp;gt;&lt;/pre&gt;&lt;br /&gt;
Can it be more simple?&lt;br /&gt;
So why I'm googleing for it over and over again?&lt;br /&gt;
&lt;br /&gt;
&lt;hr /&gt;&lt;h3&gt;Recommended Reading&lt;/h3&gt;1. &lt;a href="http://www.amazon.com/gp/product/0596517335/ref=as_li_ss_tl?ie=UTF8&amp;tag=tarlog-20&amp;linkCode=as2&amp;camp=217153&amp;creative=399349&amp;creativeASIN=0596517335"&gt;Maven: The Definitive Guide&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=&amp;l=as2&amp;o=1&amp;a=0596517335&amp;camp=217153&amp;creative=399349" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;
2. &lt;a href="http://www.amazon.com/gp/product/1430218339/ref=as_li_ss_tl?ie=UTF8&amp;tag=tarlog-20&amp;linkCode=as2&amp;camp=217153&amp;creative=399349&amp;creativeASIN=1430218339"&gt;Pro Git&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=&amp;l=as2&amp;o=1&amp;a=1430218339&amp;camp=217153&amp;creative=399349" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;
3. &lt;a href="http://www.amazon.com/gp/product/1590598385/ref=as_li_ss_tl?ie=UTF8&amp;tag=tarlog-20&amp;linkCode=as2&amp;camp=217153&amp;creative=399353&amp;creativeASIN=1590598385"&gt;Smart and Gets Things Done: Joel Spolsky's Concise Guide to Finding the Best Technical Talent&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=tarlog-20&amp;l=as2&amp;o=1&amp;a=1590598385&amp;camp=217153&amp;creative=399353" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;label id=showTextCategoryLinkPreview_l1&gt; (See all &lt;/label&gt;&lt;a href="http://www.amazon.com/General-Languages-Tools-Programming-Books/b/ref=as_li_ss_tl?ie=UTF8&amp;tag=tarlog-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399357&amp;creativeASIN=1590598385&amp;ie=UTF8&amp;node=16233481"&gt;Programming Language &amp; Tool Books&lt;/a&gt;)&lt;img src="http://www.assoc-amazon.com/e/ir?t=tarlog-20&amp;l=as2&amp;o=1&amp;a=1590598385&amp;camp=217145&amp;creative=399357" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;br /&gt;
&lt;hr /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-3206935081052503404?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/3206935081052503404/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=3206935081052503404" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/3206935081052503404?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/3206935081052503404?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/1yjK52QknS8/maven-copy-dependencies-to-folder.html" title="Maven: Copy Dependencies to a folder" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2010/03/maven-copy-dependencies-to-folder.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEMRnozfip7ImA9WxBUFk0.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-5380273254909919807</id><published>2010-03-02T16:50:00.005+02:00</published><updated>2010-03-03T11:14:47.486+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-03T11:14:47.486+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rest" /><category scheme="http://www.blogger.com/atom/ns#" term="wink" /><category scheme="http://www.blogger.com/atom/ns#" term="spring" /><title>Apache Wink - Dynamic Resources</title><content type="html">Quite often people ask me what is so different about Apache Wink, and why another JAX-RS framework. Usually I answer that Apache Wink started in HP long before there was any REST open-source framework. It was developed internally for two years before joining Apache.&lt;br /&gt;&lt;br /&gt;This may be interesting from historical point of view, but then people ask: so why should we use it now? Are there any unique features?&lt;br /&gt;And the answer here is: yes, there are some unique features beyond the JAX-RS spec and this post will describe one of the most cool features (IMO) that Wink contains: &lt;br /&gt;&lt;h3&gt;Dynamic Resources&lt;/h3&gt;&lt;br /&gt;The idea of Dynamic Resource is quite similar to &lt;a href="http://en.wikipedia.org/wiki/Template_method_pattern"&gt;Template pattern&lt;/a&gt; and it's simple: many resource classes have more or less the same logic. However, they manipulate different entities, so obviously they have different URLs.&lt;br /&gt;&lt;br /&gt;Consider the following example: a resource that simply a facade to the database - it allows the CRUD operation and it uses Hibernate as the persistence layer.&lt;br /&gt;&lt;br /&gt;So basically the template class will look something like this:  &lt;br /&gt;&lt;div style="width: 600px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;&lt;br /&gt;public class CrudResource {&lt;br /&gt;&lt;br /&gt;    private Session session;&lt;br /&gt;    @Context&lt;br /&gt;    private UriInfo uriInfo;&lt;br /&gt;    &lt;br /&gt;    private Class&lt;?&gt; clazz;&lt;br /&gt;    &lt;br /&gt;    @GET&lt;br /&gt;    public Object getEntity(@PathParam("id") String id) {&lt;br /&gt;        return session.get(clazz, id);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    @POST&lt;br /&gt;    public Response createEntity(Object newEntity) {&lt;br /&gt;        session.save(newEntity);&lt;br /&gt;        String id = newEntity.getId(); // this line will not compile, but the idea is that id is assigned by hibernate&lt;br /&gt;        URI location = uriInfo.getAbsolutePathBuilder().segment(String.valueOf(id)).build();&lt;br /&gt;        return Response.created(location).build();&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    @PUT&lt;br /&gt;    public void updateEntity(Object entity) {&lt;br /&gt;        session.update(entity);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    @DELETE&lt;br /&gt;    public void delete(@PathParam("id") String id) {&lt;br /&gt;        session.delete(session.get(clazz, id));&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;i&gt;Notice: This class doesn't contain the full logic, like transaction management, and won't even compile. It should provide the idea how to implement the "template" style resource and not how to really work with Hibernate or even Wink.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;So as you can see, this class can basically perform the CRUD operations on any entity. It would be a pity, if for each entity, we'll need to extend this class just to assign a different path. And here come the Dynamic Resources. They allow to skip the @Path annotation and implement the DynamicResource interface instead (or extend from the AbstractDynamicResource class).&lt;br /&gt;&lt;br /&gt;So now our resource will look something like this:&lt;br /&gt;&lt;div style="width: 600px;  background-color: #d7d7d7; color: #000000; font-family: courier; font-size: 12px; text-align: left; border: #668844 1px solid; overflow: auto; padding: 4px;"&gt;&lt;pre&gt;public class CrudResource extends AbstractDynamicResource  {&lt;br /&gt;...&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;Now it's possible to create multiple instances of this class and assign it a different paths and other members (like 'clazz', which should hold the value of actual class).&lt;br /&gt;&lt;br /&gt;Notice: Dynamic Resources can be returned only by Application.getSingletons() method. Thus these resources are actually singletons and must be coded accordingly (for example think about synchronization issues).&lt;br /&gt;&lt;h3&gt;Spring Integration&lt;/h3&gt;&lt;br /&gt;Wink contains the &lt;a href="http://incubator.apache.org/wink/1.0/html/5.5%20Spring%20Integration.html"&gt;Spring Integration&lt;/a&gt; extension. I won't describe its features here, but only want to mention the usage of Dynamic Resources with Spring.&lt;br /&gt;First, Dynamic Resource can be defined and registered via Spring Context, thus you can create new resources using the same class, while updating the configuration only. Pretty nice feature, when you think about it.&lt;br /&gt;Second, Dynamic Resources benefit from different scopes. Meaning, they may not be singletons anymore.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-5380273254909919807?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/5380273254909919807/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=5380273254909919807" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/5380273254909919807?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/5380273254909919807?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/rbxr7FqaeRY/apache-wink-dynamic-resources.html" title="Apache Wink - Dynamic Resources" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2010/03/apache-wink-dynamic-resources.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UFR3oyfyp7ImA9WxNbEEw.&quot;"><id>tag:blogger.com,1999:blog-5239535491482352731.post-8388463232569313667</id><published>2009-11-12T10:34:00.003+02:00</published><updated>2009-11-12T10:40:16.497+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-12T10:40:16.497+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="wink" /><title>Wink 1.0-incubating Release</title><content type="html">So finally &lt;a href="http://incubator.apache.org/wink/"&gt;Wink 1.0&lt;/a&gt; is released. This release contains quite a lot of fixes (including many performance fixes) and also some features.&lt;br /&gt;For the complete list of issues, see the &lt;a href="http://incubator.apache.org/wink/1.0/release_notes.html"&gt;release notes&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5239535491482352731-8388463232569313667?l=tarlogonjava.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tarlogonjava.blogspot.com/feeds/8388463232569313667/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=5239535491482352731&amp;postID=8388463232569313667" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8388463232569313667?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5239535491482352731/posts/default/8388463232569313667?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tarlogonjava/~3/jzm9eQnbAW8/wink-10-incubating-release.html" title="Wink 1.0-incubating Release" /><author><name>Tarlog</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="16" height="16" src="http://img2.blogblog.com/img/b16-rounded.gif" /></author><thr:total>6</thr:total><feedburner:origLink>http://tarlogonjava.blogspot.com/2009/11/wink-10-incubating-release.html</feedburner:origLink></entry></feed>

