<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4460194782217289102</id><updated>2024-08-30T18:09:07.587+03:00</updated><category term="java"/><category term="development"/><category term="spring"/><category term="jboss"/><category term="web services"/><category term="books"/><category term="facebook"/><category term="mac"/><category term="gwt"/><category term="links"/><category term="patterns"/><title type='text'>The Laboratory</title><subtitle type='html'>Konstantin Pavlov&#39;s Blog</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>23</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-1855493334463888287</id><published>2013-05-16T22:25:00.005+04:00</published><updated>2015-01-03T01:49:01.697+03:00</updated><title type='text'>The Blog Has Moved</title><content type='html'>New address: &lt;a href=&quot;http://blog.konstantinpavlov.net&quot;&gt;blog.konstantinpavlov.net&lt;/a&gt;.</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/1855493334463888287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2013/05/the-blog-has-moved.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/1855493334463888287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/1855493334463888287'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2013/05/the-blog-has-moved.html' title='The Blog Has Moved'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-3574504600179107972</id><published>2012-05-25T09:40:00.001+04:00</published><updated>2012-05-25T09:40:36.561+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><title type='text'>Book: Good Old &quot;Peopleware&quot;</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://amzn.com/0932633439&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;225&quot; width=&quot;225&quot; src=&quot;http://ecx.images-amazon.com/images/I/51MlUgcSICL._SL500_SS225_.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;
One more book worth reading - &quot;Peopleware: Productive Projects and Teams&quot; by Tom DeMarco and Timothy Lister. It&#39;s essentially a Holy Bible for every manager!
&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/3574504600179107972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2012/05/books-good-old-peopleware.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3574504600179107972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3574504600179107972'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2012/05/books-good-old-peopleware.html' title='Book: Good Old &quot;Peopleware&quot;'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-3293456713156752362</id><published>2012-05-25T09:29:00.000+04:00</published><updated>2013-06-05T01:57:24.168+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="books"/><category scheme="http://www.blogger.com/atom/ns#" term="development"/><title type='text'>Book: &quot;Continuous Delivery...&quot; by Jez Humble and David Farley</title><content type='html'>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://amzn.com/0321601912&quot; imageanchor=&quot;1&quot; style=&quot;clear:left; float:left;margin-right:1em; margin-bottom:1em&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;225&quot; width=&quot;225&quot; src=&quot;http://ecx.images-amazon.com/images/I/51UYBHnvjFL._SL500_SS225_.jpg&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a href=&quot;http://blog.konstantinpavlov.net/2012/09/book-continuous-delivery-by-jez-humble.html&quot;&gt;This book may help to make a product releasing and delivery to be more frequent and less painful.&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/3293456713156752362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2012/05/book-continuous-delivery-by-jez-humble.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3293456713156752362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3293456713156752362'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2012/05/book-continuous-delivery-by-jez-humble.html' title='Book: &quot;Continuous Delivery...&quot; by Jez Humble and David Farley'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-5495312749455739039</id><published>2011-10-05T23:43:00.000+04:00</published><updated>2012-05-28T23:53:13.577+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="patterns"/><title type='text'>Builder Pattern Usage: Rule of Thumb</title><content type='html'>&lt;p&gt;
&lt;a href=&quot;http://en.wikipedia.org/wiki/Builder_pattern&quot;&gt;Builder Pattern&lt;/a&gt; is a creational design pattern. It is good in: 
&lt;ol&gt;
  &lt;li&gt;Creating complex immutable objects&lt;/li&gt;
  &lt;li&gt;Preventing objects being created to be used before initialization is complete.
&lt;/ol&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;h2&gt;Complex Immutable Objects&lt;/h2&gt;
&lt;p&gt;
It&#39;s important that object being created should be &lt;em&gt;Complex enough&lt;/em&gt; and &lt;em&gt;Immutable.&lt;/em&gt; Overwise it may be an overkill to use a &lt;a href=&quot;http://en.wikipedia.org/wiki/Builder_pattern&quot;&gt;Builder&lt;/a&gt; for simple cases.
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If object is not complex enough&lt;/strong&gt; &amp;mdash; you may use more simple ways of creating new object, e.g. use static factory method.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If object is not immutable&lt;/strong&gt; &amp;mdash; use setter methods&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
What kind of object are complex? Much depends on context, of course. But if object has less than than 2-3 constructor parameters is unlikely to be complex enough to use the Builder. I.e, if object can be created with factory method with up to 3 parameters, than object is &lt;strong&gt;simple&lt;/strong&gt; and using Builder pattern is overkill.
&lt;/p&gt;
&lt;p&gt;One more pattern should be recalled here is &lt;a href=&quot;https://en.wikipedia.org/wiki/Value_object&quot;&gt;Value Object&lt;/a&gt; or &lt;a href=&quot;https://en.wikipedia.org/wiki/Data_transfer_object&quot;&gt;Data Transfer Object (DTO)&lt;/a&gt;. Value objects or DTOs may be passed as a constructor parameters to simplify object creation.&lt;/p&gt;

&lt;h2&gt;Preventing early object access&lt;/h2&gt;
&lt;p&gt;
Builder may be used to create an object which should not be used unless fully initialized. Initializing object using setter methods does not prevent client from calling other object business methods. To handle this incomplete state correctly you normally should perform object state check in the beginning of every business method and throw &lt;a href=&quot;http://docs.oracle.com/javase/6/docs/api/java/lang/IllegalStateException.html&quot;&gt;IllegalStateException&lt;/a&gt;... or just prevent object to be created in inconsistent state. One of the way to to this it is to use Builder. But anyway, you should check if all the parameters are initialized inside &lt;code&gt;builder.build()&lt;/code&gt; method or inside object constructor:
&lt;/p&gt;
&lt;pre&gt;
import org.apache.commons.lang3.Validate;
public class PingResponseBuilder {
    private String serverName;
    private long timestamp;

    public void setServerName(String name) {
        this.serverName = name;
    }

    public void setTimestamp(long millis) {
        this.timestamp = millis;
    }

    private void validate() {
        Validate.notBlank(serverName, &quot;The serverName must not be blank&quot;);
        Validate.isTrue(timestamp&gt;0, &quot;The timestamp must be greater than zero: %s&quot;, timestamp);
    }

    public PingResponse build() {
        validate();
        return new PingResponse(serverName, timestamp);        
    }
} 
&lt;/pre&gt;

