/*
* 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.catalog;
import javax.annotation.Nullable;
import org.apache.brooklyn.api.catalog.CatalogItem;
import org.apache.brooklyn.api.catalog.CatalogItem.CatalogItemType;
import org.apache.brooklyn.api.entity.Application;
import org.apache.brooklyn.api.entity.Entity;
import org.apache.brooklyn.api.entity.EntitySpec;
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.api.location.LocationSpec;
import org.apache.brooklyn.api.mgmt.ManagementContext;
import org.apache.brooklyn.api.policy.Policy;
import org.apache.brooklyn.api.policy.PolicySpec;
import org.apache.brooklyn.core.catalog.internal.CatalogUtils;
import org.apache.brooklyn.core.mgmt.entitlement.Entitlements;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
public class CatalogPredicates {
public static <T,SpecT> Predicate<CatalogItem<T,SpecT>> isCatalogItemType(final CatalogItemType ciType) {
// TODO PERSISTENCE WORKAROUND kept anonymous function in case referenced in persisted state
new Predicate<CatalogItem<T,SpecT>>() {
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && item.getCatalogItemType()==ciType;
}
};
return new CatalogItemTypeEqualTo<T, SpecT>(ciType);
}
/**
* @since 0.8.0
*/
private static class CatalogItemTypeEqualTo<T,SpecT> implements Predicate<CatalogItem<T,SpecT>> {
private final CatalogItemType ciType;
public CatalogItemTypeEqualTo(final CatalogItemType ciType) {
this.ciType = ciType;
}
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && item.getCatalogItemType()==ciType;
}
}
public static <T,SpecT> Predicate<CatalogItem<T,SpecT>> deprecated(final boolean deprecated) {
// TODO PERSISTENCE WORKAROUND kept anonymous function in case referenced in persisted state
new Predicate<CatalogItem<T,SpecT>>() {
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && item.isDeprecated() == deprecated;
}
};
return new DeprecatedEqualTo<T, SpecT>(deprecated);
}
/**
* @since 0.8.0
*/
private static class DeprecatedEqualTo<T,SpecT> implements Predicate<CatalogItem<T,SpecT>> {
private final boolean deprecated;
public DeprecatedEqualTo(boolean deprecated) {
this.deprecated = deprecated;
}
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && item.isDeprecated() == deprecated;
}
}
/**
* @since 0.8.0
*/
public static <T,SpecT> Predicate<CatalogItem<T,SpecT>> disabled(boolean disabled) {
return new DisabledEqualTo<T, SpecT>(disabled);
}
/**
* @since 0.8.0
*/
private static class DisabledEqualTo<T,SpecT> implements Predicate<CatalogItem<T,SpecT>> {
private final boolean disabled;
public DisabledEqualTo(boolean disabled) {
this.disabled = disabled;
}
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && item.isDisabled() == disabled;
}
}
public static final Predicate<CatalogItem<Application,EntitySpec<? extends Application>>> IS_TEMPLATE =
CatalogPredicates.<Application,EntitySpec<? extends Application>>isCatalogItemType(CatalogItemType.TEMPLATE);
public static final Predicate<CatalogItem<Entity,EntitySpec<?>>> IS_ENTITY =
CatalogPredicates.<Entity,EntitySpec<?>>isCatalogItemType(CatalogItemType.ENTITY);
public static final Predicate<CatalogItem<Policy,PolicySpec<?>>> IS_POLICY =
CatalogPredicates.<Policy,PolicySpec<?>>isCatalogItemType(CatalogItemType.POLICY);
public static final Predicate<CatalogItem<Location,LocationSpec<?>>> IS_LOCATION =
CatalogPredicates.<Location,LocationSpec<?>>isCatalogItemType(CatalogItemType.LOCATION);
// TODO PERSISTENCE WORKAROUND kept anonymous function in case referenced in persisted state
@SuppressWarnings("unused")
private static final Function<CatalogItem<?,?>,String> ID_OF_ITEM_TRANSFORMER_ANONYMOUS = new Function<CatalogItem<?,?>, String>() {
@Override @Nullable
public String apply(@Nullable CatalogItem<?,?> input) {
if (input==null) return null;
return input.getId();
}
};
// TODO PERSISTENCE WORKAROUND kept anonymous function in case referenced in persisted state
public static final Function<CatalogItem<?,?>,String> ID_OF_ITEM_TRANSFORMER = new IdOfItemTransformer();
/**
* @since 0.8.0
*/
private static class IdOfItemTransformer implements Function<CatalogItem<?,?>,String> {
@Override @Nullable
public String apply(@Nullable CatalogItem<?,?> input) {
if (input==null) return null;
return input.getId();
}
};
/** @deprecated since 0.7.0 use {@link #displayName(Predicate)} */
@Deprecated
public static <T,SpecT> Predicate<CatalogItem<T,SpecT>> name(final Predicate<? super String> filter) {
return displayName(filter);
}
/**
* @since 0.7.0
*/
public static <T,SpecT> Predicate<CatalogItem<T,SpecT>> displayName(final Predicate<? super String> filter) {
// TODO PERSISTENCE WORKAROUND kept anonymous function in case referenced in persisted state
new Predicate<CatalogItem<T,SpecT>>() {
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && filter.apply(item.getDisplayName());
}
};
return new DisplayNameMatches<T,SpecT>(filter);
}
/**
* @since 0.8.0
*/
private static class DisplayNameMatches<T,SpecT> implements Predicate<CatalogItem<T,SpecT>> {
private final Predicate<? super String> filter;
public DisplayNameMatches(Predicate<? super String> filter) {
this.filter = filter;
}
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && filter.apply(item.getDisplayName());
}
}
@Deprecated
public static <T,SpecT> Predicate<CatalogItem<T,SpecT>> registeredTypeName(final Predicate<? super String> filter) {
return symbolicName(filter);
}
public static <T,SpecT> Predicate<CatalogItem<T,SpecT>> symbolicName(final Predicate<? super String> filter) {
// TODO PERSISTENCE WORKAROUND kept anonymous function in case referenced in persisted state
new Predicate<CatalogItem<T,SpecT>>() {
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && filter.apply(item.getSymbolicName());
}
};
return new SymbolicNameMatches<T,SpecT>(filter);
}
/**
* @since 0.8.0
*/
private static class SymbolicNameMatches<T,SpecT> implements Predicate<CatalogItem<T,SpecT>> {
private final Predicate<? super String> filter;
public SymbolicNameMatches(Predicate<? super String> filter) {
this.filter = filter;
}
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && filter.apply(item.getSymbolicName());
}
}
public static <T,SpecT> Predicate<CatalogItem<T,SpecT>> javaType(final Predicate<? super String> filter) {
// TODO PERSISTENCE WORKAROUND kept anonymous function in case referenced in persisted state
new Predicate<CatalogItem<T,SpecT>>() {
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && filter.apply(item.getJavaType());
}
};
return new JavaTypeMatches<T, SpecT>(filter);
}
/**
* @since 0.8.0
*/
private static class JavaTypeMatches<T,SpecT> implements Predicate<CatalogItem<T,SpecT>> {
private final Predicate<? super String> filter;
public JavaTypeMatches(Predicate<? super String> filter) {
this.filter = filter;
}
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && filter.apply(item.getJavaType());
}
}
public static <T,SpecT> Predicate<CatalogItem<T,SpecT>> xml(final Predicate<? super String> filter) {
// TODO PERSISTENCE WORKAROUND kept anonymous function in case referenced in persisted state
new Predicate<CatalogItem<T,SpecT>>() {
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && filter.apply(item.toXmlString());
}
};
return new XmlMatches<T,SpecT>(filter);
}
/**
* @since 0.8.0
*/
private static class XmlMatches<T,SpecT> implements Predicate<CatalogItem<T,SpecT>> {
private final Predicate<? super String> filter;
public XmlMatches(Predicate<? super String> filter) {
this.filter = filter;
}
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) && filter.apply(item.toXmlString());
}
}
public static <T,SpecT> Predicate<CatalogItem<T,SpecT>> entitledToSee(final ManagementContext mgmt) {
// TODO PERSISTENCE WORKAROUND kept anonymous function in case referenced in persisted state
new Predicate<CatalogItem<T,SpecT>>() {
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) &&
Entitlements.isEntitled(mgmt.getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, item.getCatalogItemId());
}
};
return new EntitledToSee<T, SpecT>(mgmt);
}
/**
* @since 0.8.0
*/
private static class EntitledToSee<T,SpecT> implements Predicate<CatalogItem<T,SpecT>> {
private final ManagementContext mgmt;
public EntitledToSee(ManagementContext mgmt) {
this.mgmt = mgmt;
}
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return (item != null) &&
Entitlements.isEntitled(mgmt.getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, item.getCatalogItemId());
}
}
public static <T,SpecT> Predicate<CatalogItem<T,SpecT>> isBestVersion(final ManagementContext mgmt) {
// TODO PERSISTENCE WORKAROUND kept anonymous function in case referenced in persisted state
new Predicate<CatalogItem<T,SpecT>>() {
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return CatalogUtils.isBestVersion(mgmt, item);
}
};
return new IsBestVersion<T, SpecT>(mgmt);
}
/**
* @since 0.8.0
*/
private static class IsBestVersion<T,SpecT> implements Predicate<CatalogItem<T,SpecT>> {
private final ManagementContext mgmt;
public IsBestVersion(ManagementContext mgmt) {
this.mgmt = mgmt;
}
@Override
public boolean apply(@Nullable CatalogItem<T,SpecT> item) {
return CatalogUtils.isBestVersion(mgmt, item);
}
}
}