<?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 &#187; REST</title>
	<atom:link href="http://blog.alutam.com/category/rest/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>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>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>
	</channel>
</rss>
