package ru.hflabs.rcd.model.change;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.collect.Sets;
import ru.hflabs.rcd.model.Historical;
import ru.hflabs.rcd.model.Named;
import ru.hflabs.rcd.model.document.Field;
import ru.hflabs.rcd.model.document.MetaField;
import ru.hflabs.rcd.model.task.TaskDescriptor;
import ru.hflabs.util.core.collection.ArrayUtil;
import java.util.Collection;
import java.util.EnumSet;
/**
* Класс <class>Predicates</class> реализует вспомогательные методы для построения предикатов по различным критериям
*
* @see Predicate
*/
public abstract class Predicates {
/** Предикат, отслеживающий изменения именованного документа */
public static final Predicate<Collection<Diff>> CHANGE_NAME_PREDICATE = new Predicate<Collection<Diff>>() {
@Override
public boolean apply(Collection<Diff> input) {
for (Diff diff : input) {
if (Named.NAME.equals(diff.getField())) {
return true;
}
}
return false;
}
};
/** Предикат, отслеживающий изменение значение поля */
public static final Predicate<Collection<Diff>> CHANGE_VALUE_PREDICATE = new Predicate<Collection<Diff>>() {
@Override
public boolean apply(Collection<Diff> input) {
for (Diff diff : input) {
if (Field.VALUE.equals(diff.getField())) {
return true;
}
}
return false;
}
};
/** Предикат, отслеживающий изменение триггера задачи */
public static final Predicate<Collection<Diff>> CHANGE_CRON_PREDICATE = new Predicate<Collection<Diff>>() {
@Override
public boolean apply(Collection<Diff> input) {
for (Diff diff : input) {
if (TaskDescriptor.CRON.equals(diff.getField())) {
return true;
}
}
return false;
}
};
/** Предикат, отслеживающий флаг первичного ключа МЕТА-поля */
public static final Predicate<MetaField> PRIMARY_META_FIELD_PREDICATE = new Predicate<MetaField>() {
@Override
public boolean apply(MetaField input) {
return input != null && input.isFlagEstablished(MetaField.FLAG_PRIMARY);
}
};
/** Предикат, отслеживающий флаг первичного ключа МЕТА-поля */
public static final Predicate<MetaField> UNIQUE_META_FIELD_PREDICATE = new Predicate<MetaField>() {
@Override
public boolean apply(MetaField input) {
return input != null && input.isFlagEstablished(MetaField.FLAG_UNIQUE);
}
};
/** Предикат, отслеживающий флаг первичного ключа МЕТА-поля */
public static final Predicate<MetaField> HIDDEN_META_FIELD_PREDICATE = new Predicate<MetaField>() {
@Override
public boolean apply(MetaField input) {
return input != null && input.isFlagEstablished(MetaField.FLAG_HIDDEN);
}
};
/** Предикат, отслеживающий флаг первичного ключа МЕТА-поля */
public static final Predicate<MetaField> NOT_HIDDEN_META_FIELD_PREDICATE = new Predicate<MetaField>() {
@Override
public boolean apply(MetaField input) {
return input != null && !HIDDEN_META_FIELD_PREDICATE.apply(input);
}
};
protected Predicates() {
// embedded constructor
}
/**
* Формирует и возвращает предикат, проверяющий значение функции на <code>NULL</code>
*
* @param function функция
* @return Возвращает созданный предикат
*/
public static <T> Predicate<T> notNull(final Function<T, ?> function) {
return new Predicate<T>() {
@Override
public boolean apply(T input) {
return function.apply(input) != null;
}
};
}
/**
* Формирует и возвращает предикат для исторических сущностей по типам их изменений
*
* @param types целевая коллекция типов или <code>NULL</code>
* @return Возвращает созданный предикат
*/
public static <T extends Historical> Predicate<T> changeTypes(ChangeType... types) {
final Collection<ChangeType> targetTypes = ArrayUtil.isEmpty(types) ?
EnumSet.allOf(ChangeType.class) :
Sets.newHashSet(types);
return new Predicate<T>() {
@Override
public boolean apply(T input) {
return input != null && targetTypes.contains(input.getChangeType());
}
};
}
}