&lt;p&gt;
Please keep in mind, that although memory is cheap and processors are fast, creating the new Builder instance for every created object instance is not very efficient. You may re-use single builder object (in a thread-safe manner!!!) for creating multiple object instances by setting differing properties, e.g.:
&lt;/p&gt;
&lt;pre&gt;
PingResponseBuilder builder = new PingResponseBuilder();
builder.setServerName(&quot;A Test Server&quot;);
...
PingResponse firstResponse = builder.setTimestamp(System.currentTimeMillis()).build();
...
PingResponse nextResponse = builder.setTimestamp(System.currentTimeMillis()).build();
&lt;/pre&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/5495312749455739039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2011/10/builder-pattern-usage-rule-of-thumb.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/5495312749455739039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/5495312749455739039'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2011/10/builder-pattern-usage-rule-of-thumb.html' title='Builder Pattern Usage: Rule of Thumb'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-1907640188401535282</id><published>2011-02-25T17:18:00.000+03:00</published><updated>2012-09-14T09:20:53.008+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="facebook"/><title type='text'>Connecting to Facebook Chat</title><content type='html'>Some time ago, &lt;a href=&quot;http://www.facebook.com/&quot;&gt;Facebook&lt;/a&gt; has provided a public XMPP service. It makes possible to connect to Facebook chat server via any XMPP client (e.g. &lt;a href=&quot;http://www.pidgin.im&quot;&gt;Pidgin&lt;/a&gt; or &lt;a href=&quot;http://adium.im&quot;&gt;Adium&lt;/a&gt;) and send messages to your Facebook contacts.&lt;br /&gt;
&lt;br /&gt;
&lt;img src=&quot;http://www.barbariangroup.com/assets/users/rick/images/0000/4782/Adium_Account.png&quot;/&gt;&lt;br /&gt;
&lt;a href=&quot;http://adium.im&quot;&gt;Adium&lt;/a&gt; already has a built-in support for Facebook Chat. You may add Facebook Chat to &lt;a href=&quot;http://www.pidgin.im&quot;&gt;Pidgin&lt;/a&gt; as generic XMPP service.&lt;br /&gt;
&lt;br /&gt;
To configure your jabber client use the following &lt;a href=&quot;https://www.facebook.com/sitetour/chat.php&quot;&gt;recommended settings&lt;/a&gt;:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
Protocol: XMPP or Jabber&lt;br /&gt;
Username: &lt;your Facebook username&gt;&lt;br /&gt;
Domain: chat.facebook.com&lt;br /&gt;
Jabber ID: &lt;your Facebook username&gt;@chat.facebook.com&lt;br /&gt;
Password: &lt;your Facebook password&gt;&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
Enter the following server info, as requested:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
Port: 5222&lt;br /&gt;
Server: chat.facebook.com&lt;br /&gt;
Use SSL/TLS: no&lt;br /&gt;
Allow Plaintext Authentication: no&lt;br /&gt;
&lt;/code&gt;&lt;br /&gt;
When you connect to Facebook account you&#39;ll see your Facebook friend groups in roster. &lt;br /&gt;
Friend groups (friend lists) can be edited only from Facebook site, not from the XMPP client.&lt;br /&gt;
Only your confirmed friends can contact you through Facebook Chat.&lt;br /&gt;
&lt;br /&gt;
Currently, Facebook Chat does not support SSL and message encryption, but supports secured authentication using MD5.&lt;br /&gt;
&lt;br /&gt;
For information about integraitng with Facebook Chat see &lt;a href=&quot;http://developers.facebook.com/docs/chat/&quot;&gt;here&lt;/a&gt;.</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/1907640188401535282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/1907640188401535282'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2010/04/connecting-to-facebook-chat.html' title='Connecting to Facebook Chat'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-6579257038111366576</id><published>2010-11-17T10:26:00.000+03:00</published><updated>2010-11-17T10:26:35.030+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><title type='text'>Installing GWT Development Plugin in FF3.6 on OpenSuse 11.2x64</title><content type='html'>&lt;pre&gt;Compiling the plugin works for me on Arch Linux x86_64 or OpenSuse 11.2 x86_64 &amp;amp; FF36:

&quot;
mkdir gwt-source
cd gwt-source
svn checkout &lt;a href=&quot;http://google-web-toolkit.googlecode.com/svn/trunk/&quot;&gt;http://google-web-toolkit.googlecode.com/svn/trunk/&lt;/a&gt; trunk
svn checkout &lt;a href=&quot;http://google-web-toolkit.googlecode.com/svn/plugin-sdks/&quot;&gt;http://google-web-toolkit.googlecode.com/svn/plugin-sdks/&lt;/a&gt; plugin-sdks
cd trunk/plugins/xpcom
export BROWSER=ff36
export DEFAULT_FIREFOX_LIBS=/usr/lib/xulrunner-devel-1.9.2/sdk/lib/
make clean
make
&quot;

This shoulds create &quot;gwt-dev-plugin.xpi&quot; in prebuild directory, open it with FF and
may the force be with you.

