diff --git a/apis/vcloud/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java b/apis/vcloud/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java index e88de13ae4..afbf7b3b7d 100644 --- a/apis/vcloud/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java +++ b/apis/vcloud/src/test/java/org/jclouds/vcloud/VCloudAsyncClientTest.java @@ -355,7 +355,7 @@ public class VCloudAsyncClientTest extends BaseVCloudAsyncClientTest findNetworkInOrgVDCNamed( - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String orgName, - @Nullable @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String catalogName, - @EndpointParam(parser = OrgNameVDCNameResourceEntityNameToEndpoint.class) String networkName); + @Nullable @EndpointParam(parser = OrgNameVDCNameNetworkNameToEndpoint.class) String orgName, + @Nullable @EndpointParam(parser = OrgNameVDCNameNetworkNameToEndpoint.class) String catalogName, + @EndpointParam(parser = OrgNameVDCNameNetworkNameToEndpoint.class) String networkName); /** * @see CommonVCloudClient#getNetwork diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameNetworkNameToEndpoint.java b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameNetworkNameToEndpoint.java new file mode 100644 index 0000000000..281cc957f0 --- /dev/null +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameNetworkNameToEndpoint.java @@ -0,0 +1,56 @@ +/** + * + * Copyright (C) 2011 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.functions; + +import java.net.URI; +import java.util.Map; +import java.util.NoSuchElementException; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.vcloud.domain.ReferenceType; +import org.jclouds.vcloud.endpoints.Org; +import org.jclouds.vcloud.endpoints.VDC; + +import com.google.common.base.Supplier; + +/** + * + * @author Adrian Cole + */ +@Singleton +public class OrgNameVDCNameNetworkNameToEndpoint extends OrgNameVDCNameResourceNameToEndpoint { + @Inject + public OrgNameVDCNameNetworkNameToEndpoint( + Supplier>> orgVDCMap, + @Org ReferenceType defaultOrg, @VDC ReferenceType defaultVDC) { + super(orgVDCMap, defaultOrg, defaultVDC); + } + + protected URI getEndpointOfResourceInVDC(Object org, Object vDC, Object resource, + org.jclouds.vcloud.domain.VDC vDCObject) { + ReferenceType resourceEntity = vDCObject.getAvailableNetworks().get(resource); + if (resourceEntity == null) + throw new NoSuchElementException("network " + resource + " in vdc " + vDC + ", org " + org + " not found in " + + vDCObject.getAvailableNetworks().keySet()); + return resourceEntity.getHref(); + } + +} \ No newline at end of file diff --git a/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceNameToEndpoint.java b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceNameToEndpoint.java new file mode 100644 index 0000000000..c3f21b8e17 --- /dev/null +++ b/common/vcloud/src/main/java/org/jclouds/vcloud/functions/OrgNameVDCNameResourceNameToEndpoint.java @@ -0,0 +1,79 @@ +/** + * + * Copyright (C) 2011 Cloud Conscious, LLC. + * + * ==================================================================== + * Licensed 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.functions; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + +import java.net.URI; +import java.util.Map; +import java.util.NoSuchElementException; + +import javax.inject.Inject; + +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{ + + protected final Supplier>> orgVDCMap; + protected final ReferenceType defaultOrg; + protected final ReferenceType defaultVDC; + + @Inject + public OrgNameVDCNameResourceNameToEndpoint( + Supplier>> orgVDCMap, + @Org ReferenceType defaultOrg, @org.jclouds.vcloud.endpoints.VDC ReferenceType defaultVDC) { + this.orgVDCMap = orgVDCMap; + this.defaultOrg = defaultOrg; + this.defaultVDC = defaultVDC; + } + + @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); + if (org == null) + org = defaultOrg.getName(); + if (vDC == null) + vDC = defaultVDC.getName(); + Map> orgToVDCs = orgVDCMap.get(); + checkState(orgToVDCs != null, "could not get map of org name to vdcs!"); + Map vDCs = orgToVDCs.get(org); + if (vDCs == null) + throw new NoSuchElementException("org " + org + " not found in " + orgToVDCs.keySet()); + 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); + } + + protected abstract URI getEndpointOfResourceInVDC(Object org, Object vDC, Object resource, VDC vDCObject); + +} \ No newline at end of file