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);
+}