&lt;/pre&gt;&lt;br /&gt;
Update: This reciept also works under Ubuntu 10.10 32bit (you don&#39;t need to export DEFAULT_FIREFOX_LIBS)&lt;br /&gt;
&lt;br /&gt;
See original comment:&lt;br /&gt;
&lt;a href=&quot;http://code.google.com/p/google-web-toolkit/issues/detail?id=4141#c16&quot;&gt;Issue 4141 - google-web-toolkit - Various compatibility problems with OOPHM Firefox plugin on Linux distros - Project Hosting on Google Code&lt;/a&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/6579257038111366576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/6579257038111366576'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2010/03/installing-gwt-development-plugin-in.html' title='Installing GWT Development Plugin in FF3.6 on OpenSuse 11.2x64'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-2950552910562233708</id><published>2010-09-30T13:47:00.000+04:00</published><updated>2010-09-30T13:47:15.408+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="facebook"/><title type='text'>How to Set JSON Response Data Locale for Facebook Graph API</title><content type='html'>To make Facebook server return JSON responses in specified locale, you need to add parameter &lt;i&gt;locale&lt;/i&gt; to the query, e.g.: https://graph.facebook.com/me?access_token=xxx&amp;&lt;b&gt;locale=en_US&lt;/b&gt;&lt;br /&gt;
The result is:&lt;br /&gt;
&lt;code&gt;{&lt;br /&gt;
...&lt;br /&gt;
   &quot;gender&quot;: &quot;male&quot;,&lt;br /&gt;
   &quot;meeting_for&quot;: [&lt;br /&gt;
      &quot;Friendship&quot;&lt;br /&gt;
   ],&lt;br /&gt;
   &quot;relationship_status&quot;: &quot;Married&quot;,&lt;br /&gt;
...&lt;br /&gt;
}&lt;/code&gt;&lt;br /&gt;
&lt;br /&gt;
If you want to get results in russian, then add &lt;b&gt;locale=ru_RU&lt;/b&gt; to query:&lt;br /&gt;
https://graph.facebook.com/me?access_token=xxx&amp;&lt;b&gt;locale=ru_RU&lt;/b&gt;&lt;br /&gt;
and you&#39;ll get result in russian (UTF-encoded):&lt;br /&gt;
&lt;code&gt;{&lt;br /&gt;
...&lt;br /&gt;
   &quot;gender&quot;: &lt;b&gt;&quot;\u043c\u0443\u0436\u0441\u043a\u043e\u0439&quot;&lt;/b&gt;,&lt;br /&gt;
   &quot;meeting_for&quot;: [&lt;br /&gt;
      &lt;b&gt;&quot;\u0414\u0440\u0443\u0436\u0431\u0430&quot;&lt;/b&gt;&lt;br /&gt;
   ],&lt;br /&gt;
   &quot;relationship_status&quot;: &lt;b&gt;&quot;\u0416\u0435\u043d\u0430\u0442/\u0437\u0430\u043c\u0443\u0436\u0435\u043c&quot;&lt;/b&gt;,&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;/code&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/2950552910562233708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/2950552910562233708'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2010/09/how-to-set-json-response-data-locale.html' title='How to Set JSON Response Data Locale for Facebook Graph API'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-5038754941481075694</id><published>2010-07-22T17:20:00.007+04:00</published><updated>2013-05-16T22:58:26.748+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gwt"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>GWT is about to add Native JSON function support in version 2.1</title><content type='html'>GWT 2.1 has reached Milestone 2.&lt;br /&gt;
&lt;br /&gt;
One of the new features in version 2.1 is support for browser&#39;s native JSON function in JSONParser class. &lt;a href=&quot;http://blog.konstantinpavlov.net/2013/05/gwt-is-about-to-add-native-json.html&quot; rel=&quot;details&quot;&gt;More...&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/5038754941481075694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2010/07/gwt-is-about-to-add-native-json.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/5038754941481075694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/5038754941481075694'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2010/07/gwt-is-about-to-add-native-json.html' title='GWT is about to add Native JSON function support in version 2.1'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-7435049175624330150</id><published>2010-06-30T16:16:00.004+04:00</published><updated>2013-05-16T22:31:16.326+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>Upgrading to Spring 3: &quot;Unable to locate Spring NamespaceHandler&quot; in JAR file built by Maven</title><content type='html'>After upgrading to Spring 3 your may discover that your application packaged in JAR archive does not start any more throwing an exception like this:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial, Helvetica, sans-serif;&quot;&gt;&quot;Unable to locate Spring NamespaceHandler for XML schema namespace[http://www.springframework.org/schema/tx]&quot;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
This  happens when you include multiple Spring module dependencies in your pom.xml file and use Maven Shade or Assembly plugin to build a single JAR.&lt;br /&gt;
Since Spring can does not contain a single distribution jar (org.springframework:spring:jar), Spring namespace handlers, schema mappings and tooling information files are now present in multiple files with names:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;META-INF/spring.handlers&lt;/li&gt;
&lt;li&gt;META-INF/spring.schemas&lt;/li&gt;
&lt;li&gt;META-INF/spring.tooling&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
In order to make it work in a single shaded JAR you need to merge contents of these files from different jars and place merged files into new JAR. &lt;a href=&quot;http://blog.konstantinpavlov.net/2010/06/upgrading-to-spring-3-unable-to-locate-namespacehandler.html&quot; rel=&quot;answer&quot;&gt;More...&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/7435049175624330150/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2010/06/upgrading-to-spring-3-unable-to-locate.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/7435049175624330150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/7435049175624330150'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2010/06/upgrading-to-spring-3-unable-to-locate.html' title='Upgrading to Spring 3: &quot;Unable to locate Spring NamespaceHandler&quot; in JAR file built by Maven'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-5471409859929059008</id><published>2009-11-19T13:04:00.003+03:00</published><updated>2010-06-30T16:00:52.450+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><title type='text'>Mac OS X Applications for Everyday. Keyboard Layout Switchers.</title><content type='html'>&lt;img src=&quot;http://soft.yandex.ru/i/bigpromo/punto_logo_small.png&quot; alt=&quot;&quot;/&gt;&lt;br /&gt;
After two years of Mac user experience, I&#39;d like list the applications I use everyday.&lt;br /&gt;
&lt;br /&gt;
I am Russian, so I need a to write the texts in other encoding than ISO. Under windows, there is nice tool called &lt;a href=&quot;http://punto.yandex.ru/&quot;&gt;Punto Switcher&lt;/a&gt;. For long time there was no such tool for mac, except &lt;a href=&quot;http://www.macfiles.ru/utilites/226-ruswitcher.html&quot;&gt;RuSwitcher&lt;/a&gt; by Alexey Proskuryakov. RuSwitcher &lt;a href=&quot;http://deepapple.com/forum/index.php?topic=15249.0&quot;&gt;works only on Tiger and does not work under Leopard&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Hopefully, guys from Yandex has ported &lt;a href=&quot;http://punto.yandex.ru/mac/&quot;&gt;PuntoSwitcher to Mac&amp;nbsp;OS&amp;nbsp;X&lt;/a&gt; (Leopard &amp; Snow Leopard). It is still a beta but I have no problems using it.&lt;br /&gt;
&lt;br /&gt;
Some of the Punto Switcher&#39;s features are:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Switching keyboard layout automatically or with a hot key.&lt;/li&gt;
&lt;li&gt;Fix incorrect layout for selected text.&lt;/li&gt;
&lt;li&gt;Mac and Windows layout support.&lt;/li&gt;
&lt;/ul&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/5471409859929059008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/5471409859929059008'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2009/11/mac-os-x-applications-for-everyday.html' title='Mac OS X Applications for Everyday. Keyboard Layout Switchers.'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-6872736279083685226</id><published>2009-01-30T13:56:00.007+03:00</published><updated>2013-06-26T14:56:32.788+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jboss"/><category scheme="http://www.blogger.com/atom/ns#" term="links"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>How to Lookup JBoss MBean Server from Spring (JMX)</title><content type='html'>If you having problems accessing &quot;mbeanServer&quot; Spring-managed bean under JBoss Application server &lt;a href=&quot;http://blog.konstantinpavlov.net/2009/01/lookup-jboss-mbean-server-from-spring.html&quot;&gt;Read more...&lt;/a&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/6872736279083685226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2009/01/how-to-lookup-jboss-mbean-server-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/6872736279083685226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/6872736279083685226'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2009/01/how-to-lookup-jboss-mbean-server-from.html' title='How to Lookup JBoss MBean Server from Spring (JMX)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-2537888602073145738</id><published>2009-01-29T17:23:00.010+03:00</published><updated>2015-01-03T15:04:53.391+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>How to Use Spring from EJB3</title><content type='html'>This is a short instruction how to inject a spring-managed bean into EJB3 component.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Read &lt;a href=&quot;http://www.springsource.org/&quot;&gt;SpringFratamework&#39;s&lt;/a&gt; reference here: &lt;a href=&quot;http://static.springframework.org/spring/docs/2.5.x/reference/ejb.html#ejb-implementation-ejb3&quot;&gt;http://static.springframework.org/spring/docs/2.5.x/reference/ejb.html#ejb-implementation-ejb3&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Place to ejb module&#39;s classpath a file &lt;code&gt;beanRefContext.xml&lt;/code&gt;:&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE beans PUBLIC &quot;-//SPRING//DTD BEAN//EN&quot; &quot;http://www.springframework.org/dtd/spring-beans.dtd&quot;&amp;gt;&lt;br /&gt;&amp;lt;beans&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;bean id=&quot;myBeanFactory&quot; class=&quot;org.springframework.context.support.ClassPathXmlApplicationContext&quot;&amp;gt;&lt;br /&gt;  &amp;lt;constructor-arg value=&quot;myApplicationContext.xml&quot;/&amp;gt;&lt;br /&gt; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/beans&amp;gt;&lt;/pre&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Create application context file named &lt;code&gt;myApplicationContext.xml&lt;/code&gt; and define You beans there. Place this file to the ejb module&#39;s classpath.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Annotate your Stateless Session Bean:&lt;br /&gt;&lt;code&gt;&lt;pre class=&quot;java&quot;&gt;@Stateless&lt;br /&gt;&lt;strong&gt;@Interceptors(org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor.class)&lt;/strong&gt;&lt;br /&gt;public class MyFacadeBean implements MyFacade {&lt;br /&gt;&lt;br /&gt;    &lt;strong&gt;@Autowired&lt;/strong&gt;&lt;br /&gt;    private MySpringComponent component;&lt;br /&gt;    ...&lt;br /&gt;    public void foo() {&lt;br /&gt;        component.foo();//invocation &lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Deploy and test Your application.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;

&lt;script&gt;
var redirected = true;
window.location.replace(&#39;http://blog.konstantinpavlov.net/blog/2009/01/09/how-to-use-spring-from-ejb3?utm_source=blogger&#39;);
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/2537888602073145738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2009/01/how-to-use-spring-from-ejb3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/2537888602073145738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/2537888602073145738'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2009/01/how-to-use-spring-from-ejb3.html' title='How to Use Spring from EJB3'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-3179252650187730870</id><published>2009-01-27T18:20:00.011+03:00</published><updated>2009-01-30T15:51:51.546+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="spring"/><title type='text'>How To Export Spring Managed Bean To JNDI</title><content type='html'>&lt;span style=&quot;font-style:italic;&quot;&gt;Sometimes, it is necessary to export a &lt;a href=&quot;http://www.springsource.org&quot;&gt;spring&lt;/a&gt; managed bean to JNDI context. Here I want to show how do it.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In spring, there is a bean that provides a similar functionality for exporting to MBean server: &lt;a href=&quot;http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jmx/export/MBeanExporter.html&quot;&gt;MBeanExporter&lt;/a&gt;. Unfortunately, there is no standard JNDI bean exporter implementation in &lt;a href=&quot;http://www.springsource.org&quot;&gt;spring&lt;/a&gt; (current version is 2.5.6) - (Why?).&lt;br /&gt;But it&#39;s easy to write it youself:&lt;br /&gt;&lt;code&gt;&lt;pre class=&quot;java&quot;&gt;package com.example.spring.jndi.export;&lt;br /&gt;&lt;br /&gt;import org.springframework.beans.factory.DisposableBean;&lt;br /&gt;import org.springframework.beans.factory.InitializingBean;&lt;br /&gt;import org.springframework.jndi.JndiTemplate;&lt;br /&gt;&lt;br /&gt;public class JndiExporter implements InitializingBean, DisposableBean {&lt;br /&gt;&lt;br /&gt; private String jndiName;&lt;br /&gt;&lt;br /&gt; private Object bean;&lt;br /&gt;&lt;br /&gt; private final JndiTemplate jndiTemplate = new JndiTemplate();&lt;br /&gt;&lt;br /&gt; public String getJndiName() {&lt;br /&gt;  return jndiName;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setJndiName(String jndiName) {&lt;br /&gt;&lt;br /&gt;  this.jndiName = jndiName;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Object getBean() {&lt;br /&gt;  return bean;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setBean(Object bean) {&lt;br /&gt;  this.bean = bean;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; public void afterPropertiesSet() throws Exception {&lt;br /&gt;  jndiTemplate.bind(jndiName, bean);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void destroy() throws Exception {&lt;br /&gt;  if (bean != null &amp;&amp; jndiName != null &amp;&amp; bean == jndiTemplate.lookup(jndiName)) {&lt;br /&gt;   jndiTemplate.unbind(jndiName);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;Add following fragment to spring configuration file:&lt;br /&gt;&lt;code&gt;&lt;pre class=&quot;config&quot;&gt;&amp;lt;bean id=&quot;myBean&quot; class=&quot;com.example.MyBean&quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;bean class=&quot;com.example.spring.jndi.export.JndiExporter&quot;&amp;gt;&lt;br /&gt;       &amp;lt;property name=&quot;bean&quot; ref=&quot;myBean&quot; /&amp;gt;&lt;br /&gt;       &amp;lt;property name=&quot;jndiName&quot; value=&quot;MyJNDIName&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;Don&#39;t forget to make your bean serializable by implementing &lt;code&gt;java.io.Serializable&lt;/code&gt; interface.&lt;br /&gt;Now we can lookup exported bean by adding to the spring config fil: &lt;br /&gt;&lt;code&gt;&amp;lt;jee:jndi-lookup id=&quot;myJndiBean&quot; jndi-name=&quot;MyJNDIName&quot; proxy-interface=&quot;com.example.IMyBean&quot; lookup-on-startup=&quot;false&quot;/&amp;gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;That&#39;s all, folks!</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/3179252650187730870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2009/01/how-to-export-spring-managed-bean-to.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3179252650187730870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3179252650187730870'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2009/01/how-to-export-spring-managed-bean-to.html' title='How To Export Spring Managed Bean To JNDI'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-195692745946944954</id><published>2009-01-02T12:36:00.004+03:00</published><updated>2009-01-30T15:48:45.288+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Use BigDecimals for Financial Calculations: One More Example</title><content type='html'>Recently I was asked about the preferred data type in java application dealing with financial data. I suggest using of BigDecimal and here is the example why. Let&#39;s perform following arithmetic operations over double values, double values with &lt;code&gt;strictfp&lt;/code&gt; mode enabled and over BigDecimals.&lt;br /&gt;&lt;br /&gt;Expression is: &quot;0.999/9 - 0.112&quot;&lt;br /&gt;Expected result is: &quot;-0.001&quot;&lt;br /&gt;&lt;br /&gt;Java code:&lt;br /&gt;&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;import java.math.BigDecimal;&lt;br /&gt;&lt;br /&gt;public class FloationPointTest {&lt;br /&gt;&lt;br /&gt; public strictfp static void  testStrictfp() {&lt;br /&gt;  System.out.println(&quot;strictfp: 0.999/9-0.112 = &quot; + (0.999/9-0.112));&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static void main(String ... args) {&lt;br /&gt;  System.out.println(&quot;double: 0.999/9-0.112 = &quot; + (0.999/9-0.112));&lt;br /&gt;  testStrictfp();&lt;br /&gt;  System.out.println(&quot;BigDecimal: 0.999/9-0.112 = &quot; + (new BigDecimal(&quot;0.999&quot;).divide(new BigDecimal(&quot;9&quot;)).subtract(new BigDecimal(&quot;0.112&quot;))));&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Program output:&lt;pre&gt;double: 0.999/9-0.112 = -0.0010000000000000009&lt;br /&gt;strictfp: 0.999/9-0.112 = -0.0010000000000000009&lt;br /&gt;BigDecimal: 0.999/9-0.112 = -0.001&lt;/pre&gt;&lt;br /&gt;We see that only operations with BigDecimal does not lead to the lost of precision. Performing operation over values of type &lt;code&gt;double&lt;/code&gt; even in &lt;code&gt;strictfp&lt;/code&gt; mode may loose accuracy. It is not acceptable for financial calculations in the days of Global financial crisis.</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/195692745946944954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2009/01/use-bigdecimals-for-financial.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/195692745946944954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/195692745946944954'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2009/01/use-bigdecimals-for-financial.html' title='Use BigDecimals for Financial Calculations: One More Example'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-219656299483577045</id><published>2008-12-02T13:53:00.015+03:00</published><updated>2009-01-30T15:49:46.120+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Proxy Method  Resolving Order</title><content type='html'>I noticed interesting behavior of method resolving order, which reflects interface order in &lt;code&gt;java.lang.reflect.Proxy.newProxyInstance(...)&lt;/code&gt; call. It fact, it is described in Sun&#39;s java guide: &lt;a href=&quot;http://java.sun.com/j2se/1.5.0/docs/guide/reflection/proxy.html#methods&quot;&gt;Dynamic Proxy Classes: Methods Duplicated in Multiple Proxy Interfaces&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Supose, there are two interfaces (A and B) with same signature and we have created a proxy that implements this interface in order {A,B}.&lt;br /&gt;&lt;br /&gt;When we cast a proxy to class A and invoke it&#39;s method, the InvocationHandler says that we invoke a method from interface A (as expected).&lt;br /&gt;&lt;br /&gt;But when we cast a proxy to class B and invoke it&#39;s method, the InvocationHandler says that we invoke a method from interface A again! Here I&#39;d expect the InvocationHandler will say that we invoking a method of interface B and it&#39;s strange for me.&lt;br /&gt;&lt;br /&gt;Order of appearing interfaces in proxy instance factory method does matter. Following program demonstrates it:&lt;br /&gt;&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;import java.lang.reflect.InvocationHandler;&lt;br /&gt;import java.lang.reflect.Method;&lt;br /&gt;import java.lang.reflect.Proxy;&lt;br /&gt;import java.util.Arrays;&lt;br /&gt;&lt;br /&gt;public class ProxyMethod {&lt;br /&gt;&lt;br /&gt; interface A {&lt;br /&gt;  void doSomething();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; interface B {&lt;br /&gt;  void doSomething();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; static class EchoHandler implements InvocationHandler {&lt;br /&gt;&lt;br /&gt;  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {&lt;br /&gt;   System.out.println(&quot;method = &quot; + method);&lt;br /&gt;   return null;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  Object proxy1 = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),&lt;br /&gt;    &lt;strong&gt;new Class[]{B.class, A.class},// The difference&lt;/strong&gt;&lt;br /&gt;    new EchoHandler());&lt;br /&gt;&lt;br /&gt;  Object proxy2 = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),&lt;br /&gt;    &lt;strong&gt;new Class[]{A.class, B.class},// The difference&lt;/strong&gt;&lt;br /&gt;    new EchoHandler());&lt;br /&gt;&lt;br /&gt;  System.out.println(&quot;\nproxy1 intfs = &quot; + Arrays.asList(proxy1.getClass().getInterfaces()));&lt;br /&gt;  ((A) proxy1).doSomething();&lt;br /&gt;  ((B) proxy1).doSomething();&lt;br /&gt;&lt;br /&gt;  System.out.println(&quot;\nproxy2 intfs = &quot; + Arrays.asList(proxy2.getClass().getInterfaces()));&lt;br /&gt;  ((A) proxy2).doSomething();&lt;br /&gt;  ((B) proxy2).doSomething();&lt;br /&gt; }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Returns following result:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;proxy1 intfs = [interface ProxyMethod$B, interface ProxyMethod$A]&lt;br /&gt;method = public abstract void ProxyMethod$B.doSomething()&lt;br /&gt;method = public abstract void ProxyMethod$B.doSomething()&lt;br /&gt;&lt;br /&gt;proxy2 intfs = [interface ProxyMethod$A, interface ProxyMethod$B]&lt;br /&gt;method = public abstract void ProxyMethod$A.doSomething()&lt;br /&gt;method = public abstract void ProxyMethod$A.doSomething()&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;This behavior allows to build object wrapper as dynamic proxies easily. Interface of the object being wrapped should be passed first to the proxy factory method. So, if methods of the wrapped object&#39;s interface is passed to the invocation handler - just invoke them on a wrapped objects. Other methods should be handled differently by invocation handler.</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/219656299483577045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2008/12/proxy-method-resolving-order.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/219656299483577045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/219656299483577045'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2008/12/proxy-method-resolving-order.html' title='Proxy Method  Resolving Order'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-2472252728882200691</id><published>2008-03-26T10:21:00.026+03:00</published><updated>2009-01-30T16:35:38.557+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jboss"/><category scheme="http://www.blogger.com/atom/ns#" term="web services"/><title type='text'>WebService Authentication under JBoss</title><content type='html'>In my business project there is a need to check declarative security within EJB3 Session beans exposed as WebServices. The project is deployed under &lt;a href=&quot;http://labs.jboss.com/jbossas&quot;&gt;JBoss AS&lt;/a&gt; 4.0.5.GA with &lt;a href=&quot;http://labs.jboss.com/jbossws&quot;&gt;JBossWS&lt;/a&gt; 1.2.0.SP1. After brief investigation, a quick solution was found.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;HTTP BASIC Auhtentication with EJB3 Endpoints&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Axis client provides HTTP BASIC authentication when invoking web services (see &lt;a href=&quot;/2007/05/configuring-ws-security-for-axis-14.html&quot;&gt;previous article&lt;/a&gt;). So, it should be some way to enable it on server side.&lt;br /&gt;&lt;br /&gt;For EJB web service endpoints, JBossWS generates and deploys web application, so Session Beans are mapped to Servlets.&lt;br /&gt;&lt;br /&gt;Let&#39;s look at the example of &lt;em title=&quot;Statless Local Session Bean&quot;&gt;SLSB&lt;/em&gt; exposed as WebService (class HelloIntf, containing missing here @WebService annotations, is generated from WSDL and not listed here):&lt;br /&gt;&lt;pre class=&quot;java&quot;&gt;&lt;code&gt;@javax.ejb.Local(HelloIntf.class)&lt;br /&gt;@javax.ejb.Stateless(name = &quot;HelloPort&quot;)&lt;br /&gt;@javax.jws.WebService(endpointInterface = &quot;HelloIntf&quot;)&lt;br /&gt;@TransactionManagement&lt;br /&gt;@DeclareRoles({&quot;foo&quot;,&quot;bar&quot;})&lt;br /&gt;// jboss specific&lt;br /&gt;@org.jboss.ws.annotation.WebContext(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contextRoot = &quot;/services&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;urlPattern = &quot;/hello&quot;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;authMethod = &lt;strong&gt;&quot;BASIC&quot;&lt;/strong&gt;)&lt;br /&gt;public class HelloBean implements HelloIntf {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@javax.annotation.Resource&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private SessionContext ctx;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@javax.annotation.security.RolesAllowed({&quot;foo&quot;,&quot;bar&quot;})&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public String sayHello() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &quot;Hello, &quot; + ctx.getCallerPrincipal();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Defined bean will be deployed as http://localhost:8080/services/hello.&lt;br /&gt;Actually, JBossWS generates web.xml by processing annotations. In web.xml following code will be added:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;security-constraint&amp;gt;&lt;br /&gt; &amp;lt;web-resource-collection&amp;gt;&lt;br /&gt; &amp;lt;web-resource-name&amp;gt;HelloPort&amp;lt;/web-resource-name&amp;gt;&lt;br /&gt; &amp;lt;url-pattern&amp;gt;/hello&amp;lt;/url-pattern&amp;gt;&lt;br /&gt; &amp;lt;http-method&amp;gt;GET&amp;lt;/http-method&amp;gt;&lt;br /&gt; &amp;lt;http-method&amp;gt;POST&amp;lt;/http-method&amp;gt;&lt;br /&gt; &amp;lt;/web-resource-collection&amp;gt;&lt;br /&gt; &amp;lt;auth-constraint&amp;gt;&lt;br /&gt; &amp;lt;role-name&amp;gt;*&amp;lt;/role-name&amp;gt;&lt;br /&gt; &amp;lt;/auth-constraint&amp;gt;&lt;br /&gt; &amp;lt;/security-constraint&amp;gt;&lt;br /&gt; &amp;lt;login-config&amp;gt;&lt;br /&gt; &amp;lt;auth-method&amp;gt;BASIC&amp;lt;/auth-method&amp;gt;&lt;br /&gt; &amp;lt;realm-name&amp;gt;&lt;strong&gt;EJBServiceEndpointServlet Realm&lt;/strong&gt;&amp;lt;/realm-name&amp;gt;&lt;br /&gt; &amp;lt;/login-config&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Unfortunately, the realn name is predefined (hardcoded in JBossWS code) and can not be changed (in JBossWS 1.2.0.SP1), so, we may configure default application-policy called &quot;other&quot; in login-config.xml to meet our needs or to add new application-policy element with name=&quot;EJBServiceEndpointServlet Realm&quot;  (but the second solution does not works by unknown reason).</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/2472252728882200691/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2008/03/webservice-authentication-under-jboss.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/2472252728882200691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/2472252728882200691'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2008/03/webservice-authentication-under-jboss.html' title='WebService Authentication under JBoss'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-3631184775289399760</id><published>2008-03-22T12:19:00.019+03:00</published><updated>2009-04-17T10:55:49.639+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><title type='text'>MacOS Applications</title><content type='html'>As a new Mac user, I was faced to choose and install applications to make my work (and entertainment) more pleasurable.&lt;br /&gt;&lt;br /&gt;One of the most important reason when choosing applications to install is to prefer Free and Open Source than Commercial ones. Then comes size and performance. All &lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Localization&lt;/h4&gt;&lt;br /&gt;Is my native language is Russian, I need a to write the texts with other encoding than ISO. Here comes RuSwitcher by Alexey Proskuryakov. It is similar that PuntoSwitcher for Windows.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Web&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Web Browser&lt;/h4&gt;&lt;br /&gt;&lt;img src=&quot;http://images.apple.com/search/featured/images/safari.jpg&quot; align=&quot;left&quot;/&gt;&lt;br /&gt;I desided to stay with Safari as it&#39;s really fast web browser.&lt;br /&gt;But there are a number of plugins which make work with Safari more comfortable.&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;SafariBlock&lt;/h5&gt;&lt;br /&gt;&lt;img src=&quot;http://www.macupdate.com/images/icons/19202.png&quot; align=&quot;left&quot;/&gt;&lt;br /&gt;The &lt;a href=&quot;http://www.macupdate.com/info.php/id/19202&quot;&gt;SafariBlock&lt;/a&gt; plugin is absolutely necessary to block unwanted ads. - does not work in Safari 4 beta&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;Glimps&lt;/h5&gt;&lt;br /&gt;&lt;img src=&quot;http://www.machangout.com/sites/machangout.com/files/mainshot.png&quot; alt=&quot;Glimps&quot; align=&quot;left&quot;/&gt;&lt;a href=&quot;http://www.machangout.com/&quot;&gt;Glimps&lt;/a&gt; - search plugin for Safari. - better then Inquisitor. &lt;br /&gt;&lt;br /&gt;&lt;h5&gt;Keywurl&lt;/h5&gt;&lt;br /&gt;Other useful extension is &lt;a href=&quot;http://purefiction.net/keywurl/&quot;&gt;Keywurl&lt;/a&gt; - A small, free plugin for Safari that adds keyword search to the browser’s address bar. (just like in FireFox).&lt;br /&gt;&lt;img src=&quot;http://purefiction.net/keywurl/example1.png&quot; alt=&quot;search wiki from adress bar with Keywurl&quot;/&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Communications&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Mail&lt;/h4&gt;&lt;br /&gt;&lt;img src=&quot;http://www.upenn.edu/computing/provider/docs/img/mail.jpg&quot; alt=&quot;Mail.app&quot;/&gt;On Windows and Ubuntu I prefer Mozilla Thunderbird. But on Mac, I found native Mail.app is useable enough. And it seems to be faster than Thunderbird.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Reading&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Reading RSS&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://images.apple.com/downloads/macosx/internet_utilities/images/vienna_20080118142145.jpg&quot; align=&quot;left&quot; hspace=&quot;10&quot;/&gt;&lt;br /&gt;Initially, I have installed ... But when I tried &lt;a href=&quot;http://www.opencommunity.co.uk/vienna2.html&quot;&gt;Vienna&lt;/a&gt;, I stayed on it.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Reading CHM files&lt;/h4&gt;&lt;br /&gt;&lt;img src=&quot;http://www.macupdate.com/images/icons/15121.png&quot; hspace=&quot;10&quot;/&gt;&lt;br /&gt;There are a number CHM file readers available. For now, I&#39;ve stayed on &lt;a href=&quot;http://chmox.sourceforge.net/&quot;&gt;Chmox&lt;/a&gt;. Significant disadvantage of this program it is not possible to view CHMs with windows-1251 encoding.&lt;br /&gt;&lt;img src=&quot;http://www.macupdate.com/images/screens/uploaded/15121_sm.png&quot;/&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Entertainment&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href=&quot;http://www.eternalstorms.at/gimmesometune/&quot;&gt;GimmeSomeTune&lt;/a&gt; - iTunes Plugin&lt;/h4&gt;&lt;br /&gt;&lt;a href=&quot;http://www.eternalstorms.at/gimmesometune/&quot;&gt;&lt;img src=&quot;http://www.eternalstorms.at/gimmesometune/files/blocks_image_0_1.png&quot; alt=&quot;&quot; align=&quot;left&quot;/&gt;&lt;/a&gt;&lt;br /&gt;Nice iTunes plugin that fetches lyrics and artwork for currently playing composition. It has last.fm. support. It may start automatically when you start iTunes and shutdowns when you exit it.&lt;br /&gt;&lt;img src=&quot;http://www.eternalstorms.at/gimmesometune/files/blocks_image_2_1.png&quot; alt=&quot;&quot;/&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Development&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;SVN Client&lt;/h4&gt;&lt;br /&gt;&lt;img src=&quot;http://scplugin.tigris.org/images/contextual_menu-thumb.png&quot; alt=&quot;&quot;/&gt;&lt;br /&gt;&lt;a href=&quot;http://scplugin.tigris.org/&quot;&gt;SCPlugin&lt;/a&gt; - My choice is SVN client with Finder integration.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Games&lt;/h3&gt;&lt;br /&gt;I like RPG and &lt;a href=&quot;http://www.wesnoth.org/&quot;&gt;Battle for Wesnoth&lt;/a&gt; is very nice, balanced and playable game. And it&#39;s absolutely Free and Open Source!&lt;br /&gt;&lt;img src=&quot;http://www.wesnoth.org/images/sshots/wesnoth-1.4-8-175.jpg&quot; /&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/3631184775289399760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2008/03/macos-applications.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3631184775289399760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3631184775289399760'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2008/03/macos-applications.html' title='MacOS Applications'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-3580083216228751657</id><published>2007-10-09T23:56:00.000+04:00</published><updated>2012-05-28T23:47:11.206+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><title type='text'>«Трусливая» разработка</title><content type='html'>&lt;p&gt;Я называю &lt;em&gt;трусливой разработкой&lt;/em&gt; состояние проекта, когда некоторые (или все) члены команды избегают вносить изменения в исходный код или конфигурационные файлы.&lt;br /&gt;Такое бывает на завершающих стадиях проекта, когда получена некая относительно работоспособная версия сиситемы. В этот момент аналитик или менеджер приходит к разработчикам и просит внести не очень большое изменение в функциональность. В ответ ему говорят, что &quot;лучше мы ничего не будем трогать, чтобы не сломать&quot;. Услышать такие слова перед выпуском релиза - это нормально. Действительно, внесение изменений изменит скоуп (scope) релиза и отодвинет его дату, а все уже хотят поскорей его сдать. Но если такое происходит в начае релиза - это повод задуматься: а владеют ли разработчики кодом в полном объеме?&lt;/p&gt;&lt;p&gt;Разве разработчик может не владеть кодом, спросит начинающий менеджер проекта? Ответ: Да. И дело здесь не в профессионализме разработчиков. Причины могут быть различны, например:&lt;br /&gt;

&lt;ul&gt;&lt;li&gt;Отсутствие понимания у разработчика общей картины поведения системы. Невозможность предсказать изменения и оценить &quot;размер бедствия&quot;.&lt;/li&gt;
&lt;li&gt;Опасения разрушить взаимодействия между слабосвязанными компонетами: невозможно сказать, на что повлияет сделанное изменение.&lt;/li&gt;
&lt;li&gt;Новые люди в проекте. Они боятся лезть в чужой код, особенно, если его автор больше не работает над проектом.&lt;/li&gt;
&lt;li&gt;Психологическая усталость: нет драйва затевать большую переделку.&lt;/li&gt;
&lt;li&gt;Противоречия внутри команды: один разработчик отказывается работать с кодом другого разработчика.&lt;/li&gt;&lt;/ul&gt;

Осторожность даже может быть признаком профессионализма и наличия негатовного опыта в прошлом. Вот почему необстреляный солдат так рвется в бой, а ветераны не лезут на рожон. 

Другими признаками &quot;трусливого&quot; процесса могут быть:
&lt;ul&gt;&lt;li&gt;Саботирование изменений&lt;/li&gt;
&lt;li&gt;Неопреледенные оценки времени со стороны разработчиков: разработчики стараются не предоставлять менеджеру информацию, о сроках разработки. На самоа деле, они не могут даже приблизительно определить эти сроки. Возможно, что какие-то сроки все же будут заявлены, но они будут либо взяты с большим запасом, либо будут не честными и не реальными.&lt;/li&gt;&lt;/ul&gt;

Нужно как можно скорее менять ситуацию, переходя от боязни изменений к готовности вносить изменения. В противном случае теряется мотивация (драйв) команды, наступает застой, продукт перестает развиваться.&lt;/p&gt;

&lt;p&gt;Итак, как я предлагаю исправлять ситуацию следующим образом:&lt;ol&gt;

&lt;li&gt;Автоматизировать процесс сборки, автоматического тестирования и разворачивания системы. Да, бывает, что система &quot;собирается на коленке&quot;. Нужно как можно скорей добиться воспроизводимости получения работающей версии системы по исходному коду (см. &lt;a href=&quot;http://maestro-lab.blogspot.com/2012/05/book-continuous-delivery-by-jez-humble.html&quot;&gt;книжку&lt;/a&gt;).&lt;/li&gt;

&lt;li&gt;Уменьшить скоуп релизов. Перейти на короткие релизы (не более 2-3 недель). Это уменьшит нервозность среди заказчиков, менеджмента да и среди самих разработчиков. Начнет что-то наконец получаться в запланированный срок.&lt;/li&gt;

&lt;li&gt;Начать вносить небольшие изменения, используя техники рефакторинга (см.Мартин Фаулер &quot;Рефакторинг&quot;)&lt;/li&gt;
&lt;li&gt;Агрессивно использовать TDD - покрывать тестами функциональность, которая подвергнется рефакторингу, чтобы гарантировать её работоспособность после завершения рефакторинга.&lt;/li&gt;
&lt;li&gt;Если возможно, разделить большое приложение на более мелкие модули с более понятной и простой функциональностью.&lt;/li&gt;
&lt;/li&gt;&lt;/ol&gt;
При этом нужно быть готовым к потерям времени на рефакторинг.&lt;/p&gt;
&lt;p&gt;А что бы вы ещё посоветовали?&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/3580083216228751657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2007/10/configuration-management-for-java-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3580083216228751657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3580083216228751657'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2007/10/configuration-management-for-java-in.html' title='«Трусливая» разработка'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-4874071509713666833</id><published>2007-10-09T21:30:00.000+04:00</published><updated>2007-10-10T13:41:12.235+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Development Process Guidelines</title><content type='html'>&lt;p style=&quot;font-style: italic; text-align: right;&quot;&gt;&quot;You&#39;re pirates. Hang the code, and hang the rules.&lt;br /&gt;They&#39;re more like guidelines anyway.&quot; &lt;/p&gt; &lt;div style=&quot;&quot;&gt;&lt;div style=&quot;text-align: right;&quot;&gt;   &lt;/div&gt;&lt;p style=&quot;text-align: right;&quot;&gt;&lt;span style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;a title=&quot;Pirates of the Caribbean: The Curse of the Black Pearl&quot; href=&quot;http://www.imdb.com/Quotes?0325980&quot;&gt;Pirates of the Caribbean: The Curse of the Black Pearl&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt; &lt;p style=&quot;font-style: italic;&quot;&gt; &lt;/p&gt;&lt;br /&gt;I&#39;ll try to figure out some configuration and development process guidelines. Don&#39;t take it too seriously, it&#39;s just a guidelines :-)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;   Required infrastructure &lt;/h3&gt; Following tools and environments must be available:&lt;br /&gt;&lt;ol&gt;   &lt;li&gt;     Issue Tracking system - JIRA or BugZilla&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;     Version Control System [VCS] - Subversion, CVS, etc.   &lt;/li&gt;   &lt;li&gt;     Continuous Integration Tool [CI tool] - &lt;a href=&quot;https://hudson.dev.java.net/&quot;&gt;Hudson&lt;/a&gt;, &lt;a href=&quot;http://maven.apache.org/continuum/&quot;&gt;Continuum&lt;/a&gt; etc.   &lt;/li&gt;   &lt;li&gt;     System Test environment exists (dev-box) - for system test by development team (QA team - by request). Available for developers to deploy.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;     Integration Test environment exists (tst-box) - for QA team. Not available for developers&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;     Pre-Production (user-acceptance) environment exists (uat-box) - visible to end-uses, used by another projects within organization (clients). Maintained by Integrators&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;     Production environment (prod-box) - maintained by Integrators.   &lt;/li&gt; &lt;/ol&gt;&lt;br /&gt;&lt;h3&gt;   Project requirements &lt;/h3&gt; Project structure requires following:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;     Each system component should be buildable (build script exists)&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;     Each system component should be buildable on the remote machine using CI tool without human intervention (no manual source modifying) by schedule or forced build.   &lt;/li&gt; &lt;/ul&gt; &lt;h3&gt;   Roles &lt;/h3&gt; &lt;ul&gt;   &lt;li&gt;     Developer - works with code   &lt;/li&gt; &lt;/ul&gt; &lt;ul&gt;   &lt;li&gt;     Builder - prepares the distribution   &lt;/li&gt; &lt;/ul&gt; &lt;ul&gt;   &lt;li&gt;     Tester - tests the application   &lt;/li&gt;   &lt;li&gt;     Integrator - manages UAT and PROD environments&lt;br /&gt;&lt;/li&gt; &lt;/ul&gt; Single person may share multiple roles&lt;br /&gt;&lt;h3&gt;   The Process &lt;/h3&gt;&lt;br /&gt;&lt;ol&gt;      &lt;li&gt;     Builder gets the binaries from the CI Tool and deploys to dev-box environment.   &lt;/li&gt;   &lt;li&gt;     When internal system test passed:   &lt;/li&gt;   &lt;ol&gt;     &lt;li&gt;       Packages components, deployed to dev-box, into distribution package with build number assigned.     &lt;/li&gt;     &lt;li&gt;       Builder submits the Package to SCM or special folder.     &lt;/li&gt;     &lt;li&gt;       Builder assembles the change list (or marks issues in issue tracking system).     &lt;/li&gt;     &lt;li&gt;       Builder writes deployment instructions (if required)     &lt;/li&gt;     &lt;li&gt;       Builder sends changelist, deployment instructions and reference to the distribution package to the Tester.&lt;br /&gt; &lt;/li&gt;   &lt;/ol&gt;   &lt;li&gt;     Tester gets the package from the Builder and deploys it to Dev-box.   &lt;/li&gt;   &lt;li&gt;     Tester tests changes described in CHANGELIST or from Bug Tracking system as well as the regression tests   &lt;/li&gt;   &lt;li&gt;     If QA test passed:   &lt;/li&gt;   &lt;ol&gt;     &lt;li&gt;       Tester marks Distribution package as Release Candidate     &lt;/li&gt;&lt;li&gt;     Developers implement features and fix bugs. All changes are submitted to the VCS[Version Control System]   &lt;/li&gt;&lt;li&gt;     Tester writes Release Notes for RC.&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;     Tester sends deploys tested package together with release notes to the Integrator   &lt;/li&gt;      &lt;li&gt;     Integrator installs  RC version to  uat-box. (Integrator learns how to install the new release over existing running system.)&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;If UAT phase passed   &lt;/li&gt;   &lt;ol&gt;&lt;li&gt;     RC version is marked as release version   &lt;/li&gt;   &lt;li&gt;     Integrator installs RC version to the customer&#39;s server.&lt;/li&gt; &lt;/ol&gt;&lt;/ol&gt;I must have left something important in process.&lt;br /&gt;Comments are welcome ;-)</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/4874071509713666833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2007/08/development-process-guidelines-youre.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/4874071509713666833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/4874071509713666833'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2007/08/development-process-guidelines-youre.html' title='Development Process Guidelines'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-3173786961152202830</id><published>2007-09-03T03:03:00.000+04:00</published><updated>2007-09-03T03:53:43.930+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Coding java persistence: JPA vs. Hibernate</title><content type='html'>&lt;p&gt;In my current projects, I deal with database persistence layer. I use Hibernate implementation of the JPA 1.0 API. But restrictions of JPA API limits my ability to use some cool features of Hibernate, including&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Full control over cascade behavior;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Indexed collections;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Collections of primitive values.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&quot;Use JPA when possible, and Hibernate extensions where you can&#39;t do without&quot; is a reasonable solution, but... It smells.... Anyway, the code becomes not portable enough when using Hibernate extensions. May&amp;nbsp;be, it would be better to skip JPA and relay on Plain&amp;nbsp;Old&amp;nbsp;Hibernate&amp;nbsp;(&lt;acronym title=&quot;Plain Old Hibernate&quot;&gt;POH&lt;/acronym&gt;)?&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;XML Config vs. Annotations: Prons and Cons&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;JPA and Hibernate both supports XML mapping config and annotation config.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;XML does not require to import annotations in entity classes. It makes entities more portable. They stay a simple POJOs, without any extra dependencies. It makes possible to package them in separate jar and include as a dependency in the client tier.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Annotations make mapping config to live together with property declarations in java file. It is more readable to the developer. It make sense when you don&#39;t plan to expose your entities outside the persistence module.&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/3173786961152202830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2007/09/coding-java-persistence-jpa-vs.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3173786961152202830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/3173786961152202830'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2007/09/coding-java-persistence-jpa-vs.html' title='Coding java persistence: JPA vs. Hibernate'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-4565691774206417524</id><published>2007-08-24T12:04:00.000+04:00</published><updated>2007-08-24T12:08:58.251+04:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="development"/><category scheme="http://www.blogger.com/atom/ns#" term="java"/><title type='text'>Java Naming Conventions for Sample Project</title><content type='html'>    &lt;h1&gt;   Java Naming Conventions for Sample Project&lt;br&gt;&lt;/h1&gt;&lt;h2&gt;Java package naming &lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       com.company.project – project-wide package prefix. Should not be used directly.     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       com.company.project.web – web client package prefix     &lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt; &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;   &lt;br&gt; &lt;/p&gt; &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;   Common packages &lt;/p&gt; &lt;ul&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;span style=&quot;font-style: italic;&quot;&gt;com.company.project.commons&lt;/span&gt; – project-wide common classes, including exceptions     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;span style=&quot;font-style: italic;&quot;&gt;com.company.project.commons.util&lt;/span&gt; – project-wide gnerial purpose utilities.     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;span style=&quot;font-style: italic;&quot;&gt;com.company.project.commons.persistence&lt;/span&gt; – common classes retaled to server side persistence (Persistence API 1.0)     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;span style=&quot;font-style: italic;&quot;&gt;com.company.project.commons.ws&lt;/span&gt; – WebService related utilities.     &lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt; &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;   &lt;br&gt; &lt;/p&gt; &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;   Sub-system packages &lt;/p&gt; &lt;ul&gt;   &lt;li value=&quot;1&quot;&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;span style=&quot;font-style: italic;&quot;&gt;com.company.project.&amp;lt;subsystem&amp;gt;.&amp;lt;component&amp;gt;&lt;/span&gt; - may contain exceptions     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;span style=&quot;&quot;&gt;&lt;i&gt;domain&lt;/i&gt;&lt;/span&gt; – contains interfaces, classes and enums related to subsystem&#39;s domain model representation.     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;i&gt;persistence&lt;/i&gt; – persistnt entities should be placed here. EJB 2.1 beans too.     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;i&gt;component&lt;/i&gt; – session beans (EJB3) with CRUD logic (managers over persistence tier)     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;i&gt;util&lt;/i&gt; – various service utilities, e.g. DTO assemblers and helpers     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;i&gt;business&lt;/i&gt; – Session beans with complex logic. These classes deals with component layer and may use persistence entities POJOs as Data Transfer Objects (DTO) with lazy loading within a transaction.     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       util – various service utilities, e.g. DTO assemblers and helpers     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;i&gt;facade&lt;/i&gt; – Contains service facades. Serice facades are POJOs (preferrable) or EJB3 session beans which may access business and component layer beans.     &lt;/p&gt;     &lt;ul&gt;       &lt;li&gt;         &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;           &lt;i&gt;jaxws&lt;/i&gt; – contains JAXWS service implementations.         &lt;/p&gt;         &lt;ul&gt;           &lt;li&gt;             &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;               &lt;i&gt;skeletons&lt;/i&gt; – contains generated JAXWS interfaces             &lt;/p&gt;           &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;       &lt;li&gt;         &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;           &lt;i&gt;axis&lt;/i&gt; – contains AXIS service facade implementations         &lt;/p&gt;         &lt;ul&gt;           &lt;li&gt;             &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;               &lt;i&gt;skeletons&lt;/i&gt; – contains axis generated skeletons             &lt;/p&gt;           &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;       &lt;li&gt;         &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;           &lt;i&gt;util&lt;/i&gt; – various service utilities, e.g. DTO assemblers and helpers         &lt;/p&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       &lt;i&gt;client&lt;/i&gt; – contains (web) service clients     &lt;/p&gt;     &lt;ul&gt;       &lt;li&gt;         &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;           &lt;i&gt;jaxws &lt;/i&gt;&lt;span style=&quot;font-style: normal;&quot;&gt;– contains JAXWS service client&lt;/span&gt;&lt;i&gt;.&lt;/i&gt;         &lt;/p&gt;         &lt;ul&gt;           &lt;li&gt;             &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;               &lt;i&gt;stubs &lt;/i&gt;&lt;span style=&quot;font-style: normal;&quot;&gt;– contains jaxws generated sstubs&lt;/span&gt;             &lt;/p&gt;           &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;       &lt;li&gt;         &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;           &lt;i&gt;axis&lt;/i&gt; – contains AXIS service client.         &lt;/p&gt;         &lt;ul&gt;           &lt;li&gt;             &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;               &lt;i&gt;stubs&lt;/i&gt; – contains axis generated stubs             &lt;/p&gt;           &lt;/li&gt;         &lt;/ul&gt;       &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt; &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;   &lt;br&gt; &lt;/p&gt; &lt;h2 class=&quot;western&quot;&gt;   Java class naming &lt;/h2&gt; &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;   Following conventions should be applied to class naming: &lt;/p&gt; &lt;ul&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       Persistent entity should have an «Entity» suffix     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       Session beans should have an interface and implementation: FooManager and FooManagerBean     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       WebServices session bean implementation should be named with suffix FooPortImpl. If it&#39;s a session bean – FooPortBean.     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       Factories should have a «Factory» suffix     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       We use the following names for the parts of an entity / session bean:     &lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt; &lt;ol&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       Enterprise bean class: &amp;lt;name&amp;gt;Bean     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       Local home interface: &amp;lt;name&amp;gt;Home     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       Local interface: &amp;lt;name&amp;gt;.     &lt;/p&gt;   &lt;/li&gt; &lt;/ol&gt; &lt;ul&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       Accessor methods of an enterprise bean class should be grouped by field     &lt;/p&gt;   &lt;/li&gt;   &lt;li&gt;     &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;       ...     &lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt; &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;   &lt;br&gt; &lt;/p&gt; &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;   &lt;br&gt; &lt;/p&gt; &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;   &lt;br&gt; &lt;/p&gt; &lt;p style=&quot;margin-bottom: 0in;&quot;&gt;   &lt;br&gt; &lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/4565691774206417524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2007/08/java-naming-conventions-for-sample.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/4565691774206417524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/4565691774206417524'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2007/08/java-naming-conventions-for-sample.html' title='Java Naming Conventions for Sample Project'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-821474282770453876</id><published>2007-05-23T14:13:00.001+04:00</published><updated>2015-01-03T15:04:31.532+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="web services"/><title type='text'>Configuring WS-Security for Axis 1.4 client</title><content type='html'>

I was looking how to enable WS-Security features in the Axis client to my web service application. The &lt;a href=&quot;http://www.arcwebservices.com/v2006/help/samples/wssecurity_axis.htm&quot;&gt;article&lt;/a&gt;  I found describes how to do this.&lt;br /&gt;
&lt;br /&gt;
I have tested it with Axis 1.4 client.&lt;br /&gt;
&lt;br /&gt;
The things you need to configure axis client are:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Copy wss4j.jar (rev. 1.5.1), opensaml-1.1.jar and xmlsec-20050514.jar (from the openSAML distribution) to classpath (WEB-INF/lib)&lt;/li&gt;
&lt;li&gt;Add handler to client.wsdd:&lt;br /&gt;
&lt;code&gt;&lt;br /&gt;
&amp;lt;!-- Using the WSDoAllSender security   handler in request flow --&gt;&lt;br /&gt;
&amp;lt;deployment xmlns=&quot;http://xml.apache.org/axis/wsdd/&quot; java=&quot;http://xml.apache.org/axis/wsdd/providers/java&quot;&amp;gt;&lt;br /&gt;
 &amp;lt;transport name=&quot;http&quot; pivot=&quot;java:org.apache.axis.transport.http.HTTPSender&quot;&amp;gt;&lt;br /&gt;
  &amp;lt;globalconfiguration&amp;gt;&lt;br /&gt;
   &amp;lt;requestflow&amp;gt;&lt;br /&gt;
    &amp;lt;handler type=&quot;java:org.apache.ws.axis.security.WSDoAllSender&quot;&amp;gt;&lt;br /&gt;
     &amp;lt;parameter name=&quot;action&quot; value=&quot;UsernameToken&quot;&amp;gt;&lt;br /&gt;
     &amp;lt;parameter name=&quot;passwordType&quot; value=&quot;PasswordDigest&quot;&amp;gt;&lt;br /&gt;
     &amp;lt;parameter name=&quot;mustUnderstand&quot; value=&quot;false&quot;&amp;gt;&lt;br /&gt;
    &amp;lt;/handler&amp;gt;&lt;br /&gt;
   &amp;lt;/requestflow&amp;gt;&lt;br /&gt;
  &amp;lt;/globalconfiguration&amp;gt;&lt;br /&gt;
 &amp;lt;/transport&amp;gt;&lt;br /&gt;
&amp;lt;/deployment&amp;gt&lt;br /&gt;
&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
You dont need to hardcode username and password as a handler parameters as described in the &lt;a href=&quot;http://www.arcwebservices.com/v2006/help/samples/wssecurity_axis.htm&quot;&gt;article&lt;/a&gt;. Just call setUsername(...) and setPassword(...) methods of your Stub.

&lt;script&gt;
var redirected = true;
window.location.replace(&#39;http://blog.konstantinpavlov.net/blog/2007/05/23/configuring-ws-security-for-axis-14?utm_source=blogger&#39;);
&lt;/script&gt;</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/821474282770453876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2007/05/configuring-ws-security-for-axis-14.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/821474282770453876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/821474282770453876'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2007/05/configuring-ws-security-for-axis-14.html' title='Configuring WS-Security for Axis 1.4 client'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4460194782217289102.post-5435724886500748460</id><published>2007-03-02T12:50:00.000+03:00</published><updated>2007-03-02T12:58:28.371+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="java"/><category scheme="http://www.blogger.com/atom/ns#" term="jboss"/><category scheme="http://www.blogger.com/atom/ns#" term="web services"/><title type='text'>JBoss Web Services 1.2.0 has been released</title><content type='html'>There are a lot of issues were closed, but there are still ones that annoys.&lt;br /&gt;For example, abstract complexTypes are not supported: &lt;a href=&quot;http://jira.jboss.com/jira/browse/JBWS-1554&quot;&gt;JBWS-1554&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Important note&lt;/span&gt;: when using wstools for wsdl2java generation, don&#39;t forget to change &quot;file&quot; attribute to &quot;location&quot; in wstools-config.xml. In other case, you&#39;ll see NPE while instatiating java.io.File</content><link rel='replies' type='application/atom+xml' href='http://maestro-lab.blogspot.com/feeds/5435724886500748460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://maestro-lab.blogspot.com/2007/03/jboss-web-services-120-has-been.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/5435724886500748460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4460194782217289102/posts/default/5435724886500748460'/><link rel='alternate' type='text/html' href='http://maestro-lab.blogspot.com/2007/03/jboss-web-services-120-has-been.html' title='JBoss Web Services 1.2.0 has been released'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>