package net.java.cargotracker.domain.shared; /** * Abstract base implementation of composite {@link Specification} with default * implementations for {@code and}, {@code or} and {@code not}. */ public abstract class AbstractSpecification<T> implements Specification<T> { /** * {@inheritDoc} */ @Override public abstract boolean isSatisfiedBy(T t); /** * {@inheritDoc} */ @Override public Specification<T> and(Specification<T> specification) { return new AndSpecification<>(this, specification); } /** * {@inheritDoc} */ @Override public Specification<T> or(Specification<T> specification) { return new OrSpecification<>(this, specification); } /** * {@inheritDoc} */ @Override public Specification<T> not(Specification<T> specification) { return new NotSpecification<>(specification); } }