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 2013/05/27 22:36:32 UTC
git commit: JCLOUDS-82: Added method to get the underlying Api from a
View
Updated Branches:
refs/heads/master b3a320e01 -> 334bd3673
JCLOUDS-82: Added method to get the underlying Api from a View
Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/commit/334bd367
Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/tree/334bd367
Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/diff/334bd367
Branch: refs/heads/master
Commit: 334bd367302b058b0eef1444d05a6a43ecd3f065
Parents: b3a320e
Author: Ignasi Barrera <ig...@gmail.com>
Authored: Fri May 24 09:23:53 2013 +0200
Committer: Ignasi Barrera <ig...@gmail.com>
Committed: Mon May 27 22:13:25 2013 +0200
----------------------------------------------------------------------
core/src/main/java/org/jclouds/View.java | 12 ++++
.../main/java/org/jclouds/internal/BaseView.java | 15 ++++
.../java/org/jclouds/internal/BaseViewTest.java | 51 ++++++++++++++-
3 files changed, 77 insertions(+), 1 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/334bd367/core/src/main/java/org/jclouds/View.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/View.java b/core/src/main/java/org/jclouds/View.java
index 30f8863..08ed544 100644
--- a/core/src/main/java/org/jclouds/View.java
+++ b/core/src/main/java/org/jclouds/View.java
@@ -16,6 +16,8 @@
*/
package org.jclouds;
+import java.io.Closeable;
+
import com.google.common.annotations.Beta;
import com.google.common.reflect.TypeToken;
@@ -68,4 +70,14 @@ public interface View {
*/
<C extends Context> C unwrap() throws ClassCastException;
+ /**
+ * Unwraps the underlying api from this view.
+ *
+ * @param apiClass The class of the api to unwrap.
+ * @return The unwrapped api.
+ *
+ * @since 1.7
+ */
+ <A extends Closeable> A unwrapApi(Class<A> apiClass);
+
}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/334bd367/core/src/main/java/org/jclouds/internal/BaseView.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/jclouds/internal/BaseView.java b/core/src/main/java/org/jclouds/internal/BaseView.java
index 38fbbfb..250f49f 100644
--- a/core/src/main/java/org/jclouds/internal/BaseView.java
+++ b/core/src/main/java/org/jclouds/internal/BaseView.java
@@ -19,15 +19,19 @@ import static com.google.common.base.Objects.equal;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
+import java.io.Closeable;
+
import javax.inject.Singleton;
import org.jclouds.Context;
import org.jclouds.View;
import org.jclouds.location.Provider;
+import org.jclouds.rest.ApiContext;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
import com.google.common.collect.ForwardingObject;
+import com.google.common.reflect.TypeParameter;
import com.google.common.reflect.TypeToken;
/**
@@ -63,6 +67,17 @@ public abstract class BaseView extends ForwardingObject implements View {
}
@Override
+ public <A extends Closeable> A unwrapApi(Class<A> apiClass) {
+ checkArgument(ApiContext.class.isAssignableFrom(backendType.getRawType()),
+ "backend type: %s should be an ApiContext", backendType);
+ TypeToken<ApiContext<A>> contextToken = new TypeToken<ApiContext<A>>(delegate().getClass()) {
+ private static final long serialVersionUID = 1L;
+ }.where(new TypeParameter<A>() {
+ }, TypeToken.of(apiClass));
+ return unwrap(contextToken).getApi();
+ }
+
+ @Override
protected Context delegate() {
return backend;
}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/334bd367/core/src/test/java/org/jclouds/internal/BaseViewTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/jclouds/internal/BaseViewTest.java b/core/src/test/java/org/jclouds/internal/BaseViewTest.java
index 4270fdd..2d82e3b 100644
--- a/core/src/test/java/org/jclouds/internal/BaseViewTest.java
+++ b/core/src/test/java/org/jclouds/internal/BaseViewTest.java
@@ -17,19 +17,27 @@
package org.jclouds.internal;
import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.verify;
import static org.jclouds.reflect.Reflection2.typeToken;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotEquals;
import static org.testng.Assert.fail;
+import java.io.Closeable;
+import java.io.IOException;
+
import org.jclouds.domain.Credentials;
import org.jclouds.lifecycle.Closer;
import org.jclouds.providers.ProviderMetadata;
+import org.jclouds.rest.ApiContext;
import org.jclouds.rest.Utils;
import org.testng.annotations.Test;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
+import com.google.common.reflect.TypeToken;
/**
* @author Adrian Cole
@@ -66,6 +74,23 @@ public class BaseViewTest {
}
}
+ private static class DummyApi implements Closeable {
+
+ @Override
+ public void close() throws IOException {
+
+ }
+ }
+
+ public class DummyView extends BaseView {
+
+ protected DummyView(ApiContext<DummyApi> context) {
+ super(context, new TypeToken<ApiContext<DummyApi>>() {
+ private static final long serialVersionUID = 1L;
+ });
+ }
+ }
+
public void testWaterTurnedIntoWine() {
Wine wine = new Wine();
assertEquals(wine.getBackendType(), typeToken(Water.class));
@@ -83,5 +108,29 @@ public class BaseViewTest {
assertEquals(e.getMessage(), "backend type: org.jclouds.internal.BaseViewTest$Water not assignable from org.jclouds.internal.BaseViewTest$PeanutButter");
}
}
-
+
+ public void testCannotUnwrapIfNotApiContext() {
+ Wine wine = new Wine();
+ try {
+ wine.unwrapApi(DummyApi.class);
+ fail();
+ } catch (IllegalArgumentException e) {
+ assertEquals(e.getMessage(), "backend type: org.jclouds.internal.BaseViewTest$Water should be an ApiContext");
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void testUnwrapApi() {
+ DummyApi beer = new DummyApi();
+ ApiContext<DummyApi> beerContext = createMock(ApiContext.class);
+ expect(beerContext.getApi()).andReturn(beer);
+ replay(beerContext);
+
+ DummyView bar = new DummyView(beerContext);
+ DummyApi result = bar.unwrapApi(DummyApi.class);
+
+ assertEquals(result, beer);
+ verify(beerContext);
+ }
+
}