You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2015/04/15 21:41:33 UTC

[28/39] jclouds git commit: JCLOUDS-750 Remove need for custom json type adapters on OAuth.

JCLOUDS-750 Remove need for custom json type adapters on OAuth.


Project: http://git-wip-us.apache.org/repos/asf/jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds/commit/eb8b1548
Tree: http://git-wip-us.apache.org/repos/asf/jclouds/tree/eb8b1548
Diff: http://git-wip-us.apache.org/repos/asf/jclouds/diff/eb8b1548

Branch: refs/heads/master
Commit: eb8b154869087e79cd1511e3ab5e3aabe0c08941
Parents: 3515656
Author: Adrian Cole <ad...@gmail.com>
Authored: Sat Nov 1 12:31:04 2014 -0700
Committer: Adrian Cole <ad...@apache.org>
Committed: Sun Nov 2 08:28:42 2014 -0800

----------------------------------------------------------------------
 .../org/jclouds/oauth/v2/OAuthApiMetadata.java  |   4 +-
 .../oauth/v2/config/OAuthParserModule.java      | 159 -------------------
 .../org/jclouds/oauth/v2/domain/ClaimSet.java   |  42 -----
 .../org/jclouds/oauth/v2/domain/Claims.java     |  34 ++++
 .../org/jclouds/oauth/v2/domain/Header.java     |   3 +
 .../java/org/jclouds/oauth/v2/domain/Token.java |   6 +-
 .../jclouds/oauth/v2/domain/TokenRequest.java   |   8 +-
 .../oauth/v2/functions/BuildTokenRequest.java   |  19 +--
 .../oauth/v2/binders/OAuthTokenBinderTest.java  |  14 +-
 .../oauth/v2/features/OAuthApiLiveTest.java     |  14 +-
 .../oauth/v2/features/OAuthApiMockTest.java     |  15 +-
 .../BaseOAuthAuthenticatedApiLiveTest.java      |  15 +-
 .../oauth/v2/internal/BaseOAuthParseTest.java   |  30 ----
 .../jclouds/oauth/v2/parse/ParseTokenTest.java  |   4 +-
 14 files changed, 96 insertions(+), 271 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/main/java/org/jclouds/oauth/v2/OAuthApiMetadata.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/main/java/org/jclouds/oauth/v2/OAuthApiMetadata.java b/apis/oauth/src/main/java/org/jclouds/oauth/v2/OAuthApiMetadata.java
index d946d70..2690c15 100644
--- a/apis/oauth/src/main/java/org/jclouds/oauth/v2/OAuthApiMetadata.java
+++ b/apis/oauth/src/main/java/org/jclouds/oauth/v2/OAuthApiMetadata.java
@@ -25,7 +25,6 @@ import java.util.Properties;
 import org.jclouds.apis.ApiMetadata;
 import org.jclouds.oauth.v2.config.OAuthHttpApiModule;
 import org.jclouds.oauth.v2.config.OAuthModule;
-import org.jclouds.oauth.v2.config.OAuthParserModule;
 import org.jclouds.rest.internal.BaseHttpApiMetadata;
 
 import com.google.auto.service.AutoService;
