You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@oltu.apache.org by to...@apache.org on 2010/12/18 17:14:06 UTC

svn commit: r1050659 [1/2] - in /incubator/amber/trunk/oauth-2.0/oauth2-client: ./ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/amber/ src/main/java/org/apache/amber/oauth2/ src/main/java/org/apach...

Author: tommaso
Date: Sat Dec 18 16:14:04 2010
New Revision: 1050659

URL: http://svn.apache.org/viewvc?rev=1050659&view=rev
Log:
[AMBER-11] - import of Leelo OAuth 2.0 implementation - oauth2-client module

Added:
    incubator/amber/trunk/oauth-2.0/oauth2-client/   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/pom.xml   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/HttpClient.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/OAuthClient.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/URLConnectionClient.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/ClientHeaderParametersApplier.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/OAuthClientRequest.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/GitHubTokenResponse.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAccessTokenResponse.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAuthzResponse.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponse.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponseFactory.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthErrorResponse.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthJSONAccessTokenResponse.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeTokenValidator.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeValidator.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/OAuthClientValidator.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/TokenValidator.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/OAuthClientTest.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/GitHubTokenResponseTest.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/OAuthAuthorizationResponseImplTest.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/OAuthClientResponseFactoryTest.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/OAuthJSONAccessTokenResponseTest.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/utils/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/utils/TestUtils.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/validator/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/validator/CodeTokenValidatorTest.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/validator/CodeValidatorTest.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/validator/TokenValidatorTest.java   (with props)
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/resources/
    incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/resources/log4j.properties   (with props)

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Sat Dec 18 16:14:04 2010
@@ -0,0 +1 @@
+target

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/pom.xml
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/pom.xml?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/pom.xml (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/pom.xml Sat Dec 18 16:14:04 2010
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+          Copyright 2010 Newcastle University
+
+             http://research.ncl.ac.uk/smart/
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>oauth2-client</artifactId>
+    <groupId>org.apache.amber</groupId>
+    <name>Apache Amber: OAuth 2.0 Implementation - Client</name>
+    <packaging>jar</packaging>
+    <version>0.2-SNAPSHOT</version>
+
+    <parent>
+        <artifactId>amber-oauth2-parent</artifactId>
+        <groupId>org.apache.amber</groupId>
+        <version>0.2-SNAPSHOT</version>
+    </parent>
+
+    <build>
+        <finalName>oauth2-client</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>2.5</version>
+                <configuration>
+                    <excludes>
+                        <exclude>**/utils/*</exclude>
+                        <exclude>**/OAuthClientTest.java</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.amber</groupId>
+            <artifactId>oauth2-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.codehaus.jettison</groupId>
+            <artifactId>jettison</artifactId>
+            <version>${jettison.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>stax</groupId>
+                    <artifactId>stax-api</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+    </dependencies>
+
+</project>
\ No newline at end of file

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/HttpClient.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/HttpClient.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/HttpClient.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/HttpClient.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,44 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client;
+
+import java.util.Map;
+
+import org.apache.amber.oauth2.client.request.OAuthClientRequest;
+import org.apache.amber.oauth2.client.response.OAuthClientResponse;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+import org.apache.amber.oauth2.common.exception.OAuthSystemException;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public interface HttpClient {
+
+    public <T extends OAuthClientResponse> T execute(
+        OAuthClientRequest request,
+        Map<String, String> headers,
+        String requestMethod,
+        Class<T> responseClass)
+        throws OAuthSystemException, OAuthProblemException;
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/HttpClient.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/OAuthClient.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/OAuthClient.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/OAuthClient.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/OAuthClient.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,66 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.amber.oauth2.client.request.OAuthClientRequest;
+import org.apache.amber.oauth2.client.response.OAuthAccessTokenResponse;
+import org.apache.amber.oauth2.client.response.OAuthJSONAccessTokenResponse;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+import org.apache.amber.oauth2.common.exception.OAuthSystemException;
+import org.apache.amber.oauth2.common.OAuth;
+
+/**
+ * OAuth Client - exposes a high-level API for Client Applications
+ *
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class OAuthClient {
+
+    protected HttpClient httpClient;
+
+    public OAuthClient(HttpClient oauthClient) {
+        this.httpClient = oauthClient;
+    }
+
+    public <T extends OAuthAccessTokenResponse> T accessToken(
+        OAuthClientRequest request,
+        Class<T> responseClass)
+        throws OAuthSystemException, OAuthProblemException {
+
+        String method = OAuth.HttpMethod.POST;
+        Map<String, String> headers = new HashMap<String, String>();
+        headers.put(OAuth.HeaderType.CONTENT_TYPE, OAuth.ContentType.URL_ENCODED);
+
+        return httpClient.execute(request, headers, method, responseClass);
+    }
+
+    public OAuthJSONAccessTokenResponse accessToken(
+        OAuthClientRequest request)
+        throws OAuthSystemException, OAuthProblemException {
+        return accessToken(request, OAuthJSONAccessTokenResponse.class);
+    }
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/OAuthClient.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/URLConnectionClient.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/URLConnectionClient.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/URLConnectionClient.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/URLConnectionClient.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,109 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Map;
+
+import org.apache.amber.oauth2.client.request.OAuthClientRequest;
+import org.apache.amber.oauth2.client.response.OAuthClientResponse;
+import org.apache.amber.oauth2.client.response.OAuthClientResponseFactory;
+import org.apache.amber.oauth2.common.OAuth;
+import org.apache.amber.oauth2.common.exception.OAuthSystemException;
+import org.apache.amber.oauth2.common.utils.OAuthUtils;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+
+
+/**
+ * Implementation of the OAuth HttpClient using URL Connection
+ *
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class URLConnectionClient implements HttpClient {
+
+    public URLConnectionClient() {
+    }
+
+    public <T extends OAuthClientResponse> T execute(OAuthClientRequest request, Map<String, String> headers,
+                                                     String requestMethod, Class<T> responseClass)
+        throws OAuthSystemException, OAuthProblemException {
+
+        String responseBody = null;
+        URLConnection c = null;
+        int responseCode = 0;
+        try {
+            URL url = new URL(request.getLocationUri());
+
+            c = url.openConnection();
+            responseCode = -1;
+            if (c instanceof HttpURLConnection) {
+                HttpURLConnection httpURLConnection = (HttpURLConnection)c;
+
+                if (headers != null && !headers.isEmpty()) {
+                    for (Map.Entry<String, String> header : headers.entrySet()) {
+                        httpURLConnection.addRequestProperty(header.getKey(), header.getValue());
+                    }
+                }
+
+                if (!OAuthUtils.isEmpty(requestMethod)) {
+                    httpURLConnection.setRequestMethod(requestMethod);
+                    if (requestMethod.equals(OAuth.HttpMethod.POST)) {
+                        httpURLConnection.setDoOutput(true);
+                        OutputStream ost = httpURLConnection.getOutputStream();
+                        PrintWriter pw = new PrintWriter(ost);
+                        pw.print(request.getBody());
+                        pw.flush();
+                        pw.close();
+                    }
+                } else {
+                    httpURLConnection.setRequestMethod(OAuth.HttpMethod.GET);
+                }
+
+                httpURLConnection.connect();
+
+                InputStream inputStream;
+                responseCode = httpURLConnection.getResponseCode();
+                if (responseCode == 400) {
+                    inputStream = httpURLConnection.getErrorStream();
+                } else {
+                    inputStream = httpURLConnection.getInputStream();
+                }
+
+                responseBody = OAuthUtils.saveStreamAsString(inputStream);
+            }
+        } catch (IOException e) {
+            throw new OAuthSystemException(e);
+        }
+
+        return OAuthClientResponseFactory
+            .createCustomResponse(responseBody, c.getContentType(), responseCode, responseClass);
+    }
+
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/URLConnectionClient.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/ClientHeaderParametersApplier.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/ClientHeaderParametersApplier.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/ClientHeaderParametersApplier.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/ClientHeaderParametersApplier.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,48 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.request;
+
+import java.util.Map;
+
+import org.apache.amber.oauth2.common.OAuth;
+import org.apache.amber.oauth2.common.exception.OAuthSystemException;
+import org.apache.amber.oauth2.common.message.OAuthMessage;
+import org.apache.amber.oauth2.common.parameters.OAuthParametersApplier;
+import org.apache.amber.oauth2.common.utils.OAuthUtils;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class ClientHeaderParametersApplier implements OAuthParametersApplier {
+
+    public OAuthMessage applyOAuthParameters(OAuthMessage message, Map<String, String> params)
+        throws OAuthSystemException {
+
+        String header = OAuthUtils.encodeOAuthHeader(params);
+        message.addHeader(OAuth.HeaderType.AUTHORIZATION, header);
+        return message;
+
+    }
+
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/ClientHeaderParametersApplier.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/OAuthClientRequest.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/OAuthClientRequest.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/OAuthClientRequest.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/OAuthClientRequest.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,233 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.request;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.amber.oauth2.common.OAuth;
+import org.apache.amber.oauth2.common.exception.OAuthSystemException;
+import org.apache.amber.oauth2.common.message.OAuthMessage;
+import org.apache.amber.oauth2.common.parameters.OAuthParametersApplier;
+import org.apache.amber.oauth2.common.parameters.QueryParameterApplier;
+import org.apache.amber.oauth2.common.message.types.GrantType;
+import org.apache.amber.oauth2.common.parameters.BodyURLEncodedParametersApplier;
+
+/**
+ * OAuth Client Request
+ *
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+
+public class OAuthClientRequest implements OAuthMessage {
+
+    protected String url;
+    protected String body;
+    protected Map<String, String> headers;
+
+    protected OAuthClientRequest(String url) {
+        this.url = url;
+    }
+
+    public static AuthenticationRequestBuilder authorizationLocation(String url) {
+        return new AuthenticationRequestBuilder(url);
+    }
+
+    public static TokenRequestBuilder tokenLocation(String url) {
+        return new TokenRequestBuilder(url);
+    }
+
+    public String getBody() {
+        return body;
+    }
+
+    public void setBody(String body) {
+        this.body = body;
+    }
+
+    public Map<String, String> getHeaders() {
+        return headers;
+    }
+
+    @Override
+    public void addHeader(String name, String header) {
+        this.headers.put(name, header);
+    }
+
+    public void setHeaders(Map<String, String> headers) {
+        this.headers = headers;
+    }
+
+    public String getLocationUri() {
+        return url;
+    }
+
+    public void setLocationUri(String uri) {
+        this.url = uri;
+    }
+
+    public String getHeader(String name) {
+        return this.headers.get(name);
+    }
+
+    public void setHeader(String name, String value) {
+        this.headers.put(name, value);
+    }
+
+    public abstract static class OAuthRequestBuilder {
+
+        protected OAuthParametersApplier applier;
+        protected Map<String, String> parameters = new HashMap<String, String>();
+
+        protected String url;
+
+        protected OAuthRequestBuilder(String url) {
+            this.url = url;
+        }
+
+        public OAuthClientRequest buildQueryMessage() throws OAuthSystemException {
+            OAuthClientRequest request = new OAuthClientRequest(url);
+            this.applier = new QueryParameterApplier();
+            return (OAuthClientRequest)applier.applyOAuthParameters(request, parameters);
+        }
+
+        public OAuthClientRequest buildBodyMessage() throws OAuthSystemException {
+            OAuthClientRequest request = new OAuthClientRequest(url);
+            this.applier = new BodyURLEncodedParametersApplier();
+            return (OAuthClientRequest)applier.applyOAuthParameters(request, parameters);
+        }
+
+        public OAuthClientRequest buildHeaderMessage() throws OAuthSystemException {
+            OAuthClientRequest request = new OAuthClientRequest(url);
+            this.applier = new ClientHeaderParametersApplier();
+            return (OAuthClientRequest)applier.applyOAuthParameters(request, parameters);
+        }
+    }
+
+    public static class AuthenticationRequestBuilder extends OAuthRequestBuilder {
+
+        public AuthenticationRequestBuilder(String url) {
+            super(url);
+        }
+
+        public AuthenticationRequestBuilder setResponseType(String type) {
+            this.parameters.put(OAuth.OAUTH_RESPONSE_TYPE, type);
+            return this;
+        }
+
+        public AuthenticationRequestBuilder setClientId(String clientId) {
+            this.parameters.put(OAuth.OAUTH_CLIENT_ID, clientId);
+            return this;
+        }
+
+        public AuthenticationRequestBuilder setRedirectURI(String uri) {
+            this.parameters.put(OAuth.OAUTH_REDIRECT_URI, uri);
+            return this;
+        }
+
+        public AuthenticationRequestBuilder setState(String state) {
+            this.parameters.put(OAuth.OAUTH_STATE, state);
+            return this;
+        }
+
+        public AuthenticationRequestBuilder setScope(String scope) {
+            this.parameters.put(OAuth.OAUTH_SCOPE, scope);
+            return this;
+        }
+
+        public AuthenticationRequestBuilder setParameter(String paramName, String paramValue) {
+            this.parameters.put(paramName, paramValue);
+            return this;
+        }
+    }
+
+    public static class TokenRequestBuilder extends OAuthRequestBuilder {
+
+        public TokenRequestBuilder(String url) {
+            super(url);
+        }
+
+        public TokenRequestBuilder setGrantType(GrantType grantType) {
+            this.parameters.put(OAuth.OAUTH_GRANT_TYPE, grantType.toString());
+            return this;
+        }
+
+        public TokenRequestBuilder setClientId(String clientId) {
+            this.parameters.put(OAuth.OAUTH_CLIENT_ID, clientId);
+            return this;
+        }
+
+        public TokenRequestBuilder setClientSecret(String secret) {
+            this.parameters.put(OAuth.OAUTH_CLIENT_SECRET, secret);
+            return this;
+        }
+
+        public TokenRequestBuilder setUsername(String username) {
+            this.parameters.put(OAuth.OAUTH_USERNAME, username);
+            return this;
+        }
+
+        public TokenRequestBuilder setPassword(String password) {
+            this.parameters.put(OAuth.OAUTH_PASSWORD, password);
+            return this;
+        }
+
+        public TokenRequestBuilder setScope(String scope) {
+            this.parameters.put(OAuth.OAUTH_SCOPE, scope);
+            return this;
+        }
+
+        public TokenRequestBuilder setCode(String code) {
+            this.parameters.put(OAuth.OAUTH_CODE, code);
+            return this;
+        }
+
+        public TokenRequestBuilder setRedirectURI(String uri) {
+            this.parameters.put(OAuth.OAUTH_REDIRECT_URI, uri);
+            return this;
+        }
+
+        public TokenRequestBuilder setAssertion(String assertion) {
+            this.parameters.put(OAuth.OAUTH_ASSERTION, assertion);
+            return this;
+        }
+
+        public TokenRequestBuilder setAssertionType(String assertionType) {
+            this.parameters.put(OAuth.OAUTH_ASSERTION_TYPE, assertionType);
+            return this;
+        }
+
+        public TokenRequestBuilder setRefreshToken(String token) {
+            this.parameters.put(OAuth.OAUTH_REFRESH_TOKEN, token);
+            return this;
+        }
+
+        public TokenRequestBuilder setParameter(String paramName, String paramValue) {
+            this.parameters.put(paramName, paramValue);
+            return this;
+        }
+
+
+    }
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/request/OAuthClientRequest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/GitHubTokenResponse.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/GitHubTokenResponse.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/GitHubTokenResponse.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/GitHubTokenResponse.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,69 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.response;
+
+import org.apache.amber.oauth2.common.utils.OAuthUtils;
+import org.apache.amber.oauth2.common.OAuth;
+
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class GitHubTokenResponse extends OAuthAccessTokenResponse {
+
+
+    public String getAccessToken() {
+        return parameters.get(OAuth.OAUTH_ACCESS_TOKEN);
+    }
+
+    public String getExpiresIn() {
+        return parameters.get(OAuth.OAUTH_EXPIRES_IN);
+    }
+
+    public String getRefreshToken() {
+        return parameters.get(OAuth.OAUTH_EXPIRES_IN);
+    }
+
+    public String getScope() {
+        return parameters.get(OAuth.OAUTH_SCOPE);
+    }
+
+    protected void setBody(String body) {
+        this.body = body;
+        parameters = OAuthUtils.decodeForm(body);
+    }
+
+    protected void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+    protected void setResponseCode(int code) {
+        this.responseCode = code;
+    }
+
+    public String getParam(String name) {
+        return parameters.get(name);
+    }
+
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/GitHubTokenResponse.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAccessTokenResponse.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAccessTokenResponse.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAccessTokenResponse.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAccessTokenResponse.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,51 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.response;
+
+import org.apache.amber.oauth2.client.validator.TokenValidator;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public abstract class OAuthAccessTokenResponse extends OAuthClientResponse {
+
+    public abstract String getAccessToken();
+
+    public abstract String getExpiresIn();
+
+    public abstract String getRefreshToken();
+
+    public abstract String getScope();
+
+    public String getBody() {
+        return body;
+    }
+
+    @Override
+    protected void init(String body, String contentType, int responseCode) throws OAuthProblemException {
+        validator = new TokenValidator();
+        super.init(body, contentType, responseCode);
+    }
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAccessTokenResponse.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAuthzResponse.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAuthzResponse.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAuthzResponse.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAuthzResponse.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,119 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.response;
+
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.amber.oauth2.client.validator.CodeTokenValidator;
+import org.apache.amber.oauth2.client.validator.CodeValidator;
+import org.apache.amber.oauth2.client.validator.OAuthClientValidator;
+import org.apache.amber.oauth2.client.validator.TokenValidator;
+import org.apache.amber.oauth2.common.OAuth;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+import org.apache.amber.oauth2.common.utils.OAuthUtils;
+
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class OAuthAuthzResponse extends OAuthClientResponse {
+
+    private HttpServletRequest request;
+
+    protected OAuthAuthzResponse(HttpServletRequest request, OAuthClientValidator validator) {
+        this.request = request;
+        Map<String, String[]> params = request.getParameterMap();
+        for (Map.Entry<String, String[]> entry : params.entrySet()) {
+            String key = entry.getKey();
+            String[] values = entry.getValue();
+            if (!OAuthUtils.hasEmptyValues(values)) {
+                parameters.put(key, values[0]);
+            }
+        }
+        this.validator = validator;
+    }
+
+    public static OAuthAuthzResponse oauthCodeAuthzResponse(HttpServletRequest request)
+        throws OAuthProblemException {
+        OAuthAuthzResponse response = new OAuthAuthzResponse(request, new CodeValidator());
+        response.validate();
+        return response;
+    }
+
+    public static OAuthAuthzResponse oAuthCodeAndTokenAuthzResponse(HttpServletRequest request)
+        throws OAuthProblemException {
+        OAuthAuthzResponse response = new OAuthAuthzResponse(request, new CodeTokenValidator());
+        response.validate();
+        return response;
+    }
+
+    public static OAuthAuthzResponse oauthTokenAuthzResponse(HttpServletRequest request)
+        throws OAuthProblemException {
+        OAuthAuthzResponse response = new OAuthAuthzResponse(request, new TokenValidator());
+        response.validate();
+        return response;
+    }
+
+    public String getAccessToken() {
+        return getParam(OAuth.OAUTH_ACCESS_TOKEN);
+    }
+
+    public String getExpiresIn() {
+        return getParam(OAuth.OAUTH_EXPIRES_IN);
+    }
+
+    public String getScope() {
+        return getParam(OAuth.OAUTH_SCOPE);
+    }
+
+    public String getCode() {
+        return getParam(OAuth.OAUTH_CODE);
+    }
+
+    public String getState() {
+        return getParam(OAuth.OAUTH_STATE);
+    }
+
+    public HttpServletRequest getRequest() {
+        return request;
+    }
+
+    public String getParam(String key) {
+        return this.parameters.get(key);
+    }
+
+    protected void setBody(String body) {
+        this.body = body;
+    }
+
+    protected void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+    protected void setResponseCode(int responseCode) {
+        this.responseCode = responseCode;
+    }
+
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthAuthzResponse.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponse.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponse.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponse.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponse.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,63 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.response;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.amber.oauth2.client.validator.OAuthClientValidator;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public abstract class OAuthClientResponse {
+
+    protected String body;
+    protected String contentType;
+    protected int responseCode;
+
+    protected OAuthClientValidator validator;
+    protected Map<String, String> parameters = new HashMap<String, String>();
+
+    public abstract String getParam(String param);
+
+    protected abstract void setBody(String body) throws OAuthProblemException;
+
+    protected abstract void setContentType(String contentTypr);
+
+    protected abstract void setResponseCode(int responseCode);
+
+    protected void init(String body, String contentType, int responseCode) throws OAuthProblemException {
+        this.setBody(body);
+        this.setContentType(contentType);
+        this.setResponseCode(responseCode);
+        this.validate();
+
+    }
+
+    protected void validate() throws OAuthProblemException {
+        validator.validate(this);
+    }
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponse.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponseFactory.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponseFactory.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponseFactory.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponseFactory.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,66 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.response;
+
+
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+import org.apache.amber.oauth2.common.exception.OAuthSystemException;
+import org.apache.amber.oauth2.common.utils.OAuthUtils;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class OAuthClientResponseFactory {
+
+    public static OAuthClientResponse createGitHubTokenResponse(String body, String contentType,
+                                                                int responseCode)
+        throws OAuthProblemException {
+        GitHubTokenResponse resp = new GitHubTokenResponse();
+        resp.init(body, contentType, responseCode);
+        return resp;
+    }
+
+    public static OAuthClientResponse createJSONTokenResponse(String body, String contentType,
+                                                              int responseCode)
+        throws OAuthProblemException {
+        OAuthJSONAccessTokenResponse resp = new OAuthJSONAccessTokenResponse();
+        resp.init(body, contentType, responseCode);
+        return resp;
+    }
+
+    public static <T extends OAuthClientResponse> T createCustomResponse(String body, String contentType,
+                                                                         int responseCode,
+                                                                         Class<T> clazz)
+        throws OAuthSystemException, OAuthProblemException {
+
+        OAuthClientResponse resp = (OAuthClientResponse)OAuthUtils
+            .instantiateClassWithParameters(clazz, null, null);
+
+        resp.init(body, contentType, responseCode);
+
+        return (T)resp;
+    }
+
+
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthClientResponseFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthErrorResponse.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthErrorResponse.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthErrorResponse.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthErrorResponse.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,61 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.response;
+
+
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class OAuthErrorResponse {
+
+    private String error;
+    private String errorDescription;
+    private String errorUri;
+    private String state;
+
+    public OAuthErrorResponse(OAuthProblemException ex) {
+        this.error = ex.getError();
+        this.errorDescription = ex.getDescription();
+        this.errorUri = ex.getUri();
+        this.state = ex.getState();
+    }
+
+    public String getError() {
+        return error;
+    }
+
+    public String getErrorDescription() {
+        return errorDescription;
+    }
+
+    public String getErrorUri() {
+        return errorUri;
+    }
+
+    public String getState() {
+        return state;
+    }
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthErrorResponse.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthJSONAccessTokenResponse.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthJSONAccessTokenResponse.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthJSONAccessTokenResponse.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthJSONAccessTokenResponse.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,83 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.response;
+
+import org.apache.amber.oauth2.common.OAuth;
+import org.apache.amber.oauth2.common.error.OAuthError;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+import org.codehaus.jettison.json.JSONException;
+
+import org.apache.amber.oauth2.common.utils.JSONUtils;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class OAuthJSONAccessTokenResponse extends OAuthAccessTokenResponse {
+
+    public OAuthJSONAccessTokenResponse() {
+    }
+
+    @Override
+    public String getAccessToken() {
+        return parameters.get(OAuth.OAUTH_ACCESS_TOKEN);
+    }
+
+    @Override
+    public String getExpiresIn() {
+        return parameters.get(OAuth.OAUTH_EXPIRES_IN);
+    }
+
+    public String getScope() {
+        return parameters.get(OAuth.OAUTH_SCOPE);
+    }
+
+    public String getRefreshToken() {
+        return parameters.get(OAuth.OAUTH_REFRESH_TOKEN);
+    }
+
+    protected void setBody(String body) throws OAuthProblemException {
+
+        try {
+            this.body = body;
+            parameters = JSONUtils.parseJSON(body);
+        } catch (JSONException e) {
+            throw OAuthProblemException.error(OAuthError.CodeResponse.UNSUPPORTED_RESPONSE_TYPE,
+                "Invalid response! Response body is not " + OAuth.ContentType.JSON + " encoded");
+        }
+    }
+
+    protected void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+
+    protected void setResponseCode(int code) {
+        this.responseCode = code;
+    }
+
+    public String getParam(String name) {
+        return parameters.get(name);
+    }
+
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/response/OAuthJSONAccessTokenResponse.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeTokenValidator.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeTokenValidator.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeTokenValidator.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeTokenValidator.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,40 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.validator;
+
+
+import org.apache.amber.oauth2.common.OAuth;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class CodeTokenValidator extends OAuthClientValidator {
+
+    public CodeTokenValidator() {
+        requiredParams.put(OAuth.OAUTH_CODE, new String[] {});
+        requiredParams.put(OAuth.OAUTH_ACCESS_TOKEN, new String[] {});
+
+        notAllowedParams.add(OAuth.OAUTH_ACCESS_TOKEN);
+    }
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeTokenValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeValidator.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeValidator.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeValidator.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeValidator.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,41 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.validator;
+
+
+import org.apache.amber.oauth2.common.OAuth;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class CodeValidator extends OAuthClientValidator {
+
+    public CodeValidator() {
+
+        requiredParams.put(OAuth.OAUTH_CODE, new String[] {});
+
+        notAllowedParams.add(OAuth.OAUTH_ACCESS_TOKEN);
+        notAllowedParams.add(OAuth.OAUTH_EXPIRES_IN);
+    }
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/CodeValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/OAuthClientValidator.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/OAuthClientValidator.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/OAuthClientValidator.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/OAuthClientValidator.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,108 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.validator;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.amber.oauth2.common.error.OAuthError;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+import org.apache.amber.oauth2.common.utils.OAuthUtils;
+import org.apache.amber.oauth2.client.response.OAuthClientResponse;
+import org.apache.amber.oauth2.common.OAuth;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public abstract class OAuthClientValidator {
+
+    protected Map<String, String[]> requiredParams = new HashMap<String, String[]>();
+    protected List<String> notAllowedParams = new ArrayList<String>();
+
+    public void validate(OAuthClientResponse response) throws OAuthProblemException {
+        validateErrorResponse(response);
+        validateParameters(response);
+    }
+
+    public void validateParameters(OAuthClientResponse response) throws OAuthProblemException {
+        validateRequiredParameters(response);
+        validateNotAllowedParameters(response);
+    }
+
+    public void validateErrorResponse(OAuthClientResponse response) throws OAuthProblemException {
+        String error = response.getParam(OAuthError.OAUTH_ERROR);
+        if (!OAuthUtils.isEmpty(error)) {
+            String errorDesc = response.getParam(OAuthError.OAUTH_ERROR_DESCRIPTION);
+            String errorUri = response.getParam(OAuthError.OAUTH_ERROR_URI);
+            String state = response.getParam(OAuth.OAUTH_STATE);
+            throw OAuthProblemException.error(error).description(errorDesc).uri(errorUri).state(state);
+        }
+    }
+
+
+    public void validateRequiredParameters(OAuthClientResponse response) throws OAuthProblemException {
+        Set<String> missingParameters = new HashSet<String>();
+
+        for (Map.Entry<String, String[]> requiredParam : requiredParams.entrySet()) {
+            String paramName = requiredParam.getKey();
+            String val = response.getParam(paramName);
+            if (OAuthUtils.isEmpty(val)) {
+                missingParameters.add(paramName);
+            } else {
+                String[] dependentParams = requiredParam.getValue();
+                if (!OAuthUtils.hasEmptyValues(dependentParams)) {
+                    for (String dependentParam : dependentParams) {
+                        val = response.getParam(dependentParam);
+                        if (OAuthUtils.isEmpty(val)) {
+                            missingParameters.add(dependentParam);
+                        }
+                    }
+                }
+            }
+        }
+
+        if (!missingParameters.isEmpty()) {
+            throw OAuthUtils.handleMissingParameters(missingParameters);
+        }
+    }
+
+    public void validateNotAllowedParameters(OAuthClientResponse response) throws OAuthProblemException {
+        List<String> notAllowedParameters = new ArrayList<String>();
+        for (String requiredParam : notAllowedParams) {
+            String val = response.getParam(requiredParam);
+            if (!OAuthUtils.isEmpty(val)) {
+                notAllowedParameters.add(requiredParam);
+            }
+        }
+        if (!notAllowedParameters.isEmpty()) {
+            throw OAuthUtils.handleNotAllowedParametersOAuthException(notAllowedParameters);
+        }
+    }
+
+
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/OAuthClientValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/TokenValidator.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/TokenValidator.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/TokenValidator.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/TokenValidator.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,40 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.validator;
+
+
+import org.apache.amber.oauth2.common.OAuth;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class TokenValidator extends OAuthClientValidator {
+
+    public TokenValidator() {
+
+        requiredParams.put(OAuth.OAUTH_ACCESS_TOKEN, new String[] {});
+
+        notAllowedParams.add(OAuth.OAUTH_CODE);
+    }
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/main/java/org/apache/amber/oauth2/client/validator/TokenValidator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/OAuthClientTest.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/OAuthClientTest.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/OAuthClientTest.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/OAuthClientTest.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,94 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.apache.amber.oauth2.client.OAuthClient;
+import org.apache.amber.oauth2.client.URLConnectionClient;
+import org.apache.amber.oauth2.client.request.OAuthClientRequest;
+import org.apache.amber.oauth2.common.exception.OAuthSystemException;
+import org.junit.Test;
+
+import org.apache.amber.oauth2.client.response.GitHubTokenResponse;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+import org.apache.amber.oauth2.common.message.types.GrantType;
+
+/**
+ * Simple example that shows how to get OAuth 2.0 access token from Facebook
+ * using Amber OAuth 2.0 library
+ *
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class OAuthClientTest {
+
+    public static void main(String[] args) throws OAuthSystemException, IOException {
+
+        try {
+            OAuthClientRequest request = OAuthClientRequest
+                .authorizationLocation("https://graph.facebook.com/oauth/authorize")
+                .setClientId("131804060198305")
+                .setRedirectURI("http://localhost:8080/")
+                .buildQueryMessage();
+
+            //in web application you make redirection to uri:
+            System.out.println("Visit: " + request.getLocationUri() + "\nand grant permission");
+
+            System.out.print("Now enter the OAuth code you have received in redirect uri ");
+            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
+            String code = br.readLine();
+
+            request = OAuthClientRequest
+                .tokenLocation("https://graph.facebook.com/oauth/access_token")
+                .setGrantType(GrantType.AUTHORIZATION_CODE)
+                .setClientId("131804060198305")
+                .setClientSecret("3acb294b071c9aec86d60ae3daf32a93")
+                .setRedirectURI("http://localhost:8080/")
+                .setCode(code)
+                .buildBodyMessage();
+
+            OAuthClient oAuthClient = new OAuthClient(new URLConnectionClient());
+
+            //Facebook is not fully compatible with OAuth 2.0 draft 10, access token response is
+            //application/x-www-form-urlencoded, not json encoded so we use dedicated response class for that
+            //Own response class is an easy way to deal with oauth providers that introduce modifications to
+            //OAuth specification
+            GitHubTokenResponse oAuthResponse = oAuthClient.accessToken(request, GitHubTokenResponse.class);
+
+            System.out.println(
+                "Access Token: " + oAuthResponse.getAccessToken() + ", Expires in: " + oAuthResponse
+                    .getExpiresIn());
+        } catch (OAuthProblemException e) {
+            System.out.println("OAuth error: " + e.getError());
+            System.out.println("OAuth error description: " + e.getDescription());
+        }
+    }
+
+    @Test
+    public void dummyTest() {
+
+    }
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/OAuthClientTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/GitHubTokenResponseTest.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/GitHubTokenResponseTest.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/GitHubTokenResponseTest.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/GitHubTokenResponseTest.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,56 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.response;
+
+import org.junit.Test;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class GitHubTokenResponseTest {
+    @Test
+    public void testGetAccessToken() throws Exception {
+
+    }
+
+    @Test
+    public void testGetExpiresIn() throws Exception {
+    }
+
+    @Test
+    public void testGetRefreshToken() throws Exception {
+    }
+
+    @Test
+    public void testGetScope() throws Exception {
+    }
+
+    @Test
+    public void testGet() throws Exception {
+    }
+
+    @Test
+    public void testGetError() throws Exception {
+    }
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/GitHubTokenResponseTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/OAuthAuthorizationResponseImplTest.java
URL: http://svn.apache.org/viewvc/incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/OAuthAuthorizationResponseImplTest.java?rev=1050659&view=auto
==============================================================================
--- incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/OAuthAuthorizationResponseImplTest.java (added)
+++ incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/OAuthAuthorizationResponseImplTest.java Sat Dec 18 16:14:04 2010
@@ -0,0 +1,333 @@
+/**
+ *       Copyright 2010 Newcastle University
+ *
+ *          http://research.ncl.ac.uk/smart/
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.amber.oauth2.client.response;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.amber.oauth2.client.utils.TestUtils;
+import org.apache.amber.oauth2.common.OAuth;
+import org.apache.amber.oauth2.common.exception.OAuthProblemException;
+import org.junit.Assert;
+import org.junit.Test;
+import org.apache.amber.oauth2.common.error.OAuthError;
+
+import static org.easymock.EasyMock.createStrictMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.fail;
+
+/**
+ * @author Maciej Machulak (m.p.machulak@ncl.ac.uk)
+ * @author Lukasz Moren (lukasz.moren@ncl.ac.uk)
+ * @author Aad van Moorsel (aad.vanmoorsel@ncl.ac.uk)
+ */
+public class OAuthAuthorizationResponseImplTest {
+
+
+    @Test
+    public void testGetAccessToken() throws Exception {
+
+        HttpServletRequest request = createStrictMock(HttpServletRequest.class);
+
+        //check valid request
+        TestUtils.expectNoErrorParameters(request);
+        Map<String, String[]> parameters = new HashMap<String, String[]>();
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, new String[] {"test_access_token"});
+        parameters.put(OAuth.OAUTH_CODE, null);
+        parameters.put(OAuth.OAUTH_SCOPE, null);
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, null);
+
+        expect(request.getParameterMap()).andStubReturn(parameters);
+
+        replay(request);
+
+        OAuthAuthzResponse r = null;
+        try {
+            r = OAuthAuthzResponse.oauthTokenAuthzResponse(request);
+        } catch (OAuthProblemException e) {
+            fail("Exception not expected");
+        }
+
+        String token = r.getAccessToken();
+        Assert.assertNotNull(token);
+
+        verify(request);
+
+        reset(request);
+
+        //both parameters code and access token
+        TestUtils.expectNoErrorParameters(request);
+        parameters.put(OAuth.OAUTH_CODE, new String[] {"code"});
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, null);
+        parameters.put(OAuth.OAUTH_SCOPE, null);
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, null);
+
+        expect(request.getParameterMap()).andReturn(parameters);
+
+        replay(request);
+
+        r = OAuthAuthzResponse.oauthCodeAuthzResponse(request);
+        token = r.getAccessToken();
+        Assert.assertNull(token);
+        verify(request);
+
+        reset(request);
+
+        //both parameters code and access token
+        TestUtils.expectNoErrorParameters(request);
+
+        parameters.put(OAuth.OAUTH_CODE, new String[] {"test_code"});
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, new String[] {"test_access_token"});
+        parameters.put(OAuth.OAUTH_SCOPE, null);
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, null);
+
+        expect(request.getParameterMap()).andReturn(parameters);
+
+        replay(request);
+
+        try {
+            OAuthAuthzResponse.oauthTokenAuthzResponse(request);
+            fail("Exception expected");
+        } catch (OAuthProblemException e) {
+            Assert.assertTrue(
+                e.getError().equals(OAuthError.TokenResponse.INVALID_REQUEST));
+        }
+
+
+    }
+
+
+    @Test
+    public void testGetExpiresIn() throws Exception {
+        HttpServletRequest request = createStrictMock(HttpServletRequest.class);
+
+        TestUtils.expectNoErrorParameters(request);
+        Map<String, String[]> parameters = new HashMap<String, String[]>();
+        parameters.put(OAuth.OAUTH_CODE, new String[] {"test_code"});
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, null);
+        parameters.put(OAuth.OAUTH_SCOPE, new String[] {"test_scope"});
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, new String[] {"test_expires_in"});
+
+        expect(request.getParameterMap()).andStubReturn(parameters);
+
+        replay(request);
+
+        OAuthAuthzResponse r = null;
+        try {
+            OAuthAuthzResponse.oauthCodeAuthzResponse(request);
+            fail("Exception expected");
+        } catch (OAuthProblemException e) {
+            Assert.assertTrue(
+                e.getError().equals(OAuthError.TokenResponse.INVALID_REQUEST));
+        }
+
+        verify(request);
+
+        reset(request);
+
+        TestUtils.expectNoErrorParameters(request);
+        parameters.put(OAuth.OAUTH_CODE, null);
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, new String[] {"token"});
+        parameters.put(OAuth.OAUTH_SCOPE, new String[] {"test_scope"});
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, new String[] {"3600"});
+
+        expect(request.getParameterMap()).andStubReturn(parameters);
+
+        replay(request);
+
+        try {
+            r = OAuthAuthzResponse.oauthTokenAuthzResponse(request);
+        } catch (OAuthProblemException e) {
+            fail("Exception not expected");
+        }
+
+        Assert.assertNotNull(r.getExpiresIn());
+        verify(request);
+    }
+
+    @Test
+    public void testGetScope() throws Exception {
+        HttpServletRequest request = createStrictMock(HttpServletRequest.class);
+
+        TestUtils.expectNoErrorParameters(request);
+
+        Map<String, String[]> parameters = new HashMap<String, String[]>();
+        parameters.put(OAuth.OAUTH_CODE, new String[] {"test_code"});
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, null);
+        parameters.put(OAuth.OAUTH_SCOPE, new String[] {"test_scope"});
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, new String[] {"3600"});
+
+        expect(request.getParameterMap()).andStubReturn(parameters);
+
+        replay(request);
+
+        OAuthAuthzResponse r = null;
+        try {
+            OAuthAuthzResponse.oauthCodeAuthzResponse(request);
+            fail("Exception expected");
+        } catch (OAuthProblemException e) {
+            Assert.assertTrue(
+                e.getError().equals(OAuthError.TokenResponse.INVALID_REQUEST));
+
+        }
+
+        verify(request);
+
+        reset(request);
+        TestUtils.expectNoErrorParameters(request);
+
+        parameters.put(OAuth.OAUTH_CODE, null);
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, new String[] {"token"});
+        parameters.put(OAuth.OAUTH_SCOPE, new String[] {"test_scope"});
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, new String[] {"3600"});
+
+        expect(request.getParameterMap()).andStubReturn(parameters);
+
+        replay(request);
+
+        try {
+            r = OAuthAuthzResponse.oauthTokenAuthzResponse(request);
+        } catch (OAuthProblemException e) {
+            fail("Exception not expected");
+        }
+        Assert.assertNotNull(r.getScope());
+        verify(request);
+
+    }
+
+    @Test
+    public void testGetCode() throws Exception {
+        HttpServletRequest request = createStrictMock(HttpServletRequest.class);
+
+        //check valid request
+        TestUtils.expectNoErrorParameters(request);
+        Map<String, String[]> parameters = new HashMap<String, String[]>();
+        parameters.put(OAuth.OAUTH_CODE, null);
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, new String[] {"test_access_token"});
+        parameters.put(OAuth.OAUTH_SCOPE, new String[] {null});
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, new String[] {null});
+
+        expect(request.getParameterMap()).andStubReturn(parameters);
+
+        replay(request);
+
+        OAuthAuthzResponse r = OAuthAuthzResponse.oauthTokenAuthzResponse(request);
+        String code = r.getCode();
+        Assert.assertNull(code);
+
+        verify(request);
+
+        reset(request);
+
+        //both parameters code and access token
+        TestUtils.expectNoErrorParameters(request);
+
+        parameters.put(OAuth.OAUTH_CODE, new String[] {"code"});
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, null);
+        parameters.put(OAuth.OAUTH_SCOPE, new String[] {null});
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, new String[] {null});
+
+        expect(request.getParameterMap()).andStubReturn(parameters);
+        replay(request);
+
+        r = OAuthAuthzResponse.oauthCodeAuthzResponse(request);
+        code = r.getCode();
+        Assert.assertNotNull(code);
+        verify(request);
+
+        reset(request);
+
+        //both parameters code and access token
+        TestUtils.expectNoErrorParameters(request);
+
+        parameters.put(OAuth.OAUTH_CODE, new String[] {"test_code"});
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, new String[] {"test_access_token"});
+        parameters.put(OAuth.OAUTH_SCOPE, new String[] {null});
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, new String[] {null});
+
+        expect(request.getParameterMap()).andStubReturn(parameters);
+
+        replay(request);
+
+
+        try {
+            OAuthAuthzResponse.oauthCodeAuthzResponse(request);
+            fail("Exception expected");
+        } catch (OAuthProblemException e) {
+            Assert.assertTrue(
+                e.getError().equals(OAuthError.TokenResponse.INVALID_REQUEST));
+
+        }
+
+    }
+
+    @Test
+    public void testGetState() throws Exception {
+
+        HttpServletRequest request = createStrictMock(HttpServletRequest.class);
+
+        //check valid request
+        TestUtils.expectNoErrorParameters(request);
+
+        Map<String, String[]> parameters = new HashMap<String, String[]>();
+        parameters.put(OAuth.OAUTH_CODE, new String[] {"test_code"});
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, null);
+        parameters.put(OAuth.OAUTH_SCOPE, new String[] {null});
+        parameters.put(OAuth.OAUTH_STATE, new String[] {"test_state"});
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, new String[] {null});
+
+        expect(request.getParameterMap()).andStubReturn(parameters);
+
+        replay(request);
+
+        OAuthAuthzResponse r = OAuthAuthzResponse.oauthCodeAuthzResponse(request);
+        String state = r.getState();
+        Assert.assertNotNull(state);
+
+        verify(request);
+
+        reset(request);
+        //check valid request
+        TestUtils.expectNoErrorParameters(request);
+
+        parameters.put(OAuth.OAUTH_CODE, new String[] {null});
+        parameters.put(OAuth.OAUTH_ACCESS_TOKEN, new String[] {"test_access_token"});
+        parameters.put(OAuth.OAUTH_SCOPE, new String[] {null});
+        parameters.put(OAuth.OAUTH_STATE, new String[] {"test_state"});
+        parameters.put(OAuth.OAUTH_EXPIRES_IN, new String[] {null});
+
+        expect(request.getParameterMap()).andStubReturn(parameters);
+
+        replay(request);
+
+        r = OAuthAuthzResponse.oauthTokenAuthzResponse(request);
+        state = r.getState();
+        Assert.assertNotNull(state);
+
+        verify(request);
+    }
+
+}

Propchange: incubator/amber/trunk/oauth-2.0/oauth2-client/src/test/java/org/apache/amber/oauth2/client/response/OAuthAuthorizationResponseImplTest.java
------------------------------------------------------------------------------
    svn:eol-style = native