You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ab...@apache.org on 2013/08/29 20:31:56 UTC
[14/14] git commit: JCLOUDS-166,
JCLOUDS-167 - Removing async from vcloud and Terremark APIs/providers
JCLOUDS-166, JCLOUDS-167 - Removing async from vcloud and Terremark APIs/providers
Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/commit/a61ad06c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/tree/a61ad06c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds/diff/a61ad06c
Branch: refs/heads/master
Commit: a61ad06cbf62eb2bb40e0672a6021fb01cec1089
Parents: 5261f76
Author: Andrew Bayer <an...@gmail.com>
Authored: Mon Aug 26 15:01:19 2013 -0700
Committer: Andrew Bayer <an...@gmail.com>
Committed: Thu Aug 29 11:29:14 2013 -0700
----------------------------------------------------------------------
.../main/java/org/jclouds/vcloud/VCloudApi.java | 91 +++
.../org/jclouds/vcloud/VCloudApiMetadata.java | 26 +-
.../org/jclouds/vcloud/VCloudAsyncClient.java | 119 ---
.../java/org/jclouds/vcloud/VCloudClient.java | 88 --
.../org/jclouds/vcloud/VCloudVersionsApi.java | 35 +
.../vcloud/VCloudVersionsAsyncClient.java | 47 --
.../jclouds/vcloud/VCloudVersionsClient.java | 25 -
...edIntoNameThenCustomizeDeployAndPowerOn.java | 6 +-
.../strategy/VCloudComputeServiceAdapter.java | 9 +-
.../vcloud/config/VCloudHttpApiModule.java | 538 +++++++++++++
.../vcloud/config/VCloudRestClientModule.java | 570 -------------
.../org/jclouds/vcloud/features/CatalogApi.java | 145 ++++
.../vcloud/features/CatalogAsyncClient.java | 121 ---
.../jclouds/vcloud/features/CatalogClient.java | 86 --
.../org/jclouds/vcloud/features/NetworkApi.java | 61 ++
.../vcloud/features/NetworkAsyncClient.java | 70 --
.../jclouds/vcloud/features/NetworkClient.java | 33 -
.../org/jclouds/vcloud/features/OrgApi.java | 87 ++
.../jclouds/vcloud/features/OrgAsyncClient.java | 82 --
.../org/jclouds/vcloud/features/OrgClient.java | 54 --
.../org/jclouds/vcloud/features/TaskApi.java | 82 ++
.../vcloud/features/TaskAsyncClient.java | 88 --
.../org/jclouds/vcloud/features/TaskClient.java | 48 --
.../org/jclouds/vcloud/features/VAppApi.java | 262 ++++++
.../vcloud/features/VAppAsyncClient.java | 219 -----
.../org/jclouds/vcloud/features/VAppClient.java | 152 ----
.../vcloud/features/VAppTemplateApi.java | 181 +++++
.../features/VAppTemplateAsyncClient.java | 165 ----
.../vcloud/features/VAppTemplateClient.java | 97 ---
.../org/jclouds/vcloud/features/VDCApi.java | 74 ++
.../jclouds/vcloud/features/VDCAsyncClient.java | 69 --
.../org/jclouds/vcloud/features/VDCClient.java | 44 -
.../java/org/jclouds/vcloud/features/VmApi.java | 296 +++++++
.../jclouds/vcloud/features/VmAsyncClient.java | 230 ------
.../org/jclouds/vcloud/features/VmClient.java | 180 -----
.../vcloud/functions/CatalogItemsInCatalog.java | 22 +-
.../jclouds/vcloud/functions/CatalogsInOrg.java | 20 +-
.../jclouds/vcloud/functions/NetworksInOrg.java | 20 +-
.../vcloud/functions/OrgsForLocations.java | 20 +-
.../jclouds/vcloud/functions/OrgsForNames.java | 20 +-
.../functions/VAppTemplatesForCatalogItems.java | 22 +-
.../org/jclouds/vcloud/functions/VDCsInOrg.java | 20 +-
.../jclouds/vcloud/internal/VCloudLoginApi.java | 44 +
.../vcloud/internal/VCloudLoginAsyncClient.java | 53 --
.../vcloud/internal/VCloudLoginClient.java | 26 -
.../org/jclouds/vcloud/loaders/OVFLoader.java | 6 +-
.../vcloud/loaders/VAppTemplateLoader.java | 6 +-
.../jclouds/vcloud/predicates/TaskSuccess.java | 6 +-
.../java/org/jclouds/vcloud/VCloudApiTest.java | 64 ++
.../jclouds/vcloud/VCloudAsyncClientTest.java | 77 --
.../vcloud/VCloudSessionRefreshLiveTest.java | 7 +-
.../jclouds/vcloud/VCloudVersionsApiTest.java | 69 ++
.../vcloud/VCloudVersionsAsyncClientTest.java | 69 --
.../vcloud/features/CatalogApiLiveTest.java | 53 ++
.../jclouds/vcloud/features/CatalogApiTest.java | 131 +++
.../vcloud/features/CatalogAsyncClientTest.java | 131 ---
.../vcloud/features/CatalogClientLiveTest.java | 53 --
.../vcloud/features/NetworkApiLiveTest.java | 29 +
.../jclouds/vcloud/features/NetworkApiTest.java | 75 ++
.../vcloud/features/NetworkAsyncClientTest.java | 75 --
.../vcloud/features/NetworkClientLiveTest.java | 29 -
.../jclouds/vcloud/features/OrgApiLiveTest.java | 42 +
.../org/jclouds/vcloud/features/OrgApiTest.java | 91 +++
.../vcloud/features/OrgAsyncClientTest.java | 91 ---
.../vcloud/features/OrgClientLiveTest.java | 42 -
.../vcloud/features/TaskApiLiveTest.java | 29 +
.../jclouds/vcloud/features/TaskApiTest.java | 108 +++
.../vcloud/features/TaskAsyncClientTest.java | 108 ---
.../vcloud/features/TaskClientLiveTest.java | 29 -
.../vcloud/features/VAppApiLiveTest.java | 53 ++
.../jclouds/vcloud/features/VAppApiTest.java | 315 ++++++++
.../vcloud/features/VAppAsyncClientTest.java | 315 --------
.../vcloud/features/VAppClientLiveTest.java | 53 --
.../features/VAppTemplateApiLiveTest.java | 168 ++++
.../vcloud/features/VAppTemplateApiTest.java | 238 ++++++
.../features/VAppTemplateAsyncClientTest.java | 238 ------
.../features/VAppTemplateClientLiveTest.java | 168 ----
.../jclouds/vcloud/features/VDCApiLiveTest.java | 29 +
.../org/jclouds/vcloud/features/VDCApiTest.java | 102 +++
.../vcloud/features/VDCAsyncClientTest.java | 102 ---
.../vcloud/features/VDCClientLiveTest.java | 29 -
.../jclouds/vcloud/features/VmApiLiveTest.java | 163 ++++
.../org/jclouds/vcloud/features/VmApiTest.java | 320 ++++++++
.../vcloud/features/VmAsyncClientTest.java | 320 --------
.../vcloud/features/VmClientLiveTest.java | 163 ----
.../vcloud/internal/BaseVCloudApiLiveTest.java | 59 ++
.../vcloud/internal/BaseVCloudApiTest.java | 272 +++++++
.../internal/BaseVCloudAsyncClientTest.java | 272 -------
.../internal/BaseVCloudClientLiveTest.java | 60 --
.../vcloud/internal/VCloudLoginApiTest.java | 97 +++
.../internal/VCloudLoginAsyncClientTest.java | 97 ---
.../trmk/vcloud_0_8/TerremarkVCloudApi.java | 576 ++++++++++++++
.../vcloud_0_8/TerremarkVCloudAsyncClient.java | 547 -------------
.../trmk/vcloud_0_8/TerremarkVCloudClient.java | 313 --------
.../compute/TerremarkVCloudComputeClient.java | 6 +-
.../compute/functions/CreateUniqueKeyPair.java | 6 +-
.../functions/NodeMetadataToOrgAndName.java | 6 +-
.../compute/strategy/DeleteKeyPair.java | 6 +-
.../TerremarkVCloudGetImageStrategy.java | 6 +-
.../TerremarkVCloudGetNodeMetadataStrategy.java | 6 +-
.../TerremarkVCloudLifeCycleStrategy.java | 6 +-
.../TerremarkVCloudListNodesStrategy.java | 7 +-
.../config/TerremarkVCloudHttpApiModule.java | 558 +++++++++++++
.../config/TerremarkVCloudRestClientModule.java | 564 -------------
.../functions/AllCatalogItemsInCatalog.java | 23 +-
.../vcloud_0_8/functions/AllCatalogsInOrg.java | 26 +-
.../trmk/vcloud_0_8/functions/AllVDCsInOrg.java | 26 +-
.../vcloud_0_8/functions/OrgsForLocations.java | 21 +-
.../trmk/vcloud_0_8/functions/OrgsForNames.java | 20 +-
.../functions/VAppTemplatesForCatalogItems.java | 22 +-
.../VAppTemplatesForResourceEntities.java | 22 +-
.../internal/TerremarkVCloudApiMetadata.java | 12 +-
.../internal/TerremarkVCloudLoginApi.java | 40 +
.../TerremarkVCloudLoginAsyncClient.java | 53 --
.../internal/TerremarkVCloudLoginClient.java | 26 -
.../internal/TerremarkVCloudVersionsApi.java | 35 +
.../TerremarkVCloudVersionsAsyncClient.java | 47 --
.../internal/TerremarkVCloudVersionsClient.java | 25 -
.../trmk/vcloud_0_8/predicates/TaskSuccess.java | 6 +-
.../trmk/vcloud_0_8/TerremarkApiLiveTest.java | 795 +++++++++++++++++++
.../vcloud_0_8/TerremarkClientLiveTest.java | 795 -------------------
.../TerremarkVCloudComputeClientTest.java | 4 +-
.../compute/strategy/DeleteKeyPairTest.java | 4 +-
.../suppliers/VAppTemplatesInOrgsLiveTest.java | 6 +-
.../internal/BaseTerremarkApiLiveTest.java | 70 ++
.../internal/BaseTerremarkClientLiveTest.java | 70 --
.../internal/TerremarkVCloudLoginApiTest.java | 99 +++
.../TerremarkVCloudLoginAsyncClientTest.java | 99 ---
.../TerremarkVCloudVersionsApiTest.java | 70 ++
.../TerremarkVCloudVersionsAsyncClientTest.java | 70 --
.../BluelockVCloudZone01CatalogApiLiveTest.java | 33 +
...uelockVCloudZone01CatalogClientLiveTest.java | 33 -
.../BluelockVCloudZone01NetworkApiLiveTest.java | 33 +
...uelockVCloudZone01NetworkClientLiveTest.java | 33 -
.../BluelockVCloudZone01OrgApiLiveTest.java | 33 +
.../BluelockVCloudZone01OrgClientLiveTest.java | 33 -
.../BluelockVCloudZone01TaskApiLiveTest.java | 33 +
.../BluelockVCloudZone01TaskClientLiveTest.java | 33 -
.../BluelockVCloudZone01VAppApiLiveTest.java | 33 +
.../BluelockVCloudZone01VAppClientLiveTest.java | 33 -
...lockVCloudZone01VAppTemplateApiLiveTest.java | 33 +
...kVCloudZone01VAppTemplateClientLiveTest.java | 33 -
.../BluelockVCloudZone01VDCApiLiveTest.java | 33 +
.../BluelockVCloudZone01VDCClientLiveTest.java | 33 -
.../BluelockVCloudZone01VmApiLiveTest.java | 33 +
.../BluelockVCloudZone01VmClientLiveTest.java | 33 -
...nHouseDataElementVCloudProviderMetadata.java | 4 +-
...ouseDataElementVCloudCatalogApiLiveTest.java | 33 +
...eDataElementVCloudCatalogClientLiveTest.java | 33 -
...ouseDataElementVCloudNetworkApiLiveTest.java | 33 +
...eDataElementVCloudNetworkClientLiveTest.java | 33 -
...eenHouseDataElementVCloudOrgApiLiveTest.java | 33 +
...HouseDataElementVCloudOrgClientLiveTest.java | 33 -
...enHouseDataElementVCloudTaskApiLiveTest.java | 33 +
...ouseDataElementVCloudTaskClientLiveTest.java | 33 -
...enHouseDataElementVCloudVAppApiLiveTest.java | 33 +
...ouseDataElementVCloudVAppClientLiveTest.java | 33 -
...ataElementVCloudVAppTemplateApiLiveTest.java | 33 +
...ElementVCloudVAppTemplateClientLiveTest.java | 33 -
...eenHouseDataElementVCloudVDCApiLiveTest.java | 33 +
...HouseDataElementVCloudVDCClientLiveTest.java | 33 -
...reenHouseDataElementVCloudVmApiLiveTest.java | 34 +
...nHouseDataElementVCloudVmClientLiveTest.java | 34 -
.../jclouds/trmk/ecloud/TerremarkECloudApi.java | 255 ++++++
.../trmk/ecloud/TerremarkECloudApiMetadata.java | 17 +-
.../trmk/ecloud/TerremarkECloudAsyncClient.java | 289 -------
.../trmk/ecloud/TerremarkECloudClient.java | 90 ---
.../config/TerremarkECloudHttpApiModule.java | 100 +++
.../config/TerremarkECloudRestClientModule.java | 124 ---
.../features/DataCenterOperationsApi.java | 75 ++
.../DataCenterOperationsAsyncClient.java | 71 --
.../features/DataCenterOperationsClient.java | 52 --
.../trmk/ecloud/features/TagOperationsApi.java | 68 ++
.../features/TagOperationsAsyncClient.java | 69 --
.../ecloud/features/TagOperationsClient.java | 44 -
...ternetServiceAndPublicIpAddressSupplier.java | 6 +-
.../ecloud/BaseTerremarkECloudApiLiveTest.java | 41 +
.../trmk/ecloud/BaseTerremarkECloudApiTest.java | 268 +++++++
.../BaseTerremarkECloudAsyncClientTest.java | 268 -------
.../BaseTerremarkECloudClientLiveTest.java | 41 -
.../trmk/ecloud/TerremarkECloudApiLiveTest.java | 69 ++
.../trmk/ecloud/TerremarkECloudApiTest.java | 529 ++++++++++++
.../ecloud/TerremarkECloudAsyncClientTest.java | 529 ------------
.../ecloud/TerremarkECloudClientLiveTest.java | 69 --
.../ecloud/TerremarkECloudClientMockTest.java | 6 +-
.../TerremarkECloudComputeServiceLiveTest.java | 4 +-
.../DataCenterOperationsApiLiveTest.java | 43 +
.../features/DataCenterOperationsApiTest.java | 79 ++
.../DataCenterOperationsAsyncClientTest.java | 79 --
.../DataCenterOperationsClientLiveTest.java | 43 -
.../features/TagOperationsApiLiveTest.java | 43 +
.../ecloud/features/TagOperationsApiTest.java | 78 ++
.../features/TagOperationsAsyncClientTest.java | 78 --
.../features/TagOperationsClientLiveTest.java | 43 -
.../TerremarkVCloudExpressApi.java | 113 +++
.../TerremarkVCloudExpressApiMetadata.java | 16 +-
.../TerremarkVCloudExpressAsyncClient.java | 155 ----
.../TerremarkVCloudExpressClient.java | 37 -
.../TerremarkVCloudExpressHttpApiModule.java | 44 +
.../TerremarkVCloudExpressRestClientModule.java | 52 --
...ternetServiceAndPublicIpAddressSupplier.java | 6 +-
.../vcloudexpress/InternetServiceLiveTest.java | 6 +-
.../TerremarkVCloudExpressApiLiveTest.java | 52 ++
.../TerremarkVCloudExpressApiTest.java | 779 ++++++++++++++++++
.../TerremarkVCloudExpressAsyncClientTest.java | 779 ------------------
.../TerremarkVCloudExpressClientLiveTest.java | 52 --
...markVCloudExpressComputeServiceLiveTest.java | 4 +-
207 files changed, 10010 insertions(+), 11610 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudApi.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudApi.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudApi.java
new file mode 100644
index 0000000..5ecef9c
--- /dev/null
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudApi.java
@@ -0,0 +1,91 @@
+/*
+ * 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.vcloud;
+
+import java.io.Closeable;
+
+import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.vcloud.features.CatalogApi;
+import org.jclouds.vcloud.features.NetworkApi;
+import org.jclouds.vcloud.features.OrgApi;
+import org.jclouds.vcloud.features.TaskApi;
+import org.jclouds.vcloud.features.VAppApi;
+import org.jclouds.vcloud.features.VAppTemplateApi;
+import org.jclouds.vcloud.features.VDCApi;
+import org.jclouds.vcloud.features.VmApi;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
+
+/**
+ * Provides access to VCloud resources via their REST API.
+ * <p/>
+ *
+ * @see <a href="http://communities.vmware.com/community/developer/forums/vcloudapi" />
+ * @author Adrian Cole
+ */
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
+public interface VCloudApi extends Closeable {
+ /**
+ * Provides asynchronous access to VApp Template features.
+ *
+ */
+ @Delegate
+ VAppTemplateApi getVAppTemplateClient();
+
+ /**
+ * Provides synchronous access to VApp features.
+ */
+ @Delegate
+ VAppApi getVAppClient();
+
+ /**
+ * Provides synchronous access to Vm features.
+ */
+ @Delegate
+ VmApi getVmClient();
+
+ /**
+ * Provides synchronous access to Catalog features.
+ */
+ @Delegate
+ CatalogApi getCatalogClient();
+
+ /**
+ * Provides synchronous access to Task features.
+ */
+ @Delegate
+ TaskApi getTaskClient();
+
+ /**
+ * Provides synchronous access to VDC features.
+ */
+ @Delegate
+ VDCApi getVDCClient();
+
+ /**
+ * Provides synchronous access to Network features.
+ */
+ @Delegate
+ NetworkApi getNetworkClient();
+
+ /**
+ * Provides synchronous access to Org features.
+ */
+ @Delegate
+ OrgApi getOrgClient();
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudApiMetadata.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudApiMetadata.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudApiMetadata.java
index 3991316..bd60ef9 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudApiMetadata.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudApiMetadata.java
@@ -29,13 +29,12 @@ import java.util.Properties;
import org.jclouds.apis.ApiMetadata;
import org.jclouds.compute.ComputeServiceContext;
-import org.jclouds.rest.internal.BaseRestApiMetadata;
+import org.jclouds.rest.internal.BaseHttpApiMetadata;
import org.jclouds.vcloud.compute.config.VCloudComputeServiceContextModule;
-import org.jclouds.vcloud.config.VCloudRestClientModule;
+import org.jclouds.vcloud.config.VCloudHttpApiModule;
import org.jclouds.vcloud.domain.network.FenceMode;
import com.google.common.collect.ImmutableSet;
-import com.google.common.reflect.TypeToken;
import com.google.inject.Module;
/**
@@ -43,17 +42,9 @@ import com.google.inject.Module;
*
* @author Adrian Cole
*/
-public class VCloudApiMetadata extends BaseRestApiMetadata {
+public class VCloudApiMetadata extends BaseHttpApiMetadata<VCloudApi> {
+
- /**
- * @deprecated please use {@code org.jclouds.ContextBuilder#buildApi(VCloudClient.class)} as
- * {@link VCloudAsyncClient} interface will be removed in jclouds 1.7.
- */
- @Deprecated
- public static final TypeToken<org.jclouds.rest.RestContext<VCloudClient, VCloudAsyncClient>> CONTEXT_TOKEN = new TypeToken<org.jclouds.rest.RestContext<VCloudClient, VCloudAsyncClient>>() {
- private static final long serialVersionUID = 1L;
- };
-
@Override
public Builder toBuilder() {
return new Builder().fromApiMetadata(this);
@@ -68,7 +59,7 @@ public class VCloudApiMetadata extends BaseRestApiMetadata {
}
public static Properties defaultProperties() {
- Properties properties = BaseRestApiMetadata.defaultProperties();
+ Properties properties = BaseHttpApiMetadata.defaultProperties();
properties.setProperty(PROPERTY_VCLOUD_VERSION_SCHEMA, "1");
properties.setProperty(PROPERTY_VCLOUD_XML_NAMESPACE,
String.format("http://www.vmware.com/vcloud/v${%s}", PROPERTY_VCLOUD_VERSION_SCHEMA));
@@ -87,11 +78,8 @@ public class VCloudApiMetadata extends BaseRestApiMetadata {
return properties;
}
- public static class Builder extends BaseRestApiMetadata.Builder<Builder> {
-
- @SuppressWarnings("deprecation")
+ public static class Builder extends BaseHttpApiMetadata.Builder<VCloudApi, Builder> {
protected Builder() {
- super(VCloudClient.class, VCloudAsyncClient.class);
id("vcloud")
.name("VCloud 1.0 API")
.identityName("User at Organization (user@org)")
@@ -100,7 +88,7 @@ public class VCloudApiMetadata extends BaseRestApiMetadata {
.version("1.0")
.defaultProperties(VCloudApiMetadata.defaultProperties())
.view(typeToken(ComputeServiceContext.class))
- .defaultModules(ImmutableSet.<Class<? extends Module>>of(VCloudRestClientModule.class, VCloudComputeServiceContextModule.class));
+ .defaultModules(ImmutableSet.<Class<? extends Module>>of(VCloudHttpApiModule.class, VCloudComputeServiceContextModule.class));
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java
deleted file mode 100644
index 4820d8e..0000000
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudAsyncClient.java
+++ /dev/null
@@ -1,119 +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.vcloud;
-
-import java.io.Closeable;
-
-import org.jclouds.rest.annotations.Delegate;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.vcloud.features.CatalogAsyncClient;
-import org.jclouds.vcloud.features.NetworkAsyncClient;
-import org.jclouds.vcloud.features.OrgAsyncClient;
-import org.jclouds.vcloud.features.TaskAsyncClient;
-import org.jclouds.vcloud.features.VAppAsyncClient;
-import org.jclouds.vcloud.features.VAppTemplateAsyncClient;
-import org.jclouds.vcloud.features.VDCAsyncClient;
-import org.jclouds.vcloud.features.VmAsyncClient;
-import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
-
-/**
- * Provides access to VCloud resources via their REST API.
- * <p/>
- *
- * @see <a href= "https://community.vcloudexpress.terremark.com/en-us/discussion_forums/f/60.aspx"
- * />
- * @author Adrian Cole
- * @deprecated please use {@code org.jclouds.ContextBuilder#buildApi(VCloudClient.class)} as
- * {@link VCloudAsyncClient} interface will be removed in jclouds 1.7.
- */
-@Deprecated
-@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
-public interface VCloudAsyncClient extends Closeable {
-
- /**
- * Provides asynchronous access to VApp Template features.
- *
- * @see VCloudClient#getVAppTemplateClient
- *
- */
- @Delegate
- VAppTemplateAsyncClient getVAppTemplateClient();
-
- /**
- * Provides asynchronous access to VApp features.
- *
- * @see VCloudClient#getVAppClient
- *
- */
- @Delegate
- VAppAsyncClient getVAppClient();
-
- /**
- * Provides asynchronous access to Vm features.
- *
- * @see VCloudClient#getVmClient
- *
- */
- @Delegate
- VmAsyncClient getVmClient();
-
- /**
- * Provides asynchronous access to Catalog features.
- *
- * @see VCloudClient#getCatalogClient
- *
- */
- @Delegate
- CatalogAsyncClient getCatalogClient();
-
- /**
- * Provides asynchronous access to Task features.
- *
- * @see VCloudClient#getTaskClient
- *
- */
- @Delegate
- TaskAsyncClient getTaskClient();
-
- /**
- * Provides asynchronous access to VDC features.
- *
- * @see VCloudClient#getVDCClient
- *
- */
- @Delegate
- VDCAsyncClient getVDCClient();
-
- /**
- * Provides asynchronous access to Network features.
- *
- * @see VCloudClient#getNetworkClient
- *
- */
- @Delegate
- NetworkAsyncClient getNetworkClient();
-
- /**
- * Provides asynchronous access to Org features.
- *
- * @see VCloudClient#getOrgClient
- *
- */
- @Delegate
- OrgAsyncClient getOrgClient();
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudClient.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudClient.java
deleted file mode 100644
index b37e1b1..0000000
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudClient.java
+++ /dev/null
@@ -1,88 +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.vcloud;
-
-import java.io.Closeable;
-
-import org.jclouds.rest.annotations.Delegate;
-import org.jclouds.vcloud.features.CatalogClient;
-import org.jclouds.vcloud.features.NetworkClient;
-import org.jclouds.vcloud.features.OrgClient;
-import org.jclouds.vcloud.features.TaskClient;
-import org.jclouds.vcloud.features.VAppClient;
-import org.jclouds.vcloud.features.VAppTemplateClient;
-import org.jclouds.vcloud.features.VDCClient;
-import org.jclouds.vcloud.features.VmClient;
-
-/**
- * Provides access to VCloud resources via their REST API.
- * <p/>
- *
- * @see <a href="http://communities.vmware.com/community/developer/forums/vcloudapi" />
- * @author Adrian Cole
- */
-public interface VCloudClient extends Closeable {
- /**
- * Provides asynchronous access to VApp Template features.
- *
- */
- @Delegate
- VAppTemplateClient getVAppTemplateClient();
-
- /**
- * Provides synchronous access to VApp features.
- */
- @Delegate
- VAppClient getVAppClient();
-
- /**
- * Provides synchronous access to Vm features.
- */
- @Delegate
- VmClient getVmClient();
-
- /**
- * Provides synchronous access to Catalog features.
- */
- @Delegate
- CatalogClient getCatalogClient();
-
- /**
- * Provides synchronous access to Task features.
- */
- @Delegate
- TaskClient getTaskClient();
-
- /**
- * Provides synchronous access to VDC features.
- */
- @Delegate
- VDCClient getVDCClient();
-
- /**
- * Provides synchronous access to Network features.
- */
- @Delegate
- NetworkClient getNetworkClient();
-
- /**
- * Provides synchronous access to Org features.
- */
- @Delegate
- OrgClient getOrgClient();
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsApi.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsApi.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsApi.java
new file mode 100644
index 0000000..01ec045
--- /dev/null
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsApi.java
@@ -0,0 +1,35 @@
+/*
+ * 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.vcloud;
+
+import java.io.Closeable;
+import java.net.URI;
+import java.util.SortedMap;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+
+import org.jclouds.rest.annotations.XMLResponseParser;
+import org.jclouds.vcloud.xml.SupportedVersionsHandler;
+
+public interface VCloudVersionsApi extends Closeable {
+
+ @GET
+ @XMLResponseParser(SupportedVersionsHandler.class)
+ @Path("/versions")
+ SortedMap<String, URI> getSupportedVersions();
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsAsyncClient.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsAsyncClient.java
deleted file mode 100644
index 53212c9..0000000
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsAsyncClient.java
+++ /dev/null
@@ -1,47 +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.vcloud;
-
-import java.io.Closeable;
-import java.net.URI;
-import java.util.SortedMap;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-
-import org.jclouds.rest.annotations.XMLResponseParser;
-import org.jclouds.vcloud.xml.SupportedVersionsHandler;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Establishes a context with a VCloud endpoint.
- * <p/>
- *
- * @see <a href="https://community.vcloudexpress.terremark.com/en-us/discussion_forums/f/60.aspx" />
- * @author Adrian Cole
- */
-public interface VCloudVersionsAsyncClient extends Closeable {
-
- /**
- * Retrieve information for supported versions
- */
- @GET
- @XMLResponseParser(SupportedVersionsHandler.class)
- @Path("/versions")
- ListenableFuture<SortedMap<String, URI>> getSupportedVersions();
-}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsClient.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsClient.java
deleted file mode 100644
index 17a210c..0000000
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/VCloudVersionsClient.java
+++ /dev/null
@@ -1,25 +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.vcloud;
-
-import java.io.Closeable;
-import java.net.URI;
-import java.util.SortedMap;
-public interface VCloudVersionsClient extends Closeable {
-
- SortedMap<String, URI> getSupportedVersions();
-}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn.java
index 64da573..e9da2e0 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn.java
@@ -42,7 +42,7 @@ import org.jclouds.ovf.Network;
import org.jclouds.predicates.validators.DnsNameValidator;
import org.jclouds.rest.annotations.BuildVersion;
import org.jclouds.vcloud.TaskStillRunningException;
-import org.jclouds.vcloud.VCloudClient;
+import org.jclouds.vcloud.VCloudApi;
import org.jclouds.vcloud.compute.options.VCloudTemplateOptions;
import org.jclouds.vcloud.domain.GuestCustomizationSection;
import org.jclouds.vcloud.domain.NetworkConnection;
@@ -71,7 +71,7 @@ public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployA
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
- protected final VCloudClient client;
+ protected final VCloudApi client;
protected final Predicate<URI> successTester;
protected final LoadingCache<URI, VAppTemplate> vAppTemplates;
protected final NetworkConfigurationForNetworkAndOptions networkConfigurationForNetworkAndOptions;
@@ -79,7 +79,7 @@ public class InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployA
@Inject
- protected InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn(VCloudClient client,
+ protected InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn(VCloudApi client,
Predicate<URI> successTester, LoadingCache<URI, VAppTemplate> vAppTemplates, NetworkConfigurationForNetworkAndOptions networkConfigurationForNetworkAndOptions,
@BuildVersion String buildVersion) {
this.client = client;
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudComputeServiceAdapter.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudComputeServiceAdapter.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudComputeServiceAdapter.java
index 6627c47..efa8e3a 100644
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudComputeServiceAdapter.java
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/compute/strategy/VCloudComputeServiceAdapter.java
@@ -38,7 +38,7 @@ import org.jclouds.ovf.Envelope;
import org.jclouds.util.Throwables2;
import org.jclouds.vcloud.TaskInErrorStateException;
import org.jclouds.vcloud.TaskStillRunningException;
-import org.jclouds.vcloud.VCloudClient;
+import org.jclouds.vcloud.VCloudApi;
import org.jclouds.vcloud.VCloudMediaType;
import org.jclouds.vcloud.domain.Org;
import org.jclouds.vcloud.domain.ReferenceType;
@@ -54,10 +54,9 @@ import com.google.common.base.Predicate;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;
-import com.google.common.collect.Iterables;
/**
- * defines the connection between the {@link VCloudClient} implementation and the jclouds
+ * defines the connection between the {@link org.jclouds.vcloud.VCloudApi} implementation and the jclouds
* {@link ComputeService}
*
*/
@@ -68,7 +67,7 @@ public class VCloudComputeServiceAdapter implements ComputeServiceAdapter<VApp,
@Named(ComputeServiceConstants.COMPUTE_LOGGER)
protected Logger logger = Logger.NULL;
- protected final VCloudClient client;
+ protected final VCloudApi client;
protected final Predicate<URI> successTester;
protected final InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn booter;
protected final Supplier<Map<String, Org>> nameToOrg;
@@ -76,7 +75,7 @@ public class VCloudComputeServiceAdapter implements ComputeServiceAdapter<VApp,
protected final Function<VAppTemplate, Envelope> templateToEnvelope;
@Inject
- protected VCloudComputeServiceAdapter(VCloudClient client, Predicate<URI> successTester,
+ protected VCloudComputeServiceAdapter(VCloudApi client, Predicate<URI> successTester,
InstantiateVAppTemplateWithGroupEncodedIntoNameThenCustomizeDeployAndPowerOn booter,
Supplier<Map<String, Org>> nameToOrg, VAppTemplatesSupplier templates,
Function<VAppTemplate, Envelope> templateToEnvelope) {
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudHttpApiModule.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudHttpApiModule.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudHttpApiModule.java
new file mode 100644
index 0000000..d60d311
--- /dev/null
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudHttpApiModule.java
@@ -0,0 +1,538 @@
+/*
+ * 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.vcloud.config;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Predicates.notNull;
+import static com.google.common.collect.Iterables.concat;
+import static com.google.common.collect.Iterables.filter;
+import static com.google.common.collect.Iterables.getLast;
+import static com.google.common.collect.Iterables.transform;
+import static com.google.common.collect.Maps.transformValues;
+import static com.google.common.collect.Maps.uniqueIndex;
+import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
+import static org.jclouds.rest.config.BinderUtils.bindHttpApi;
+import static org.jclouds.util.Predicates2.retry;
+import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_FENCEMODE;
+import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.SortedMap;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.cim.xml.ResourceAllocationSettingDataHandler;
+import org.jclouds.domain.Location;
+import org.jclouds.http.HttpErrorHandler;
+import org.jclouds.http.annotation.ClientError;
+import org.jclouds.http.annotation.Redirection;
+import org.jclouds.http.annotation.ServerError;
+import org.jclouds.location.suppliers.ImplicitLocationSupplier;
+import org.jclouds.location.suppliers.LocationsSupplier;
+import org.jclouds.ovf.Envelope;
+import org.jclouds.rest.AuthorizationException;
+import org.jclouds.rest.ConfiguresHttpApi;
+import org.jclouds.rest.annotations.ApiVersion;
+import org.jclouds.rest.config.HttpApiModule;
+import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier;
+import org.jclouds.vcloud.VCloudApi;
+import org.jclouds.vcloud.VCloudToken;
+import org.jclouds.vcloud.VCloudVersionsApi;
+import org.jclouds.vcloud.compute.functions.FindLocationForResource;
+import org.jclouds.vcloud.compute.functions.ValidateVAppTemplateAndReturnEnvelopeOrThrowIllegalArgumentException;
+import org.jclouds.vcloud.domain.Catalog;
+import org.jclouds.vcloud.domain.CatalogItem;
+import org.jclouds.vcloud.domain.Org;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.domain.VAppTemplate;
+import org.jclouds.vcloud.domain.VCloudSession;
+import org.jclouds.vcloud.domain.VDC;
+import org.jclouds.vcloud.domain.network.FenceMode;
+import org.jclouds.vcloud.endpoints.Network;
+import org.jclouds.vcloud.endpoints.OrgList;
+import org.jclouds.vcloud.functions.CatalogItemsInCatalog;
+import org.jclouds.vcloud.functions.CatalogItemsInOrg;
+import org.jclouds.vcloud.functions.CatalogsInOrg;
+import org.jclouds.vcloud.functions.DefaultNetworkNameInTemplate;
+import org.jclouds.vcloud.functions.OrgsForLocations;
+import org.jclouds.vcloud.functions.OrgsForNames;
+import org.jclouds.vcloud.functions.VAppTemplatesForCatalogItems;
+import org.jclouds.vcloud.functions.VDCsInOrg;
+import org.jclouds.vcloud.handlers.ParseVCloudErrorFromHttpResponse;
+import org.jclouds.vcloud.internal.VCloudLoginApi;
+import org.jclouds.vcloud.loaders.OVFLoader;
+import org.jclouds.vcloud.loaders.VAppTemplateLoader;
+import org.jclouds.vcloud.location.DefaultVDC;
+import org.jclouds.vcloud.location.OrgAndVDCToLocationSupplier;
+import org.jclouds.vcloud.predicates.TaskSuccess;
+import org.jclouds.vcloud.xml.ovf.VCloudResourceAllocationSettingDataHandler;
+
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
+import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
+import com.google.common.collect.Lists;
+import com.google.inject.Injector;
+import com.google.inject.Provides;
+import com.google.inject.Scopes;
+import com.google.inject.TypeLiteral;
+
+/**
+ * Configures the VCloud authentication service connection, including logging and http transport.
+ *
+ * @author Adrian Cole
+ */
+@ConfiguresHttpApi
+public class VCloudHttpApiModule extends HttpApiModule<VCloudApi> {
+
+
+ @Provides
+ @Singleton
+ protected Supplier<VCloudSession> provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds,
+ AtomicReference<AuthorizationException> authException, final VCloudLoginApi login) {
+ return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException,
+ new Supplier<VCloudSession>() {
+
+ @Override
+ public VCloudSession get() {
+ return login.login();
+ }
+
+ @Override
+ public String toString() {
+ return Objects.toStringHelper(login).add("method", "login").toString();
+ }
+ }, seconds, TimeUnit.SECONDS);
+ }
+
+ @Override
+ protected void configure() {
+ super.configure();
+ bind(new TypeLiteral<Function<Iterable<CatalogItem>, Iterable<VAppTemplate>>>() {
+ }).to(new TypeLiteral<VAppTemplatesForCatalogItems>() {
+ });
+ bind(ResourceAllocationSettingDataHandler.class).to(VCloudResourceAllocationSettingDataHandler.class);
+ installDefaultVCloudEndpointsModule();
+ bind(new TypeLiteral<Function<ReferenceType, Location>>() {
+ }).to(new TypeLiteral<FindLocationForResource>() {
+ });
+ bind(new TypeLiteral<Function<Org, Iterable<Catalog>>>() {
+ }).to(new TypeLiteral<CatalogsInOrg>() {
+ });
+ bind(new TypeLiteral<Function<Org, Iterable<VDC>>>() {
+ }).to(new TypeLiteral<VDCsInOrg>() {
+ });
+ bind(new TypeLiteral<Function<Iterable<String>, Iterable<Org>>>() {
+ }).to(new TypeLiteral<OrgsForNames>() {
+ });
+ bind(new TypeLiteral<Function<Iterable<Location>, Iterable<Org>>>() {
+ }).to(new TypeLiteral<OrgsForLocations>() {
+ });
+ bind(new TypeLiteral<Function<Catalog, Iterable<CatalogItem>>>() {
+ }).to(new TypeLiteral<CatalogItemsInCatalog>() {
+ });
+ bind(new TypeLiteral<Function<Org, Iterable<CatalogItem>>>() {
+ }).to(new TypeLiteral<CatalogItemsInOrg>() {
+ });
+
+ bindCacheLoaders();
+
+ bind(new TypeLiteral<Function<VAppTemplate, String>>() {
+ }).annotatedWith(Network.class).to(new TypeLiteral<DefaultNetworkNameInTemplate>() {
+ });
+
+ bind(new TypeLiteral<Function<VAppTemplate, Envelope>>() {
+ }).to(new TypeLiteral<ValidateVAppTemplateAndReturnEnvelopeOrThrowIllegalArgumentException>() {
+ });
+ bindHttpApi(binder(), VCloudApi.class);
+ bindHttpApi(binder(), VCloudVersionsApi.class);
+ bindHttpApi(binder(), VCloudLoginApi.class);
+ }
+
+ protected void bindCacheLoaders() {
+ bind(new TypeLiteral<CacheLoader<URI, VAppTemplate>>() {
+ }).to(new TypeLiteral<VAppTemplateLoader>() {
+ });
+
+ bind(new TypeLiteral<CacheLoader<URI, Envelope>>() {
+ }).to(new TypeLiteral<OVFLoader>() {
+ });
+ }
+
+ @Provides
+ @Singleton
+ @org.jclouds.vcloud.endpoints.VDC
+ protected Supplier<Map<String, String>> provideVDCtoORG(Supplier<Map<String, Org>> orgNameToOrgSupplier) {
+ return Suppliers.compose(new Function<Map<String, Org>, Map<String, String>>() {
+
+ @Override
+ public Map<String, String> apply(Map<String, Org> arg0) {
+ Builder<String, String> returnVal = ImmutableMap.builder();
+ for (Entry<String, Org> orgr : arg0.entrySet()) {
+ for (String vdc : orgr.getValue().getVDCs().keySet()) {
+ returnVal.put(vdc, orgr.getKey());
+ }
+ }
+ return returnVal.build();
+ }
+ }, orgNameToOrgSupplier);
+
+ }
+
+ @Provides
+ @Singleton
+ protected Supplier<Map<String, Org>> provideOrgMapCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds,
+ AtomicReference<AuthorizationException> authException, OrgMapSupplier supplier) {
+ return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
+ TimeUnit.SECONDS);
+ }
+
+ @Provides
+ @Singleton
+ @OrgList
+ protected Supplier<URI> provideOrgListURI(Supplier<VCloudSession> sessionSupplier) {
+ return Suppliers.compose(new Function<VCloudSession, URI>() {
+
+ @Override
+ public URI apply(VCloudSession arg0) {
+ return URI.create(getLast(arg0.getOrgs().values()).getHref().toASCIIString().replaceAll("org/.*", "org"));
+ }
+
+ @Override
+ public String toString() {
+ return "orgListURI()";
+ }
+
+ }, sessionSupplier);
+ }
+
+ @Singleton
+ public static class OrgMapSupplier implements Supplier<Map<String, Org>> {
+ protected final Supplier<VCloudSession> sessionSupplier;
+ protected final Function<Iterable<String>, Iterable<Org>> organizationsForNames;
+
+ @Inject
+ protected OrgMapSupplier(Supplier<VCloudSession> sessionSupplier,
+ Function<Iterable<String>, Iterable<Org>> organizationsForNames) {
+ this.sessionSupplier = sessionSupplier;
+ this.organizationsForNames = organizationsForNames;
+ }
+
+ @Override
+ public Map<String, Org> get() {
+ return uniqueIndex(organizationsForNames.apply(sessionSupplier.get().getOrgs().keySet()), name);
+ }
+ }
+
+ protected void installDefaultVCloudEndpointsModule() {
+ install(new DefaultVCloudReferencesModule());
+ }
+
+ @Singleton
+ public static class OrgCatalogSupplier implements
+ Supplier<Map<String, Map<String, Catalog>>> {
+ protected final Supplier<Map<String, Org>> orgSupplier;
+ protected final Function<Org, Iterable<Catalog>> allCatalogsInOrg;
+
+ @Inject
+ protected OrgCatalogSupplier(Supplier<Map<String, Org>> orgSupplier,
+ Function<Org, Iterable<Catalog>> allCatalogsInOrg) {
+ this.orgSupplier = orgSupplier;
+ this.allCatalogsInOrg = allCatalogsInOrg;
+ }
+
+ @Override
+ public Map<String, Map<String, Catalog>> get() {
+ return transformValues(transformValues(orgSupplier.get(), allCatalogsInOrg),
+ new Function<Iterable<? extends Catalog>, Map<String, Catalog>>() {
+
+ @Override
+ public Map<String, Catalog> apply(Iterable<? extends Catalog> from) {
+ return ImmutableMap.copyOf(uniqueIndex(from, name));
+ }
+
+ });
+ }
+ }
+
+ @VCloudToken
+ @Provides
+ @Singleton
+ Supplier<String> provideVCloudToken(Supplier<VCloudSession> cache) {
+ return Suppliers.compose(new Function<VCloudSession, String>() {
+
+ @Override
+ public String apply(VCloudSession input) {
+ return checkNotNull(input.getVCloudToken(), "No token present in session");
+ }
+ }, cache);
+ }
+
+ @Provides
+ @org.jclouds.vcloud.endpoints.Org
+ @Singleton
+ protected Supplier<Map<String, ReferenceType>> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds,
+ AtomicReference<AuthorizationException> authException, OrgNameToOrgSupplier supplier) {
+ return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
+ TimeUnit.SECONDS);
+ }
+
+ @Provides
+ @Singleton
+ protected Supplier<Map<URI, VDC>> provideURIToVDC(
+ @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference<AuthorizationException> authException,
+ URItoVDC supplier) {
+ return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
+ TimeUnit.SECONDS);
+ }
+
+ @Singleton
+ public static class URItoVDC implements Supplier<Map<URI, VDC>> {
+ private final Supplier<Map<String, Map<String, VDC>>> orgVDCMap;
+
+ @Inject
+ URItoVDC(Supplier<Map<String, Map<String, VDC>>> orgVDCMap) {
+ this.orgVDCMap = orgVDCMap;
+ }
+
+ @Override
+ public Map<URI, VDC> get() {
+ return uniqueIndex(concat(transform(orgVDCMap.get().values(),
+ new Function<Map<String, VDC>, Iterable<VDC>>() {
+
+ @Override
+ public Iterable<VDC> apply(
+ Map<String, VDC> from) {
+ return from.values();
+ }
+
+ })), new Function<VDC, URI>() {
+
+ @Override
+ public URI apply(VDC from) {
+ return from.getHref();
+ }
+
+ });
+ }
+
+ }
+
+ static final Function<ReferenceType, String> name = new Function<ReferenceType, String>() {
+
+ @Override
+ public String apply(ReferenceType from) {
+ return from.getName();
+ }
+
+ };
+
+ @Provides
+ @Singleton
+ @org.jclouds.vcloud.endpoints.VCloudLogin
+ protected Supplier<URI> provideAuthenticationURI(final VCloudVersionsApi versionService,
+ @ApiVersion final String version) {
+ return new Supplier<URI>() {
+
+ @Override
+ public URI get() {
+ SortedMap<String, URI> versions = versionService.getSupportedVersions();
+ checkState(versions.size() > 0, "No versions present");
+ checkState(versions.containsKey(version), "version " + version + " not present in: " + versions);
+ return versions.get(version);
+ }
+
+ public String toString() {
+ return "login()";
+ }
+ };
+ }
+
+ @Singleton
+ private static class OrgNameToOrgSupplier implements Supplier<Map<String, ReferenceType>> {
+ private final Supplier<VCloudSession> sessionSupplier;
+
+ @Inject
+ OrgNameToOrgSupplier(Supplier<VCloudSession> sessionSupplier) {
+ this.sessionSupplier = sessionSupplier;
+ }
+
+ @Override
+ public Map<String, ReferenceType> get() {
+ return sessionSupplier.get().getOrgs();
+ }
+
+ }
+
+ @Provides
+ @Singleton
+ protected Supplier<Org> provideOrg(final Supplier<Map<String, Org>> orgSupplier,
+ @org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg) {
+ return Suppliers.compose(new Function<ReferenceType, Org>() {
+
+ @Override
+ public Org apply(ReferenceType input) {
+ return orgSupplier.get().get(input.getName());
+
+ }
+ }, defaultOrg);
+ }
+
+ @Provides
+ @Singleton
+ protected Predicate<URI> successTester(Injector injector,
+ @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) {
+ return retry(injector.getInstance(TaskSuccess.class), completed);
+ }
+
+ @Provides
+ @Singleton
+ protected Supplier<Map<String, Map<String, Catalog>>> provideOrgCatalogItemMapSupplierCache(
+ @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference<AuthorizationException> authException,
+ OrgCatalogSupplier supplier) {
+ return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
+ TimeUnit.SECONDS);
+ }
+
+ @Provides
+ @Singleton
+ protected Supplier<Map<String, Map<String, VDC>>> provideOrgVDCSupplierCache(
+ @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference<AuthorizationException> authException,
+ OrgVDCSupplier supplier) {
+ return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
+ TimeUnit.SECONDS);
+ }
+
+ @Singleton
+ public static class OrgVDCSupplier implements Supplier<Map<String, Map<String, VDC>>> {
+ protected final Supplier<Map<String, Org>> orgSupplier;
+ private final Function<Org, Iterable<VDC>> allVDCsInOrg;
+
+ @Inject
+ protected OrgVDCSupplier(Supplier<Map<String, Org>> orgSupplier,
+ Function<Org, Iterable<VDC>> allVDCsInOrg) {
+ this.orgSupplier = orgSupplier;
+ this.allVDCsInOrg = allVDCsInOrg;
+ }
+
+ @Override
+ public Map<String, Map<String, VDC>> get() {
+ return transformValues(transformValues(orgSupplier.get(), allVDCsInOrg),
+ new Function<Iterable<? extends VDC>, Map<String, VDC>>() {
+
+ @Override
+ public Map<String, VDC> apply(
+ Iterable<? extends VDC> from) {
+ return uniqueIndex(Lists.newArrayList(from), name);
+ }
+
+ });
+ }
+ }
+
+ @Singleton
+ public static class OrgCatalogItemSupplier implements
+ Supplier<Map<String, Map<String, Map<String, CatalogItem>>>> {
+ protected final Supplier<Map<String, Map<String, Catalog>>> catalogSupplier;
+ protected final Function<Catalog, Iterable<CatalogItem>> allCatalogItemsInCatalog;
+
+ @Inject
+ protected OrgCatalogItemSupplier(
+ Supplier<Map<String, Map<String, Catalog>>> catalogSupplier,
+ Function<Catalog, Iterable<CatalogItem>> allCatalogItemsInCatalog) {
+ this.catalogSupplier = catalogSupplier;
+ this.allCatalogItemsInCatalog = allCatalogItemsInCatalog;
+ }
+
+ @Override
+ public Map<String, Map<String, Map<String, CatalogItem>>> get() {
+ return transformValues(
+ catalogSupplier.get(),
+ new Function<Map<String, Catalog>, Map<String, Map<String, CatalogItem>>>() {
+
+ @Override
+ public Map<String, Map<String, CatalogItem>> apply(
+ Map<String, Catalog> from) {
+ return transformValues(
+ from,
+ new Function<Catalog, Map<String, CatalogItem>>() {
+
+ @Override
+ public Map<String, CatalogItem> apply(Catalog from) {
+ return uniqueIndex(filter(allCatalogItemsInCatalog.apply(from), notNull()), name);
+ }
+ });
+
+ }
+ });
+ }
+ }
+
+ @Provides
+ @Singleton
+ protected Supplier<Map<String, Map<String, Map<String, CatalogItem>>>> provideOrgCatalogItemSupplierCache(
+ @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference<AuthorizationException> authException,
+ OrgCatalogItemSupplier supplier) {
+ return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
+ TimeUnit.SECONDS);
+ }
+
+ @Provides
+ @Singleton
+ protected FenceMode defaultFenceMode(@Named(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) String fenceMode) {
+ return FenceMode.fromValue(fenceMode);
+ }
+
+ @Provides
+ @Singleton
+ protected LoadingCache<URI, VAppTemplate> vAppTemplates(CacheLoader<URI, VAppTemplate> vAppTemplates) {
+ return CacheBuilder.newBuilder().build(vAppTemplates);
+ }
+
+ @Provides
+ @Singleton
+ protected LoadingCache<URI, Envelope> envelopes(CacheLoader<URI, Envelope> envelopes) {
+ return CacheBuilder.newBuilder().build(envelopes);
+ }
+
+ @Override
+ protected void bindErrorHandlers() {
+ bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(ParseVCloudErrorFromHttpResponse.class);
+ bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(ParseVCloudErrorFromHttpResponse.class);
+ bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(ParseVCloudErrorFromHttpResponse.class);
+ }
+
+ @Override
+ protected void installLocations() {
+ super.installLocations();
+ bind(ImplicitLocationSupplier.class).to(DefaultVDC.class).in(Scopes.SINGLETON);
+ bind(LocationsSupplier.class).to(OrgAndVDCToLocationSupplier.class).in(Scopes.SINGLETON);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java
deleted file mode 100644
index 71af24d..0000000
--- a/apis/vcloud/src/main/java/org/jclouds/vcloud/config/VCloudRestClientModule.java
+++ /dev/null
@@ -1,570 +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.vcloud.config;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-import static com.google.common.base.Predicates.notNull;
-import static com.google.common.collect.Iterables.concat;
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.getLast;
-import static com.google.common.collect.Iterables.transform;
-import static com.google.common.collect.Maps.transformValues;
-import static com.google.common.collect.Maps.uniqueIndex;
-import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
-import static org.jclouds.rest.config.BinderUtils.bindSyncToAsyncHttpApi;
-import static org.jclouds.util.Predicates2.retry;
-import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_DEFAULT_FENCEMODE;
-import static org.jclouds.vcloud.reference.VCloudConstants.PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED;
-
-import java.net.URI;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.SortedMap;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
-
-import org.jclouds.cim.xml.ResourceAllocationSettingDataHandler;
-import org.jclouds.domain.Location;
-import org.jclouds.http.HttpErrorHandler;
-import org.jclouds.http.annotation.ClientError;
-import org.jclouds.http.annotation.Redirection;
-import org.jclouds.http.annotation.ServerError;
-import org.jclouds.location.suppliers.ImplicitLocationSupplier;
-import org.jclouds.location.suppliers.LocationsSupplier;
-import org.jclouds.ovf.Envelope;
-import org.jclouds.rest.AuthorizationException;
-import org.jclouds.rest.ConfiguresRestClient;
-import org.jclouds.rest.annotations.ApiVersion;
-import org.jclouds.rest.config.RestClientModule;
-import org.jclouds.rest.suppliers.MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier;
-import org.jclouds.vcloud.VCloudAsyncClient;
-import org.jclouds.vcloud.VCloudClient;
-import org.jclouds.vcloud.VCloudToken;
-import org.jclouds.vcloud.VCloudVersionsAsyncClient;
-import org.jclouds.vcloud.VCloudVersionsClient;
-import org.jclouds.vcloud.compute.functions.FindLocationForResource;
-import org.jclouds.vcloud.compute.functions.ValidateVAppTemplateAndReturnEnvelopeOrThrowIllegalArgumentException;
-import org.jclouds.vcloud.domain.Catalog;
-import org.jclouds.vcloud.domain.CatalogItem;
-import org.jclouds.vcloud.domain.Org;
-import org.jclouds.vcloud.domain.ReferenceType;
-import org.jclouds.vcloud.domain.VAppTemplate;
-import org.jclouds.vcloud.domain.VCloudSession;
-import org.jclouds.vcloud.domain.VDC;
-import org.jclouds.vcloud.domain.network.FenceMode;
-import org.jclouds.vcloud.endpoints.Network;
-import org.jclouds.vcloud.endpoints.OrgList;
-import org.jclouds.vcloud.features.CatalogAsyncClient;
-import org.jclouds.vcloud.features.CatalogClient;
-import org.jclouds.vcloud.features.NetworkAsyncClient;
-import org.jclouds.vcloud.features.NetworkClient;
-import org.jclouds.vcloud.features.OrgAsyncClient;
-import org.jclouds.vcloud.features.OrgClient;
-import org.jclouds.vcloud.features.TaskAsyncClient;
-import org.jclouds.vcloud.features.TaskClient;
-import org.jclouds.vcloud.features.VAppAsyncClient;
-import org.jclouds.vcloud.features.VAppClient;
-import org.jclouds.vcloud.features.VAppTemplateAsyncClient;
-import org.jclouds.vcloud.features.VAppTemplateClient;
-import org.jclouds.vcloud.features.VDCAsyncClient;
-import org.jclouds.vcloud.features.VDCClient;
-import org.jclouds.vcloud.features.VmAsyncClient;
-import org.jclouds.vcloud.features.VmClient;
-import org.jclouds.vcloud.functions.CatalogItemsInCatalog;
-import org.jclouds.vcloud.functions.CatalogItemsInOrg;
-import org.jclouds.vcloud.functions.CatalogsInOrg;
-import org.jclouds.vcloud.functions.DefaultNetworkNameInTemplate;
-import org.jclouds.vcloud.functions.OrgsForLocations;
-import org.jclouds.vcloud.functions.OrgsForNames;
-import org.jclouds.vcloud.functions.VAppTemplatesForCatalogItems;
-import org.jclouds.vcloud.functions.VDCsInOrg;
-import org.jclouds.vcloud.handlers.ParseVCloudErrorFromHttpResponse;
-import org.jclouds.vcloud.internal.VCloudLoginAsyncClient;
-import org.jclouds.vcloud.internal.VCloudLoginClient;
-import org.jclouds.vcloud.loaders.OVFLoader;
-import org.jclouds.vcloud.loaders.VAppTemplateLoader;
-import org.jclouds.vcloud.location.DefaultVDC;
-import org.jclouds.vcloud.location.OrgAndVDCToLocationSupplier;
-import org.jclouds.vcloud.predicates.TaskSuccess;
-import org.jclouds.vcloud.xml.ovf.VCloudResourceAllocationSettingDataHandler;
-
-import com.google.common.base.Function;
-import com.google.common.base.Objects;
-import com.google.common.base.Predicate;
-import com.google.common.base.Supplier;
-import com.google.common.base.Suppliers;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMap.Builder;
-import com.google.common.collect.Lists;
-import com.google.inject.Injector;
-import com.google.inject.Provides;
-import com.google.inject.Scopes;
-import com.google.inject.TypeLiteral;
-
-/**
- * Configures the VCloud authentication service connection, including logging and http transport.
- *
- * @author Adrian Cole
- */
-@ConfiguresRestClient
-public class VCloudRestClientModule extends RestClientModule<VCloudClient, VCloudAsyncClient> {
-
- public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
- .put(VAppTemplateClient.class, VAppTemplateAsyncClient.class)//
- .put(VAppClient.class, VAppAsyncClient.class)//
- .put(VmClient.class, VmAsyncClient.class)//
- .put(CatalogClient.class, CatalogAsyncClient.class)//
- .put(TaskClient.class, TaskAsyncClient.class)//
- .put(VDCClient.class, VDCAsyncClient.class)//
- .put(NetworkClient.class, NetworkAsyncClient.class)//
- .put(OrgClient.class, OrgAsyncClient.class)//
- .build();
-
- public VCloudRestClientModule() {
- super(DELEGATE_MAP);
- }
-
- @Provides
- @Singleton
- protected Supplier<VCloudSession> provideVCloudTokenCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds,
- AtomicReference<AuthorizationException> authException, final VCloudLoginClient login) {
- return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException,
- new Supplier<VCloudSession>() {
-
- @Override
- public VCloudSession get() {
- return login.login();
- }
-
- @Override
- public String toString() {
- return Objects.toStringHelper(login).add("method", "login").toString();
- }
- }, seconds, TimeUnit.SECONDS);
- }
-
- @Override
- protected void configure() {
- super.configure();
- bind(new TypeLiteral<Function<Iterable<CatalogItem>, Iterable<VAppTemplate>>>() {
- }).to(new TypeLiteral<VAppTemplatesForCatalogItems>() {
- });
- bind(ResourceAllocationSettingDataHandler.class).to(VCloudResourceAllocationSettingDataHandler.class);
- installDefaultVCloudEndpointsModule();
- bind(new TypeLiteral<Function<ReferenceType, Location>>() {
- }).to(new TypeLiteral<FindLocationForResource>() {
- });
- bind(new TypeLiteral<Function<Org, Iterable<Catalog>>>() {
- }).to(new TypeLiteral<CatalogsInOrg>() {
- });
- bind(new TypeLiteral<Function<Org, Iterable<VDC>>>() {
- }).to(new TypeLiteral<VDCsInOrg>() {
- });
- bind(new TypeLiteral<Function<Iterable<String>, Iterable<Org>>>() {
- }).to(new TypeLiteral<OrgsForNames>() {
- });
- bind(new TypeLiteral<Function<Iterable<Location>, Iterable<Org>>>() {
- }).to(new TypeLiteral<OrgsForLocations>() {
- });
- bind(new TypeLiteral<Function<Catalog, Iterable<CatalogItem>>>() {
- }).to(new TypeLiteral<CatalogItemsInCatalog>() {
- });
- bind(new TypeLiteral<Function<Org, Iterable<CatalogItem>>>() {
- }).to(new TypeLiteral<CatalogItemsInOrg>() {
- });
-
- bindCacheLoaders();
-
- bind(new TypeLiteral<Function<VAppTemplate, String>>() {
- }).annotatedWith(Network.class).to(new TypeLiteral<DefaultNetworkNameInTemplate>() {
- });
-
- bind(new TypeLiteral<Function<VAppTemplate, Envelope>>() {
- }).to(new TypeLiteral<ValidateVAppTemplateAndReturnEnvelopeOrThrowIllegalArgumentException>() {
- });
- bindSyncToAsyncHttpApi(binder(), VCloudVersionsClient.class, VCloudVersionsAsyncClient.class);
- bindSyncToAsyncHttpApi(binder(), VCloudLoginClient.class, VCloudLoginAsyncClient.class);
- }
-
- protected void bindCacheLoaders() {
- bind(new TypeLiteral<CacheLoader<URI, VAppTemplate>>() {
- }).to(new TypeLiteral<VAppTemplateLoader>() {
- });
-
- bind(new TypeLiteral<CacheLoader<URI, Envelope>>() {
- }).to(new TypeLiteral<OVFLoader>() {
- });
- }
-
- @Provides
- @Singleton
- @org.jclouds.vcloud.endpoints.VDC
- protected Supplier<Map<String, String>> provideVDCtoORG(Supplier<Map<String, Org>> orgNameToOrgSupplier) {
- return Suppliers.compose(new Function<Map<String, Org>, Map<String, String>>() {
-
- @Override
- public Map<String, String> apply(Map<String, Org> arg0) {
- Builder<String, String> returnVal = ImmutableMap.builder();
- for (Entry<String, Org> orgr : arg0.entrySet()) {
- for (String vdc : orgr.getValue().getVDCs().keySet()) {
- returnVal.put(vdc, orgr.getKey());
- }
- }
- return returnVal.build();
- }
- }, orgNameToOrgSupplier);
-
- }
-
- @Provides
- @Singleton
- protected Supplier<Map<String, Org>> provideOrgMapCache(@Named(PROPERTY_SESSION_INTERVAL) long seconds,
- AtomicReference<AuthorizationException> authException, OrgMapSupplier supplier) {
- return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
- TimeUnit.SECONDS);
- }
-
- @Provides
- @Singleton
- @OrgList
- protected Supplier<URI> provideOrgListURI(Supplier<VCloudSession> sessionSupplier) {
- return Suppliers.compose(new Function<VCloudSession, URI>() {
-
- @Override
- public URI apply(VCloudSession arg0) {
- return URI.create(getLast(arg0.getOrgs().values()).getHref().toASCIIString().replaceAll("org/.*", "org"));
- }
-
- @Override
- public String toString() {
- return "orgListURI()";
- }
-
- }, sessionSupplier);
- }
-
- @Singleton
- public static class OrgMapSupplier implements Supplier<Map<String, Org>> {
- protected final Supplier<VCloudSession> sessionSupplier;
- protected final Function<Iterable<String>, Iterable<Org>> organizationsForNames;
-
- @Inject
- protected OrgMapSupplier(Supplier<VCloudSession> sessionSupplier,
- Function<Iterable<String>, Iterable<Org>> organizationsForNames) {
- this.sessionSupplier = sessionSupplier;
- this.organizationsForNames = organizationsForNames;
- }
-
- @Override
- public Map<String, Org> get() {
- return uniqueIndex(organizationsForNames.apply(sessionSupplier.get().getOrgs().keySet()), name);
- }
- }
-
- protected void installDefaultVCloudEndpointsModule() {
- install(new DefaultVCloudReferencesModule());
- }
-
- @Singleton
- public static class OrgCatalogSupplier implements
- Supplier<Map<String, Map<String, Catalog>>> {
- protected final Supplier<Map<String, Org>> orgSupplier;
- protected final Function<Org, Iterable<Catalog>> allCatalogsInOrg;
-
- @Inject
- protected OrgCatalogSupplier(Supplier<Map<String, Org>> orgSupplier,
- Function<Org, Iterable<Catalog>> allCatalogsInOrg) {
- this.orgSupplier = orgSupplier;
- this.allCatalogsInOrg = allCatalogsInOrg;
- }
-
- @Override
- public Map<String, Map<String, Catalog>> get() {
- return transformValues(transformValues(orgSupplier.get(), allCatalogsInOrg),
- new Function<Iterable<? extends Catalog>, Map<String, Catalog>>() {
-
- @Override
- public Map<String, Catalog> apply(Iterable<? extends Catalog> from) {
- return ImmutableMap.copyOf(uniqueIndex(from, name));
- }
-
- });
- }
- }
-
- @VCloudToken
- @Provides
- @Singleton
- Supplier<String> provideVCloudToken(Supplier<VCloudSession> cache) {
- return Suppliers.compose(new Function<VCloudSession, String>() {
-
- @Override
- public String apply(VCloudSession input) {
- return checkNotNull(input.getVCloudToken(), "No token present in session");
- }
- }, cache);
- }
-
- @Provides
- @org.jclouds.vcloud.endpoints.Org
- @Singleton
- protected Supplier<Map<String, ReferenceType>> provideVDCtoORG(@Named(PROPERTY_SESSION_INTERVAL) long seconds,
- AtomicReference<AuthorizationException> authException, OrgNameToOrgSupplier supplier) {
- return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
- TimeUnit.SECONDS);
- }
-
- @Provides
- @Singleton
- protected Supplier<Map<URI, VDC>> provideURIToVDC(
- @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference<AuthorizationException> authException,
- URItoVDC supplier) {
- return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
- TimeUnit.SECONDS);
- }
-
- @Singleton
- public static class URItoVDC implements Supplier<Map<URI, VDC>> {
- private final Supplier<Map<String, Map<String, VDC>>> orgVDCMap;
-
- @Inject
- URItoVDC(Supplier<Map<String, Map<String, VDC>>> orgVDCMap) {
- this.orgVDCMap = orgVDCMap;
- }
-
- @Override
- public Map<URI, VDC> get() {
- return uniqueIndex(concat(transform(orgVDCMap.get().values(),
- new Function<Map<String, VDC>, Iterable<VDC>>() {
-
- @Override
- public Iterable<VDC> apply(
- Map<String, VDC> from) {
- return from.values();
- }
-
- })), new Function<VDC, URI>() {
-
- @Override
- public URI apply(VDC from) {
- return from.getHref();
- }
-
- });
- }
-
- }
-
- static final Function<ReferenceType, String> name = new Function<ReferenceType, String>() {
-
- @Override
- public String apply(ReferenceType from) {
- return from.getName();
- }
-
- };
-
- @Provides
- @Singleton
- @org.jclouds.vcloud.endpoints.VCloudLogin
- protected Supplier<URI> provideAuthenticationURI(final VCloudVersionsClient versionService,
- @ApiVersion final String version) {
- return new Supplier<URI>() {
-
- @Override
- public URI get() {
- SortedMap<String, URI> versions = versionService.getSupportedVersions();
- checkState(versions.size() > 0, "No versions present");
- checkState(versions.containsKey(version), "version " + version + " not present in: " + versions);
- return versions.get(version);
- }
-
- public String toString() {
- return "login()";
- }
- };
- }
-
- @Singleton
- private static class OrgNameToOrgSupplier implements Supplier<Map<String, ReferenceType>> {
- private final Supplier<VCloudSession> sessionSupplier;
-
- @Inject
- OrgNameToOrgSupplier(Supplier<VCloudSession> sessionSupplier) {
- this.sessionSupplier = sessionSupplier;
- }
-
- @Override
- public Map<String, ReferenceType> get() {
- return sessionSupplier.get().getOrgs();
- }
-
- }
-
- @Provides
- @Singleton
- protected Supplier<Org> provideOrg(final Supplier<Map<String, Org>> orgSupplier,
- @org.jclouds.vcloud.endpoints.Org Supplier<ReferenceType> defaultOrg) {
- return Suppliers.compose(new Function<ReferenceType, Org>() {
-
- @Override
- public Org apply(ReferenceType input) {
- return orgSupplier.get().get(input.getName());
-
- }
- }, defaultOrg);
- }
-
- @Provides
- @Singleton
- protected Predicate<URI> successTester(Injector injector,
- @Named(PROPERTY_VCLOUD_TIMEOUT_TASK_COMPLETED) long completed) {
- return retry(injector.getInstance(TaskSuccess.class), completed);
- }
-
- @Provides
- @Singleton
- protected Supplier<Map<String, Map<String, Catalog>>> provideOrgCatalogItemMapSupplierCache(
- @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference<AuthorizationException> authException,
- OrgCatalogSupplier supplier) {
- return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
- TimeUnit.SECONDS);
- }
-
- @Provides
- @Singleton
- protected Supplier<Map<String, Map<String, VDC>>> provideOrgVDCSupplierCache(
- @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference<AuthorizationException> authException,
- OrgVDCSupplier supplier) {
- return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
- TimeUnit.SECONDS);
- }
-
- @Singleton
- public static class OrgVDCSupplier implements Supplier<Map<String, Map<String, VDC>>> {
- protected final Supplier<Map<String, Org>> orgSupplier;
- private final Function<Org, Iterable<VDC>> allVDCsInOrg;
-
- @Inject
- protected OrgVDCSupplier(Supplier<Map<String, Org>> orgSupplier,
- Function<Org, Iterable<VDC>> allVDCsInOrg) {
- this.orgSupplier = orgSupplier;
- this.allVDCsInOrg = allVDCsInOrg;
- }
-
- @Override
- public Map<String, Map<String, VDC>> get() {
- return transformValues(transformValues(orgSupplier.get(), allVDCsInOrg),
- new Function<Iterable<? extends VDC>, Map<String, VDC>>() {
-
- @Override
- public Map<String, VDC> apply(
- Iterable<? extends VDC> from) {
- return uniqueIndex(Lists.newArrayList(from), name);
- }
-
- });
- }
- }
-
- @Singleton
- public static class OrgCatalogItemSupplier implements
- Supplier<Map<String, Map<String, Map<String, CatalogItem>>>> {
- protected final Supplier<Map<String, Map<String, Catalog>>> catalogSupplier;
- protected final Function<Catalog, Iterable<CatalogItem>> allCatalogItemsInCatalog;
-
- @Inject
- protected OrgCatalogItemSupplier(
- Supplier<Map<String, Map<String, Catalog>>> catalogSupplier,
- Function<Catalog, Iterable<CatalogItem>> allCatalogItemsInCatalog) {
- this.catalogSupplier = catalogSupplier;
- this.allCatalogItemsInCatalog = allCatalogItemsInCatalog;
- }
-
- @Override
- public Map<String, Map<String, Map<String, CatalogItem>>> get() {
- return transformValues(
- catalogSupplier.get(),
- new Function<Map<String, Catalog>, Map<String, Map<String, CatalogItem>>>() {
-
- @Override
- public Map<String, Map<String, CatalogItem>> apply(
- Map<String, Catalog> from) {
- return transformValues(
- from,
- new Function<Catalog, Map<String, CatalogItem>>() {
-
- @Override
- public Map<String, CatalogItem> apply(Catalog from) {
- return uniqueIndex(filter(allCatalogItemsInCatalog.apply(from), notNull()), name);
- }
- });
-
- }
- });
- }
- }
-
- @Provides
- @Singleton
- protected Supplier<Map<String, Map<String, Map<String, CatalogItem>>>> provideOrgCatalogItemSupplierCache(
- @Named(PROPERTY_SESSION_INTERVAL) long seconds, AtomicReference<AuthorizationException> authException,
- OrgCatalogItemSupplier supplier) {
- return MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier.create(authException, supplier, seconds,
- TimeUnit.SECONDS);
- }
-
- @Provides
- @Singleton
- protected FenceMode defaultFenceMode(@Named(PROPERTY_VCLOUD_DEFAULT_FENCEMODE) String fenceMode) {
- return FenceMode.fromValue(fenceMode);
- }
-
- @Provides
- @Singleton
- protected LoadingCache<URI, VAppTemplate> vAppTemplates(CacheLoader<URI, VAppTemplate> vAppTemplates) {
- return CacheBuilder.newBuilder().build(vAppTemplates);
- }
-
- @Provides
- @Singleton
- protected LoadingCache<URI, Envelope> envelopes(CacheLoader<URI, Envelope> envelopes) {
- return CacheBuilder.newBuilder().build(envelopes);
- }
-
- @Override
- protected void bindErrorHandlers() {
- bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(ParseVCloudErrorFromHttpResponse.class);
- bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(ParseVCloudErrorFromHttpResponse.class);
- bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(ParseVCloudErrorFromHttpResponse.class);
- }
-
- @Override
- protected void installLocations() {
- super.installLocations();
- bind(ImplicitLocationSupplier.class).to(DefaultVDC.class).in(Scopes.SINGLETON);
- bind(LocationsSupplier.class).to(OrgAndVDCToLocationSupplier.class).in(Scopes.SINGLETON);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-jclouds/blob/a61ad06c/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogApi.java
----------------------------------------------------------------------
diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogApi.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogApi.java
new file mode 100644
index 0000000..0828c29
--- /dev/null
+++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogApi.java
@@ -0,0 +1,145 @@
+/*
+ * 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.vcloud.features;
+
+import static org.jclouds.vcloud.VCloudMediaType.CATALOGITEM_XML;
+import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML;
+
+import java.net.URI;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import org.jclouds.Fallbacks;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.MapBinder;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+import org.jclouds.vcloud.binders.BindCatalogItemToXmlPayload;
+import org.jclouds.vcloud.binders.OrgNameAndCatalogNameToEndpoint;
+import org.jclouds.vcloud.binders.OrgNameCatalogNameItemNameToEndpoint;
+import org.jclouds.vcloud.domain.Catalog;
+import org.jclouds.vcloud.domain.CatalogItem;
+import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.options.CatalogItemOptions;
+import org.jclouds.vcloud.xml.CatalogHandler;
+import org.jclouds.vcloud.xml.CatalogItemHandler;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+/**
+ * Provides access to Catalog functionality in vCloud
+ * <p/>
+ *
+ * @see <a href="http://communities.vmware.com/community/developer/forums/vcloudapi" />
+ * @author Adrian Cole
+ */
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
+public interface CatalogApi {
+
+ @GET
+ @XMLResponseParser(CatalogHandler.class)
+ @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+ @Consumes(CATALOG_XML)
+ Catalog getCatalog(@EndpointParam URI catalogId);
+
+ /**
+ * returns the catalog in the organization associated with the specified name. Note that both
+ * parameters can be null to choose default.
+ *
+ * @param orgName
+ * organization name, or null for the default
+ * @param catalogName
+ * catalog name, or null for the default
+ * @throws NoSuchElementException
+ * if you specified an org or catalog name that isn't present
+ */
+ @GET
+ @XMLResponseParser(CatalogHandler.class)
+ @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+ @Consumes(CATALOG_XML)
+ @MapBinder(OrgNameAndCatalogNameToEndpoint.class)
+ Catalog findCatalogInOrgNamed(@Nullable @PayloadParam("orgName") String orgName,
+ @Nullable @PayloadParam("catalogName") String catalogName);
+
+ @GET
+ @Consumes(CATALOGITEM_XML)
+ @XMLResponseParser(CatalogItemHandler.class)
+ @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+ CatalogItem getCatalogItem(@EndpointParam URI catalogItem);
+
+ /**
+ * returns the catalog item in the catalog associated with the specified name. Note that the org
+ * and catalog parameters can be null to choose default.
+ *
+ * @param orgName
+ * organization name, or null for the default
+ * @param catalogName
+ * catalog name, or null for the default
+ * @param itemName
+ * item you wish to lookup
+ *
+ * @throws NoSuchElementException
+ * if you specified an org, catalog, or catalog item name that isn't present
+ */
+ @GET
+ @Consumes(CATALOGITEM_XML)
+ @XMLResponseParser(CatalogItemHandler.class)
+ @Fallback(Fallbacks.NullOnNotFoundOr404.class)
+ @MapBinder(OrgNameCatalogNameItemNameToEndpoint.class)
+ CatalogItem findCatalogItemInOrgCatalogNamed(@Nullable @PayloadParam("orgName") String orgName,
+ @Nullable @PayloadParam("catalogName") String catalogName,
+ @PayloadParam("itemName") String itemName);
+
+ /**
+ * A catalog can contain references to vApp templates and media images that have been uploaded to
+ * any vDC in an organization. A vApp template or media image can be listed in at most one
+ * catalog.
+ *
+ * @param entity
+ * the reference to the vApp templates and media image
+ * @param catalog
+ * URI of the catalog to add the resourceEntity from
+ * @param name
+ * name of the entry in the catalog
+ *
+ * @param options
+ * options such as description or properties
+ * @return the new catalog item
+ */
+ @POST
+ @Path("/catalogItems")
+ @Consumes(CATALOGITEM_XML)
+ @Produces(CATALOGITEM_XML)
+ @MapBinder(BindCatalogItemToXmlPayload.class)
+ @XMLResponseParser(CatalogItemHandler.class)
+ CatalogItem addVAppTemplateOrMediaImageToCatalogAndNameItem(@PayloadParam("Entity") URI entity,
+ @EndpointParam URI catalog,
+ @PayloadParam("name") String name,
+ CatalogItemOptions... options);
+
+ @DELETE
+ @Fallback(Fallbacks.VoidOnNotFoundOr404.class)
+ void deleteCatalogItem(@EndpointParam URI href);
+}