cleaner impl of LocationPredicate, which doesn't eagerly fetch current location on toString()

This commit is contained in:
Adrian Cole 2012-03-20 09:34:26 -07:00
parent e4197bec8f
commit 684210d8d8
2 changed files with 32 additions and 18 deletions

View File

@ -17,7 +17,10 @@
* under the License.
*/
package org.jclouds.compute.domain.internal;
import static com.google.common.base.Preconditions.*;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.base.Predicates.equalTo;
import static com.google.common.base.Predicates.or;
import org.jclouds.compute.domain.ComputeMetadata;
import org.jclouds.domain.Location;
@ -25,6 +28,8 @@ import org.jclouds.domain.LocationScope;
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;
/**
* If the current location id is null, then we don't care where to launch a node.
@ -42,33 +47,43 @@ public class LocationPredicate implements Predicate<ComputeMetadata> {
@Override
public boolean apply(ComputeMetadata input) {
Location location = locationSupplier.get();
if (location == null)
Location current = locationSupplier.get();
if (current == null)
return true;
if (location.equals(input.getLocation()))
return true;
checkArgument(
location.getParent() != null || location.getScope() == LocationScope.PROVIDER,
"only locations of scope PROVIDER can have a null parent; arg: %s",
location);
if (input.getLocation() == null)
return true;
Location parent = current.getParent();
checkArgument(
parent != null || current.getScope() == LocationScope.PROVIDER,
"only locations of scope PROVIDER can have a null parent; arg: %s",
current);
checkState(
input.getLocation().getParent() != null || input.getLocation().getScope() == LocationScope.PROVIDER,
"only locations of scope PROVIDER can have a null parent; input: %s",
input.getLocation());
Builder<Predicate<Location>> predicates = ImmutableSet.<Predicate<Location>>builder();
predicates.add(equalTo(current));
return location.equals(input.getLocation()) || location.getParent() != null
&& location.getParent().equals(input.getLocation()) || location.getParent().getParent() != null
&& location.getParent().getParent().equals(input.getLocation());
if (parent != null) {
predicates.add(equalTo(parent));
Location grandparent = parent.getParent();
if (grandparent != null)
predicates.add(equalTo(grandparent));
}
return or(predicates.build()).apply(input.getLocation());
}
@Override
public String toString() {
return locationSupplier.get() == null ? "anyLocation()" : "locationEqualsParentOrGrandparentOf(" + locationSupplier.get().getId() + ")";
// not calling .get() here, as it could accidentally cause eager api fetch
return "equalsParentOrGrandparentOfCurrentLocation()";
}
}

View File

@ -627,7 +627,7 @@ public class TemplateBuilderImplTest {
@SuppressWarnings("unchecked")
@Test
public void testDefaultLocationWithUnmatchedPredicateExceptionMessage() {
public void testDefaultLocationWithUnmatchedPredicateExceptionMessageAndLocationNotCalled() {
Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
.<Location> of());
Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet.<Image> of());
@ -639,7 +639,6 @@ public class TemplateBuilderImplTest {
TemplateOptions defaultOptions = createMock(TemplateOptions.class);
expect(optionsProvider.get()).andReturn(defaultOptions);
expect(defaultLocation.getId()).andReturn("us-east-1");
replay(defaultOptions);
replay(defaultLocation);
@ -654,7 +653,7 @@ public class TemplateBuilderImplTest {
assert false;
} catch (NoSuchElementException e) {
// make sure big data is not in the exception message
assertEquals(e.getMessage(), "no image matched predicate: And(locationEqualsParentOrGrandparentOf(us-east-1),imageDescription(description))");
assertEquals(e.getMessage(), "no image matched predicate: And(equalsParentOrGrandparentOfCurrentLocation(),imageDescription(description))");
}
verify(defaultOptions);