diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndCatalogNameToEndpoint.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameAndCatalogNameToEndpoint.java similarity index 72% rename from apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndCatalogNameToEndpoint.java rename to apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameAndCatalogNameToEndpoint.java index 318dc06f8f..bebf805b1c 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndCatalogNameToEndpoint.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameAndCatalogNameToEndpoint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.vcloud.functions; +package org.jclouds.vcloud.binders; import static com.google.common.base.Preconditions.checkNotNull; @@ -27,11 +27,12 @@ import java.util.NoSuchElementException; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.MapBinder; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.endpoints.Catalog; -import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.collect.Iterables; @@ -40,7 +41,7 @@ import com.google.common.collect.Iterables; * @author Adrian Cole */ @Singleton -public class OrgNameAndCatalogNameToEndpoint implements Function { +public class OrgNameAndCatalogNameToEndpoint implements MapBinder { private final Supplier> orgMap; private final Supplier defaultOrg; private final Supplier defaultCatalog; @@ -55,21 +56,26 @@ public class OrgNameAndCatalogNameToEndpoint implements Function { } @SuppressWarnings("unchecked") - public URI apply(Object from) { - Iterable orgCatalog = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgCatalog, 0); - Object catalog = Iterables.get(orgCatalog, 1); + @Override + public R bindToRequest(R request, Map postParams) { + Object org = postParams.get("orgName"); + Object catalog = postParams.get("catalogName"); if (org == null && catalog == null) - return defaultCatalog.get().getHref(); + return (R) request.toBuilder().endpoint(defaultCatalog.get().getHref()).build(); else if (org == null) org = defaultOrg.get().getName(); try { Map catalogs = checkNotNull(orgMap.get().get(org)).getCatalogs(); - return catalog == null ? Iterables.getLast(catalogs.values()).getHref() : catalogs.get(catalog).getHref(); + URI endpoint = catalog == null ? Iterables.getLast(catalogs.values()).getHref() : catalogs.get(catalog).getHref(); + return (R) request.toBuilder().endpoint(endpoint).build(); } catch (NullPointerException e) { throw new NoSuchElementException(org + "/" + catalog + " not found in " + orgMap.get()); } } - + + @Override + public R bindToRequest(R request, Object input) { + throw new IllegalStateException(getClass() + " needs parameters"); + } } diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndVDCNameToEndpoint.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameAndVDCNameToEndpoint.java similarity index 73% rename from apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndVDCNameToEndpoint.java rename to apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameAndVDCNameToEndpoint.java index 6a0087bef0..44185365b3 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameAndVDCNameToEndpoint.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameAndVDCNameToEndpoint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.vcloud.functions; +package org.jclouds.vcloud.binders; import static com.google.common.base.Preconditions.checkNotNull; @@ -27,11 +27,12 @@ import java.util.NoSuchElementException; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.MapBinder; import org.jclouds.vcloud.domain.Org; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.endpoints.VDC; -import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.collect.Iterables; @@ -40,7 +41,7 @@ import com.google.common.collect.Iterables; * @author Adrian Cole */ @Singleton -public class OrgNameAndVDCNameToEndpoint implements Function { +public class OrgNameAndVDCNameToEndpoint implements MapBinder { private final Supplier> orgNameToVDCEndpoint; private final Supplier defaultOrg; private final Supplier defaultVDC; @@ -54,21 +55,26 @@ public class OrgNameAndVDCNameToEndpoint implements Function { } @SuppressWarnings("unchecked") - public URI apply(Object from) { - Iterable orgVdc = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgVdc, 0); - Object vdc = Iterables.get(orgVdc, 1); + @Override + public R bindToRequest(R request, Map postParams) { + Object org = postParams.get("orgName"); + Object vdc = postParams.get("vdcName"); if (org == null && vdc == null) - return defaultVDC.get().getHref(); + return (R) request.toBuilder().endpoint(defaultVDC.get().getHref()).build(); else if (org == null) org = defaultOrg.get().getName(); try { Map vdcs = checkNotNull(orgNameToVDCEndpoint.get().get(org)).getVDCs(); - return vdc == null ? Iterables.getLast(vdcs.values()).getHref() : vdcs.get(vdc).getHref(); + URI endpoint = vdc == null ? Iterables.getLast(vdcs.values()).getHref() : vdcs.get(vdc).getHref(); + return (R) request.toBuilder().endpoint(endpoint).build(); } catch (NullPointerException e) { throw new NoSuchElementException(org + "/" + vdc + " not found in " + orgNameToVDCEndpoint.get()); } } + @Override + public R bindToRequest(R request, Object input) { + throw new IllegalStateException(getClass() + " needs parameters"); + } } diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameItemNameToEndpoint.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameItemNameToEndpoint.java similarity index 76% rename from apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameItemNameToEndpoint.java rename to apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameItemNameToEndpoint.java index 4a9dc529e7..9ce92963da 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameItemNameToEndpoint.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameItemNameToEndpoint.java @@ -16,31 +16,30 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.vcloud.functions; +package org.jclouds.vcloud.binders; import static com.google.common.base.Preconditions.checkNotNull; -import java.net.URI; import java.util.Map; import java.util.NoSuchElementException; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.MapBinder; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.endpoints.Catalog; import org.jclouds.vcloud.endpoints.Org; -import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; /** * * @author Adrian Cole */ @Singleton -public class OrgNameCatalogNameItemNameToEndpoint implements Function { +public class OrgNameCatalogNameItemNameToEndpoint implements MapBinder { private final Supplier>> orgCatalogMap; private final Supplier defaultOrg; private final Supplier defaultCatalog; @@ -55,22 +54,26 @@ public class OrgNameCatalogNameItemNameToEndpoint implements Function orgCatalog = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgCatalog, 0); - Object catalog = Iterables.get(orgCatalog, 1); - Object catalogItem = Iterables.get(orgCatalog, 2); + @Override + public R bindToRequest(R request, Map postParams) { + Object org = postParams.get("orgName"); + Object catalog = postParams.get("catalogName"); + Object catalogItem = postParams.get("itemName"); if (org == null) org = defaultOrg.get().getName(); if (catalog == null) catalog = defaultCatalog.get().getName(); try { Map catalogs = checkNotNull(orgCatalogMap.get().get(org)); - return catalogs.get(catalog).get(catalogItem).getHref(); + return (R) request.toBuilder().endpoint(catalogs.get(catalog).get(catalogItem).getHref()).build(); } catch (NullPointerException e) { throw new NoSuchElementException(org + "/" + catalog + "/" + catalogItem + " not found in " + orgCatalogMap.get()); } } - + + @Override + public R bindToRequest(R request, Object input) { + throw new IllegalStateException(getClass() + " needs parameters"); + } } diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameVAppTemplateNameToEndpoint.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameVAppTemplateNameToEndpoint.java similarity index 79% rename from apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameVAppTemplateNameToEndpoint.java rename to apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameVAppTemplateNameToEndpoint.java index 8bdcd27d25..8ef7237e09 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameCatalogNameVAppTemplateNameToEndpoint.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameCatalogNameVAppTemplateNameToEndpoint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.vcloud.functions; +package org.jclouds.vcloud.binders; import static com.google.common.base.Preconditions.checkNotNull; @@ -27,21 +27,21 @@ import java.util.NoSuchElementException; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.MapBinder; import org.jclouds.vcloud.domain.CatalogItem; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.endpoints.Catalog; import org.jclouds.vcloud.endpoints.Org; -import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; /** * * @author Adrian Cole */ @Singleton -public class OrgNameCatalogNameVAppTemplateNameToEndpoint implements Function { +public class OrgNameCatalogNameVAppTemplateNameToEndpoint implements MapBinder { private final Supplier>>> orgCatalogItemMap; private final Supplier defaultOrg; private final Supplier defaultCatalog; @@ -56,11 +56,11 @@ public class OrgNameCatalogNameVAppTemplateNameToEndpoint implements Function orgCatalog = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgCatalog, 0); - Object catalog = Iterables.get(orgCatalog, 1); - Object catalogItem = Iterables.get(orgCatalog, 2); + @Override + public R bindToRequest(R request, Map postParams) { + Object org = postParams.get("orgName"); + Object catalog = postParams.get("catalogName"); + Object catalogItem = postParams.get("itemName"); if (org == null) org = defaultOrg.get().getName(); if (catalog == null) @@ -80,8 +80,13 @@ public class OrgNameCatalogNameVAppTemplateNameToEndpoint implements Function R bindToRequest(R request, Object input) { + throw new IllegalStateException(getClass() + " needs parameters"); + } } diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameNetworkNameToEndpoint.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameNetworkNameToEndpoint.java similarity index 98% rename from apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameNetworkNameToEndpoint.java rename to apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameNetworkNameToEndpoint.java index 1279367a44..1609dbe603 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameNetworkNameToEndpoint.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameNetworkNameToEndpoint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.vcloud.functions; +package org.jclouds.vcloud.binders; import java.net.URI; import java.util.Map; diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceEntityNameToEndpoint.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceEntityNameToEndpoint.java similarity index 98% rename from apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceEntityNameToEndpoint.java rename to apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceEntityNameToEndpoint.java index fae9af885b..33be1ccea7 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceEntityNameToEndpoint.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceEntityNameToEndpoint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.vcloud.functions; +package org.jclouds.vcloud.binders; import java.net.URI; import java.util.Map; diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceNameToEndpoint.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceNameToEndpoint.java similarity index 77% rename from apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceNameToEndpoint.java rename to apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceNameToEndpoint.java index f5b0bbff4f..a3457e71a1 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceNameToEndpoint.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/binders/OrgNameVDCNameResourceNameToEndpoint.java @@ -16,9 +16,8 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.vcloud.functions; +package org.jclouds.vcloud.binders; -import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import java.net.URI; @@ -27,18 +26,18 @@ import java.util.NoSuchElementException; import javax.inject.Inject; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.MapBinder; import org.jclouds.vcloud.domain.ReferenceType; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.endpoints.Org; -import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; /** * * @author Adrian Cole */ -public abstract class OrgNameVDCNameResourceNameToEndpoint implements Function{ +public abstract class OrgNameVDCNameResourceNameToEndpoint implements MapBinder { protected final Supplier>> orgVDCMap; protected final Supplier defaultOrg; @@ -54,11 +53,11 @@ public abstract class OrgNameVDCNameResourceNameToEndpoint implements Function< } @SuppressWarnings("unchecked") - public URI apply(Object from) { - Iterable orgVDC = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgVDC, 0); - Object vDC = Iterables.get(orgVDC, 1); - Object resource = Iterables.get(orgVDC, 2); + @Override + public R bindToRequest(R request, Map postParams) { + Object org = postParams.get("orgName"); + Object vDC = postParams.get("vdcName"); + Object resource = postParams.get("resourceName"); if (org == null) org = defaultOrg.get().getName(); if (vDC == null) @@ -71,9 +70,14 @@ public abstract class OrgNameVDCNameResourceNameToEndpoint implements Function< org.jclouds.vcloud.domain.VDC vDCObject = vDCs.get(vDC); if (vDCObject == null) throw new NoSuchElementException("vdc " + vDC + " in org " + org + " not found in " + vDCs.keySet()); - return getEndpointOfResourceInVDC(org, vDC, resource, vDCObject); + URI endpoint = getEndpointOfResourceInVDC(org, vDC, resource, vDCObject); + return (R) request.toBuilder().endpoint(endpoint).build(); } protected abstract URI getEndpointOfResourceInVDC(Object org, Object vDC, Object resource, VDC vDCObject); + @Override + public R bindToRequest(R request, Object input) { + throw new IllegalStateException(getClass() + " needs parameters"); + } } diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogAsyncClient.java index 953e3c1691..4b8cde293e 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogAsyncClient.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/CatalogAsyncClient.java @@ -40,11 +40,11 @@ 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.functions.OrgNameAndCatalogNameToEndpoint; -import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint; import org.jclouds.vcloud.options.CatalogItemOptions; import org.jclouds.vcloud.xml.CatalogHandler; import org.jclouds.vcloud.xml.CatalogItemHandler; @@ -76,9 +76,9 @@ public interface CatalogAsyncClient { @XMLResponseParser(CatalogHandler.class) @Fallback(NullOnNotFoundOr404.class) @Consumes(CATALOG_XML) - ListenableFuture findCatalogInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String catalogName); + @MapBinder(OrgNameAndCatalogNameToEndpoint.class) + ListenableFuture findCatalogInOrgNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("catalogName") String catalogName); /** * @see CatalogClient#getCatalogItem @@ -96,10 +96,9 @@ public interface CatalogAsyncClient { @Consumes(CATALOGITEM_XML) @XMLResponseParser(CatalogItemHandler.class) @Fallback(NullOnNotFoundOr404.class) - ListenableFuture findCatalogItemInOrgCatalogNamed( - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName); + @MapBinder(OrgNameCatalogNameItemNameToEndpoint.class) + ListenableFuture findCatalogItemInOrgCatalogNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("catalogName") String catalogName, @PayloadParam("itemName") String itemName); /** * @see CatalogClient#addVAppTemplateOrMediaImageToCatalog diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/NetworkAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/NetworkAsyncClient.java index 145887b4b6..124ae93712 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/NetworkAsyncClient.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/NetworkAsyncClient.java @@ -29,11 +29,13 @@ import org.jclouds.Fallbacks.NullOnNotFoundOr404; 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.OrgNameVDCNameNetworkNameToEndpoint; import org.jclouds.vcloud.domain.network.OrgNetwork; import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest; -import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint; import org.jclouds.vcloud.xml.OrgNetworkHandler; import com.google.common.util.concurrent.ListenableFuture; @@ -54,10 +56,9 @@ public interface NetworkAsyncClient { @Consumes(NETWORK_XML) @XMLResponseParser(OrgNetworkHandler.class) @Fallback(NullOnNotFoundOr404.class) - ListenableFuture findNetworkInOrgVDCNamed( - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String networkName); + @MapBinder(OrgNameVDCNameNetworkNameToEndpoint.class) + ListenableFuture findNetworkInOrgVDCNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("vdcName") String vdcName, @PayloadParam("resourceName") String networkName); /** * @see NetworkClient#getNetwork diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppAsyncClient.java index 10e86fb524..5c2dffaca8 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppAsyncClient.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppAsyncClient.java @@ -47,10 +47,10 @@ import org.jclouds.rest.annotations.XMLResponseParser; import org.jclouds.vcloud.binders.BindCloneVAppParamsToXmlPayload; import org.jclouds.vcloud.binders.BindDeployVAppParamsToXmlPayload; import org.jclouds.vcloud.binders.BindUndeployVAppParamsToXmlPayload; +import org.jclouds.vcloud.binders.OrgNameVDCNameResourceEntityNameToEndpoint; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest; -import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint; import org.jclouds.vcloud.options.CloneVAppOptions; import org.jclouds.vcloud.xml.TaskHandler; import org.jclouds.vcloud.xml.VAppHandler; @@ -100,10 +100,9 @@ public interface VAppAsyncClient { @Consumes(VAPP_XML) @XMLResponseParser(VAppHandler.class) @Fallback(NullOnNotFoundOr404.class) - ListenableFuture findVAppInOrgVDCNamed( - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String vAppName); + @MapBinder(OrgNameVDCNameResourceEntityNameToEndpoint.class) + ListenableFuture findVAppInOrgVDCNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("vdcName") String vdcName, @PayloadParam("resourceName") String vAppName); /** * @see VAppClient#getVApp diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppTemplateAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppTemplateAsyncClient.java index 3db62a0e47..ec483e0fbc 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppTemplateAsyncClient.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VAppTemplateAsyncClient.java @@ -49,11 +49,11 @@ import org.jclouds.rest.annotations.XMLResponseParser; import org.jclouds.vcloud.binders.BindCaptureVAppParamsToXmlPayload; import org.jclouds.vcloud.binders.BindCloneVAppTemplateParamsToXmlPayload; import org.jclouds.vcloud.binders.BindInstantiateVAppTemplateParamsToXmlPayload; +import org.jclouds.vcloud.binders.OrgNameCatalogNameVAppTemplateNameToEndpoint; import org.jclouds.vcloud.domain.Task; import org.jclouds.vcloud.domain.VApp; import org.jclouds.vcloud.domain.VAppTemplate; import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest; -import org.jclouds.vcloud.functions.OrgNameCatalogNameVAppTemplateNameToEndpoint; import org.jclouds.vcloud.options.CaptureVAppOptions; import org.jclouds.vcloud.options.CloneVAppTemplateOptions; import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions; @@ -142,10 +142,9 @@ public interface VAppTemplateAsyncClient { @Consumes(VAPPTEMPLATE_XML) @XMLResponseParser(VAppTemplateHandler.class) @Fallback(NullOnNotFoundOr404.class) - ListenableFuture findVAppTemplateInOrgCatalogNamed( - @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String itemName); + @MapBinder(OrgNameCatalogNameVAppTemplateNameToEndpoint.class) + ListenableFuture findVAppTemplateInOrgCatalogNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("catalogName") String catalogName, @PayloadParam("itemName") String itemName); /** * @see VAppTemplateClient#getVAppTemplate diff --git a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VDCAsyncClient.java b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VDCAsyncClient.java index 753dfc98fc..4b11d0aa26 100644 --- a/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VDCAsyncClient.java +++ b/apis/vcloud/src/main/java/org/jclouds/vcloud/features/VDCAsyncClient.java @@ -29,11 +29,13 @@ import org.jclouds.Fallbacks.NullOnNotFoundOr404; 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.OrgNameAndVDCNameToEndpoint; import org.jclouds.vcloud.domain.VDC; import org.jclouds.vcloud.filters.AddVCloudAuthorizationAndCookieToRequest; -import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint; import org.jclouds.vcloud.xml.VDCHandler; import com.google.common.util.concurrent.ListenableFuture; @@ -63,7 +65,7 @@ public interface VDCAsyncClient { @XMLResponseParser(VDCHandler.class) @Consumes(VDC_XML) @Fallback(NullOnNotFoundOr404.class) - ListenableFuture findVDCInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName); + @MapBinder(OrgNameAndVDCNameToEndpoint.class) + ListenableFuture findVDCInOrgNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("vdcName") String vdcName); } diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/features/NetworkAsyncClientTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/features/NetworkAsyncClientTest.java index 5f9277cca1..913f83c36c 100644 --- a/apis/vcloud/src/test/java/org/jclouds/vcloud/features/NetworkAsyncClientTest.java +++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/features/NetworkAsyncClientTest.java @@ -60,7 +60,7 @@ public class NetworkAsyncClientTest extends BaseVCloudAsyncClientTest findCatalogItemInOrgCatalogNamed( - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String catalogName, - @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName); + @MapBinder(OrgNameCatalogNameItemNameToEndpoint.class) + ListenableFuture findCatalogItemInOrgCatalogNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("catalogName") String catalogName, @PayloadParam("itemName") String itemName); /** * @see TerremarkVCloudClient#getCatalogItem @@ -199,9 +197,9 @@ public interface TerremarkVCloudAsyncClient { @XMLResponseParser(CatalogHandler.class) @Fallback(NullOnNotFoundOr404.class) @Consumes(CATALOG_XML) - ListenableFuture findCatalogInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameAndCatalogNameToEndpoint.class) String catalogName); + @MapBinder(OrgNameAndCatalogNameToEndpoint.class) + ListenableFuture findCatalogInOrgNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("catalogName") String catalogName); /** * @see VCloudClient#getVAppTemplate @@ -219,10 +217,9 @@ public interface TerremarkVCloudAsyncClient { @Consumes(VAPPTEMPLATE_XML) @XMLResponseParser(VAppTemplateHandler.class) @Fallback(NullOnNotFoundOr404.class) - ListenableFuture findVAppTemplateInOrgCatalogNamed( - @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameCatalogNameVAppTemplateNameToEndpoint.class) String itemName); + @MapBinder(OrgNameCatalogNameVAppTemplateNameToEndpoint.class) + ListenableFuture findVAppTemplateInOrgCatalogNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("catalogName") String catalogName, @PayloadParam("itemName") String itemName); /** * @see VCloudClient#findNetworkInOrgVDCNamed @@ -231,10 +228,9 @@ public interface TerremarkVCloudAsyncClient { @Consumes(NETWORK_XML) @XMLResponseParser(NetworkHandler.class) @Fallback(NullOnNotFoundOr404.class) - ListenableFuture findNetworkInOrgVDCNamed( - @Nullable @EndpointParam(parser = OrgNameVDCNameNetworkNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameVDCNameNetworkNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameVDCNameNetworkNameToEndpoint.class) String networkName); + @MapBinder(OrgNameVDCNameResourceEntityNameToEndpoint.class) + ListenableFuture findNetworkInOrgVDCNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("vdcName") String vdcName, @PayloadParam("resourceName") String networkName); /** * @see VCloudClient#getNetwork @@ -264,10 +260,9 @@ public interface TerremarkVCloudAsyncClient { @Consumes(VAPP_XML) @XMLResponseParser(VAppHandler.class) @Fallback(NullOnNotFoundOr404.class) - ListenableFuture findVAppInOrgVDCNamed( - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String vAppName); + @MapBinder(OrgNameVDCNameResourceEntityNameToEndpoint.class) + ListenableFuture findVAppInOrgVDCNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("vdcName") String vdcName, @PayloadParam("resourceName") String vAppName); /** * @see VCloudClient#getVApp @@ -388,9 +383,9 @@ public interface TerremarkVCloudAsyncClient { @XMLResponseParser(VDCHandler.class) @Consumes(VDC_XML) @Fallback(NullOnNotFoundOr404.class) - ListenableFuture findVDCInOrgNamed( - @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName); + @MapBinder(OrgNameAndVDCNameToEndpoint.class) + ListenableFuture findVDCInOrgNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("vdcName") String vdcName); /** * @see TerremarkVCloudClient#instantiateVAppTemplateInVDC diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameAndCatalogNameToEndpoint.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameAndCatalogNameToEndpoint.java similarity index 72% rename from common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameAndCatalogNameToEndpoint.java rename to common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameAndCatalogNameToEndpoint.java index d9b74bea6f..28e21bd9fa 100644 --- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameAndCatalogNameToEndpoint.java +++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameAndCatalogNameToEndpoint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.trmk.vcloud_0_8.functions; +package org.jclouds.trmk.vcloud_0_8.binders; import static com.google.common.base.Preconditions.checkNotNull; @@ -27,11 +27,12 @@ import java.util.NoSuchElementException; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.MapBinder; import org.jclouds.trmk.vcloud_0_8.domain.Org; import org.jclouds.trmk.vcloud_0_8.domain.ReferenceType; import org.jclouds.trmk.vcloud_0_8.endpoints.Catalog; -import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.collect.Iterables; @@ -40,7 +41,7 @@ import com.google.common.collect.Iterables; * @author Adrian Cole */ @Singleton -public class OrgNameAndCatalogNameToEndpoint implements Function { +public class OrgNameAndCatalogNameToEndpoint implements MapBinder { private final Supplier> orgMap; private final Supplier defaultOrg; private final Supplier defaultCatalog; @@ -54,21 +55,26 @@ public class OrgNameAndCatalogNameToEndpoint implements Function { } @SuppressWarnings("unchecked") - public URI apply(Object from) { - Iterable orgCatalog = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgCatalog, 0); - Object catalog = Iterables.get(orgCatalog, 1); + @Override + public R bindToRequest(R request, Map postParams) { + Object org = postParams.get("orgName"); + Object catalog = postParams.get("catalogName"); if (org == null && catalog == null) - return defaultCatalog.get().getHref(); + return (R) request.toBuilder().endpoint(defaultCatalog.get().getHref()).build(); else if (org == null) org = defaultOrg.get().getName(); try { Map catalogs = checkNotNull(orgMap.get().get(org)).getCatalogs(); - return catalog == null ? Iterables.getLast(catalogs.values()).getHref() : catalogs.get(catalog).getHref(); + URI endpoint = catalog == null ? Iterables.getLast(catalogs.values()).getHref() : catalogs.get(catalog).getHref(); + return (R) request.toBuilder().endpoint(endpoint).build(); } catch (NullPointerException e) { throw new NoSuchElementException(org + "/" + catalog + " not found in " + orgMap.get()); } } + @Override + public R bindToRequest(R request, Object input) { + throw new IllegalStateException(getClass() + " needs parameters"); + } } diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameAndVDCNameToEndpoint.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameAndVDCNameToEndpoint.java similarity index 73% rename from common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameAndVDCNameToEndpoint.java rename to common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameAndVDCNameToEndpoint.java index d68b3959cf..aa27c71f2b 100644 --- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameAndVDCNameToEndpoint.java +++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameAndVDCNameToEndpoint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.trmk.vcloud_0_8.functions; +package org.jclouds.trmk.vcloud_0_8.binders; import static com.google.common.base.Preconditions.checkNotNull; @@ -27,11 +27,12 @@ import java.util.NoSuchElementException; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.MapBinder; import org.jclouds.trmk.vcloud_0_8.domain.Org; import org.jclouds.trmk.vcloud_0_8.domain.ReferenceType; import org.jclouds.trmk.vcloud_0_8.endpoints.VDC; -import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.collect.Iterables; @@ -40,7 +41,7 @@ import com.google.common.collect.Iterables; * @author Adrian Cole */ @Singleton -public class OrgNameAndVDCNameToEndpoint implements Function { +public class OrgNameAndVDCNameToEndpoint implements MapBinder { private final Supplier> orgNameToVDCEndpoint; private final Supplier defaultOrg; private final Supplier defaultVDC; @@ -54,21 +55,26 @@ public class OrgNameAndVDCNameToEndpoint implements Function { } @SuppressWarnings("unchecked") - public URI apply(Object from) { - Iterable orgVdc = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgVdc, 0); - Object vdc = Iterables.get(orgVdc, 1); + @Override + public R bindToRequest(R request, Map postParams) { + Object org = postParams.get("orgName"); + Object vdc = postParams.get("vdcName"); if (org == null && vdc == null) - return defaultVDC.get().getHref(); + return (R) request.toBuilder().endpoint(defaultVDC.get().getHref()).build(); else if (org == null) org = defaultOrg.get().getName(); try { Map vdcs = checkNotNull(orgNameToVDCEndpoint.get().get(org)).getVDCs(); - return vdc == null ? Iterables.getLast(vdcs.values()).getHref() : vdcs.get(vdc).getHref(); + URI endpoint = vdc == null ? Iterables.getLast(vdcs.values()).getHref() : vdcs.get(vdc).getHref(); + return (R) request.toBuilder().endpoint(endpoint).build(); } catch (NullPointerException e) { throw new NoSuchElementException(org + "/" + vdc + " not found in " + orgNameToVDCEndpoint.get()); } } + @Override + public R bindToRequest(R request, Object input) { + throw new IllegalStateException(getClass() + " needs parameters"); + } } diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameCatalogNameItemNameToEndpoint.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameCatalogNameItemNameToEndpoint.java similarity index 76% rename from common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameCatalogNameItemNameToEndpoint.java rename to common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameCatalogNameItemNameToEndpoint.java index 671e4bdeb3..64cbc4f77a 100644 --- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameCatalogNameItemNameToEndpoint.java +++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameCatalogNameItemNameToEndpoint.java @@ -16,31 +16,30 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.trmk.vcloud_0_8.functions; +package org.jclouds.trmk.vcloud_0_8.binders; import static com.google.common.base.Preconditions.checkNotNull; -import java.net.URI; import java.util.Map; import java.util.NoSuchElementException; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.MapBinder; import org.jclouds.trmk.vcloud_0_8.domain.ReferenceType; import org.jclouds.trmk.vcloud_0_8.endpoints.Catalog; import org.jclouds.trmk.vcloud_0_8.endpoints.Org; -import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; /** * * @author Adrian Cole */ @Singleton -public class OrgNameCatalogNameItemNameToEndpoint implements Function { +public class OrgNameCatalogNameItemNameToEndpoint implements MapBinder { private final Supplier>> orgCatalogMap; private final Supplier defaultOrg; private final Supplier defaultCatalog; @@ -55,22 +54,26 @@ public class OrgNameCatalogNameItemNameToEndpoint implements Function orgCatalog = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgCatalog, 0); - Object catalog = Iterables.get(orgCatalog, 1); - Object catalogItem = Iterables.get(orgCatalog, 2); + @Override + public R bindToRequest(R request, Map postParams) { + Object org = postParams.get("orgName"); + Object catalog = postParams.get("catalogName"); + Object catalogItem = postParams.get("itemName"); if (org == null) org = defaultOrg.get().getName(); if (catalog == null) catalog = defaultCatalog.get().getName(); try { Map catalogs = checkNotNull(orgCatalogMap.get().get(org)); - return catalogs.get(catalog).get(catalogItem).getHref(); + return (R) request.toBuilder().endpoint(catalogs.get(catalog).get(catalogItem).getHref()).build(); } catch (NullPointerException e) { throw new NoSuchElementException(org + "/" + catalog + "/" + catalogItem + " not found in " + orgCatalogMap.get()); } } + @Override + public R bindToRequest(R request, Object input) { + throw new IllegalStateException(getClass() + " needs parameters"); + } } diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameCatalogNameVAppTemplateNameToEndpoint.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameCatalogNameVAppTemplateNameToEndpoint.java similarity index 80% rename from common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameCatalogNameVAppTemplateNameToEndpoint.java rename to common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameCatalogNameVAppTemplateNameToEndpoint.java index 7d9d4f0448..133d174f30 100644 --- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameCatalogNameVAppTemplateNameToEndpoint.java +++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameCatalogNameVAppTemplateNameToEndpoint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.trmk.vcloud_0_8.functions; +package org.jclouds.trmk.vcloud_0_8.binders; import static com.google.common.base.Preconditions.checkNotNull; @@ -27,21 +27,21 @@ import java.util.NoSuchElementException; import javax.inject.Inject; import javax.inject.Singleton; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.MapBinder; import org.jclouds.trmk.vcloud_0_8.domain.CatalogItem; import org.jclouds.trmk.vcloud_0_8.domain.ReferenceType; import org.jclouds.trmk.vcloud_0_8.endpoints.Catalog; import org.jclouds.trmk.vcloud_0_8.endpoints.Org; -import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; /** * * @author Adrian Cole */ @Singleton -public class OrgNameCatalogNameVAppTemplateNameToEndpoint implements Function { +public class OrgNameCatalogNameVAppTemplateNameToEndpoint implements MapBinder { private final Supplier>>> orgCatalogItemMap; private final Supplier defaultOrg; private final Supplier defaultCatalog; @@ -56,11 +56,11 @@ public class OrgNameCatalogNameVAppTemplateNameToEndpoint implements Function orgCatalog = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgCatalog, 0); - Object catalog = Iterables.get(orgCatalog, 1); - Object catalogItem = Iterables.get(orgCatalog, 2); + @Override + public R bindToRequest(R request, Map postParams) { + Object org = postParams.get("orgName"); + Object catalog = postParams.get("catalogName"); + Object catalogItem = postParams.get("itemName"); if (org == null) org = defaultOrg.get().getName(); if (catalog == null) @@ -80,8 +80,13 @@ public class OrgNameCatalogNameVAppTemplateNameToEndpoint implements Function R bindToRequest(R request, Object input) { + throw new IllegalStateException(getClass() + " needs parameters"); + } } diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameVDCNameNetworkNameToEndpoint.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameVDCNameNetworkNameToEndpoint.java similarity index 97% rename from common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameVDCNameNetworkNameToEndpoint.java rename to common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameVDCNameNetworkNameToEndpoint.java index 7021ca2447..0472dec62f 100644 --- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameVDCNameNetworkNameToEndpoint.java +++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameVDCNameNetworkNameToEndpoint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.trmk.vcloud_0_8.functions; +package org.jclouds.trmk.vcloud_0_8.binders; import java.net.URI; import java.util.Map; diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameVDCNameResourceEntityNameToEndpoint.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameVDCNameResourceEntityNameToEndpoint.java similarity index 97% rename from common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameVDCNameResourceEntityNameToEndpoint.java rename to common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameVDCNameResourceEntityNameToEndpoint.java index d6d621a2b6..71556d73b6 100644 --- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameVDCNameResourceEntityNameToEndpoint.java +++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameVDCNameResourceEntityNameToEndpoint.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.trmk.vcloud_0_8.functions; +package org.jclouds.trmk.vcloud_0_8.binders; import java.net.URI; import java.util.Map; diff --git a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameVDCNameResourceNameToEndpoint.java b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameVDCNameResourceNameToEndpoint.java similarity index 78% rename from common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameVDCNameResourceNameToEndpoint.java rename to common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameVDCNameResourceNameToEndpoint.java index d75a0ed2e8..38fe2f6278 100644 --- a/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/functions/OrgNameVDCNameResourceNameToEndpoint.java +++ b/common/trmk/src/main/java/org/jclouds/trmk/vcloud_0_8/binders/OrgNameVDCNameResourceNameToEndpoint.java @@ -16,9 +16,8 @@ * specific language governing permissions and limitations * under the License. */ -package org.jclouds.trmk.vcloud_0_8.functions; +package org.jclouds.trmk.vcloud_0_8.binders; -import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import java.net.URI; @@ -27,18 +26,18 @@ import java.util.NoSuchElementException; import javax.inject.Inject; +import org.jclouds.http.HttpRequest; +import org.jclouds.rest.MapBinder; import org.jclouds.trmk.vcloud_0_8.domain.ReferenceType; import org.jclouds.trmk.vcloud_0_8.domain.VDC; import org.jclouds.trmk.vcloud_0_8.endpoints.Org; -import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.collect.Iterables; /** * * @author Adrian Cole */ -public abstract class OrgNameVDCNameResourceNameToEndpoint implements Function{ +public abstract class OrgNameVDCNameResourceNameToEndpoint implements MapBinder { protected final Supplier>> orgVDCMap; protected final Supplier defaultOrg; @@ -54,11 +53,11 @@ public abstract class OrgNameVDCNameResourceNameToEndpoint implements Function< } @SuppressWarnings("unchecked") - public URI apply(Object from) { - Iterable orgVDC = (Iterable) checkNotNull(from, "args"); - Object org = Iterables.get(orgVDC, 0); - Object vDC = Iterables.get(orgVDC, 1); - Object resource = Iterables.get(orgVDC, 2); + @Override + public R bindToRequest(R request, Map postParams) { + Object org = postParams.get("orgName"); + Object vDC = postParams.get("vdcName"); + Object resource = postParams.get("resourceName"); if (org == null) org = defaultOrg.get().getName(); if (vDC == null) @@ -71,9 +70,14 @@ public abstract class OrgNameVDCNameResourceNameToEndpoint implements Function< org.jclouds.trmk.vcloud_0_8.domain.VDC vDCObject = vDCs.get(vDC); if (vDCObject == null) throw new NoSuchElementException("vdc " + vDC + " in org " + org + " not found in " + vDCs.keySet()); - return getEndpointOfResourceInVDC(org, vDC, resource, vDCObject); + URI endpoint = getEndpointOfResourceInVDC(org, vDC, resource, vDCObject); + return (R) request.toBuilder().endpoint(endpoint).build(); } protected abstract URI getEndpointOfResourceInVDC(Object org, Object vDC, Object resource, VDC vDCObject); + @Override + public R bindToRequest(R request, Object input) { + throw new IllegalStateException(getClass() + " needs parameters"); + } } diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/TerremarkECloudAsyncClient.java b/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/TerremarkECloudAsyncClient.java index 80b6243fb8..cb7aaa11a0 100644 --- a/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/TerremarkECloudAsyncClient.java +++ b/providers/trmk-ecloud/src/main/java/org/jclouds/trmk/ecloud/TerremarkECloudAsyncClient.java @@ -55,6 +55,7 @@ import org.jclouds.trmk.ecloud.features.TagOperationsAsyncClient; import org.jclouds.trmk.ecloud.xml.ECloudOrgHandler; import org.jclouds.trmk.vcloud_0_8.TerremarkVCloudAsyncClient; import org.jclouds.trmk.vcloud_0_8.binders.BindCreateKeyToXmlPayload; +import org.jclouds.trmk.vcloud_0_8.binders.OrgNameVDCNameNetworkNameToEndpoint; import org.jclouds.trmk.vcloud_0_8.domain.InternetService; import org.jclouds.trmk.vcloud_0_8.domain.IpAddress; import org.jclouds.trmk.vcloud_0_8.domain.KeyPair; @@ -65,8 +66,6 @@ import org.jclouds.trmk.vcloud_0_8.domain.PublicIpAddress; import org.jclouds.trmk.vcloud_0_8.domain.VAppExtendedInfo; import org.jclouds.trmk.vcloud_0_8.filters.SetVCloudTokenCookie; import org.jclouds.trmk.vcloud_0_8.functions.OrgNameToEndpoint; -import org.jclouds.trmk.vcloud_0_8.functions.OrgNameVDCNameNetworkNameToEndpoint; -import org.jclouds.trmk.vcloud_0_8.functions.OrgNameVDCNameResourceEntityNameToEndpoint; import org.jclouds.trmk.vcloud_0_8.functions.OrgURIToKeysListEndpoint; import org.jclouds.trmk.vcloud_0_8.functions.VDCURIToInternetServicesEndpoint; import org.jclouds.trmk.vcloud_0_8.functions.VDCURIToPublicIPsEndpoint; @@ -230,21 +229,6 @@ public interface TerremarkECloudAsyncClient extends TerremarkVCloudAsyncClient { @Fallback(NullOnNotFoundOr404.class) ListenableFuture getKeyPair(@EndpointParam URI keyId); - // TODO - // /** - // * @see TerremarkVCloudClient#configureKeyPair - // */ - // @PUT - // @Endpoint(org.jclouds.vcloud.endpoints.VCloudApi.class) - // @Path("/extensions/key/{keyId}") - // @Produces(APPLICATION_XML) - // @Consumes(APPLICATION_XML) - // @XMLResponseParser(KeyPairHandler.class) - // ListenableFuture configureKeyPair( - // @PathParam("keyId") int keyId, - // @BinderParam(BindKeyPairConfigurationToXmlPayload.class) - // KeyPairConfiguration keyConfiguration); - /** * @see TerremarkECloudClient#deleteKeyPair */ @@ -260,10 +244,9 @@ public interface TerremarkECloudAsyncClient extends TerremarkVCloudAsyncClient { @Consumes(NETWORK_XML) @XMLResponseParser(NetworkHandler.class) @Fallback(NullOnNotFoundOr404.class) - ListenableFuture findNetworkInOrgVDCNamed( - @Nullable @EndpointParam(parser = OrgNameVDCNameNetworkNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameVDCNameNetworkNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String networkName); + @MapBinder(OrgNameVDCNameNetworkNameToEndpoint.class) + ListenableFuture findNetworkInOrgVDCNamed(@Nullable @PayloadParam("orgName") String orgName, + @Nullable @PayloadParam("vdcName") String vdcName, @PayloadParam("resourceName") String networkName); /** * @see TerremarkECloudClient#getNetwork