blob: 41f016c49d5ea7fc496c7f918c33a187ad98d163 [file] [log] [blame]
/*
* 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.entity;
import java.util.Collection;
import java.util.regex.Pattern;
import javax.annotation.Nullable;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.entity.Group;
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.api.sensor.AttributeSensor;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.config.ConfigKey.HasConfigKey;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.apache.brooklyn.core.sensor.Sensors;
import org.apache.brooklyn.util.collections.CollectionFunctionals;
import org.apache.brooklyn.util.guava.SerializablePredicate;
import org.apache.brooklyn.util.javalang.Reflections;
import org.apache.brooklyn.util.text.StringPredicates;
import com.google.common.base.Objects;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
@SuppressWarnings("serial")
public class EntityPredicates {
public static Predicate<Entity> idEqualTo(final String val) {
return idSatisfies(Predicates.equalTo(val));
}
public static Predicate<Entity> idSatisfies(final Predicate<? super String> condition) {
return new IdSatisfies(condition);
}
protected static class IdSatisfies implements SerializablePredicate<Entity> {
protected final Predicate<? super String> condition;
protected IdSatisfies(Predicate<? super String> condition) {
this.condition = condition;
}
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && condition.apply(input.getId());
}
@Override
public String toString() {
return "idSatisfies("+condition+")";
}
}
/** @deprecated since 0.7.0 kept only to allow conversion of anonymous inner classes */
@SuppressWarnings("unused") @Deprecated
private static <T> Predicate<Entity> idEqualToOld(final T val) {
return new SerializablePredicate<Entity>() {
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && Objects.equal(input.getId(), val);
}
};
}
// ---------------------------
public static Predicate<Entity> displayNameEqualTo(final String val) {
return displayNameSatisfies(Predicates.equalTo(val));
}
public static Predicate<Entity> displayNameSatisfies(final Predicate<? super String> condition) {
return new DisplayNameSatisfies(condition);
}
protected static class DisplayNameSatisfies implements SerializablePredicate<Entity> {
protected final Predicate<? super String> condition;
protected DisplayNameSatisfies(Predicate<? super String> condition) {
this.condition = condition;
}
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && condition.apply(input.getDisplayName());
}
@Override
public String toString() {
return "displayNameSatisfies("+condition+")";
}
}
/** @deprecated since 0.7.0 kept only to allow conversion of anonymous inner classes */
@SuppressWarnings("unused") @Deprecated
private static <T> Predicate<Entity> displayNameEqualToOld(final T val) {
return new SerializablePredicate<Entity>() {
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && Objects.equal(input.getDisplayName(), val);
}
};
}
/** @deprecated since 0.7.0 use {@link #displayNameSatisfies(Predicate)} to clarify this is *regex* matching
* (passing {@link StringPredicates#matchesRegex(String)} as the predicate) */
public static Predicate<Entity> displayNameMatches(final String regex) {
return displayNameSatisfies(StringPredicates.matchesRegex(regex));
}
/** @deprecated since 0.7.0 kept only to allow conversion of anonymous inner classes */
@SuppressWarnings("unused") @Deprecated
private static class DisplayNameMatches implements SerializablePredicate<Entity> {
private final String regex;
DisplayNameMatches(String regex) {
this.regex = regex;
}
@Override
public boolean apply(@Nullable Entity input) {
return (input != null && input.getDisplayName() != null) && input.getDisplayName().matches(regex);
}
@Override
public String toString() {
return "DisplayNameMatches("+regex+")";
}
};
// ---------------------------
public static Predicate<Entity> applicationIdEqualTo(final String val) {
return applicationIdSatisfies(Predicates.equalTo(val));
}
public static Predicate<Entity> applicationIdSatisfies(final Predicate<? super String> condition) {
return new ApplicationIdSatisfies(condition);
}
protected static class ApplicationIdSatisfies implements SerializablePredicate<Entity> {
protected final Predicate<? super String> condition;
protected ApplicationIdSatisfies(Predicate<? super String> condition) {
this.condition = condition;
}
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && condition.apply(input.getApplicationId());
}
@Override
public String toString() {
return "applicationIdSatisfies("+condition+")";
}
}
/** @deprecated since 0.7.0 kept only to allow conversion of anonymous inner classes */
@SuppressWarnings("unused") @Deprecated
private static Predicate<Entity> applicationIdEqualToOld(final String val) {
return new SerializablePredicate<Entity>() {
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && val.equals(input.getApplicationId());
}
};
}
// ---------------------------
public static Predicate<Entity> attributeNotNull(final String attributeName) {
return attributeSatisfies(attributeName, Predicates.notNull());
}
public static <T> Predicate<Entity> attributeNotNull(final AttributeSensor<T> attribute) {
return attributeSatisfies(attribute, Predicates.<T>notNull());
}
public static Predicate<Entity> attributeEqualTo(final String attributeName, final Object val) {
return attributeSatisfies(attributeName, Predicates.equalTo(val));
}
public static <T> Predicate<Entity> attributeEqualTo(final AttributeSensor<T> attribute, final T val) {
return attributeSatisfies(attribute, Predicates.equalTo(val));
}
public static <T> Predicate<Entity> attributeNotEqualTo(final String attributeName, final Object val) {
return attributeSatisfies(attributeName, Predicates.not(Predicates.equalTo(val)));
}
public static <T> Predicate<Entity> attributeNotEqualTo(final AttributeSensor<T> attribute, final T val) {
return attributeSatisfies(attribute, Predicates.not(Predicates.equalTo(val)));
}
public static Predicate<Entity> attributeSatisfies(final String attributeName, final Predicate<Object> condition) {
return new AttributeSatisfies<Object>(Sensors.newSensor(Object.class, attributeName), condition);
}
public static <T> Predicate<Entity> attributeSatisfies(final AttributeSensor<T> attribute, final Predicate<T> condition) {
return new AttributeSatisfies<T>(attribute, condition);
}
protected static class AttributeSatisfies<T> implements SerializablePredicate<Entity> {
protected final AttributeSensor<T> attribute;
protected final Predicate<T> condition;
private AttributeSatisfies(AttributeSensor<T> attribute, Predicate<T> condition) {
this.attribute = attribute;
this.condition = condition;
}
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && condition.apply(input.getAttribute(attribute));
}
@Override
public String toString() {
return "attributeSatisfies("+attribute.getName()+","+condition+")";
}
}
/** @deprecated since 0.7.0 kept only to allow conversion of anonymous inner classes */
@SuppressWarnings("unused") @Deprecated
private static <T> Predicate<Entity> attributeEqualToOld(final AttributeSensor<T> attribute, final T val) {
return new SerializablePredicate<Entity>() {
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && Objects.equal(input.getAttribute(attribute), val);
}
};
}
// ---------------------------
public static <T> Predicate<Entity> configNotNull(final String configKeyName) {
return configSatisfies(configKeyName, Predicates.notNull());
}
public static <T> Predicate<Entity> configNotNull(final ConfigKey<T> configKey) {
return configSatisfies(configKey, Predicates.<T>notNull());
}
public static <T> Predicate<Entity> configNotNull(final HasConfigKey<T> configKey) {
return configNotNull(configKey.getConfigKey());
}
public static <T> Predicate<Entity> configEqualTo(final String configKeyName, final Object val) {
return configSatisfies(configKeyName, Predicates.equalTo(val));
}
public static <T> Predicate<Entity> configEqualTo(final ConfigKey<T> configKey, final T val) {
return configSatisfies(configKey, Predicates.equalTo(val));
}
public static <T> Predicate<Entity> configEqualTo(final HasConfigKey<T> configKey, final T val) {
return configEqualTo(configKey.getConfigKey(), val);
}
public static <T> Predicate<Entity> configNotEqualTo(final String configKeyName, final Object val) {
return configSatisfies(configKeyName, Predicates.not(Predicates.equalTo(val)));
}
public static <T> Predicate<Entity> configNotEqualTo(final ConfigKey<T> configKey, final T val) {
return configSatisfies(configKey, Predicates.not(Predicates.equalTo(val)));
}
public static <T> Predicate<Entity> configNotEqualTo(final HasConfigKey<T> configKey, final T val) {
return configNotEqualTo(configKey.getConfigKey(), val);
}
public static Predicate<Entity> configSatisfies(final String configKeyName, final Predicate<Object> condition) {
return new ConfigKeySatisfies<Object>(ConfigKeys.newConfigKey(Object.class, configKeyName), condition);
}
public static <T> Predicate<Entity> configSatisfies(final ConfigKey<T> configKey, final Predicate<T> condition) {
return new ConfigKeySatisfies<T>(configKey, condition);
}
public static <T> Predicate<Entity> configSatisfies(final HasConfigKey<T> configKey, final Predicate<T> condition) {
return new ConfigKeySatisfies<T>(configKey.getConfigKey(), condition);
}
protected static class ConfigKeySatisfies<T> implements SerializablePredicate<Entity> {
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 Entity input) {
return (input != null) && condition.apply(input.getConfig(configKey));
}
@Override
public String toString() {
return "configKeySatisfies("+configKey.getName()+","+condition+")";
}
}
/** @deprecated since 0.7.0 kept only to allow conversion of anonymous inner classes */
@SuppressWarnings("unused") @Deprecated
private static <T> Predicate<Entity> configEqualToOld(final ConfigKey<T> configKey, final T val) {
return new SerializablePredicate<Entity>() {
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && Objects.equal(input.getConfig(configKey), val);
}
};
}
/** @deprecated since 0.7.0 kept only to allow conversion of anonymous inner classes */
@SuppressWarnings("unused") @Deprecated
private static <T> Predicate<Entity> configEqualToOld(final HasConfigKey<T> configKey, final T val) {
return new SerializablePredicate<Entity>() {
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && Objects.equal(input.getConfig(configKey), val);
}
};
}
// ---------------------------
/**
* @param typeRegex a regular expression
* @return true if any of the interfaces implemented by the entity (including those derived) match typeRegex.
*/
public static Predicate<Entity> hasInterfaceMatching(String typeRegex) {
return new ImplementsInterface(typeRegex);
}
protected static class ImplementsInterface implements SerializablePredicate<Entity> {
protected final Pattern pattern;
public ImplementsInterface(String typeRegex) {
this.pattern = Pattern.compile(typeRegex);
}
@Override
public boolean apply(@Nullable Entity input) {
if (input == null) return false;
for (Class<?> cls : Reflections.getAllInterfaces(input.getClass())) {
if (pattern.matcher(cls.getName()).matches()) {
return true;
}
}
return false;
}
}
// ---------------------------
/**
* Returns a predicate that determines if a given entity is a direct child of this {@code parent}.
*/
public static Predicate<Entity> isChildOf(final Entity parent) {
return new IsChildOf(parent);
}
// if needed, could add parentSatisfies(...)
protected static class IsChildOf implements SerializablePredicate<Entity> {
protected final Entity parent;
protected IsChildOf(Entity parent) {
this.parent = parent;
}
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && Objects.equal(input.getParent(), parent);
}
@Override
public String toString() {
return "isChildOf("+parent+")";
}
}
/** @deprecated since 0.7.0 kept only to allow conversion of anonymous inner classes */
@SuppressWarnings("unused") @Deprecated
private static <T> Predicate<Entity> isChildOfOld(final Entity parent) {
return new SerializablePredicate<Entity>() {
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && Objects.equal(input.getParent(), parent);
}
};
}
// ---------------------------
public static Predicate<Entity> isMemberOf(final Group group) {
return new IsMemberOf(group);
}
protected static class IsMemberOf implements SerializablePredicate<Entity> {
protected final Group group;
protected IsMemberOf(Group group) {
this.group = group;
}
@Override
public boolean apply(@Nullable Entity input) {
return (group != null) && (input != null) && group.hasMember(input);
}
@Override
public String toString() {
return "isMemberOf("+group+")";
}
}
/** @deprecated since 0.7.0 kept only to allow conversion of anonymous inner classes */
@SuppressWarnings("unused") @Deprecated
private static <T> Predicate<Entity> isMemberOfOld(final Group group) {
return new SerializablePredicate<Entity>() {
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && group.hasMember(input);
}
};
}
// ---------------------------
/**
* Create a predicate that matches any entity who has an exact match for the given location
* (i.e. {@code entity.getLocations().contains(location)}).
*/
public static <T> Predicate<Entity> locationsIncludes(Location location) {
return locationsSatisfy(CollectionFunctionals.contains(location));
}
public static <T> Predicate<Entity> locationsSatisfy(final Predicate<Collection<Location>> condition) {
return new LocationsSatisfy(condition);
}
protected static class LocationsSatisfy implements SerializablePredicate<Entity> {
protected final Predicate<Collection<Location>> condition;
protected LocationsSatisfy(Predicate<Collection<Location>> condition) {
this.condition = condition;
}
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && condition.apply(input.getLocations());
}
@Override
public String toString() {
return "locationsSatisfy("+condition+")";
}
}
/** @deprecated since 0.7.0 use {@link #locationsIncludes(Location)} */
@Deprecated
public static <T> Predicate<Entity> withLocation(final Location location) {
return locationsIncludes(location);
}
/** @deprecated since 0.7.0 use {@link #locationsIncludes(Location)}, introduced to allow deserialization of anonymous inner class */
@SuppressWarnings("unused") @Deprecated
private static <T> Predicate<Entity> withLocationOld(final Location location) {
return new SerializablePredicate<Entity>() {
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && input.getLocations().contains(location);
}
};
}
// ---------------------------
public static <T> Predicate<Entity> isManaged() {
return new IsManaged();
}
protected static class IsManaged implements SerializablePredicate<Entity> {
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && Entities.isManaged(input);
}
@Override
public String toString() {
return "isManaged()";
}
}
/** @deprecated since 0.7.0 use {@link #isManaged()} */ @Deprecated
public static <T> Predicate<Entity> managed() {
return isManaged();
}
/** @deprecated since 0.7.0 use {@link #isManaged()}, introduced to allow deserialization of anonymous inner class */
@SuppressWarnings("unused") @Deprecated
private static <T> Predicate<Entity> managedOld() {
return new SerializablePredicate<Entity>() {
@Override
public boolean apply(@Nullable Entity input) {
return (input != null) && Entities.isManaged(input);
}
};
}
}