<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Martin Matula&#039;s Blog</title>
	<atom:link href="http://blog.alutam.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.alutam.com</link>
	<description></description>
	<lastBuildDate>Sat, 31 Oct 2009 13:14:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
   <image>
    <title>Martin Matula&#039;s Blog</title>
    <url>http://www.gravatar.com/avatar/fe13f36272d010f4b3c09e477a620991?s=</url>
    <link>http://blog.alutam.com</link>
   </image>
		<item>
		<title>Reading Password-Protected ZIP Files in Java</title>
		<link>http://blog.alutam.com/2009/10/31/reading-password-protected-zip-files-in-java/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://blog.alutam.com/2009/10/31/reading-password-protected-zip-files-in-java/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 12:13:34 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Password]]></category>
		<category><![CDATA[ZIP]]></category>

		<guid isPermaLink="false">http://blog.alutam.com/?p=102</guid>
		<description><![CDATA[On a recent &#8220;fun&#8221; project, I needed my application to be able to access password-protected zip files of a particular format. It was one of these features I thought will take me no time to implement. Anyway, to my surprise, neither JDK supports password-protected ZIP files, nor I was able to find a suitable Java [...]]]></description>
			<content:encoded><![CDATA[<p>On a recent &#8220;fun&#8221; project, I needed my application to be able to access password-protected zip files of a particular format. It was one of these features I thought will take me no time to implement. Anyway, to my surprise, neither JDK supports password-protected ZIP files, nor I was able to find a suitable Java open source library I could use for that purpose. So, I ended up writing the utility class on my own. I wrote an implementation of <code>java.io.InputStream</code> that filters the ZIP file data and turns a password-protected ZIP into an unprotected one on the fly &#8211; so the stream can be nicely chained with <code>java.util.zip.ZipInputStream</code>. Although the class is specifically targeted at the particular type of ZIP files I had to deal with (see the limitations below), maybe other people have to deal with the same type of files, or this class can provide a good start for others to turn it into a utility that would work with any type of ZIP (maybe I will do it myself some day &#8211; for now I don&#8217;t have time).<br />
To implement this class I used the <a href="http://www.pkware.com/documents/casestudies/APPNOTE.TXT">ZIP File Format Specification</a> as the source of information. I also used the <a href="http://www.7-zip.org/">7-zip project</a> (C++) as a reference during the debugging to verify my understanding of the ZIP spec. and the CRC algorithm.<br />
So, here is the class:</p>
<div class="codebox">
<pre><span class="Include">import java.io.IOException;</span>
<span class="Include">import java.io.InputStream;</span>

<span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">ZipDecryptInputStream</span> <span class="ReservedWord">extends</span> <span class="Identifier">InputStream</span> <span class="Braces">{</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="ReservedWord">int</span><span class="Braces">[</span><span class="Braces">]</span> <span class="Identifier">CRC_TABLE</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="ReservedWord">int</span><span class="Braces">[</span><span class="Numeric">256</span><span class="Braces">]</span><span class="Symbol">;</span>
    <span class="Comment">// compute the table</span>
    <span class="Comment">// (could also have it pre-computed - see http://snippets.dzone.com/tag/crc32)</span>
    <span class="ReservedWord">static</span> <span class="Braces">{</span>
        <span class="ReservedWord">for</span> <span class="Braces">(</span><span class="ReservedWord">int</span> <span class="Identifier">i</span> <span class="Symbol">=</span> <span class="Numeric">0</span><span class="Symbol">;</span> <span class="Identifier">i</span> <span class="Symbol">&lt;</span> <span class="Numeric">256</span><span class="Symbol">;</span> <span class="Identifier">i</span><span class="Symbol">+</span><span class="Symbol">+</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="ReservedWord">int</span> <span class="Identifier">r</span> <span class="Symbol">=</span> <span class="Identifier">i</span><span class="Symbol">;</span>
            <span class="ReservedWord">for</span> <span class="Braces">(</span><span class="ReservedWord">int</span> <span class="Identifier">j</span> <span class="Symbol">=</span> <span class="Numeric">0</span><span class="Symbol">;</span> <span class="Identifier">j</span> <span class="Symbol">&lt;</span> <span class="Numeric">8</span><span class="Symbol">;</span> <span class="Identifier">j</span><span class="Symbol">+</span><span class="Symbol">+</span><span class="Braces">)</span> <span class="Braces">{</span>
                <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Braces">(</span><span class="Identifier">r</span> <span class="Symbol">&amp;</span> <span class="Numeric">1</span><span class="Braces">)</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="Numeric">1</span><span class="Braces">)</span> <span class="Braces">{</span>
                    <span class="Identifier">r</span> <span class="Symbol">=</span> <span class="Braces">(</span><span class="Identifier">r</span> <span class="Symbol">&gt;</span><span class="Symbol">&gt;</span><span class="Symbol">&gt;</span> <span class="Numeric">1</span><span class="Braces">)</span> ^ <span class="Numeric">0xedb88320</span><span class="Symbol">;</span>
                <span class="Braces">}</span> <span class="ReservedWord">else</span> <span class="Braces">{</span>
                    <span class="Identifier">r</span> <span class="Symbol">&gt;</span><span class="Symbol">&gt;</span><span class="Symbol">&gt;</span><span class="Symbol">=</span> <span class="Numeric">1</span><span class="Symbol">;</span>
                <span class="Braces">}</span>
            <span class="Braces">}</span>
            <span class="Identifier">CRC_TABLE</span><span class="Braces">[</span><span class="Identifier">i</span><span class="Braces">]</span> <span class="Symbol">=</span> <span class="Identifier">r</span><span class="Symbol">;</span>
        <span class="Braces">}</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="ReservedWord">int</span> <span class="Identifier">DECRYPT_HEADER_SIZE</span> <span class="Symbol">=</span> <span class="Numeric">12</span><span class="Symbol">;</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="ReservedWord">int</span><span class="Braces">[</span><span class="Braces">]</span> <span class="Identifier">LFH_SIGNATURE</span> <span class="Symbol">=</span> <span class="Braces">{</span><span class="Numeric">0x50</span>, <span class="Numeric">0x4b</span>, <span class="Numeric">0x03</span>, <span class="Numeric">0x04</span><span class="Braces">}</span><span class="Symbol">;</span>

    <span class="ReservedWord">private</span> <span class="ReservedWord">final</span> <span class="Identifier">InputStream</span> <span class="Identifier">delegate</span><span class="Symbol">;</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">final</span> <span class="Identifier">String</span> <span class="Identifier">password</span><span class="Symbol">;</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">final</span> <span class="ReservedWord">int</span> <span class="Identifier">keys</span><span class="Braces">[</span><span class="Braces">]</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="ReservedWord">int</span><span class="Braces">[</span><span class="Numeric">3</span><span class="Braces">]</span><span class="Symbol">;</span>

    <span class="ReservedWord">private</span> <span class="Identifier">State</span> <span class="Identifier">state</span> <span class="Symbol">=</span> <span class="Identifier">State</span>.<span class="Identifier">SIGNATURE</span><span class="Symbol">;</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">int</span> <span class="Identifier">skipBytes</span><span class="Symbol">;</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">int</span> <span class="Identifier">compressedSize</span><span class="Symbol">;</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">int</span> <span class="Identifier">value</span><span class="Symbol">;</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">int</span> <span class="Identifier">valuePos</span><span class="Symbol">;</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">int</span> <span class="Identifier">valueInc</span><span class="Symbol">;</span>

    <span class="ReservedWord">public</span> <span class="Identifier">ZipDecryptInputStream</span><span class="Braces">(</span><span class="Identifier">InputStream</span> <span class="Identifier">stream</span>, <span class="Identifier">String</span> <span class="Identifier">password</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="ReservedWord">this</span>.<span class="Identifier">delegate</span> <span class="Symbol">=</span> <span class="Identifier">stream</span><span class="Symbol">;</span>
        <span class="ReservedWord">this</span>.<span class="Identifier">password</span> <span class="Symbol">=</span> <span class="Identifier">password</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    @<span class="Identifier">Override</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">int</span> <span class="Identifier">read</span><span class="Braces">(</span><span class="Braces">)</span> <span class="ReservedWord">throws</span> <span class="Identifier">IOException</span> <span class="Braces">{</span>
        <span class="ReservedWord">int</span> <span class="Identifier">result</span> <span class="Symbol">=</span> <span class="Identifier">delegate</span>.<span class="Identifier">read</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">skipBytes</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="Numeric">0</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="ReservedWord">switch</span> <span class="Braces">(</span><span class="Identifier">state</span><span class="Braces">)</span> <span class="Braces">{</span>
                <span class="ReservedWord">case</span> <span class="Identifier">SIGNATURE</span><span class="Symbol">:</span>
                    <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">result</span> <span class="Symbol">!</span><span class="Symbol">=</span> <span class="Identifier">LFH_SIGNATURE</span><span class="Braces">[</span><span class="Identifier">valuePos</span><span class="Braces">]</span><span class="Braces">)</span> <span class="Braces">{</span>
                        <span class="Identifier">state</span> <span class="Symbol">=</span> <span class="Identifier">State</span>.<span class="Identifier">TAIL</span><span class="Symbol">;</span>
                    <span class="Braces">}</span> <span class="ReservedWord">else</span> <span class="Braces">{</span>
                        <span class="Identifier">valuePos</span><span class="Symbol">+</span><span class="Symbol">+</span><span class="Symbol">;</span>
                        <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">valuePos</span> <span class="Symbol">&gt;</span><span class="Symbol">=</span> <span class="Identifier">LFH_SIGNATURE</span>.<span class="Identifier">length</span><span class="Braces">)</span> <span class="Braces">{</span>
                            <span class="Identifier">skipBytes</span> <span class="Symbol">=</span> <span class="Numeric">2</span><span class="Symbol">;</span>
                            <span class="Identifier">state</span> <span class="Symbol">=</span> <span class="Identifier">State</span>.<span class="Identifier">FLAGS</span><span class="Symbol">;</span>
                        <span class="Braces">}</span>
                    <span class="Braces">}</span>
                    <span class="ReservedWord">break</span><span class="Symbol">;</span>
                <span class="ReservedWord">case</span> <span class="Identifier">FLAGS</span><span class="Symbol">:</span>
                    <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Braces">(</span><span class="Identifier">result</span> <span class="Symbol">&amp;</span> <span class="Numeric">1</span><span class="Braces">)</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="Numeric">0</span><span class="Braces">)</span> <span class="Braces">{</span>
                        <span class="ReservedWord">throw</span> <span class="ReservedWord">new</span> <span class="Identifier">IllegalStateException</span><span class="Braces">(</span><span class="String">&quot;ZIP not password protected.&quot;</span><span class="Braces">)</span><span class="Symbol">;</span>
                    <span class="Braces">}</span>
                    <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Braces">(</span><span class="Identifier">result</span> <span class="Symbol">&amp;</span> <span class="Numeric">64</span><span class="Braces">)</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="Numeric">64</span><span class="Braces">)</span> <span class="Braces">{</span>
                        <span class="ReservedWord">throw</span> <span class="ReservedWord">new</span> <span class="Identifier">IllegalStateException</span><span class="Braces">(</span><span class="String">&quot;Strong encryption used.&quot;</span><span class="Braces">)</span><span class="Symbol">;</span>
                    <span class="Braces">}</span>
                    <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Braces">(</span><span class="Identifier">result</span> <span class="Symbol">&amp;</span> <span class="Numeric">8</span><span class="Braces">)</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="Numeric">8</span><span class="Braces">)</span> <span class="Braces">{</span>
                        <span class="ReservedWord">throw</span> <span class="ReservedWord">new</span> <span class="Identifier">IllegalStateException</span><span class="Braces">(</span><span class="String">&quot;Unsupported ZIP format.&quot;</span><span class="Braces">)</span><span class="Symbol">;</span>
                    <span class="Braces">}</span>
                    <span class="Identifier">result</span> <span class="Symbol">-</span><span class="Symbol">=</span> <span class="Numeric">1</span><span class="Symbol">;</span>
                    <span class="Identifier">compressedSize</span> <span class="Symbol">=</span> <span class="Numeric">0</span><span class="Symbol">;</span>
                    <span class="Identifier">valuePos</span> <span class="Symbol">=</span> <span class="Numeric">0</span><span class="Symbol">;</span>
                    <span class="Identifier">valueInc</span> <span class="Symbol">=</span> <span class="Identifier">DECRYPT_HEADER_SIZE</span><span class="Symbol">;</span>
                    <span class="Identifier">state</span> <span class="Symbol">=</span> <span class="Identifier">State</span>.<span class="Identifier">COMPRESSED_SIZE</span><span class="Symbol">;</span>
                    <span class="Identifier">skipBytes</span> <span class="Symbol">=</span> <span class="Numeric">11</span><span class="Symbol">;</span>
                    <span class="ReservedWord">break</span><span class="Symbol">;</span>
                <span class="ReservedWord">case</span> <span class="Identifier">COMPRESSED_SIZE</span><span class="Symbol">:</span>
                    <span class="Identifier">compressedSize</span> <span class="Symbol">+</span><span class="Symbol">=</span> <span class="Identifier">result</span> <span class="Symbol">&lt;</span><span class="Symbol">&lt;</span> <span class="Braces">(</span><span class="Numeric">8</span> <span class="Symbol">*</span> <span class="Identifier">valuePos</span><span class="Braces">)</span><span class="Symbol">;</span>
                    <span class="Identifier">result</span> <span class="Symbol">-</span><span class="Symbol">=</span> <span class="Identifier">valueInc</span><span class="Symbol">;</span>
                    <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">result</span> <span class="Symbol">&lt;</span> <span class="Numeric">0</span><span class="Braces">)</span> <span class="Braces">{</span>
                        <span class="Identifier">valueInc</span> <span class="Symbol">=</span> <span class="Numeric">1</span><span class="Symbol">;</span>
                        <span class="Identifier">result</span> <span class="Symbol">+</span><span class="Symbol">=</span> <span class="Numeric">256</span><span class="Symbol">;</span>
                    <span class="Braces">}</span> <span class="ReservedWord">else</span> <span class="Braces">{</span>
                        <span class="Identifier">valueInc</span> <span class="Symbol">=</span> <span class="Numeric">0</span><span class="Symbol">;</span>
                    <span class="Braces">}</span>
                    <span class="Identifier">valuePos</span><span class="Symbol">+</span><span class="Symbol">+</span><span class="Symbol">;</span>
                    <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">valuePos</span> <span class="Symbol">&gt;</span> <span class="Numeric">3</span><span class="Braces">)</span> <span class="Braces">{</span>
                        <span class="Identifier">valuePos</span> <span class="Symbol">=</span> <span class="Numeric">0</span><span class="Symbol">;</span>
                        <span class="Identifier">value</span> <span class="Symbol">=</span> <span class="Numeric">0</span><span class="Symbol">;</span>
                        <span class="Identifier">state</span> <span class="Symbol">=</span> <span class="Identifier">State</span>.<span class="Identifier">FN_LENGTH</span><span class="Symbol">;</span>
                        <span class="Identifier">skipBytes</span> <span class="Symbol">=</span> <span class="Numeric">4</span><span class="Symbol">;</span>
                    <span class="Braces">}</span>
                    <span class="ReservedWord">break</span><span class="Symbol">;</span>
                <span class="ReservedWord">case</span> <span class="Identifier">FN_LENGTH</span><span class="Symbol">:</span>
                <span class="ReservedWord">case</span> <span class="Identifier">EF_LENGTH</span><span class="Symbol">:</span>
                    <span class="Identifier">value</span> <span class="Symbol">+</span><span class="Symbol">=</span> <span class="Identifier">result</span> <span class="Symbol">&lt;</span><span class="Symbol">&lt;</span> <span class="Numeric">8</span> <span class="Symbol">*</span> <span class="Identifier">valuePos</span><span class="Symbol">;</span>
                    <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">valuePos</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="Numeric">1</span><span class="Braces">)</span> <span class="Braces">{</span>
                        <span class="Identifier">valuePos</span> <span class="Symbol">=</span> <span class="Numeric">0</span><span class="Symbol">;</span>
                        <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">state</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="Identifier">State</span>.<span class="Identifier">FN_LENGTH</span><span class="Braces">)</span> <span class="Braces">{</span>
                            <span class="Identifier">state</span> <span class="Symbol">=</span> <span class="Identifier">State</span>.<span class="Identifier">EF_LENGTH</span><span class="Symbol">;</span>
                        <span class="Braces">}</span> <span class="ReservedWord">else</span> <span class="Braces">{</span>
                            <span class="Identifier">state</span> <span class="Symbol">=</span> <span class="Identifier">State</span>.<span class="Identifier">HEADER</span><span class="Symbol">;</span>
                            <span class="Identifier">skipBytes</span> <span class="Symbol">=</span> <span class="Identifier">value</span><span class="Symbol">;</span>
                        <span class="Braces">}</span>
                    <span class="Braces">}</span> <span class="ReservedWord">else</span> <span class="Braces">{</span>
                        <span class="Identifier">valuePos</span> <span class="Symbol">=</span> <span class="Numeric">1</span><span class="Symbol">;</span>
                    <span class="Braces">}</span>
                    <span class="ReservedWord">break</span><span class="Symbol">;</span>
                <span class="ReservedWord">case</span> <span class="Identifier">HEADER</span><span class="Symbol">:</span>
                    <span class="Identifier">initKeys</span><span class="Braces">(</span><span class="Identifier">password</span><span class="Braces">)</span><span class="Symbol">;</span>
                    <span class="ReservedWord">for</span> <span class="Braces">(</span><span class="ReservedWord">int</span> <span class="Identifier">i</span> <span class="Symbol">=</span> <span class="Numeric">0</span><span class="Symbol">;</span> <span class="Identifier">i</span> <span class="Symbol">&lt;</span> <span class="Identifier">DECRYPT_HEADER_SIZE</span><span class="Symbol">;</span> <span class="Identifier">i</span><span class="Symbol">+</span><span class="Symbol">+</span><span class="Braces">)</span> <span class="Braces">{</span>
                        <span class="Identifier">updateKeys</span><span class="Braces">(</span><span class="Braces">(</span><span class="ReservedWord">byte</span><span class="Braces">)</span> <span class="Braces">(</span><span class="Identifier">result</span> ^ <span class="Identifier">decryptByte</span><span class="Braces">(</span><span class="Braces">)</span><span class="Braces">)</span><span class="Braces">)</span><span class="Symbol">;</span>
                        <span class="Identifier">result</span> <span class="Symbol">=</span> <span class="Identifier">delegate</span>.<span class="Identifier">read</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
                    <span class="Braces">}</span>
                    <span class="Identifier">compressedSize</span> <span class="Symbol">-</span><span class="Symbol">=</span> <span class="Identifier">DECRYPT_HEADER_SIZE</span><span class="Symbol">;</span>
                    <span class="Identifier">state</span> <span class="Symbol">=</span> <span class="Identifier">State</span>.<span class="Identifier">DATA</span><span class="Symbol">;</span>
                    <span class="Comment">// intentionally no break</span>
                <span class="ReservedWord">case</span> <span class="Identifier">DATA</span><span class="Symbol">:</span>
                    <span class="Identifier">result</span> <span class="Symbol">=</span> <span class="Braces">(</span><span class="Identifier">result</span> ^ <span class="Identifier">decryptByte</span><span class="Braces">(</span><span class="Braces">)</span><span class="Braces">)</span> <span class="Symbol">&amp;</span> <span class="Numeric">0xff</span><span class="Symbol">;</span>
                    <span class="Identifier">updateKeys</span><span class="Braces">(</span><span class="Braces">(</span><span class="ReservedWord">byte</span><span class="Braces">)</span> <span class="Identifier">result</span><span class="Braces">)</span><span class="Symbol">;</span>
                    <span class="Identifier">compressedSize</span><span class="Symbol">-</span><span class="Symbol">-</span><span class="Symbol">;</span>
                    <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">compressedSize</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="Numeric">0</span><span class="Braces">)</span> <span class="Braces">{</span>
                        <span class="Identifier">valuePos</span> <span class="Symbol">=</span> <span class="Numeric">0</span><span class="Symbol">;</span>
                        <span class="Identifier">state</span> <span class="Symbol">=</span> <span class="Identifier">State</span>.<span class="Identifier">SIGNATURE</span><span class="Symbol">;</span>
                    <span class="Braces">}</span>
                    <span class="ReservedWord">break</span><span class="Symbol">;</span>
                <span class="ReservedWord">case</span> <span class="Identifier">TAIL</span><span class="Symbol">:</span>
                    <span class="Comment">// do nothing</span>
            <span class="Braces">}</span>
        <span class="Braces">}</span> <span class="ReservedWord">else</span> <span class="Braces">{</span>
            <span class="Identifier">skipBytes</span><span class="Symbol">-</span><span class="Symbol">-</span><span class="Symbol">;</span>
        <span class="Braces">}</span>
        <span class="ReservedWord">return</span> <span class="Identifier">result</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    @<span class="Identifier">Override</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">void</span> <span class="Identifier">close</span><span class="Braces">(</span><span class="Braces">)</span> <span class="ReservedWord">throws</span> <span class="Identifier">IOException</span> <span class="Braces">{</span>
        <span class="Identifier">delegate</span>.<span class="Identifier">close</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="ReservedWord">super</span>.<span class="Identifier">close</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">private</span> <span class="ReservedWord">void</span> <span class="Identifier">initKeys</span><span class="Braces">(</span><span class="Identifier">String</span> <span class="Identifier">password</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">0</span><span class="Braces">]</span> <span class="Symbol">=</span> <span class="Numeric">305419896</span><span class="Symbol">;</span>
        <span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">1</span><span class="Braces">]</span> <span class="Symbol">=</span> <span class="Numeric">591751049</span><span class="Symbol">;</span>
        <span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">2</span><span class="Braces">]</span> <span class="Symbol">=</span> <span class="Numeric">878082192</span><span class="Symbol">;</span>
        <span class="ReservedWord">for</span> <span class="Braces">(</span><span class="ReservedWord">int</span> <span class="Identifier">i</span> <span class="Symbol">=</span> <span class="Numeric">0</span><span class="Symbol">;</span> <span class="Identifier">i</span> <span class="Symbol">&lt;</span> <span class="Identifier">password</span>.<span class="Identifier">length</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span> <span class="Identifier">i</span><span class="Symbol">+</span><span class="Symbol">+</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Identifier">updateKeys</span><span class="Braces">(</span><span class="Braces">(</span><span class="ReservedWord">byte</span><span class="Braces">)</span> <span class="Braces">(</span><span class="Identifier">password</span>.<span class="Identifier">charAt</span><span class="Braces">(</span><span class="Identifier">i</span><span class="Braces">)</span> <span class="Symbol">&amp;</span> <span class="Numeric">0xff</span><span class="Braces">)</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Braces">}</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">private</span> <span class="ReservedWord">void</span> <span class="Identifier">updateKeys</span><span class="Braces">(</span><span class="ReservedWord">byte</span> <span class="Identifier">charAt</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">0</span><span class="Braces">]</span> <span class="Symbol">=</span> <span class="Identifier">crc32</span><span class="Braces">(</span><span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">0</span><span class="Braces">]</span>, <span class="Identifier">charAt</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">1</span><span class="Braces">]</span> <span class="Symbol">+</span><span class="Symbol">=</span> <span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">0</span><span class="Braces">]</span> <span class="Symbol">&amp;</span> <span class="Numeric">0xff</span><span class="Symbol">;</span>
        <span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">1</span><span class="Braces">]</span> <span class="Symbol">=</span> <span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">1</span><span class="Braces">]</span> <span class="Symbol">*</span> <span class="Numeric">134775813</span> <span class="Symbol">+</span> <span class="Numeric">1</span><span class="Symbol">;</span>
        <span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">2</span><span class="Braces">]</span> <span class="Symbol">=</span> <span class="Identifier">crc32</span><span class="Braces">(</span><span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">2</span><span class="Braces">]</span>, <span class="Braces">(</span><span class="ReservedWord">byte</span><span class="Braces">)</span> <span class="Braces">(</span><span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">1</span><span class="Braces">]</span> <span class="Symbol">&gt;</span><span class="Symbol">&gt;</span> <span class="Numeric">24</span><span class="Braces">)</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">private</span> <span class="ReservedWord">byte</span> <span class="Identifier">decryptByte</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="ReservedWord">int</span> <span class="Identifier">temp</span> <span class="Symbol">=</span> <span class="Identifier">keys</span><span class="Braces">[</span><span class="Numeric">2</span><span class="Braces">]</span> <span class="Symbol">|</span> <span class="Numeric">2</span><span class="Symbol">;</span>
        <span class="ReservedWord">return</span> <span class="Braces">(</span><span class="ReservedWord">byte</span><span class="Braces">)</span> <span class="Braces">(</span><span class="Braces">(</span><span class="Identifier">temp</span> <span class="Symbol">*</span> <span class="Braces">(</span><span class="Identifier">temp</span> ^ <span class="Numeric">1</span><span class="Braces">)</span><span class="Braces">)</span> <span class="Symbol">&gt;</span><span class="Symbol">&gt;</span><span class="Symbol">&gt;</span> <span class="Numeric">8</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">private</span> <span class="ReservedWord">int</span> <span class="Identifier">crc32</span><span class="Braces">(</span><span class="ReservedWord">int</span> <span class="Identifier">oldCrc</span>, <span class="ReservedWord">byte</span> <span class="Identifier">charAt</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="ReservedWord">return</span> <span class="Braces">(</span><span class="Braces">(</span><span class="Identifier">oldCrc</span> <span class="Symbol">&gt;</span><span class="Symbol">&gt;</span><span class="Symbol">&gt;</span> <span class="Numeric">8</span><span class="Braces">)</span> ^ <span class="Identifier">CRC_TABLE</span><span class="Braces">[</span><span class="Braces">(</span><span class="Identifier">oldCrc</span> ^ <span class="Identifier">charAt</span><span class="Braces">)</span> <span class="Symbol">&amp;</span> <span class="Numeric">0xff</span><span class="Braces">]</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="Identifier">enum</span> <span class="Identifier">State</span> <span class="Braces">{</span>
        <span class="Identifier">SIGNATURE</span>, <span class="Identifier">FLAGS</span>, <span class="Identifier">COMPRESSED_SIZE</span>, <span class="Identifier">FN_LENGTH</span>, <span class="Identifier">EF_LENGTH</span>, <span class="Identifier">HEADER</span>, <span class="Identifier">DATA</span>, <span class="Identifier">TAIL</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
<p>These are the limitations:</p>
<ul>
<li>Only the &#8220;Traditional PKWARE Encryption&#8221; is supported (spec. section VII)</li>
<li>Files that have the &#8220;compressed length&#8221; information at the end of the data section (rather than at the beginning) are not supported (see &#8220;general purpose bit flag&#8221;, bit 3 in section V, subsection J in the spec.)</li>
</ul>
<p>And this is how you can use it in your code:</p>
<div class="codebox">
<pre><span class="Include">import java.io.FileInputStream;</span>
<span class="Include">import java.io.FileOutputStream;</span>
<span class="Include">import java.io.IOException;</span>
<span class="Include">import java.util.zip.ZipEntry;</span>
<span class="Include">import java.util.zip.ZipInputStream;</span>

<span class="Comment">// usage: java Main [filename] [password]</span>
<span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">Main</span> <span class="Braces">{</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">static</span> <span class="ReservedWord">void</span> <span class="Identifier">main</span><span class="Braces">(</span><span class="Identifier">String</span><span class="Braces">[</span><span class="Braces">]</span> <span class="Identifier">args</span><span class="Braces">)</span> <span class="ReservedWord">throws</span> <span class="Identifier">IOException</span> <span class="Braces">{</span>
        <span class="Comment">// password-protected zip file I need to read</span>
        <span class="Identifier">FileInputStream</span> <span class="Identifier">fis</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="Identifier">FileInputStream</span><span class="Braces">(</span><span class="Identifier">args</span><span class="Braces">[</span><span class="Numeric">0</span><span class="Braces">]</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// wrap it in the decrypt stream</span>
        <span class="Identifier">ZipDecryptInputStream</span> <span class="Identifier">zdis</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="Identifier">ZipDecryptInputStream</span><span class="Braces">(</span><span class="Identifier">fis</span>, <span class="Identifier">args</span><span class="Braces">[</span><span class="Numeric">1</span><span class="Braces">]</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// wrap the decrypt stream by the ZIP input stream</span>
        <span class="Identifier">ZipInputStream</span> <span class="Identifier">zis</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="Identifier">ZipInputStream</span><span class="Braces">(</span><span class="Identifier">zdis</span><span class="Braces">)</span><span class="Symbol">;</span>

        <span class="Comment">// read all the zip entries and save them as files</span>
        <span class="Identifier">ZipEntry</span> <span class="Identifier">ze</span><span class="Symbol">;</span>
        <span class="ReservedWord">while</span> <span class="Braces">(</span><span class="Braces">(</span><span class="Identifier">ze</span> <span class="Symbol">=</span> <span class="Identifier">zis</span>.<span class="Identifier">getNextEntry</span><span class="Braces">(</span><span class="Braces">)</span><span class="Braces">)</span> <span class="Symbol">!</span><span class="Symbol">=</span> <span class="ReservedWord">null</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Identifier">FileOutputStream</span> <span class="Identifier">fos</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="Identifier">FileOutputStream</span><span class="Braces">(</span><span class="Identifier">ze</span>.<span class="Identifier">getName</span><span class="Braces">(</span><span class="Braces">)</span><span class="Braces">)</span><span class="Symbol">;</span>
            <span class="ReservedWord">int</span> <span class="Identifier">b</span><span class="Symbol">;</span>
            <span class="ReservedWord">while</span> <span class="Braces">(</span><span class="Braces">(</span><span class="Identifier">b</span> <span class="Symbol">=</span> <span class="Identifier">zis</span>.<span class="Identifier">read</span><span class="Braces">(</span><span class="Braces">)</span><span class="Braces">)</span> <span class="Symbol">!</span><span class="Symbol">=</span> <span class="Symbol">-</span><span class="Numeric">1</span><span class="Braces">)</span> <span class="Braces">{</span>
                <span class="Identifier">fos</span>.<span class="Identifier">write</span><span class="Braces">(</span><span class="Identifier">b</span><span class="Braces">)</span><span class="Symbol">;</span>
            <span class="Braces">}</span>
            <span class="Identifier">fos</span>.<span class="Identifier">close</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
            <span class="Identifier">zis</span>.<span class="Identifier">closeEntry</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Braces">}</span>
        <span class="Identifier">zis</span>.<span class="Identifier">close</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.alutam.com/2009/10/31/reading-password-protected-zip-files-in-java/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Jersey Hands-On Lab</title>
		<link>http://blog.alutam.com/2009/09/16/jersey-hands-on-lab/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://blog.alutam.com/2009/09/16/jersey-hands-on-lab/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 19:31:49 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[REST]]></category>
		<category><![CDATA[JavaOne]]></category>
		<category><![CDATA[JAX-RS]]></category>
		<category><![CDATA[Jersey]]></category>

		<guid isPermaLink="false">http://blog.alutam.com/?p=94</guid>
		<description><![CDATA[Earlier this year, me and Naresh created an introductory level Jersey hands-on lab for JavaOne &#8216;09. As I realized just recently, the hands-on labs had been made available for download to all SDN members (free registration) shortly after JavaOne. It may be another useful resource for you to get started with Jersey. The lab provides [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier this year, me and <a href="http://blogs.sun.com/naresh/">Naresh</a> created an introductory level Jersey hands-on lab for JavaOne &#8216;09. As I realized just recently, the hands-on labs had been made available for download to all SDN members (free registration) shortly after JavaOne. It may be another useful resource for you to get started with Jersey. The lab provides detailed step-by-step instructions on how to set up your environment and then guides you through 3 exercises:</p>
<ol>
<li>Hello world! &#8211; leading you through your first JAX-RS/Jersey application, explaining the JAX-RS basics</li>
<li>Advanced JAX-RS/Jersey Features &#8211; showing how to develop a little more complex web application using JAX-RS/Jersey features such as path parameters, multiple representations for a resource, writing your own MessageBodyReader/Writer, Jersey MVC and some more</li>
<li>Using Jersey Client API &#8211; showing how to access web resources using the Client API provided by Jersey</li>
</ol>
<p>You can download the Hands-On Lab as well as get more info <a href="http://developers.sun.com/learning/javaoneonline/j1lab.jsp?lab=LAB-5542&#038;yr=2009&#038;track=1">here</a>. I&#8217;ve also added this link to our <a href="http://wikis.sun.com/display/Jersey">Jersey Wiki</a>. After you download the lab, just unzip the file and open <i>index.html</i> in <i>restwebservice</i> directory. The zip also contains solution directories for all three exercises. I hope the lab will be of help. Let me know in case you have any questions or feedback on it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alutam.com/2009/09/16/jersey-hands-on-lab/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaFX Password Field</title>
		<link>http://blog.alutam.com/2009/09/12/javafx-password-field/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://blog.alutam.com/2009/09/12/javafx-password-field/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 11:33:02 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[Password]]></category>
		<category><![CDATA[TextBox]]></category>

		<guid isPermaLink="false">http://blog.alutam.com/?p=76</guid>
		<description><![CDATA[As I mentioned in My First Experience with JavaFX blog, there is no password field in JavaFX, so I had to google for some workarounds. Although I found a few, none of them worked flawlessly, so last night I decided to spend some time trying to come up with a password field that would really [...]]]></description>
			<content:encoded><![CDATA[<p>As I mentioned in <a href="http://blog.alutam.com/2009/08/21/my-first-experience-with-javafx/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">My First Experience with JavaFX</a> blog, there is no password field in JavaFX, so I had to google for some workarounds. Although I found a few, none of them worked flawlessly, so last night I decided to spend some time trying to come up with a password field that would really work as expected. And, I think I managed to come up with an elegant and simple solution. No hacking in form of covering the text area with additional components or adding effects that blur the text box (including the caret and component borders). It looks and behaves exactly as you would expect of a password field. Click on the following picture to try it out:<br />
<script type="text/javascript">
function showApplet() { 
    document.getElementById("Applet").innerHTML = "<iframe alt=PasswordBoxDemo scrolling=no frameborder=0 src='/apps/javafx/PasswordBoxDemo/PasswordBoxDemo.html' height=100 width=300 ></iframe>"; 
}
</script></p>
<div id="Applet" style="border: 1px solid; text-align: left;"><a href="##utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="/img/pbdemo.png" onclick='showApplet();'/></a></div>
<p>Or click the following button for standalone mode:<br />
<a href="/apps/javafx/PasswordBoxDemo/PasswordBoxDemo.jnlp#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img src="/img/jws-launch-button.jpg"/></a><br />
And here is how it is implemented:</p>
<div class="codebox">
<pre><span class="Include"><span class="ReservedWord">import</span> javafx.scene.control.TextBox;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.util.Math;</span>

<span class="DocComment">/**
 * @author Martin Matula
 */</span>
<span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">PasswordBox</span> <span class="ReservedWord">extends</span> <span class="Identifier">TextBox</span> <span class="Braces">{</span>
    <span class="ReservedWord">public</span><span class="Symbol">-</span><span class="Identifier">read</span> <span class="ReservedWord">var</span> <span class="Identifier">password</span> <span class="Symbol">=</span> <span class="String">&quot;&quot;</span><span class="Symbol">;</span>

    <span class="ReservedWord">override</span> <span class="ReservedWord">function</span> <span class="Identifier">replaceSelection</span><span class="Braces">(</span><span class="Identifier">arg</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="ReservedWord">var</span> <span class="Identifier">pos1</span> <span class="Symbol">=</span> <span class="Identifier">Math</span>.<span class="Identifier">min</span><span class="Braces">(</span><span class="Identifier">dot</span>, <span class="Identifier">mark</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="ReservedWord">var</span> <span class="Identifier">pos2</span> <span class="Symbol">=</span> <span class="Identifier">Math</span>.<span class="Identifier">max</span><span class="Braces">(</span><span class="Identifier">dot</span>, <span class="Identifier">mark</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Identifier">password</span> <span class="Symbol">=</span> <span class="String">&quot;{password.substring(0, pos1)}{arg}{password.substring(pos2)}&quot;</span><span class="Symbol">;</span>
        <span class="ReservedWord">super</span>.<span class="Identifier">replaceSelection</span><span class="Braces">(</span><span class="Identifier">getStars</span><span class="Braces">(</span><span class="Identifier">arg</span>.<span class="Identifier">length</span><span class="Braces">(</span><span class="Braces">)</span><span class="Braces">)</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">override</span> <span class="ReservedWord">function</span> <span class="Identifier">deleteNextChar</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Braces">(</span><span class="Identifier">mark</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="Identifier">dot</span><span class="Braces">)</span> <span class="ReservedWord">and</span> <span class="Braces">(</span><span class="Identifier">dot</span> <span class="Symbol">&lt;</span> <span class="Identifier">password</span>.<span class="Identifier">length</span><span class="Braces">(</span><span class="Braces">)</span><span class="Braces">)</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Identifier">password</span> <span class="Symbol">=</span> <span class="String">&quot;{password.substring(0, dot)}{password.substring(dot + 1)}&quot;</span><span class="Symbol">;</span>
        <span class="Braces">}</span>
        <span class="ReservedWord">super</span>.<span class="Identifier">deleteNextChar</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">override</span> <span class="ReservedWord">function</span> <span class="Identifier">deletePreviousChar</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Braces">(</span><span class="Identifier">mark</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="Identifier">dot</span><span class="Braces">)</span> <span class="ReservedWord">and</span> <span class="Braces">(</span><span class="Identifier">dot</span> <span class="Symbol">&gt;</span> <span class="Numeric">0</span><span class="Braces">)</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Identifier">password</span> <span class="Symbol">=</span> <span class="String">&quot;{password.substring(0, dot - 1)}{password.substring(dot)}&quot;</span><span class="Symbol">;</span>
        <span class="Braces">}</span>
        <span class="ReservedWord">super</span>.<span class="Identifier">deletePreviousChar</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">function</span> <span class="Identifier">getStars</span><span class="Braces">(</span><span class="Identifier">len</span><span class="Symbol">:</span> <span class="Identifier">Integer</span><span class="Braces">)</span><span class="Symbol">:</span> <span class="Identifier">String</span> <span class="Braces">{</span>
        <span class="ReservedWord">var</span> <span class="Identifier">result</span><span class="Symbol">:</span> <span class="Identifier">String</span> <span class="Symbol">=</span> <span class="String">&quot;&quot;</span><span class="Symbol">;</span>
        <span class="ReservedWord">for</span> <span class="Braces">(</span><span class="Identifier">i</span> <span class="ReservedWord">in</span> <span class="Braces">[</span><span class="Numeric">1</span>..<span class="Identifier">len</span><span class="Braces">]</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Identifier">result</span> <span class="Symbol">=</span> <span class="String">&quot;{result}*&quot;</span><span class="Symbol">;</span>
        <span class="Braces">}</span>
        <span class="Identifier">result</span><span class="Symbol">;</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
<p>Quite simple, isn&#8217;t it? Here is how it is used in the Main class:</p>
<div class="codebox">
<pre><span class="Include"><span class="ReservedWord">import</span> javafx.stage.Stage;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.Scene;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.text.Text;</span>

<span class="ReservedWord">var</span> <span class="Identifier">password</span><span class="Symbol">:</span> <span class="Identifier">PasswordBox</span><span class="Symbol">;</span>

<span class="ReservedWord">var</span> <span class="Identifier">stage</span><span class="Symbol">:</span> <span class="Identifier">Stage</span> <span class="Symbol">=</span> <span class="Identifier">Stage</span> <span class="Braces">{</span>
    <span class="Identifier">title</span><span class="Symbol">:</span> <span class="String">&quot;PasswordBox Demo&quot;</span>
    <span class="Identifier">width</span><span class="Symbol">:</span> <span class="Numeric">200</span>
    <span class="Identifier">height</span><span class="Symbol">:</span> <span class="Numeric">100</span>
    <span class="Identifier">scene</span><span class="Symbol">:</span> <span class="Identifier">Scene</span> <span class="Braces">{</span>
        <span class="Identifier">content</span><span class="Symbol">:</span> <span class="Braces">[</span>
            <span class="Identifier">password</span> <span class="Symbol">=</span> <span class="Identifier">PasswordBox</span> <span class="Braces">{</span>
                <span class="Identifier">translateX</span><span class="Symbol">:</span> <span class="Numeric">10</span>
                <span class="Identifier">translateY</span><span class="Symbol">:</span> <span class="Numeric">10</span>
                <span class="Identifier">columns</span><span class="Symbol">:</span> <span class="Numeric">20</span>
            <span class="Braces">}</span>,
            <span class="Identifier">Text</span> <span class="Braces">{</span>
                <span class="Identifier">x</span><span class="Symbol">:</span> <span class="Numeric">10</span>
                <span class="Identifier">y</span><span class="Symbol">:</span> <span class="Numeric">50</span>
                <span class="Identifier">content</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">password</span>.<span class="Identifier">password</span>
            <span class="Braces">}</span>
        <span class="Braces">]</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
<p>I guess there is still a room for improving the API &#8211; the real password is stored in the <code>password</code> property, while the <code>text</code> property became useless and should never be set by a client. If you want to populate the field with a remembered password, you need to do it by calling <code>replaceSelection("password")</code> on the password field after it&#8217;s initialization (rather than setting the <code>text</code> or the <code>password</code> properties). Anyway, I wanted to keep the code simple so that you can easily see the basic idea behind it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alutam.com/2009/09/12/javafx-password-field/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>More Struggling with JavaFX</title>
		<link>http://blog.alutam.com/2009/09/09/more-struggling-with-javafx/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://blog.alutam.com/2009/09/09/more-struggling-with-javafx/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 21:09:21 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[JavaFX]]></category>

		<guid isPermaLink="false">http://blog.alutam.com/?p=59</guid>
		<description><![CDATA[In my first blog on JavaFX I mentioned polishing the details takes a lot of time and I thought it is due to the lack of experience. As I am spending more time trying to develop a real-life desktop application, I am becoming more doubtful about this. Too often I have to spend too much [...]]]></description>
			<content:encoded><![CDATA[<p>In my first blog on JavaFX I mentioned polishing the details takes a lot of time and I thought it is due to the lack of experience. As I am spending more time trying to develop a real-life desktop application, I am becoming more doubtful about this. Too often I have to spend too much time trying to make the UI behave the way I want and sometimes I just have to give up and change my mind about the desired design to avoid wasting even more time. It is hard to provide concrete examples and ask for help as my application&#8217;s UI is quite complex. But recently I could isolate a simple case that I can use to demonstrate what I am talking about.<br />
Look at the following simple code:</p>
<div class="codebox">
<pre><span class="Include"><span class="ReservedWord">import</span> javafx.stage.Stage;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.Scene;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.layout.VBox;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.paint.Color;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.shape.Rectangle;</span>

<span class="ReservedWord">var</span> <span class="Identifier">rec1</span><span class="Symbol">:</span> <span class="Identifier">Rectangle</span><span class="Symbol">;</span>
<span class="ReservedWord">var</span> <span class="Identifier">stage</span><span class="Symbol">:</span> <span class="Identifier">Stage</span> <span class="Symbol">=</span> <span class="Identifier">Stage</span> <span class="Braces">{</span>
    <span class="Identifier">title</span><span class="Symbol">:</span> <span class="String">&quot;Rectangles&quot;</span>
    <span class="Identifier">width</span><span class="Symbol">:</span> <span class="Numeric">200</span>
    <span class="Identifier">height</span><span class="Symbol">:</span> <span class="Numeric">200</span>
    <span class="Identifier">scene</span><span class="Symbol">:</span> <span class="Identifier">Scene</span> <span class="Braces">{</span>
        <span class="Identifier">content</span><span class="Symbol">:</span> <span class="Braces">[</span>
            <span class="Identifier">VBox</span> <span class="Braces">{</span>
                <span class="Identifier">spacing</span><span class="Symbol">:</span> <span class="Numeric">0</span>
                <span class="Identifier">content</span><span class="Symbol">:</span> <span class="Braces">[</span>
                    <span class="Identifier">rec1</span> <span class="Symbol">=</span> <span class="Identifier">Rectangle</span> <span class="Braces">{</span>
                        <span class="Identifier">fill</span><span class="Symbol">:</span> <span class="Identifier">Color</span>.<span class="Identifier">BLACK</span>
                        <span class="Identifier">width</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">stage</span>.<span class="Identifier">scene</span>.<span class="Identifier">width</span>
                        <span class="Identifier">height</span><span class="Symbol">:</span> <span class="Numeric">50</span>
                    <span class="Braces">}</span>
                    <span class="Identifier">Rectangle</span> <span class="Braces">{</span>
                        <span class="Identifier">fill</span><span class="Symbol">:</span> <span class="Identifier">Color</span>.<span class="Identifier">GRAY</span>
                        <span class="Identifier">width</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">stage</span>.<span class="Identifier">scene</span>.<span class="Identifier">width</span>
                        <span class="Identifier">height</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">stage</span>.<span class="Identifier">scene</span>.<span class="Identifier">height</span> <span class="Symbol">-</span> <span class="Identifier">rec1</span>.<span class="Identifier">height</span>
                    <span class="Braces">}</span>
                <span class="Braces">]</span>
            <span class="Braces">}</span>
        <span class="Braces">]</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
<p>It creates a window containing two rectangles that fully cover the scene:<br />
<img src="/img/rectangles1.png" alt="Rectangles screenshot"/><br />
All works great at this point.<br />
Now, let&#8217;s see what happens when I set the stroke to Color.BLACK:</p>
<div class="codebox">
<pre>...
                    <span class="Identifier">Rectangle</span> <span class="Braces">{</span>
                        <span class="Identifier">fill</span><span class="Symbol">:</span> <span class="Identifier">Color</span>.<span class="Identifier">GRAY</span>
                        <span style="background: yellow;"><span class="Identifier">stroke</span><span class="Symbol">:</span> <span class="Identifier">Color</span>.<span class="Identifier">BLACK</span></span>
                        <span class="Identifier">width</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">stage</span>.<span class="Identifier">scene</span>.<span class="Identifier">width</span>
                        <span class="Identifier">height</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">stage</span>.<span class="Identifier">scene</span>.<span class="Identifier">height</span> <span class="Symbol">-</span> <span class="Identifier">rec1</span>.<span class="Identifier">height</span>
                    <span class="Braces">}</span>
...</pre>
</div>
<p>Running this I am getting the following result:<br />
<img src="/img/rectangles2.png" alt="Rectangles screenshot"/><br />
As you can see, besides the fact that the rectangle now has the black border, it also jumped both horizontally and vertically and uncovered a strip of white background color. Going back and forth trying to find a workaround can be time consuming &#8211; I did not find a good way of debugging this kind of issues. Now imagine the same thing happens when the UI contains many more nested components. Trying to figure out which one causes the problem and how to tweak things to get the desired result may be endless.<br />
Anyway, I am still not giving up! Has anyone found an efficient way of debugging and resolving this type of issues quickly?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alutam.com/2009/09/09/more-struggling-with-javafx/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Implementing a Scroll View in JavaFX</title>
		<link>http://blog.alutam.com/2009/08/30/implementing-a-scroll-view-in-javafx/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://blog.alutam.com/2009/08/30/implementing-a-scroll-view-in-javafx/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 12:51:47 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[Scrolling]]></category>

		<guid isPermaLink="false">http://blog.alutam.com/?p=53</guid>
		<description><![CDATA[JavaFX does not seem to have support for scroll views. So, you have to
implement it on your own. Here is how I started implementing my own scroll view supporting
vertical scrolling:

package scrollviewdemo;

import javafx.scene.CustomNode;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.control.ScrollBar;
import javafx.util.Math;
import javafx.scene.shape.Rectangle;
import javafx.scene.paint.Paint;

public class ScrollView extends CustomNode {
    public-init var node: Node;
    public var [...]]]></description>
			<content:encoded><![CDATA[<p>JavaFX does not seem to have support for scroll views. So, you have to<br />
implement it on your own. Here is how I started implementing my own scroll view supporting<br />
vertical scrolling:</p>
<div class="codebox">
<pre><span class="Include"><span class="ReservedWord">package</span> scrollviewdemo;</span>

<span class="Include"><span class="ReservedWord">import</span> javafx.scene.CustomNode;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.Group;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.Node;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.control.ScrollBar;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.util.Math;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.shape.Rectangle;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.paint.Paint;</span>

<span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">ScrollView</span> <span class="ReservedWord">extends</span> <span class="Identifier">CustomNode</span> <span class="Braces">{</span>
    <span class="ReservedWord">public-init</span> <span class="ReservedWord">var</span> <span class="Identifier">node</span><span class="Symbol">:</span> <span class="Identifier">Node</span><span class="Symbol">;</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">var</span> <span class="Identifier">width</span><span class="Symbol">:</span> <span class="Identifier">Float</span><span class="Symbol">;</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">var</span> <span class="Identifier">height</span><span class="Symbol">:</span> <span class="Identifier">Float</span><span class="Symbol">;</span>

    <span class="ReservedWord">var</span> <span class="Identifier">group</span><span class="Symbol">:</span> <span class="Identifier">Group</span><span class="Symbol">;</span>
    <span class="ReservedWord">var</span> <span class="Identifier">gap</span> <span class="Symbol">=</span> <span class="ReservedWord">bind</span> <span class="Identifier">group</span>.<span class="Identifier">layoutBounds</span>.<span class="Identifier">height</span> <span class="Symbol">-</span> <span class="Identifier">height</span><span class="Symbol">;</span>

    <span class="ReservedWord">def</span> <span class="Identifier">scrollBar</span><span class="Symbol">:</span> <span class="Identifier">ScrollBar</span> <span class="Symbol">=</span> <span class="Identifier">ScrollBar</span> <span class="Braces">{</span>
        <span class="Identifier">translateX</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">width</span> <span class="Symbol">-</span> <span class="Identifier">scrollBar</span>.<span class="Identifier">width</span>
        <span class="Identifier">min</span><span class="Symbol">:</span> <span class="Numeric">0</span>
        <span class="Identifier">max</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">Math</span>.<span class="Identifier">max</span><span class="Braces">(</span><span class="Numeric">0</span>, <span class="Identifier">gap</span><span class="Braces">)</span>
        <span class="Identifier">visible</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">gap</span> <span class="Symbol">&gt;</span> <span class="Numeric">0</span>
        <span class="Identifier">vertical</span><span class="Symbol">:</span> <span class="ReservedWord">true</span>
        <span class="Identifier">height</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">height</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">override</span> <span class="ReservedWord">function</span> <span class="Identifier">create</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Identifier">Group</span> <span class="Braces">{</span>
            <span class="Identifier">content</span><span class="Symbol">:</span> <span class="Braces">[</span>
                <span class="Identifier">Group</span> <span class="Braces">{</span>
                    <span class="Identifier">content</span><span class="Symbol">:</span> <span class="Braces">[</span>
                        <span class="Identifier">group</span> <span class="Symbol">=</span> <span class="Identifier">Group</span> <span class="Braces">{</span>
                            <span class="Identifier">translateY</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Symbol">-</span> <span class="Identifier">scrollBar</span>.<span class="Identifier">value</span>
                            <span class="Identifier">content</span><span class="Symbol">:</span> <span class="Braces">[</span><span class="Identifier">node</span><span class="Braces">]</span>
                        <span class="Braces">}</span>
                    <span class="Braces">]</span>
                    <span class="Identifier">clip</span><span class="Symbol">:</span> <span class="Identifier">Rectangle</span> <span class="Braces">{</span>
                        <span class="Identifier">width</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">width</span> <span class="Symbol">-</span> <span class="Braces">{</span><span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">gap</span> <span class="Symbol">&gt;</span> <span class="Numeric">0</span><span class="Braces">)</span> <span class="Identifier">scrollBar</span>.<span class="Identifier">width</span> <span class="ReservedWord">else</span> <span class="Numeric">0</span><span class="Braces">}</span>
                        <span class="Identifier">height</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">height</span>
                    <span class="Braces">}</span>
                <span class="Braces">}</span>,
                <span class="Identifier">scrollBar</span>
            <span class="Braces">]</span>
        <span class="Braces">}</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
<p>This is how it can be used in a simple application:</p>
<div class="codebox">
<pre><span class="ReservedWord">var</span> <span class="Identifier">stage</span><span class="Symbol">:</span> <span class="Identifier">Stage</span> <span class="Symbol">=</span> <span class="Identifier">Stage</span> <span class="Braces">{</span>
    <span class="Identifier">title</span><span class="Symbol">:</span> <span class="String">&quot;Application title&quot;</span>
    <span class="Identifier">width</span><span class="Symbol">:</span> <span class="Numeric">200</span>
    <span class="Identifier">height</span><span class="Symbol">:</span> <span class="Numeric">200</span>
    <span class="Identifier">scene</span><span class="Symbol">:</span> <span class="Identifier">Scene</span> <span class="Braces">{</span>
        <span class="Identifier">content</span><span class="Symbol">:</span> <span class="Braces">[</span>
            <span class="Identifier">ScrollView</span> <span class="Braces">{</span>
                <span class="Identifier">width</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">stage</span>.<span class="Identifier">scene</span>.<span class="Identifier">width</span>
                <span class="Identifier">height</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">stage</span>.<span class="Identifier">scene</span>.<span class="Identifier">height</span>
                <span class="Identifier">node</span><span class="Symbol">:</span> <span class="Identifier">VBox</span> <span class="Braces">{</span>
                    <span class="Identifier">content</span><span class="Symbol">:</span> <span class="ReservedWord">for</span> <span class="Braces">(</span><span class="Identifier">i</span> <span class="ReservedWord">in</span> <span class="Braces">[</span><span class="Numeric">0</span>..<span class="Numeric">20</span><span class="Braces">]</span><span class="Braces">)</span> <span class="Identifier">ImageView</span> <span class="Braces">{</span>
                        <span class="Identifier">image</span><span class="Symbol">:</span> <span class="Identifier">Image</span> <span class="Braces">{</span>
                            <span class="Comment">// some picture</span>
                            <span class="Identifier">url</span><span class="Symbol">:</span> <span class="String">&quot;{__DIR__}pic.png&quot;</span>
                        <span class="Braces">}</span>
                    <span class="Braces">}</span>
                <span class="Braces">}</span>
            <span class="Braces">}</span>
        <span class="Braces">]</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
<p>To support mouse scroll wheel I added the following to the ScrollView class:</p>
<div class="codebox">
<pre>    <span class="ReservedWord">override</span> <span class="ReservedWord">var</span> <span class="Identifier">onMouseWheelMoved</span> <span class="Symbol">=</span> <span class="ReservedWord">function</span><span class="Braces">(</span><span class="Identifier">event</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Comment">// multiplying by 4 makes the scrolling faster and still smooth</span>
        <span class="Identifier">scrollBar</span>.<span class="Identifier">value</span> <span class="Symbol">+</span><span class="Symbol">=</span> <span class="Identifier">event</span>.<span class="Identifier">wheelRotation</span> <span class="Symbol">*</span> <span class="Numeric">4</span><span class="Symbol">;</span>
    <span class="Braces">}</span></pre>
</div>
<p>However, as it turned out, transparent components don&#8217;t receive mouse events, so the mouse<br />
wheel worked only when the mouse pointer was on top of a non-transparent object. So, to work<br />
around this, I had to fill the scroll view background using an opaque rectangle. The resulting<br />
ScrollView component looks like this:</p>
<div class="codebox">
<pre><span class="Include"><span class="ReservedWord">package</span> scrollviewdemo;</span>

<span class="Include"><span class="ReservedWord">import</span> javafx.scene.CustomNode;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.Group;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.Node;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.control.ScrollBar;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.util.Math;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.shape.Rectangle;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.paint.Paint;</span>

<span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">ScrollView</span> <span class="ReservedWord">extends</span> <span class="Identifier">CustomNode</span> <span class="Braces">{</span>
    <span class="ReservedWord">public-init</span> <span class="ReservedWord">var</span> <span class="Identifier">node</span><span class="Symbol">:</span> <span class="Identifier">Node</span><span class="Symbol">;</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">var</span> <span class="Identifier">width</span><span class="Symbol">:</span> <span class="Identifier">Float</span><span class="Symbol">;</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">var</span> <span class="Identifier">height</span><span class="Symbol">:</span> <span class="Identifier">Float</span><span class="Symbol">;</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">var</span> <span class="Identifier">fill</span><span class="Symbol">:</span> <span class="Identifier">Paint</span><span class="Symbol">;</span>

    <span class="ReservedWord">var</span> <span class="Identifier">group</span><span class="Symbol">:</span> <span class="Identifier">Group</span><span class="Symbol">;</span>
    <span class="ReservedWord">var</span> <span class="Identifier">gap</span> <span class="Symbol">=</span> <span class="ReservedWord">bind</span> <span class="Identifier">group</span>.<span class="Identifier">layoutBounds</span>.<span class="Identifier">height</span> <span class="Symbol">-</span> <span class="Identifier">height</span><span class="Symbol">;</span>

    <span class="ReservedWord">def</span> <span class="Identifier">scrollBar</span><span class="Symbol">:</span> <span class="Identifier">ScrollBar</span> <span class="Symbol">=</span> <span class="Identifier">ScrollBar</span> <span class="Braces">{</span>
        <span class="Identifier">translateX</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">width</span> <span class="Symbol">-</span> <span class="Identifier">scrollBar</span>.<span class="Identifier">width</span>
        <span class="Identifier">min</span><span class="Symbol">:</span> <span class="Numeric">0</span>
        <span class="Identifier">max</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">Math</span>.<span class="Identifier">max</span><span class="Braces">(</span><span class="Numeric">0</span>, <span class="Identifier">gap</span><span class="Braces">)</span>
        <span class="Identifier">visible</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">gap</span> <span class="Symbol">&gt;</span> <span class="Numeric">0</span>
        <span class="Identifier">vertical</span><span class="Symbol">:</span> <span class="ReservedWord">true</span>
        <span class="Identifier">height</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">height</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">override</span> <span class="ReservedWord">function</span> <span class="Identifier">create</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Identifier">Group</span> <span class="Braces">{</span>
            <span class="Identifier">content</span><span class="Symbol">:</span> <span class="Braces">[</span>
                <span class="Identifier">Rectangle</span> <span class="Braces">{</span>
                    <span class="Identifier">fill</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">fill</span>
                    <span class="Identifier">width</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">width</span> <span class="Symbol">-</span> <span class="Braces">{</span><span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">gap</span> <span class="Symbol">&gt;</span> <span class="Numeric">0</span><span class="Braces">)</span> <span class="Identifier">scrollBar</span>.<span class="Identifier">width</span> <span class="ReservedWord">else</span> <span class="Numeric">0</span><span class="Braces">}</span>
                    <span class="Identifier">height</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">height</span>
                <span class="Braces">}</span>,
                <span class="Identifier">Group</span> <span class="Braces">{</span>
                    <span class="Identifier">content</span><span class="Symbol">:</span> <span class="Braces">[</span>
                        <span class="Identifier">group</span> <span class="Symbol">=</span> <span class="Identifier">Group</span> <span class="Braces">{</span>
                            <span class="Identifier">translateY</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Symbol">-</span> <span class="Identifier">scrollBar</span>.<span class="Identifier">value</span>
                            <span class="Identifier">content</span><span class="Symbol">:</span> <span class="Braces">[</span><span class="Identifier">node</span><span class="Braces">]</span>
                        <span class="Braces">}</span>
                    <span class="Braces">]</span>
                    <span class="Identifier">clip</span><span class="Symbol">:</span> <span class="Identifier">Rectangle</span> <span class="Braces">{</span>
                        <span class="Identifier">width</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">width</span> <span class="Symbol">-</span> <span class="Braces">{</span><span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">gap</span> <span class="Symbol">&gt;</span> <span class="Numeric">0</span><span class="Braces">)</span> <span class="Identifier">scrollBar</span>.<span class="Identifier">width</span> <span class="ReservedWord">else</span> <span class="Numeric">0</span><span class="Braces">}</span>
                        <span class="Identifier">height</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">height</span>
                    <span class="Braces">}</span>
                <span class="Braces">}</span>,
                <span class="Identifier">scrollBar</span>
            <span class="Braces">]</span>
        <span class="Braces">}</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">override</span> <span class="ReservedWord">var</span> <span class="Identifier">onMouseWheelMoved</span> <span class="Symbol">=</span> <span class="ReservedWord">function</span><span class="Braces">(</span><span class="Identifier">event</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Comment">// multiplying by 4 makes the scrolling faster and still smooth</span>
        <span class="Identifier">scrollBar</span>.<span class="Identifier">value</span> <span class="Symbol">+</span><span class="Symbol">=</span> <span class="Identifier">event</span>.<span class="Identifier">wheelRotation</span> <span class="Symbol">*</span> <span class="Numeric">4</span><span class="Symbol">;</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
<p>And the following line should be added to the Main.fx to make it work:</p>
<div class="codebox">
<pre><span class="Include"><span class="ReservedWord">package</span> scrollviewdemo;</span>

<span class="Include"><span class="ReservedWord">import</span> javafx.stage.Stage;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.Scene;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.layout.VBox;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.image.Image;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.image.ImageView;</span>
<span class="Include"><span class="ReservedWord">import</span> javafx.scene.paint.Color;</span>

<span class="ReservedWord">var</span> <span class="Identifier">stage</span><span class="Symbol">:</span> <span class="Identifier">Stage</span> <span class="Symbol">=</span> <span class="Identifier">Stage</span> <span class="Braces">{</span>
    <span class="Identifier">title</span><span class="Symbol">:</span> <span class="String">&quot;Application title&quot;</span>
    <span class="Identifier">width</span><span class="Symbol">:</span> <span class="Numeric">200</span>
    <span class="Identifier">height</span><span class="Symbol">:</span> <span class="Numeric">200</span>
    <span class="Identifier">scene</span><span class="Symbol">:</span> <span class="Identifier">Scene</span> <span class="Braces">{</span>
        <span class="Identifier">content</span><span class="Symbol">:</span> <span class="Braces">[</span>
            <span class="Identifier">ScrollView</span> <span class="Braces">{</span>
                <span class="Identifier">width</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">stage</span>.<span class="Identifier">scene</span>.<span class="Identifier">width</span>
                <span class="Identifier">height</span><span class="Symbol">:</span> <span class="ReservedWord">bind</span> <span class="Identifier">stage</span>.<span class="Identifier">scene</span>.<span class="Identifier">height</span>
                <span style="background: yellow;"><span class="Identifier">fill</span><span class="Symbol">:</span> <span class="Identifier">Color</span>.<span class="Identifier">WHITE</span></span>
                <span class="Identifier">node</span><span class="Symbol">:</span> <span class="Identifier">VBox</span> <span class="Braces">{</span>
                    <span class="Identifier">content</span><span class="Symbol">:</span> <span class="ReservedWord">for</span> <span class="Braces">(</span><span class="Identifier">i</span> <span class="ReservedWord">in</span> <span class="Braces">[</span><span class="Numeric">0</span>..<span class="Numeric">20</span><span class="Braces">]</span><span class="Braces">)</span> <span class="Identifier">ImageView</span> <span class="Braces">{</span>
                        <span class="Identifier">image</span><span class="Symbol">:</span> <span class="Identifier">Image</span> <span class="Braces">{</span>
                            <span class="Comment">// some picture</span>
                            <span class="Identifier">url</span><span class="Symbol">:</span> <span class="String">&quot;{__DIR__}pic.png&quot;</span>
                        <span class="Braces">}</span>
                    <span class="Braces">}</span>
                <span class="Braces">}</span>
            <span class="Braces">}</span>
        <span class="Braces">]</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.alutam.com/2009/08/30/implementing-a-scroll-view-in-javafx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Custom Asynchronous Tasks in JavaFX</title>
		<link>http://blog.alutam.com/2009/08/26/custom-asynchronous-tasks-in-javafx/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://blog.alutam.com/2009/08/26/custom-asynchronous-tasks-in-javafx/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 20:16:22 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[Concurrency]]></category>

		<guid isPermaLink="false">http://blog.alutam.com/?p=50</guid>
		<description><![CDATA[As I mentioned in my previous blog, during my experiments with JavaFX I needed to run certain tasks on a separate thread (e.g. calls to a remote web service via Jersey Client API). One can do it in JavaFX using JavaTaskBase class, but I wanted something simpler, something similar to what FXexperience blog suggested. So, [...]]]></description>
			<content:encoded><![CDATA[<p>As I mentioned in my previous blog, during my experiments with JavaFX I needed to run certain tasks on a separate thread (e.g. calls to a remote web service via Jersey Client API). One can do it in JavaFX using JavaTaskBase class, but I wanted something simpler, something similar to what <a href="http://fxexperience.com/2009/06/background-tasks-in-javafx/">FXexperience blog</a> suggested. So, I created a custom subclass of javafx.async.Task named AsyncTask that allowed me to make asynchronous calls as follows:</p>
<div class="codebox">
<pre>    <span class="Identifier">AsyncTask</span> <span class="Braces">{</span>
        <span class="Identifier">run</span><span class="Symbol">:</span> <span class="Identifier">function</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Comment">// add the code you want to run asynchronously</span>
        <span class="Braces">}</span>

        <span class="Identifier">onDone</span><span class="Symbol">:</span> <span class="Identifier">function</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Comment">// this is executed once the "run" method finishes running</span>
        <span class="Braces">}</span>
    <span class="Braces">}</span>.<span class="Identifier">start</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span></pre>
</div>
<p>Here is the source code for the AsyncTask class together with the helper Java class it&#8217;s using. It should be self explanatory.</p>
<div>
<pre><small><em>AsyncTask.fx</em></small></pre>
</div>
<div class="codebox">
<pre><span class="Include">import javafx.async.Task;</span>

<span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">AsyncTask</span> <span class="ReservedWord">extends</span> <span class="Identifier">Task</span>, <span class="Identifier">AsyncTaskHelper</span>.<span class="Identifier">Task</span> <span class="Braces">{</span>
    <span class="DocComment">/** Function that should be run asynchronously.
     */</span>
    <span class="ReservedWord">public</span> <span class="Identifier">var</span> <span class="Identifier">run</span><span class="Symbol">:</span> <span class="Identifier">function</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Symbol">=</span> <span class="ReservedWord">null</span><span class="Symbol">;</span>

    <span class="Comment">// the helper</span>
    <span class="Identifier">def</span> <span class="Identifier">peer</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="Identifier">AsyncTaskHelper</span><span class="Braces">(</span><span class="ReservedWord">this</span><span class="Braces">)</span><span class="Symbol">;</span>

    <span class="Comment">// used to start the task</span>
    <span class="Identifier">override</span> <span class="Identifier">function</span> <span class="Identifier">start</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Identifier">started</span> <span class="Symbol">=</span> <span class="ReservedWord">true</span><span class="Symbol">;</span>
        <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">onStart</span> <span class="Symbol">!</span><span class="Symbol">=</span> <span class="ReservedWord">null</span><span class="Braces">)</span> <span class="Identifier">onStart</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Identifier">peer</span>.<span class="Identifier">start</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="Comment">// don't need stop - isn't implemented</span>
    <span class="Identifier">override</span> <span class="Identifier">function</span> <span class="Identifier">stop</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Comment">// do nothing</span>
    <span class="Braces">}</span>

    <span class="Comment">// called from the helper Java class from a different thread</span>
    <span class="Identifier">override</span> <span class="Identifier">function</span> <span class="Identifier">taskRun</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Comment">// run the code to be run asynchronously</span>
        <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">run</span> <span class="Symbol">!</span><span class="Symbol">=</span> <span class="ReservedWord">null</span><span class="Braces">)</span> <span class="Identifier">run</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// send a notification (on the dispatch thread) the code finished running</span>
        <span class="Identifier">FX</span>.<span class="Identifier">deferAction</span><span class="Braces">(</span><span class="Identifier">function</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Identifier">done</span> <span class="Symbol">=</span> <span class="ReservedWord">true</span><span class="Symbol">;</span>
            <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Identifier">onDone</span> <span class="Symbol">!</span><span class="Symbol">=</span> <span class="ReservedWord">null</span><span class="Braces">)</span> <span class="Identifier">onDone</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Braces">}</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
<div>
<pre><small><em>AsyncTaskHelper.java</em></small></pre>
</div>
<div class="codebox">
<pre><span class="Include">import java.util.concurrent.ExecutorService;</span>
<span class="Include">import java.util.concurrent.Executors;</span>

<span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">AsyncTaskHelper</span> <span class="ReservedWord">implements</span> <span class="Identifier">Runnable</span> <span class="Braces">{</span>
    <span class="Comment">// Using a fixed threadpool to run the asynchronous task</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="Identifier">ExecutorService</span> <span class="Identifier">QUEUE</span> <span class="Symbol">=</span> <span class="Identifier">Executors</span>.<span class="Identifier">newFixedThreadPool</span><span class="Braces">(</span><span class="Numeric">10</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Comment">// the "parent" JavaFX AsyncTask instance</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">final</span> <span class="Identifier">Task</span> <span class="Identifier">peer</span><span class="Symbol">;</span>

    <span class="ReservedWord">public</span> <span class="Identifier">AsyncTaskHelper</span><span class="Braces">(</span><span class="Identifier">Task</span> <span class="Identifier">peer</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="ReservedWord">this</span>.<span class="Identifier">peer</span> <span class="Symbol">=</span> <span class="Identifier">peer</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="Comment">// called from AsyncTask.start() method - will add this task</span>
    <span class="Comment">// to the thread pool queue</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">void</span> <span class="Identifier">start</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Identifier">QUEUE</span>.<span class="Identifier">execute</span><span class="Braces">(</span><span class="ReservedWord">this</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="Comment">// called by the thread pool queue to start the task</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">void</span> <span class="Identifier">run</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Identifier">peer</span>.<span class="Identifier">taskRun</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>

    <span class="Comment">// interface to be implemented by the "parent" JavaFX AsyncTask</span>
    <span class="ReservedWord">public</span> <span class="ReservedWord">static</span> <span class="ReservedWord">interface</span> <span class="Identifier">Task</span> <span class="Braces">{</span>
        <span class="ReservedWord">public</span> <span class="ReservedWord">void</span> <span class="Identifier">taskRun</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.alutam.com/2009/08/26/custom-asynchronous-tasks-in-javafx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>My First Experience with JavaFX</title>
		<link>http://blog.alutam.com/2009/08/21/my-first-experience-with-javafx/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://blog.alutam.com/2009/08/21/my-first-experience-with-javafx/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 10:01:42 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[NetBeans]]></category>

		<guid isPermaLink="false">http://blog.alutam.com/?p=41</guid>
		<description><![CDATA[A week ago I started to look into JavaFX, to see if I could use it for application development. Here is my experience so far&#8230;
Learning
Googling for some tutorials, I ended up taking the following two: Learning the JavaFX Script Programming Language and Building GUI Application with JavaFX. These were both extremely easy to follow and [...]]]></description>
			<content:encoded><![CDATA[<p>A week ago I started to look into JavaFX, to see if I could use it for application development. Here is my experience so far&#8230;</p>
<p><strong>Learning<br />
</strong>Googling for some tutorials, I ended up taking the following two: <a href="http://java.sun.com/javafx/1/tutorials/core/">Learning the JavaFX Script Programming Language</a> and <a href="http://java.sun.com/javafx/1/tutorials/ui/">Building GUI Application with JavaFX</a>. These were both extremely easy to follow and provided a good quick-start guide. Then I started reading a more complex one &#8211; <a href="http://www.javafx.com/docs/tutorials/mediabrowser/">Media Browser Tutorial</a>, but since I was eager to start my own development and thought I could do it after those first two tutorials, I wasn&#8217;t patient enough to go through even the first module of this one. Although later I did download the source code to see how the tutorial deals with some more advanced stuff (like screen scrolling, which turns out to be more complicated than expected with JavaFX).</p>
<p><strong>Development Tools<br />
</strong>My IDE of choice is NetBeans &#8211; it has great features (&#8230;and version 6.7 looks awesome on my Mac). And it is the recommended IDE for JavaFX development &#8211; NetBeans 6.7 comes with support for JavaFX projects built in. Anyway, being used to the Java code development in NetBeans with all the bells and whistles like code hints, refactorings, etc., switching to JavaFX development felt like I am in hell. Missing support for fixing imports, broken indentation, closing bracket generation and code-completion being the most annoying things. So, be ready for the maturity of the tools not being there yet &#8211; which I guess is understandable given the level of maturity of the JavaFX platform itself.</p>
<p><strong>Using JavaFX<br />
</strong>I wanted to see if I could quickly put together an application built on top of a client library for working with on-line media (pictures, videos) I&#8217;d been working on. And the result was, I really could &#8211; I got the 80% of the initial functionality done within an hour. I did not care about the details, just wanted to get it done quickly and thought I would polish the details later &#8211; and it worked. So I was happy. Anyway, &#8220;polishing the details&#8221; took a huge amount of time and at times would make me think I would have done much better if I wrote it in Java right away. But, I got through it and now I am realizing it just takes more practice to be able to reduce the number of the painful trial and error cycles and get what I need in a reasonable time. So, I thought I would share a few things I ran into to make others prepared for some bumps and save them some time:</p>
<ul>
<li>The most time-consuming thing was playing with the layout. The ability to bind property values to each other is nice. But in certain situations it does not work as expected when using it to lay out objects. Sometimes it causes StackOverflowExceptions and it is hard to see how to achieve what you need while avoiding these exceptions. Also understanding different coordinate properties of objects like x, y, translateX, translateY, layoutX, layoutY, boundsInLocal.minX/minY, boundsInParent.minX/minY takes time. So, I ended up spending a lot of energy on trying to make the components lay out properly (the tutorials usually use non-resizable main window, which makes the life much simpler), and basically the only approach that worked was trial and error &#8211; i.e. run the application, see it does not do what you need, think about what may fix it, make the change (usually wrap a few objects in another layout, or remove some grouping, etc.), run it again and see. Each of these cycles are made more painful by NetBeans, since wrapping objects in a group gets you into this broken indentation and closing bracket generation hell. I am hoping more experience will reduce the number of needed cycles (I think I can already see improvements). Given this it is also not good to try to make up your mind about the visual design of your app along the way &#8211; it is better to think it through well in advance as the cost of redoing it is too high. Again, this may improve with the amount of experience.</li>
<li>By default, the whole JavaFX program runs in one thread &#8211; the dispatch thread. For specific time-consuming operations, there is a support for running them asynchronously (e.g. for loading images from a URL you can set Image.backgroundLoading to true). Creating your own asynchronous operations is not very straightforward, but works as well &#8211; <a href="http://blogs.sun.com/baechul/entry/javafx_1_2_async">Baechul&#8217;s blog</a> explains how. I found the <a href="http://fxexperience.com/2009/06/background-tasks-in-javafx/">FXexperience blog</a> inspiring in that respect and wrote my own very simple implementation of an asynchronous task &#8211; will blog about it later.</li>
<li>No support for something like a scroll pane. What may look like a simple task &#8211; adding a scroll bar to your application &#8211; is not so simple with JavaFX &#8211; there is a ScrollBar control in the 1.2 version of the API, but looks like you have to place it yourself as well as implement the scrolling. I wrote a simple generic component to do this &#8211; will publish it in one of my next blogs.</li>
<li>No support for hiding passwords in text boxes. When you want your user to enter a password to a text box, it is currently impossible to have the text box show a sequence of &#8220;*&#8221; instead of the actual password. There are some suggested workarounds on the web <a href="http://forums.sun.com/thread.jspa?threadID=5386816">here</a> and <a href="http://javafx.com/samples/Tweeter/src/LoginView.fx.html">here</a>. But I did not figure out how to use the first one (is there such font with just a single glyph for all characters on all platforms?) and the second one did not work for me for some reason either. For now I am using the one suggested by <a href="http://blogs.citytechinc.com/sanderson/?p=111">Sten in his blog</a>, but even that has issues (the password is almost readable and the box is blurred including its edges), so I am planning to spend some more time on it to see if I can come up with something better.</li>
<li>To make it possible for my application to access system resources when run from the browser (like the file system), I had to make it a &#8220;Self Signed Jar&#8221; by going into my project&#8217;s properties (in NetBeans) selecting &#8220;Application&#8221; category in the Project Properties dialog and making sure &#8220;Self Signed Jar&#8221; is checked.</li>
</ul>
<p>Now, one may argue I could use the standard Swing components to work around some of the issues. The problem with that is that they look different from the JavaFX components, so e.g. combining the JavaFX text boxes with a Swing one would look ugly.</p>
<p>OK. That&#8217;s it for now. I&#8217;ll try to dive into some specific areas in my future blogs.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alutam.com/2009/08/21/my-first-experience-with-javafx/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Using OAuth Callback</title>
		<link>http://blog.alutam.com/2009/08/17/using-oauth-callback/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://blog.alutam.com/2009/08/17/using-oauth-callback/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 19:24:31 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[REST]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[SmugMug]]></category>

		<guid isPermaLink="false">http://blog.alutam.com/?p=23</guid>
		<description><![CDATA[Over the past week I&#8217;ve been playing a bit with JavaFX. I will blog on my experience later. Today I would like to follow up on my last post and write about the OAuth callback.
If you look at the sample code in my last blog, there is one ugly thing &#8211; users have to be [...]]]></description>
			<content:encoded><![CDATA[<p>Over the past week I&#8217;ve been playing a bit with JavaFX. I will blog on my experience later. Today I would like to follow up on my last post and write about the OAuth callback.<br />
If you look at the sample code in my last blog, there is one ugly thing &#8211; users have to be told to press Enter once they authenticate in a browser that the application opens:</p>
<div class="codebox">
<pre>    <span class="Comment">// open the browser at the authorization URL to let user authorize</span>
    <span class="Identifier">Desktop</span>.<span class="Identifier">getDesktop</span><span class="Braces">(</span><span class="Braces">)</span>.<span class="Identifier">browse</span><span class="Braces">(</span><span class="ReservedWord">new</span> <span class="Identifier">URI</span><span class="Braces">(</span><span class="Identifier">URL_AUTHORIZE</span> <span class="Symbol">+</span>
            <span class="String">"?oauth_token="</span> <span class="Symbol">+</span> <span class="Identifier">response</span>.<span class="Identifier">auth</span>.<span class="Identifier">token</span>.<span class="Identifier">id</span><span class="Braces">)</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Comment">// wait for the user to authenticate</span>
    <span class="Identifier">System</span>.<span class="Identifier">out</span>.<span class="Identifier">println</span><span class="Braces">(</span><span class="String">&quot;Once you authenticated with SmugMug and granted&quot;</span> <span class="Symbol">+</span>
            <span class="String">&quot;permissions to this app, press Enter to continue.&quot;</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Identifier">System</span>.<span class="Identifier">in</span>.<span class="Identifier">read</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span></pre>
</div>
<p>Although the OAuth specification mentions one can pass a callback URL to the authorization call, I had not been able to make it work with SmugMug until recently, when I ran into <a href="http://www.dgrin.com/showpost.php?p=842069&amp;postcount=28">this post</a> on the SmugMug API forum. The post says that instead of accepting the oauth_callback as the query parameter in the authorization request, SmugMug allows me to set the callback URL for my application by editing the properties of the API key I&#8217;ve received in the SmugMug control panel. So, I went ahead and tried to set it to &#8220;http://localhost:9097/oauth&#8221; and it worked! So I was able to get rid of that ugly waiting for users pressing the Enter key with the following trick:</p>
<div class="codebox">
<pre>    <span class="ReservedWord">synchronized</span> <span class="Braces">(</span><span class="Identifier">App</span>.<span class="ReservedWord">class</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="Comment">// create an instance of the lightweight HTTP server on port 9097</span>
        <span class="Identifier">HttpServer</span> <span class="Identifier">server</span> <span class="Symbol">=</span> <span class="Identifier">HttpServer</span>.<span class="Identifier">create</span><span class="Braces">(</span><span class="ReservedWord">new</span> <span class="Identifier">InetSocketAddress</span><span class="Braces">(</span><span class="Numeric">9097</span><span class="Braces">)</span>, <span class="Numeric">0</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// assign a handler to &quot;/oauth&quot; context</span>
        <span class="Identifier">server</span>.<span class="Identifier">createContext</span><span class="Braces">(</span><span class="String">&quot;/oauth&quot;</span>, <span class="ReservedWord">new</span> <span class="Identifier">HttpHandler</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="ReservedWord">public</span> <span class="ReservedWord">void</span> <span class="Identifier">handle</span><span class="Braces">(</span><span class="Identifier">HttpExchange</span> <span class="Identifier">t</span><span class="Braces">)</span> <span class="ReservedWord">throws</span> <span class="Identifier">IOException</span> <span class="Braces">{</span>
                <span class="Comment">// notify the app the user has authorized</span>
                <span class="ReservedWord">synchronized</span> <span class="Braces">(</span><span class="Identifier">App</span>.<span class="ReservedWord">class</span><span class="Braces">)</span> <span class="Braces">{</span>
                    <span class="Identifier">App</span>.<span class="ReservedWord">class</span>.<span class="Identifier">notifyAll</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
                <span class="Braces">}</span>
                <span class="Comment">// send some descriptive page as a response</span>
                <span class="Identifier">t</span>.<span class="Identifier">sendResponseHeaders</span><span class="Braces">(</span><span class="Numeric">200</span>, <span class="Numeric">0</span><span class="Braces">)</span><span class="Symbol">;</span>
                <span class="Identifier">OutputStream</span> <span class="Identifier">os</span> <span class="Symbol">=</span> <span class="Identifier">t</span>.<span class="Identifier">getResponseBody</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
                <span class="Identifier">InputStream</span> <span class="Identifier">is</span> <span class="Symbol">=</span> <span class="Identifier">getClass</span><span class="Braces">(</span><span class="Braces">)</span>.<span class="Identifier">getResourceAsStream</span><span class="Braces">(</span><span class="String">&quot;authorize.html&quot;</span><span class="Braces">)</span><span class="Symbol">;</span>
                <span class="ReservedWord">int</span> <span class="Identifier">count</span><span class="Symbol">;</span>
                <span class="ReservedWord">byte</span><span class="Braces">[</span><span class="Braces">]</span> <span class="Identifier">b</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="ReservedWord">byte</span><span class="Braces">[</span><span class="Numeric">32000</span><span class="Braces">]</span><span class="Symbol">;</span>
                <span class="ReservedWord">while</span> <span class="Braces">(</span><span class="Numeric">0</span> <span class="Symbol">&lt;</span> <span class="Braces">(</span><span class="Identifier">count</span> <span class="Symbol">=</span> <span class="Identifier">is</span>.<span class="Identifier">read</span><span class="Braces">(</span><span class="Identifier">b</span><span class="Braces">)</span><span class="Braces">)</span><span class="Braces">)</span> <span class="Braces">{</span>
                    <span class="Identifier">os</span>.<span class="Identifier">write</span><span class="Braces">(</span><span class="Identifier">b</span>, <span class="Numeric">0</span>, <span class="Identifier">count</span><span class="Braces">)</span><span class="Symbol">;</span>
                <span class="Braces">}</span>
                <span class="Comment">// close the streams</span>
                <span class="Identifier">os</span>.<span class="Identifier">close</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
                <span class="Identifier">is</span>.<span class="Identifier">close</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>

            <span class="Braces">}</span>
        <span class="Braces">}</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Identifier">server</span>.<span class="Identifier">setExecutor</span><span class="Braces">(</span><span class="ReservedWord">null</span><span class="Braces">)</span><span class="Symbol">;</span> <span class="Comment">// creates a default executor</span>
        <span class="Comment">// start the server</span>
        <span class="Identifier">server</span>.<span class="Identifier">start</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// open the authorization URI in the browser</span>
        <span class="Identifier">Desktop</span>.<span class="Identifier">getDesktop</span><span class="Braces">(</span><span class="Braces">)</span>.<span class="Identifier">browse</span><span class="Braces">(</span><span class="ReservedWord">new</span> <span class="Identifier">URI</span><span class="Braces">(</span><span class="Identifier">URL_AUTHORIZE</span> <span class="Symbol">+</span>
                <span class="String">&quot;?oauth_token=&quot;</span> <span class="Symbol">+</span> <span class="Identifier">response</span>.<span class="Identifier">auth</span>.<span class="Identifier">token</span>.<span class="Identifier">id</span><span class="Braces">)</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// wait until the HttpHandler sends me &quot;notify&quot; signal</span>
        <span class="Identifier">App</span>.<span class="ReservedWord">class</span>.<span class="Identifier">wait</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// user has authorized - stop the lightweight HTTP server</span>
        <span class="Identifier">server</span>.<span class="Identifier">stop</span><span class="Braces">(</span><span class="Numeric">0</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span></pre>
</div>
<p>Basically, just before I send a request to the authorization URI, I start an instance of the lightweight HTTP server (present in JDK6 or you can download it <a href="http://download.java.net/maven/2/com/sun/net/httpserver/http/20070405/">here</a> in case you are running on JDK5) which listens on http://localhost:9097/oauth, and then just wait for the callback request to come in. SmugMug, once the user authorizes, redirects the browser to this URL, which wakes up the suspended execution of my app and returns some descriptive HTML page to the user &#8211; something along the same lines as the original SmugMug page, e.g.:</p>
<div style="padding: 20px; background-color: #e0e0e0;">
<h2>Thank you for adding App to your Authorized Applications.</h2>
<p>(You can de-authorize anytime via your control panel.)
</p></div>
<p>Now, one drawback of the SmugMug approach of not allowing applications to specify the callback URL dynamically (in the request to the authorization URL) is that the port your application uses is pretty much hard-coded &#8211; you have to manually enter it (as part of the callback URL) in your API key properties on SmugMug website. That means, if the port your application wants to use is busy you have to fall back to the original approach.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alutam.com/2009/08/17/using-oauth-callback/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using Jersey Client OAuth Support with SmugMug</title>
		<link>http://blog.alutam.com/2009/08/10/using-jersey-client-oauth-support-with-smugmug/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://blog.alutam.com/2009/08/10/using-jersey-client-oauth-support-with-smugmug/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 23:41:18 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[REST]]></category>
		<category><![CDATA[JAX-RS]]></category>
		<category><![CDATA[Jersey]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[SmugMug]]></category>

		<guid isPermaLink="false">http://blog.alutam.com/?p=6</guid>
		<description><![CDATA[Recently I decided to use SmugMug to store my photo galleries. They have an API people can use to access the features of the site programmatically and I noticed they added OAuth in the latest version. So, I thought I would give it a try and see if I can use the OAuth Support in [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I decided to use <a href="http://smugmug.com">SmugMug</a> to store my photo galleries. They have an <a href="http://wiki.smugmug.net/display/SmugMug/API">API</a> people can use to access the features of the site programmatically and I noticed they added OAuth in the <a href="http://wiki.smugmug.net/display/API/Home">latest version</a>. So, I thought I would give it a try and see if I can use the <a href="http://wikis.sun.com/display/Jersey/OAuth">OAuth Support</a> in <a href="http://jersey.dev.java.net/">Jersey</a> to authorize and authenticate my client application with SmugMug. Turned out it works! Here is how to do it:</p>
<ol>
<li>First you have to request an API Key from SmugMug. You can do it <a href="http://www.smugmug.com/hack/apikeys">here</a>.</li>
<li>They probably approve these automatically &#8211; mine was approved immediately and I got the key along with a &#8220;secret&#8221; (another number used as a consumer secret key in OAuth).</li>
<li>Now you can create a new maven project, adding jersey-client, jersey-json, oauth-signature and oauth-client as the dependencies &#8211; here is a pom file snippet:
<div class="codebox">
<pre>    <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>dependency<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>groupId<span class="Braces">&gt;</span></span>com.sun.jersey<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/groupId<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>artifactId<span class="Braces">&gt;</span></span>jersey-client<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/artifactId<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>version<span class="Braces">&gt;</span></span>1.1.2-ea-SNAPSHOT<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/version<span class="Braces">&gt;</span></span>
    <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/dependency<span class="Braces">&gt;</span></span>
    <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>dependency<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>groupId<span class="Braces">&gt;</span></span>com.sun.jersey<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/groupId<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>artifactId<span class="Braces">&gt;</span></span>jersey-json<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/artifactId<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>version<span class="Braces">&gt;</span></span>1.1.2-ea-SNAPSHOT<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/version<span class="Braces">&gt;</span></span>
    <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/dependency<span class="Braces">&gt;</span></span>
    <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>dependency<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>groupId<span class="Braces">&gt;</span></span>com.sun.jersey.oauth<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/groupId<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>artifactId<span class="Braces">&gt;</span></span>oauth-signature<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/artifactId<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>version<span class="Braces">&gt;</span></span>1.1.2-ea-SNAPSHOT<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/version<span class="Braces">&gt;</span></span>
    <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/dependency<span class="Braces">&gt;</span></span>
    <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>dependency<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>groupId<span class="Braces">&gt;</span></span>com.sun.jersey.oauth<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/groupId<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>artifactId<span class="Braces">&gt;</span></span>oauth-client<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/artifactId<span class="Braces">&gt;</span></span>
      <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>version<span class="Braces">&gt;</span></span>1.1.2-ea-SNAPSHOT<span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/version<span class="Braces">&gt;</span></span>
    <span class="PredefinedIdentifier"><span class="Braces">&lt;</span>/dependency<span class="Braces">&gt;</span></span></pre>
</div>
</li>
<li>The first thing you need to do according to the <a href="http://oauth.net/core/1.0#anchor9">OAuth spec</a> is to get an unauthorized request token from the provider (SmugMug in this case). You will need the key and the secret you obtained in step 1. The <a href="http://wiki.smugmug.net/display/API/API+1.2.2">SmugMug API</a> provides a method for requesting these tokens &#8211; <a href="http://wiki.smugmug.net/display/API/show+1.2.2?method=smugmug.auth.getRequestToken">getRequestToken</a>. Here is an example of how you can call this method using Jersey client API and the Jersey OAuth library:
<div class="codebox">
<pre><span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">App</span> <span class="Braces">{</span>
    <span class="Comment">// base URL for the API calls</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="Identifier">String</span> <span class="Identifier">URL_API</span> <span class="Symbol">=</span>
            <span class="String">"http://api.smugmug.com/services/api/json/1.2.2/"</span><span class="Symbol">;</span>

    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="Identifier">String</span> <span class="Identifier">CONSUMER_SECRET</span> <span class="Symbol">=</span> <span class="Comment">/* your API Key */</span><span class="Symbol">;</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="Identifier">String</span> <span class="Identifier">CONSUMER_KEY</span> <span class="Symbol">=</span> <span class="Comment">/* your secret key */</span><span class="Symbol">;</span>

    <span class="ReservedWord">public</span> <span class="ReservedWord">static</span> <span class="ReservedWord">void</span> <span class="Identifier">main</span><span class="Braces">(</span> <span class="Identifier">String</span><span class="Braces">[</span><span class="Braces">]</span> <span class="Identifier">args</span> <span class="Braces">)</span> <span class="ReservedWord">throws</span> <span class="Identifier">Exception</span> <span class="Braces">{</span>
        <span class="Comment">// Create a Jersey client</span>
        <span class="Identifier">Client</span> <span class="Identifier">client</span> <span class="Symbol">=</span> <span class="Identifier">Client</span>.<span class="Identifier">create</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>

        <span class="Comment">// Create a resource to be used to make SmugMug API calls</span>
        <span class="Identifier">WebResource</span> <span class="Identifier">resource</span> <span class="Symbol">=</span> <span class="Identifier">client</span>.<span class="Identifier">resource</span><span class="Braces">(</span><span class="Identifier">URL_API</span><span class="Braces">)</span>.
                <span class="Identifier">queryParam</span><span class="Braces">(</span><span class="String">"method"</span>, <span class="String">"smugmug.auth.getRequestToken"</span><span class="Braces">)</span><span class="Symbol">;</span>

        <span class="Comment">// Set the OAuth parameters</span>
        <span class="Identifier">OAuthSecrets</span> <span class="Identifier">secrets</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="Identifier">OAuthSecrets</span><span class="Braces">(</span><span class="Braces">)</span>.<span class="Identifier">consumerSecret</span><span class="Braces">(</span><span class="Identifier">CONSUMER_SECRET</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Identifier">OAuthParameters</span> <span class="Identifier">params</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="Identifier">OAuthParameters</span><span class="Braces">(</span><span class="Braces">)</span>.<span class="Identifier">consumerKey</span><span class="Braces">(</span><span class="Identifier">CONSUMER_KEY</span><span class="Braces">)</span>.
                <span class="Identifier">signatureMethod</span><span class="Braces">(</span><span class="String">"HMAC-SHA1"</span><span class="Braces">)</span>.<span class="Identifier">version</span><span class="Braces">(</span><span class="String">"1.0"</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// Create the OAuth client filter</span>
        <span class="Identifier">OAuthClientFilter</span> <span class="Identifier">filter</span> <span class="Symbol">=</span>
                <span class="ReservedWord">new</span> <span class="Identifier">OAuthClientFilter</span><span class="Braces">(</span><span class="Identifier">client</span>.<span class="Identifier">getProviders</span><span class="Braces">(</span><span class="Braces">)</span>, <span class="Identifier">params</span>, <span class="Identifier">secrets</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// Add the filter to the resource</span>
        <span class="Identifier">resource</span>.<span class="Identifier">addFilter</span><span class="Braces">(</span><span class="Identifier">filter</span><span class="Braces">)</span><span class="Symbol">;</span>

        <span class="Comment">// make the request and print out the result</span>
        <span class="Identifier">System</span>.<span class="Identifier">out</span>.<span class="Identifier">println</span><span class="Braces">(</span><span class="Identifier">resource</span>.<span class="Identifier">get</span><span class="Braces">(</span><span class="Identifier">String</span>.<span class="ReservedWord">class</span><span class="Braces">)</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
</li>
<li>The next step in the OAuth flow is to obtain user authorization. To do this, the user needs to be redirected to the SmugMug authorization URL &#8211; http://api.smugmug.com/services/oauth/authorize.mg (see the SmugMug Specifics section on <a href="http://wiki.smugmug.net/display/API/OAuth">their OAuth page</a>), passing the request token ID as a query parameter (you need to extract that from the getRequestToken method&#8217;s response). At this URL the user will log in and grant the requested access to your application. Here is how I did it:
<div class="codebox">
<pre><span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">App</span> <span class="Braces">{</span>
    <span class="Comment">// base URL for the API calls</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="Identifier">String</span> <span class="Identifier">URL_API</span> <span class="Symbol">=</span>
            <span class="String">"http://api.smugmug.com/services/api/json/1.2.2/"</span><span class="Symbol">;</span>
    <span class="Comment">// authorization URL</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="Identifier">String</span> <span class="Identifier">URL_AUTHORIZE</span> <span class="Symbol">=</span>
            <span class="String">"http://api.smugmug.com/services/oauth/authorize.mg"</span><span class="Symbol">;</span>

    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="Identifier">String</span> <span class="Identifier">CONSUMER_SECRET</span> <span class="Symbol">=</span> <span class="Comment">/* your API Key */</span><span class="Symbol">;</span>
    <span class="ReservedWord">private</span> <span class="ReservedWord">static</span> <span class="ReservedWord">final</span> <span class="Identifier">String</span> <span class="Identifier">CONSUMER_KEY</span> <span class="Symbol">=</span> <span class="Comment">/* your secret key */</span><span class="Symbol">;</span>

    <span class="ReservedWord">public</span> <span class="ReservedWord">static</span> <span class="ReservedWord">void</span> <span class="Identifier">main</span><span class="Braces">(</span> <span class="Identifier">String</span><span class="Braces">[</span><span class="Braces">]</span> <span class="Identifier">args</span> <span class="Braces">)</span> <span class="ReservedWord">throws</span> <span class="Identifier">Exception</span> <span class="Braces">{</span>
        <span class="Comment">// Create a Jersey client</span>
        <span class="Identifier">Client</span> <span class="Identifier">client</span> <span class="Symbol">=</span> <span class="Identifier">Client</span>.<span class="Identifier">create</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>

        <span class="Comment">// Create a resource to be used to make SmugMug API calls</span>
        <span class="Identifier">WebResource</span> <span class="Identifier">resource</span> <span class="Symbol">=</span> <span class="Identifier">client</span>.<span class="Identifier">resource</span><span class="Braces">(</span><span class="Identifier">URL_API</span><span class="Braces">)</span>.
                <span class="Identifier">queryParam</span><span class="Braces">(</span><span class="String">"method"</span>, <span class="String">"smugmug.auth.getRequestToken"</span><span class="Braces">)</span><span class="Symbol">;</span>

        <span class="Comment">// Set the OAuth parameters</span>
        <span class="Identifier">OAuthSecrets</span> <span class="Identifier">secrets</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="Identifier">OAuthSecrets</span><span class="Braces">(</span><span class="Braces">)</span>.<span class="Identifier">consumerSecret</span><span class="Braces">(</span><span class="Identifier">CONSUMER_SECRET</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Identifier">OAuthParameters</span> <span class="Identifier">params</span> <span class="Symbol">=</span> <span class="ReservedWord">new</span> <span class="Identifier">OAuthParameters</span><span class="Braces">(</span><span class="Braces">)</span>.<span class="Identifier">consumerKey</span><span class="Braces">(</span><span class="Identifier">CONSUMER_KEY</span><span class="Braces">)</span>.
                <span class="Identifier">signatureMethod</span><span class="Braces">(</span><span class="String">"HMAC-SHA1"</span><span class="Braces">)</span>.<span class="Identifier">version</span><span class="Braces">(</span><span class="String">"1.0"</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// Create the OAuth client filter</span>
        <span class="Identifier">OAuthClientFilter</span> <span class="Identifier">filter</span> <span class="Symbol">=</span>
                <span class="ReservedWord">new</span> <span class="Identifier">OAuthClientFilter</span><span class="Braces">(</span><span class="Identifier">client</span>.<span class="Identifier">getProviders</span><span class="Braces">(</span><span class="Braces">)</span>, <span class="Identifier">params</span>, <span class="Identifier">secrets</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// Add the filter to the resource</span>
        <span class="Identifier">resource</span>.<span class="Identifier">addFilter</span><span class="Braces">(</span><span class="Identifier">filter</span><span class="Braces">)</span><span class="Symbol">;</span>

        <span class="Comment">// make the request</span>
        <span class="Identifier">RequestTokenResponse</span> <span class="Identifier">response</span> <span class="Symbol">=</span> <span class="Identifier">resource</span>.<span class="Identifier">get</span><span class="Braces">(</span><span class="Identifier">RequestTokenResponse</span>.<span class="ReservedWord">class</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// check the status</span>
        <span class="ReservedWord">if</span> <span class="Braces">(</span><span class="Symbol">!</span><span class="String">"ok"</span>.<span class="Identifier">equals</span><span class="Braces">(</span><span class="Identifier">response</span>.<span class="Identifier">stat</span><span class="Braces">)</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="Identifier">System</span>.<span class="Identifier">out</span>.<span class="Identifier">println</span><span class="Braces">(</span><span class="String">"getRequestToken failed with response: "</span> <span class="Symbol">+</span>
                    <span class="Identifier">response</span>.<span class="Identifier">toString</span><span class="Braces">(</span><span class="Braces">)</span><span class="Braces">)</span><span class="Symbol">;</span>
            <span class="ReservedWord">return</span><span class="Symbol">;</span>
        <span class="Braces">}</span>

        <span class="Comment">// open the browser at the authorization URL to let user authorize</span>
        <span class="Identifier">Desktop</span>.<span class="Identifier">getDesktop</span><span class="Braces">(</span><span class="Braces">)</span>.<span class="Identifier">browse</span><span class="Braces">(</span><span class="ReservedWord">new</span> <span class="Identifier">URI</span><span class="Braces">(</span><span class="Identifier">URL_AUTHORIZE</span> <span class="Symbol">+</span>
                <span class="String">"?oauth_token="</span> <span class="Symbol">+</span> <span class="Identifier">response</span>.<span class="Identifier">auth</span>.<span class="Identifier">token</span>.<span class="Identifier">id</span><span class="Braces">)</span><span class="Braces">)</span><span class="Symbol">;</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
<p>The RequestTokenResponse class representing getRequestToken method&#8217;s response looks as follows:</p>
<div class="codebox">
<pre>@<span class="Identifier">XmlRootElement</span>
<span class="ReservedWord">public</span> <span class="ReservedWord">class</span> <span class="Identifier">RequestTokenResponse</span> <span class="Braces">{</span>
    <span class="ReservedWord">public</span> <span class="Identifier">String</span> <span class="Identifier">stat</span><span class="Symbol">;</span>
    <span class="ReservedWord">public</span> <span class="Identifier">String</span> <span class="Identifier">method</span><span class="Symbol">;</span>
    <span class="ReservedWord">public</span> @<span class="Identifier">XmlElement</span><span class="Braces">(</span><span class="Identifier">name</span><span class="Symbol">=</span><span class="String">"Auth"</span><span class="Braces">)</span> <span class="Identifier">AuthElement</span> <span class="Identifier">auth</span><span class="Symbol">;</span>

    <span class="ReservedWord">public</span> <span class="ReservedWord">static</span> <span class="ReservedWord">class</span> <span class="Identifier">AuthElement</span> <span class="Braces">{</span>
        <span class="ReservedWord">public</span> @<span class="Identifier">XmlElement</span><span class="Braces">(</span><span class="Identifier">name</span><span class="Symbol">=</span><span class="String">"Token"</span><span class="Braces">)</span> <span class="Identifier">TokenElement</span> <span class="Identifier">token</span><span class="Symbol">;</span>

        @<span class="Identifier">Override</span>
        <span class="ReservedWord">public</span> <span class="Identifier">String</span> <span class="Identifier">toString</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="ReservedWord">return</span> <span class="String">"token=("</span> <span class="Symbol">+</span> <span class="Braces">(</span><span class="Identifier">token</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="ReservedWord">null</span> ? <span class="String">"null"</span> <span class="Symbol">:</span> <span class="Identifier">token</span>.<span class="Identifier">toString</span><span class="Braces">(</span><span class="Braces">)</span><span class="Braces">)</span> <span class="Symbol">+</span> <span class="String">")"</span><span class="Symbol">;</span>
        <span class="Braces">}</span>
    <span class="Braces">}</span>

    <span class="ReservedWord">public</span> <span class="ReservedWord">static</span> <span class="ReservedWord">class</span> <span class="Identifier">TokenElement</span> <span class="Braces">{</span>
        <span class="ReservedWord">public</span> <span class="Identifier">String</span> <span class="Identifier">id</span><span class="Symbol">;</span>
        <span class="ReservedWord">public</span> @<span class="Identifier">XmlElement</span><span class="Braces">(</span><span class="Identifier">name</span><span class="Symbol">=</span><span class="String">"Secret"</span><span class="Braces">)</span> <span class="Identifier">String</span> <span class="Identifier">secret</span><span class="Symbol">;</span>

        @<span class="Identifier">Override</span>
        <span class="ReservedWord">public</span> <span class="Identifier">String</span> <span class="Identifier">toString</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
            <span class="ReservedWord">return</span> <span class="String">"id="</span> <span class="Symbol">+</span> <span class="Identifier">id</span> <span class="Symbol">+</span> <span class="String">" secret="</span> <span class="Symbol">+</span> <span class="Identifier">secret</span><span class="Symbol">;</span>
        <span class="Braces">}</span>
    <span class="Braces">}</span>

    @<span class="Identifier">Override</span>
    <span class="ReservedWord">public</span> <span class="Identifier">String</span> <span class="Identifier">toString</span><span class="Braces">(</span><span class="Braces">)</span> <span class="Braces">{</span>
        <span class="ReservedWord">return</span> <span class="String">"stat="</span> <span class="Symbol">+</span> <span class="Identifier">stat</span> <span class="Symbol">+</span> <span class="String">" method="</span> <span class="Symbol">+</span> <span class="Identifier">method</span> <span class="Symbol">+</span> <span class="String">" auth=("</span> <span class="Symbol">+</span>
                <span class="Braces">(</span><span class="Identifier">auth</span> <span class="Symbol">=</span><span class="Symbol">=</span> <span class="ReservedWord">null</span> ? <span class="String">"null"</span> <span class="Symbol">:</span> <span class="Identifier">auth</span>.<span class="Identifier">toString</span><span class="Braces">(</span><span class="Braces">)</span><span class="Braces">)</span> <span class="Symbol">+</span> <span class="String">")"</span><span class="Symbol">;</span>
    <span class="Braces">}</span>
<span class="Braces">}</span></pre>
</div>
</li>
<li>After the user authenticates and grants access for your application, the last step is to request an access token &#8211; that will then enable your application to make subsequent API calls. You can implement this by adding the following lines at the end of the main method from the previous bullet:
<div class="codebox">
<pre>        <span class="Comment">// wait for the user to authenticate</span>
        <span class="Identifier">System</span>.<span class="Identifier">out</span>.<span class="Identifier">println</span><span class="Braces">(</span><span class="String">&quot;Once you authenticated with SmugMug and granted&quot;</span> <span class="Symbol">+</span>
                <span class="String">&quot;permissions to this app, press Enter to continue.&quot;</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Identifier">System</span>.<span class="Identifier">in</span>.<span class="Identifier">read</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>

        <span class="Comment">// make an API call to request the access token</span>
        <span class="Identifier">resource</span> <span class="Symbol">=</span> <span class="Identifier">client</span>.<span class="Identifier">resource</span><span class="Braces">(</span><span class="Identifier">URL_API</span><span class="Braces">)</span>.<span class="Identifier">queryParam</span><span class="Braces">(</span><span class="String">&quot;method&quot;</span>,
                <span class="String">&quot;smugmug.auth.getAccessToken&quot;</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// use the request token id and secret to create the request</span>
        <span class="Identifier">secrets</span>.<span class="Identifier">setTokenSecret</span><span class="Braces">(</span><span class="Identifier">response</span>.<span class="Identifier">auth</span>.<span class="Identifier">token</span>.<span class="Identifier">secret</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Identifier">params</span>.<span class="Identifier">token</span><span class="Braces">(</span><span class="Identifier">response</span>.<span class="Identifier">auth</span>.<span class="Identifier">token</span>.<span class="Identifier">id</span><span class="Braces">)</span>.<span class="Identifier">timestamp</span><span class="Braces">(</span><span class="Braces">)</span>.<span class="Identifier">nonce</span><span class="Braces">(</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Identifier">resource</span>.<span class="Identifier">addFilter</span><span class="Braces">(</span><span class="Identifier">filter</span><span class="Braces">)</span><span class="Symbol">;</span>
        <span class="Comment">// make the request and print out the result</span>
        <span class="Identifier">System</span>.<span class="Identifier">out</span>.<span class="Identifier">println</span><span class="Braces">(</span><span class="Identifier">resource</span>.<span class="Identifier">get</span><span class="Braces">(</span><span class="Identifier">String</span>.<span class="ReservedWord">class</span><span class="Braces">)</span><span class="Braces">)</span><span class="Symbol">;</span></pre>
</div>
</li>
<li>That&#8217;s it! Now your application can store the access token and use it to perform actions on behalf of the user.</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.alutam.com/2009/08/10/using-jersey-client-oauth-support-with-smugmug/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Hello world!</title>
		<link>http://blog.alutam.com/2009/08/04/hello-world/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed</link>
		<comments>http://blog.alutam.com/2009/08/04/hello-world/#comments</comments>
		<pubDate>Tue, 04 Aug 2009 21:33:56 +0000</pubDate>
		<dc:creator>Martin</dc:creator>
				<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://www.alutam.com/?p=1</guid>
		<description><![CDATA[Decided to start my blog. Still playing with the WordPress to tweak the overall page appearance. Feedback and hints are welcome  .
]]></description>
			<content:encoded><![CDATA[<p>Decided to start my blog. Still playing with the WordPress to tweak the overall page appearance. Feedback and hints are welcome <img src='http://blog.alutam.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alutam.com/2009/08/04/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