@@ -65,8 +64,7 @@ public class OAuthApiMetadata extends BaseHttpApiMetadata<OAuthApi> {
          .documentation(URI.create("TODO"))
          .version("2")
          .defaultProperties(OAuthApiMetadata.defaultProperties())
-         .defaultModules(ImmutableSet
-               .<Class<? extends Module>>of(OAuthModule.class, OAuthParserModule.class, OAuthHttpApiModule.class));
+         .defaultModules(ImmutableSet.<Class<? extends Module>>of(OAuthModule.class, OAuthHttpApiModule.class));
       }
 
       @Override

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthParserModule.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthParserModule.java b/apis/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthParserModule.java
deleted file mode 100644
index 4768e6b..0000000
--- a/apis/oauth/src/main/java/org/jclouds/oauth/v2/config/OAuthParserModule.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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.jclouds.oauth.v2.config;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-
-import javax.inject.Singleton;
-
-import org.jclouds.oauth.v2.domain.ClaimSet;
-import org.jclouds.oauth.v2.domain.Header;
-import org.jclouds.oauth.v2.domain.Token;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.gson.Gson;
-import com.google.gson.TypeAdapter;
-import com.google.gson.TypeAdapterFactory;
-import com.google.gson.reflect.TypeToken;
-import com.google.gson.stream.JsonReader;
-import com.google.gson.stream.JsonWriter;
-import com.google.inject.AbstractModule;
-import com.google.inject.Provides;
-
-/** Configures type adapter factories for {@link Header}, {@link ClaimSet}, and {@link Token}. */
-public final class OAuthParserModule extends AbstractModule {
-   @Override protected void configure() {
-   }
-
-   // TODO: change jclouds core to use collaborative set bindings
-   @Provides @Singleton public Set<TypeAdapterFactory> typeAdapterFactories() {
-      return ImmutableSet
-            .<TypeAdapterFactory>of(new HeaderTypeAdapter(), new ClaimSetTypeAdapter(), new TokenAdapter());
-   }
-
-   private static final class HeaderTypeAdapter extends SubtypeAdapterFactory<Header> {
-      HeaderTypeAdapter() {
-         super(Header.class);
-      }
-
-      @Override public void write(JsonWriter out, Header value) throws IOException {
-         out.beginObject();
-         out.name("alg");
-         out.value(value.signerAlgorithm());
-         out.name("typ");
-         out.value(value.type());
-         out.endObject();
-      }
-
-      @Override public Header read(JsonReader in) throws IOException {
-         in.beginObject();
-         in.nextName();
-         String signerAlgorithm = in.nextString();
-         in.nextName();
-         String type = in.nextString();
-         in.endObject();
-         return Header.create(signerAlgorithm, type);
-      }
-   }
-
-   private static final class ClaimSetTypeAdapter extends SubtypeAdapterFactory<ClaimSet> {
-      ClaimSetTypeAdapter() {
-         super(ClaimSet.class);
-      }
-
-      @Override public void write(JsonWriter out, ClaimSet value) throws IOException {
-         out.beginObject();
-         for (Map.Entry<String, String> entry : value.claims().entrySet()) {
-            out.name(entry.getKey());
-            out.value(entry.getValue());
-         }
-         out.name("exp");
-         out.value(value.expirationTime());
-         out.name("iat");
-         out.value(value.emissionTime());
-         out.endObject();
-      }
-
-      @Override public ClaimSet read(JsonReader in) throws IOException {
-         Map<String, String> claims = new LinkedHashMap<String, String>();
-         in.beginObject();
-         while (in.hasNext()) {
-            claims.put(in.nextName(), in.nextString());
-         }
-         in.endObject();
-         return ClaimSet.create(0, 0, Collections.unmodifiableMap(claims));
-      }
-   }
-
-   /** OAuth is used in apis that may not default to snake case. Explicity control case format. */
-   private static final class TokenAdapter extends SubtypeAdapterFactory<Token> {
-      TokenAdapter() {
-         super(Token.class);
-      }
-
-      @Override public void write(JsonWriter out, Token value) throws IOException {
-         out.beginObject();
-         out.name("access_token");
-         out.value(value.accessToken());
-         out.name("token_type");
-         out.value(value.tokenType());
-         out.name("expires_in");
-         out.value(value.expiresIn());
-         out.endObject();
-      }
-
-      @Override public Token read(JsonReader in) throws IOException {
-         String accessToken = null;
-         String tokenType = null;
-         int expiresIn = 0;
-         in.beginObject();
-         while (in.hasNext()) {
-            String name = in.nextName();
-            if (name.equals("access_token")) {
-               accessToken = in.nextString();
-            } else if (name.equals("token_type")) {
-               tokenType = in.nextString();
-            } else if (name.equals("expires_in")) {
-               expiresIn = in.nextInt();
-            } else {
-               in.skipValue();
-            }
-         }
-         in.endObject();
-         return Token.create(accessToken, tokenType, expiresIn);
-      }
-   }
-
-   private abstract static class SubtypeAdapterFactory<T> extends TypeAdapter<T> implements TypeAdapterFactory {
-      private final Class<T> baseClass;
-
-      private SubtypeAdapterFactory(Class<T> baseClass) {
-         this.baseClass = baseClass;
-      }
-
-      @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
-         if (!(baseClass.isAssignableFrom(typeToken.getRawType()))) {
-            return null;
-         }
-         return (TypeAdapter<T>) this;
-      }
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/ClaimSet.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/ClaimSet.java b/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/ClaimSet.java
deleted file mode 100644
index e265e90..0000000
--- a/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/ClaimSet.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * 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.jclouds.oauth.v2.domain;
-
-import java.util.Map;
-
-import com.google.auto.value.AutoValue;
-
-/**
- * The claimset for the {@linkplain Token}.
- *
- * @see <a href="https://developers.google.com/accounts/docs/OAuth2ServiceAccount">doc</a>
- */
-@AutoValue
-public abstract class ClaimSet {
-
-   /** The emission time, in seconds since the epoch. */
-   public abstract long emissionTime();
-
-   /** The expiration time, in seconds since the emission time. */
-   public abstract long expirationTime();
-
-   public abstract Map<String, String> claims();
-
-   public static ClaimSet create(long emissionTime, long expirationTime, Map<String, String> claims) {
-      return new AutoValue_ClaimSet(emissionTime, expirationTime, claims);
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Claims.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Claims.java b/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Claims.java
new file mode 100644
index 0000000..07b03f6
--- /dev/null
+++ b/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Claims.java
@@ -0,0 +1,34 @@
+/*
+ * 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.jclouds.oauth.v2.domain;
+
+/**
+ * Description of Claims corresponding to a {@linkplain Token JWT Token}.
+ *
+ * @see <a href="https://tools.ietf.org/html/draft-ietf-oauth-json-web-token-30#section-4">registered list</a>
+ */
+public final class Claims {
+   /** The time at which the JWT was issued, in seconds since the epoch. */
+   public static final String ISSUED_AT = "iat";
+
+   /** The expiration time, in seconds since {@link #ISSUED_AT}. */
+   public static final String EXPIRATION_TIME = "exp";
+
+   private Claims(){
+      throw new AssertionError("intentionally unimplemented");
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Header.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Header.java b/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Header.java
index 9146824..ea83a91 100644
--- a/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Header.java
+++ b/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Header.java
@@ -16,6 +16,8 @@
  */
 package org.jclouds.oauth.v2.domain;
 
+import org.jclouds.json.SerializedNames;
+
 import com.google.auto.value.AutoValue;
 
 /**
@@ -32,6 +34,7 @@ public abstract class Header {
    /** The type of the token, e.g., {@code JWT}. */
    public abstract String type();
 
+   @SerializedNames({ "alg", "typ" })
    public static Header create(String signerAlgorithm, String type){
       return new AutoValue_Header(signerAlgorithm, type);
    }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Token.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Token.java b/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Token.java
index cf7ce57..548a83f 100644
--- a/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Token.java
+++ b/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/Token.java
@@ -16,6 +16,8 @@
  */
 package org.jclouds.oauth.v2.domain;
 
+import org.jclouds.json.SerializedNames;
+
 import com.google.auto.value.AutoValue;
 
 /**
@@ -32,8 +34,8 @@ public abstract class Token {
    /** In how many seconds this token expires. */
    public abstract long expiresIn();
 
-   public static Token
-   create(String accessToken, String tokenType, long expiresIn) {
+   @SerializedNames({"access_token", "token_type", "expires_in"})
+   public static Token create(String accessToken, String tokenType, long expiresIn) {
       return new AutoValue_Token(accessToken, tokenType, expiresIn);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/TokenRequest.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/TokenRequest.java b/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/TokenRequest.java
index a0154bf..b08a20b 100644
--- a/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/TokenRequest.java
+++ b/apis/oauth/src/main/java/org/jclouds/oauth/v2/domain/TokenRequest.java
@@ -16,14 +16,16 @@
  */
 package org.jclouds.oauth.v2.domain;
 
+import java.util.Map;
+
 import com.google.auto.value.AutoValue;
 
 @AutoValue
 public abstract class TokenRequest {
    public abstract Header header();
-   public abstract ClaimSet claimSet();
+   public abstract Map<String, Object> claimSet();
 
-   public static TokenRequest create(Header header, ClaimSet claimSet) {
-      return new AutoValue_TokenRequest(header, claimSet);
+   public static TokenRequest create(Header header, Map<String, Object> claims) {
+      return new AutoValue_TokenRequest(header, claims);
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/main/java/org/jclouds/oauth/v2/functions/BuildTokenRequest.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/main/java/org/jclouds/oauth/v2/functions/BuildTokenRequest.java b/apis/oauth/src/main/java/org/jclouds/oauth/v2/functions/BuildTokenRequest.java
index bcce004..7d94349 100644
--- a/apis/oauth/src/main/java/org/jclouds/oauth/v2/functions/BuildTokenRequest.java
+++ b/apis/oauth/src/main/java/org/jclouds/oauth/v2/functions/BuildTokenRequest.java
@@ -21,15 +21,15 @@ import static org.jclouds.oauth.v2.OAuthConstants.ADDITIONAL_CLAIMS;
 import static org.jclouds.oauth.v2.config.OAuthProperties.AUDIENCE;
 import static org.jclouds.oauth.v2.config.OAuthProperties.SCOPES;
 import static org.jclouds.oauth.v2.config.OAuthProperties.SIGNATURE_OR_MAC_ALGORITHM;
+import static org.jclouds.oauth.v2.domain.Claims.EXPIRATION_TIME;
+import static org.jclouds.oauth.v2.domain.Claims.ISSUED_AT;
 
 import java.util.Collections;
 import java.util.LinkedHashMap;
-import java.util.List;
 import java.util.Map;
 
 import org.jclouds.Constants;
 import org.jclouds.oauth.v2.config.OAuthScopes;
-import org.jclouds.oauth.v2.domain.ClaimSet;
 import org.jclouds.oauth.v2.domain.Header;
 import org.jclouds.oauth.v2.domain.OAuthCredentials;
 import org.jclouds.oauth.v2.domain.TokenRequest;
@@ -38,7 +38,6 @@ import org.jclouds.rest.internal.GeneratedHttpRequest;
 import com.google.common.base.Function;
 import com.google.common.base.Joiner;
 import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableList;
 import com.google.common.reflect.Invokable;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
@@ -51,9 +50,6 @@ import com.google.inject.name.Named;
  * TODO scopes etc should come from the REST method and not from a global property
  */
 public final class BuildTokenRequest implements Function<GeneratedHttpRequest, TokenRequest> {
-   // exp and ist (expiration and emission times) are assumed mandatory already
-   private static final List<String> REQUIRED_CLAIMS = ImmutableList.of("iss", "scope", "aud");
-
    private final String assertionTargetDescription;
    private final String signatureAlgorithm;
    private final Supplier<OAuthCredentials> credentialsSupplier;
@@ -92,18 +88,15 @@ public final class BuildTokenRequest implements Function<GeneratedHttpRequest, T
       // fetch the token
       Header header = Header.create(signatureAlgorithm, "JWT");
 
-      Map<String, String> claims = new LinkedHashMap<String, String>();
+      Map<String, Object> claims = new LinkedHashMap<String, Object>();
       claims.put("iss", credentialsSupplier.get().identity);
       claims.put("scope", getOAuthScopes(request));
       claims.put("aud", assertionTargetDescription);
+      claims.put(EXPIRATION_TIME, now + tokenDuration);
+      claims.put(ISSUED_AT, now);
       claims.putAll(additionalClaims);
 
-      checkState(claims.keySet().containsAll(REQUIRED_CLAIMS),
-            "not all required claims were present");
-
-      ClaimSet claimSet = ClaimSet.create(now, now + tokenDuration, Collections.unmodifiableMap(claims));
-
-      return TokenRequest.create(header, claimSet);
+      return TokenRequest.create(header, claims);
    }
 
    private String getOAuthScopes(GeneratedHttpRequest request) {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/test/java/org/jclouds/oauth/v2/binders/OAuthTokenBinderTest.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/test/java/org/jclouds/oauth/v2/binders/OAuthTokenBinderTest.java b/apis/oauth/src/test/java/org/jclouds/oauth/v2/binders/OAuthTokenBinderTest.java
index b73d49b..fedb691 100644
--- a/apis/oauth/src/test/java/org/jclouds/oauth/v2/binders/OAuthTokenBinderTest.java
+++ b/apis/oauth/src/test/java/org/jclouds/oauth/v2/binders/OAuthTokenBinderTest.java
@@ -16,17 +16,19 @@
  */
 package org.jclouds.oauth.v2.binders;
 
+import static org.jclouds.oauth.v2.domain.Claims.EXPIRATION_TIME;
+import static org.jclouds.oauth.v2.domain.Claims.ISSUED_AT;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertSame;
 import static org.testng.Assert.assertTrue;
 
 import java.io.IOException;
+import java.util.Map;
 
 import org.jclouds.ContextBuilder;
 import org.jclouds.http.HttpRequest;
 import org.jclouds.oauth.v2.OAuthApiMetadata;
 import org.jclouds.oauth.v2.OAuthTestUtils;
-import org.jclouds.oauth.v2.domain.ClaimSet;
 import org.jclouds.oauth.v2.domain.Header;
 import org.jclouds.oauth.v2.domain.TokenRequest;
 import org.jclouds.util.Strings2;
@@ -48,9 +50,13 @@ public class OAuthTokenBinderTest {
               (OAuthTestUtils.defaultProperties(null)).build().utils()
               .injector().getInstance(OAuthTokenBinder.class);
       Header header = Header.create("a", "b");
-      ClaimSet claimSet = ClaimSet.create(0, 0,
-            ImmutableMap.of("ist", STRING_THAT_GENERATES_URL_UNSAFE_BASE64_ENCODING));
-      TokenRequest tokenRequest = TokenRequest.create(header, claimSet);
+
+      Map<String, Object> claims = ImmutableMap.<String, Object>builder()
+            .put(ISSUED_AT, 0)
+            .put(EXPIRATION_TIME, 0)
+            .put("ist", STRING_THAT_GENERATES_URL_UNSAFE_BASE64_ENCODING).build();
+
+      TokenRequest tokenRequest = TokenRequest.create(header, claims);
       HttpRequest request = tokenRequestFormat.bindToRequest(
             HttpRequest.builder().method("GET").endpoint("http://localhost").build(), tokenRequest);
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiLiveTest.java b/apis/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiLiveTest.java
index 5b1e0e6..fa4bed5 100644
--- a/apis/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiLiveTest.java
+++ b/apis/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiLiveTest.java
@@ -21,13 +21,15 @@ import static org.jclouds.oauth.v2.OAuthTestUtils.getMandatoryProperty;
 import static org.jclouds.oauth.v2.config.OAuthProperties.AUDIENCE;
 import static org.jclouds.oauth.v2.config.OAuthProperties.SCOPES;
 import static org.jclouds.oauth.v2.config.OAuthProperties.SIGNATURE_OR_MAC_ALGORITHM;
+import static org.jclouds.oauth.v2.domain.Claims.EXPIRATION_TIME;
+import static org.jclouds.oauth.v2.domain.Claims.ISSUED_AT;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
+import java.util.Map;
 import java.util.Properties;
 
 import org.jclouds.oauth.v2.OAuthConstants;
-import org.jclouds.oauth.v2.domain.ClaimSet;
 import org.jclouds.oauth.v2.domain.Header;
 import org.jclouds.oauth.v2.domain.Token;
 import org.jclouds.oauth.v2.domain.TokenRequest;
@@ -71,10 +73,14 @@ public class OAuthApiLiveTest extends BaseOAuthApiLiveTest {
 
       long now = nowInSeconds();
 
-      ClaimSet claimSet = ClaimSet.create(now, now + 3600,
-            ImmutableMap.of("aud", audience, "scope", scopes, "iss", identity));
+      Map<String, Object> claims = ImmutableMap.<String, Object>builder()
+         .put("iss", identity)
+         .put("scope", scopes)
+         .put("aud", audience)
+         .put(EXPIRATION_TIME, now + 3600)
+         .put(ISSUED_AT, now).build();
 
-      TokenRequest tokenRequest = TokenRequest.create(header, claimSet);
+      TokenRequest tokenRequest = TokenRequest.create(header, claims);
       Token token = api.authenticate(tokenRequest);
 
       assertNotNull(token, "no token when authenticating " + tokenRequest);

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiMockTest.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiMockTest.java b/apis/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiMockTest.java
index 95cc537..f76a360 100644
--- a/apis/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiMockTest.java
+++ b/apis/oauth/src/test/java/org/jclouds/oauth/v2/features/OAuthApiMockTest.java
@@ -22,11 +22,14 @@ import static com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 import static org.jclouds.Constants.PROPERTY_MAX_RETRIES;
 import static org.jclouds.oauth.v2.config.OAuthProperties.AUDIENCE;
+import static org.jclouds.oauth.v2.domain.Claims.EXPIRATION_TIME;
+import static org.jclouds.oauth.v2.domain.Claims.ISSUED_AT;
 import static org.jclouds.util.Strings2.toStringAndClose;
 import static org.testng.Assert.assertEquals;
 
 import java.io.IOException;
 import java.net.URL;
+import java.util.Map;
 import java.util.Properties;
 
 import org.jclouds.ContextBuilder;
@@ -34,7 +37,6 @@ import org.jclouds.concurrent.config.ExecutorServiceModule;
 import org.jclouds.oauth.v2.OAuthApi;
 import org.jclouds.oauth.v2.OAuthApiMetadata;
 import org.jclouds.oauth.v2.OAuthTestUtils;
-import org.jclouds.oauth.v2.domain.ClaimSet;
 import org.jclouds.oauth.v2.domain.Header;
 import org.jclouds.oauth.v2.domain.Token;
 import org.jclouds.oauth.v2.domain.TokenRequest;
@@ -61,9 +63,12 @@ public class OAuthApiMockTest {
 
    private static final Token TOKEN = Token.create("1/8xbJqaOZXSUZbHLl5EOtu1pxz3fmmetKx9W8CV4t79M", "Bearer", 3600);
 
-   private static final ClaimSet CLAIM_SET = ClaimSet.create(1328569781, 1328573381, ImmutableMap
-         .of("iss", "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com", "scope",
-               "https://www.googleapis.com/auth/prediction", "aud", "https://accounts.google.com/o/oauth2/token"));
+   private static final Map<String, Object> CLAIMS = ImmutableMap.<String, Object>builder()
+         .put("iss", "761326798069-r5mljlln1rd4lrbhg75efgigp36m78j5@developer.gserviceaccount.com")
+         .put("scope", "https://www.googleapis.com/auth/prediction")
+         .put("aud", "https://accounts.google.com/o/oauth2/token")
+         .put(EXPIRATION_TIME, 1328573381)
+         .put(ISSUED_AT, 1328569781).build();
 
    private static final Header HEADER = Header.create("RS256", "JWT");
 
@@ -78,7 +83,7 @@ public class OAuthApiMockTest {
 
       OAuthApi api = api(server.getUrl("/"));
 
-      assertEquals(api.authenticate(TokenRequest.create(HEADER, CLAIM_SET)), TOKEN);
+      assertEquals(api.authenticate(TokenRequest.create(HEADER, CLAIMS)), TOKEN);
 
       RecordedRequest request = server.takeRequest();
       assertEquals(request.getMethod(), "POST");

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthAuthenticatedApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthAuthenticatedApiLiveTest.java b/apis/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthAuthenticatedApiLiveTest.java
index 4652c0c..c88f65f 100644
--- a/apis/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthAuthenticatedApiLiveTest.java
+++ b/apis/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthAuthenticatedApiLiveTest.java
@@ -15,22 +15,25 @@
  * limitations under the License.
  */
 package org.jclouds.oauth.v2.internal;
+
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.jclouds.oauth.v2.config.OAuthProperties.AUDIENCE;
 import static org.jclouds.oauth.v2.config.OAuthProperties.SIGNATURE_OR_MAC_ALGORITHM;
+import static org.jclouds.oauth.v2.domain.Claims.EXPIRATION_TIME;
+import static org.jclouds.oauth.v2.domain.Claims.ISSUED_AT;
 import static org.testng.Assert.assertNotNull;
 
 import java.io.Closeable;
+import java.util.Map;
 import java.util.Properties;
 
 import org.jclouds.apis.BaseApiLiveTest;
 import org.jclouds.config.ValueOfConfigurationKeyOrNull;
 import org.jclouds.oauth.v2.OAuthApi;
 import org.jclouds.oauth.v2.OAuthConstants;
-import org.jclouds.oauth.v2.domain.ClaimSet;
 import org.jclouds.oauth.v2.domain.Header;
 import org.jclouds.oauth.v2.domain.Token;
 import org.jclouds.oauth.v2.domain.TokenRequest;
@@ -80,10 +83,14 @@ public abstract class BaseOAuthAuthenticatedApiLiveTest<A extends Closeable> ext
 
       long now = SECONDS.convert(System.currentTimeMillis(), MILLISECONDS);
 
-      ClaimSet claimSet = ClaimSet.create(now, now + 3600,
-            ImmutableMap.of("aud", audience, "scope", scopes, "iss", identity));
+      Map<String, Object> claims = ImmutableMap.<String, Object>builder()
+            .put("iss", identity)
+            .put("scope", scopes)
+            .put("aud", audience)
+            .put(EXPIRATION_TIME, now + 3600)
+            .put(ISSUED_AT, now).build();
 
-      TokenRequest tokenRequest = TokenRequest.create(header, claimSet);
+      TokenRequest tokenRequest = TokenRequest.create(header, claims);
 
       Token token = oauthApi.authenticate(tokenRequest);
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthParseTest.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthParseTest.java b/apis/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthParseTest.java
deleted file mode 100644
index ae47cfd..0000000
--- a/apis/oauth/src/test/java/org/jclouds/oauth/v2/internal/BaseOAuthParseTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.jclouds.oauth.v2.internal;
-
-import org.jclouds.json.BaseItemParserTest;
-import org.jclouds.json.config.GsonModule;
-import org.jclouds.oauth.v2.config.OAuthParserModule;
-
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-
-public abstract class BaseOAuthParseTest<T> extends BaseItemParserTest<T> {
-   @Override protected Injector injector() {
-      return Guice.createInjector(new GsonModule(), new OAuthParserModule());
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/eb8b1548/apis/oauth/src/test/java/org/jclouds/oauth/v2/parse/ParseTokenTest.java
----------------------------------------------------------------------
diff --git a/apis/oauth/src/test/java/org/jclouds/oauth/v2/parse/ParseTokenTest.java b/apis/oauth/src/test/java/org/jclouds/oauth/v2/parse/ParseTokenTest.java
index d564359..416ec5e 100644
--- a/apis/oauth/src/test/java/org/jclouds/oauth/v2/parse/ParseTokenTest.java
+++ b/apis/oauth/src/test/java/org/jclouds/oauth/v2/parse/ParseTokenTest.java
@@ -20,12 +20,12 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 
 import javax.ws.rs.Consumes;
 
+import org.jclouds.json.BaseItemParserTest;
 import org.jclouds.oauth.v2.domain.Token;
-import org.jclouds.oauth.v2.internal.BaseOAuthParseTest;
 import org.testng.annotations.Test;
 
 @Test(groups = "unit", testName = "ParseTokenTest")
-public class ParseTokenTest extends BaseOAuthParseTest<Token> {
+public class ParseTokenTest extends BaseItemParserTest<Token> {
 
    @Override
    public String resource() {