diff --git a/core/src/main/java/org/jclouds/location/suppliers/implicit/FirstNetwork.java b/core/src/main/java/org/jclouds/location/suppliers/implicit/FirstNetwork.java new file mode 100644 index 0000000000..f78c944648 --- /dev/null +++ b/core/src/main/java/org/jclouds/location/suppliers/implicit/FirstNetwork.java @@ -0,0 +1,67 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.location.suppliers.implicit; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.collect.Iterables.find; +import static com.google.common.collect.Iterables.transform; +import static org.jclouds.location.predicates.LocationPredicates.isNetwork; + +import java.util.NoSuchElementException; +import java.util.Set; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import org.jclouds.collect.Memoized; +import org.jclouds.domain.Location; +import org.jclouds.location.functions.ToIdAndScope; +import org.jclouds.location.suppliers.ImplicitLocationSupplier; + +import com.google.common.base.Supplier; + +/** + * + * @author Dies Koper + * + */ +@Singleton +public class FirstNetwork implements ImplicitLocationSupplier { + + private final Supplier> locationsSupplier; + + @Inject + FirstNetwork(@Memoized Supplier> locationsSupplier) { + this.locationsSupplier = checkNotNull(locationsSupplier, + "locationsSupplierSupplier"); + } + + @Override + public Location get() { + Set locations = locationsSupplier.get(); + try { + return find(locations, isNetwork()); + } catch (NoSuchElementException e) { + throw new NoSuchElementException( + "none of the locations are scope NETWORK: " + + transform(locations, ToIdAndScope.INSTANCE)); + } + } + +} \ No newline at end of file diff --git a/core/src/test/java/org/jclouds/location/suppliers/implicit/FirstNetworkTest.java b/core/src/test/java/org/jclouds/location/suppliers/implicit/FirstNetworkTest.java new file mode 100644 index 0000000000..520ade127b --- /dev/null +++ b/core/src/test/java/org/jclouds/location/suppliers/implicit/FirstNetworkTest.java @@ -0,0 +1,71 @@ +/** + * Licensed to jclouds, Inc. (jclouds) under one or more + * contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. jclouds 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.location.suppliers.implicit; + +import static org.testng.Assert.assertEquals; + +import java.util.NoSuchElementException; +import java.util.Set; + +import org.jclouds.domain.Location; +import org.jclouds.domain.LocationBuilder; +import org.jclouds.domain.LocationScope; +import org.testng.annotations.Test; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; +import com.google.common.collect.ImmutableSet; + +/** + * Tests behavior of {@code FirstNetwork} + * + * @author Adrian Cole + * @author Dies Koper + */ +@Test(groups = "unit", testName = "FirstNetworkTest") +public class FirstNetworkTest { + Location provider = new LocationBuilder().scope(LocationScope.PROVIDER).id("servo").description("http://servo") + .build(); + Location region = new LocationBuilder().scope(LocationScope.REGION).id("servo-r").description("http://r.servo") + .parent(provider).build(); + Location network = new LocationBuilder().scope(LocationScope.NETWORK).id("servo-n").description("http://z.r.servo") + .parent(region).build(); + + @Test + public void testDidntFindNetworkThrowsNSEEWithReasonableMessage() { + Supplier> supplier = Suppliers.> ofInstance(ImmutableSet + . of(provider, region)); + FirstNetwork fn = new FirstNetwork(supplier); + + try { + fn.get(); + assert false; + } catch (NoSuchElementException e) { + assertEquals(e.getMessage(), "none of the locations are scope NETWORK: [servo:PROVIDER, servo-r:REGION]"); + } + } + + @Test + public void testFirstNetwork() { + Supplier> supplier = Suppliers.> ofInstance(ImmutableSet + . of(provider, region, network)); + FirstNetwork fn = new FirstNetwork(supplier); + assertEquals(fn.get(), network); + } +}