/* * 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.apache.brooklyn.core.location; import javax.annotation.Nullable; import org.apache.brooklyn.api.location.Location; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.config.ConfigKey.HasConfigKey; import org.apache.brooklyn.util.guava.SerializablePredicate; import com.google.common.base.Objects; import com.google.common.base.Predicate; import com.google.common.base.Predicates; @SuppressWarnings("serial") public class LocationPredicates { /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static <T> Predicate<Location> idEqualToOld(final T val) { // TODO PERSISTENCE WORKAROUND return new Predicate<Location>() { @Override public boolean apply(@Nullable Location input) { return (input != null) && Objects.equal(input.getId(), val); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static <T> Predicate<Location> displayNameEqualToOld(final T val) { // TODO PERSISTENCE WORKAROUND return new Predicate<Location>() { @Override public boolean apply(@Nullable Location input) { return (input != null) && Objects.equal(input.getDisplayName(), val); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static <T> Predicate<Location> configEqualToOld(final ConfigKey<T> configKey, final T val) { // TODO PERSISTENCE WORKAROUND return new Predicate<Location>() { @Override public boolean apply(@Nullable Location input) { return (input != null) && Objects.equal(input.getConfig(configKey), val); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static <T> Predicate<Location> configEqualToOld(final HasConfigKey<T> configKey, final T val) { // TODO PERSISTENCE WORKAROUND return new Predicate<Location>() { @Override public boolean apply(@Nullable Location input) { return (input != null) && Objects.equal(input.getConfig(configKey), val); } }; } /** * Returns a predicate that determines if a given location is a direct child of this {@code parent}. */ /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static <T> Predicate<Location> isChildOfOld(final Location parent) { // TODO PERSISTENCE WORKAROUND return new Predicate<Location>() { @Override public boolean apply(@Nullable Location input) { return (input != null) && Objects.equal(input.getParent(), parent); } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static <T> Predicate<Location> isDescendantOfOld(final Location ancestor) { // TODO PERSISTENCE WORKAROUND return new Predicate<Location>() { @Override public boolean apply(@Nullable Location input) { // assumes impossible to have cycles in location-hierarchy Location contenderAncestor = (input == null) ? input : input.getParent(); while (contenderAncestor != null) { if (Objects.equal(contenderAncestor, ancestor)) { return true; } contenderAncestor = contenderAncestor.getParent(); } return false; } }; } /** @deprecated since 0.9.0 kept only to allow conversion of anonymous inner classes */ @SuppressWarnings("unused") @Deprecated private static <T> Predicate<Location> managedOld() { // TODO PERSISTENCE WORKAROUND return new Predicate<Location>() { @Override public boolean apply(@Nullable Location input) { return (input != null) && Locations.isManaged(input); } }; } public static Predicate<Location> idEqualTo(final String val) { return idSatisfies(Predicates.equalTo(val)); } public static Predicate<Location> idSatisfies(final Predicate<? super String> condition) { return new IdSatisfies(condition); } protected static class IdSatisfies implements SerializablePredicate<Location> { protected final Predicate<? super String> condition; protected IdSatisfies(Predicate<? super String> condition) { this.condition = condition; } @Override public boolean apply(@Nullable Location input) { return (input != null) && condition.apply(input.getId()); } @Override public String toString() { return "idSatisfies("+condition+")"; } } public static Predicate<Location> displayNameEqualTo(final String val) { return displayNameSatisfies(Predicates.equalTo(val)); } public static Predicate<Location> displayNameSatisfies(final Predicate<? super String> condition) { return new DisplayNameSatisfies(condition); } protected static class DisplayNameSatisfies implements SerializablePredicate<Location> { protected final Predicate<? super String> condition; protected DisplayNameSatisfies(Predicate<? super String> condition) { this.condition = condition; } @Override public boolean apply(@Nullable Location input) { return (input != null) && condition.apply(input.getDisplayName()); } @Override public String toString() { return "displayNameSatisfies("+condition+")"; } } public static <T> Predicate<Location> configEqualTo(final ConfigKey<T> configKey, final T val) { return configSatisfies(configKey, Predicates.equalTo(val)); } public static <T> Predicate<Location> configSatisfies(final ConfigKey<T> configKey, final Predicate<T> condition) { return new ConfigKeySatisfies<T>(configKey, condition); } public static <T> Predicate<Location> configEqualTo(final HasConfigKey<T> configKey, final T val) { return configEqualTo(configKey.getConfigKey(), val); } public static <T> Predicate<Location> configSatisfies(final HasConfigKey<T> configKey, final Predicate<T> condition) { return new ConfigKeySatisfies<T>(configKey.getConfigKey(), condition); } protected static class ConfigKeySatisfies<T> implements SerializablePredicate<Location> { protected final ConfigKey<T> configKey; protected final Predicate<T> condition; private ConfigKeySatisfies(ConfigKey<T> configKey, Predicate<T> condition) { this.configKey = configKey; this.condition = condition; } @Override public boolean apply(@Nullable Location input) { return (input != null) && condition.apply(input.getConfig(configKey)); } @Override public String toString() { return "configKeySatisfies("+configKey.getName()+","+condition+")"; } } /** * Returns a predicate that determines if a given location is a direct child of this {@code parent}. */ public static Predicate<Location> isChildOf(final Location parent) { return new IsChildOf(parent); } // if needed, could add parentSatisfies(...) protected static class IsChildOf implements SerializablePredicate<Location> { protected final Location parent; protected IsChildOf(Location parent) { this.parent = parent; } @Override public boolean apply(@Nullable Location input) { return (input != null) && Objects.equal(input.getParent(), parent); } @Override public String toString() { return "isChildOf("+parent+")"; } } /** * Returns a predicate that determines if a given location is a descendant of this {@code ancestor}. */ public static <T> Predicate<Location> isDescendantOf(final Location ancestor) { return new IsDescendantOf(ancestor); } protected static class IsDescendantOf implements SerializablePredicate<Location> { protected final Location ancestor; protected IsDescendantOf(Location ancestor) { this.ancestor = ancestor; } @Override public boolean apply(@Nullable Location input) { // assumes impossible to have cycles in location-hierarchy Location contenderAncestor = (input == null) ? input : input.getParent(); while (contenderAncestor != null) { if (Objects.equal(contenderAncestor, ancestor)) { return true; } contenderAncestor = contenderAncestor.getParent(); } return false; } } public static <T> Predicate<Location> managed() { return IsManaged.INSTANCE; } protected static class IsManaged implements Predicate<Location> { protected static final IsManaged INSTANCE = new IsManaged(); @Override public boolean apply(@Nullable Location input) { return (input != null) && Locations.isManaged(input); } } }