/*
 * Copyright 2016-2020 the original author or authors.
 *
 * Licensed 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
 *
 *      https://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.springframework.data.domain;

import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;

import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;

import org.springframework.lang.Nullable;
import org.springframework.util.Assert;

Specification for property path matching to use in query by example (QBE). An ExampleMatcher can be created for a object type. Instances of ExampleMatcher can be either matchingAll() or matchingAny() and settings can be tuned with... methods in a fluent style. with... methods return a copy of the ExampleMatcher instance with the specified setting. Null-handling defaults to NullHandler.IGNORE and case-sensitive StringMatcher.DEFAULT string matching.

This class is immutable.

Author:Christoph Strobl, Mark Paluch, Oliver Gierke, Jens Schauder
Since:1.12
/** * Specification for property path matching to use in query by example (QBE). An {@link ExampleMatcher} can be created * for a {@link Class object type}. Instances of {@link ExampleMatcher} can be either {@link #matchingAll()} or * {@link #matchingAny()} and settings can be tuned {@code with...} methods in a fluent style. {@code with...} methods * return a copy of the {@link ExampleMatcher} instance with the specified setting. Null-handling defaults to * {@link NullHandler#IGNORE} and case-sensitive {@link StringMatcher#DEFAULT} string matching. * <p> * This class is immutable. * * @author Christoph Strobl * @author Mark Paluch * @author Oliver Gierke * @author Jens Schauder * @since 1.12 */
public interface ExampleMatcher {
Create a new ExampleMatcher including all non-null properties by default matching all predicates derived from the example.
See Also:
Returns:new instance of ExampleMatcher.
/** * Create a new {@link ExampleMatcher} including all non-null properties by default matching <strong>all</strong> * predicates derived from the example. * * @return new instance of {@link ExampleMatcher}. * @see #matchingAll() */
static ExampleMatcher matching() { return matchingAll(); }
Create a new ExampleMatcher including all non-null properties by default matching any predicate derived from the example.
Returns:new instance of ExampleMatcher.
/** * Create a new {@link ExampleMatcher} including all non-null properties by default matching <strong>any</strong> * predicate derived from the example. * * @return new instance of {@link ExampleMatcher}. */
static ExampleMatcher matchingAny() { return new TypedExampleMatcher().withMode(MatchMode.ANY); }
Create a new ExampleMatcher including all non-null properties by default matching all predicates derived from the example.
Returns:new instance of ExampleMatcher.
/** * Create a new {@link ExampleMatcher} including all non-null properties by default matching <strong>all</strong> * predicates derived from the example. * * @return new instance of {@link ExampleMatcher}. */
static ExampleMatcher matchingAll() { return new TypedExampleMatcher().withMode(MatchMode.ALL); }
Returns a copy of this ExampleMatcher with the specified propertyPaths. This instance is immutable and unaffected by this method call.
Params:
  • ignoredPaths – must not be null and not empty.
Returns:new instance of ExampleMatcher.
/** * Returns a copy of this {@link ExampleMatcher} with the specified {@code propertyPaths}. This instance is immutable * and unaffected by this method call. * * @param ignoredPaths must not be {@literal null} and not empty. * @return new instance of {@link ExampleMatcher}. */
ExampleMatcher withIgnorePaths(String... ignoredPaths);
Returns a copy of this ExampleMatcher with the specified string matching of defaultStringMatcher. This instance is immutable and unaffected by this method call.
Params:
  • defaultStringMatcher – must not be null.
Returns:new instance of ExampleMatcher.
/** * Returns a copy of this {@link ExampleMatcher} with the specified string matching of {@code defaultStringMatcher}. * This instance is immutable and unaffected by this method call. * * @param defaultStringMatcher must not be {@literal null}. * @return new instance of {@link ExampleMatcher}. */
ExampleMatcher withStringMatcher(StringMatcher defaultStringMatcher);
Returns a copy of this ExampleMatcher with ignoring case sensitivity by default. This instance is immutable and unaffected by this method call.
Returns:new instance of ExampleMatcher.
/** * Returns a copy of this {@link ExampleMatcher} with ignoring case sensitivity by default. This instance is immutable * and unaffected by this method call. * * @return new instance of {@link ExampleMatcher}. */
default ExampleMatcher withIgnoreCase() { return withIgnoreCase(true); }
Returns a copy of this ExampleMatcher with defaultIgnoreCase. This instance is immutable and unaffected by this method call.
Params:
  • defaultIgnoreCase –
Returns:new instance of ExampleMatcher.
/** * Returns a copy of this {@link ExampleMatcher} with {@code defaultIgnoreCase}. This instance is immutable and * unaffected by this method call. * * @param defaultIgnoreCase * @return new instance of {@link ExampleMatcher}. */
ExampleMatcher withIgnoreCase(boolean defaultIgnoreCase);
Returns a copy of this ExampleMatcher with the specified GenericPropertyMatcher for the propertyPath. This instance is immutable and unaffected by this method call.
Params:
  • propertyPath – must not be null.
  • matcherConfigurer – callback to configure a GenericPropertyMatcher, must not be null.
Returns:new instance of ExampleMatcher.
/** * Returns a copy of this {@link ExampleMatcher} with the specified {@code GenericPropertyMatcher} for the * {@code propertyPath}. This instance is immutable and unaffected by this method call. * * @param propertyPath must not be {@literal null}. * @param matcherConfigurer callback to configure a {@link GenericPropertyMatcher}, must not be {@literal null}. * @return new instance of {@link ExampleMatcher}. */
default ExampleMatcher withMatcher(String propertyPath, MatcherConfigurer<GenericPropertyMatcher> matcherConfigurer) { Assert.hasText(propertyPath, "PropertyPath must not be empty!"); Assert.notNull(matcherConfigurer, "MatcherConfigurer must not be empty!"); GenericPropertyMatcher genericPropertyMatcher = new GenericPropertyMatcher(); matcherConfigurer.configureMatcher(genericPropertyMatcher); return withMatcher(propertyPath, genericPropertyMatcher); }
Returns a copy of this ExampleMatcher with the specified GenericPropertyMatcher for the propertyPath. This instance is immutable and unaffected by this method call.
Params:
  • propertyPath – must not be null.
  • genericPropertyMatcher – callback to configure a GenericPropertyMatcher, must not be null.
Returns:new instance of ExampleMatcher.
/** * Returns a copy of this {@link ExampleMatcher} with the specified {@code GenericPropertyMatcher} for the * {@code propertyPath}. This instance is immutable and unaffected by this method call. * * @param propertyPath must not be {@literal null}. * @param genericPropertyMatcher callback to configure a {@link GenericPropertyMatcher}, must not be {@literal null}. * @return new instance of {@link ExampleMatcher}. */
ExampleMatcher withMatcher(String propertyPath, GenericPropertyMatcher genericPropertyMatcher);
Returns a copy of this ExampleMatcher with the specified PropertyValueTransformer for the propertyPath.
Params:
  • propertyPath – must not be null.
  • propertyValueTransformer – must not be null.
Returns:new instance of ExampleMatcher.
/** * Returns a copy of this {@link ExampleMatcher} with the specified {@code PropertyValueTransformer} for the * {@code propertyPath}. * * @param propertyPath must not be {@literal null}. * @param propertyValueTransformer must not be {@literal null}. * @return new instance of {@link ExampleMatcher}. */
ExampleMatcher withTransformer(String propertyPath, PropertyValueTransformer propertyValueTransformer);
Returns a copy of this ExampleMatcher with ignore case sensitivity for the propertyPaths. This instance is immutable and unaffected by this method call.
Params:
  • propertyPaths – must not be null and not empty.
Returns:new instance of ExampleMatcher.
/** * Returns a copy of this {@link ExampleMatcher} with ignore case sensitivity for the {@code propertyPaths}. This * instance is immutable and unaffected by this method call. * * @param propertyPaths must not be {@literal null} and not empty. * @return new instance of {@link ExampleMatcher}. */
ExampleMatcher withIgnoreCase(String... propertyPaths);
Returns a copy of this ExampleMatcher with treatment for null values of NullHandler.INCLUDE . This instance is immutable and unaffected by this method call.
Returns:new instance of ExampleMatcher.
/** * Returns a copy of this {@link ExampleMatcher} with treatment for {@literal null} values of * {@link NullHandler#INCLUDE} . This instance is immutable and unaffected by this method call. * * @return new instance of {@link ExampleMatcher}. */
default ExampleMatcher withIncludeNullValues() { return withNullHandler(NullHandler.INCLUDE); }
Returns a copy of this ExampleMatcher with treatment for null values of NullHandler.IGNORE. This instance is immutable and unaffected by this method call.
Returns:new instance of ExampleMatcher.
/** * Returns a copy of this {@link ExampleMatcher} with treatment for {@literal null} values of * {@link NullHandler#IGNORE}. This instance is immutable and unaffected by this method call. * * @return new instance of {@link ExampleMatcher}. */
default ExampleMatcher withIgnoreNullValues() { return withNullHandler(NullHandler.IGNORE); }
Returns a copy of this ExampleMatcher with the specified nullHandler. This instance is immutable and unaffected by this method call.
Params:
  • nullHandler – must not be null.
Returns:new instance of ExampleMatcher.
/** * Returns a copy of this {@link ExampleMatcher} with the specified {@code nullHandler}. This instance is immutable * and unaffected by this method call. * * @param nullHandler must not be {@literal null}. * @return new instance of {@link ExampleMatcher}. */
ExampleMatcher withNullHandler(NullHandler nullHandler);
Get defined null handling.
Returns:never null
/** * Get defined null handling. * * @return never {@literal null} */
NullHandler getNullHandler();
Get defined StringMatcher.
Returns:never null.
/** * Get defined {@link ExampleMatcher.StringMatcher}. * * @return never {@literal null}. */
StringMatcher getDefaultStringMatcher();
Returns:true if String should be matched with ignore case option.
/** * @return {@literal true} if {@link String} should be matched with ignore case option. */
boolean isIgnoreCaseEnabled();
Params:
  • path – must not be null.
Returns:return true if path was set to be ignored.
/** * @param path must not be {@literal null}. * @return return {@literal true} if path was set to be ignored. */
default boolean isIgnoredPath(String path) { return getIgnoredPaths().contains(path); }
Returns:unmodifiable Set of ignored paths.
/** * @return unmodifiable {@link Set} of ignored paths. */
Set<String> getIgnoredPaths();
Returns:the PropertySpecifiers within the ExampleMatcher.
/** * @return the {@link PropertySpecifiers} within the {@link ExampleMatcher}. */
PropertySpecifiers getPropertySpecifiers();
Returns whether all of the predicates of the Example are supposed to match. If false is returned, it's sufficient if any of the predicates derived from the Example match.
Returns:whether all of the predicates of the Example are supposed to match or any of them is sufficient.
/** * Returns whether all of the predicates of the {@link Example} are supposed to match. If {@literal false} is * returned, it's sufficient if any of the predicates derived from the {@link Example} match. * * @return whether all of the predicates of the {@link Example} are supposed to match or any of them is sufficient. */
default boolean isAllMatching() { return getMatchMode().equals(MatchMode.ALL); }
Returns whether it's sufficient that any of the predicates of the Example match. If false is returned, all predicates derived from the example need to match to produce results.
Returns:whether it's sufficient that any of the predicates of the Example match or all need to match.
/** * Returns whether it's sufficient that any of the predicates of the {@link Example} match. If {@literal false} is * returned, all predicates derived from the example need to match to produce results. * * @return whether it's sufficient that any of the predicates of the {@link Example} match or all need to match. */
default boolean isAnyMatching() { return getMatchMode().equals(MatchMode.ANY); }
Get the match mode of the ExampleMatcher.
Returns:never null.
Since:2.0
/** * Get the match mode of the {@link ExampleMatcher}. * * @return never {@literal null}. * @since 2.0 */
MatchMode getMatchMode();
Null handling for creating criterion out of an Example.
Author:Christoph Strobl
/** * Null handling for creating criterion out of an {@link Example}. * * @author Christoph Strobl */
enum NullHandler { INCLUDE, IGNORE }
Callback to configure a matcher.
Author:Mark Paluch
Type parameters:
  • <T> –
/** * Callback to configure a matcher. * * @author Mark Paluch * @param <T> */
interface MatcherConfigurer<T> { void configureMatcher(T matcher); }
A generic property matcher that specifies string matching and case sensitivity.
Author:Mark Paluch
/** * A generic property matcher that specifies {@link StringMatcher string matching} and case sensitivity. * * @author Mark Paluch */
@EqualsAndHashCode class GenericPropertyMatcher { @Nullable StringMatcher stringMatcher = null; @Nullable Boolean ignoreCase = null; PropertyValueTransformer valueTransformer = NoOpPropertyValueTransformer.INSTANCE;
Creates an unconfigured GenericPropertyMatcher.
/** * Creates an unconfigured {@link GenericPropertyMatcher}. */
public GenericPropertyMatcher() {}
Creates a new GenericPropertyMatcher with a StringMatcher and ignoreCase.
Params:
  • stringMatcher – must not be null.
  • ignoreCase –
Returns:
/** * Creates a new {@link GenericPropertyMatcher} with a {@link StringMatcher} and {@code ignoreCase}. * * @param stringMatcher must not be {@literal null}. * @param ignoreCase * @return */
public static GenericPropertyMatcher of(StringMatcher stringMatcher, boolean ignoreCase) { return new GenericPropertyMatcher().stringMatcher(stringMatcher).ignoreCase(ignoreCase); }
Creates a new GenericPropertyMatcher with a StringMatcher and ignoreCase.
Params:
  • stringMatcher – must not be null.
Returns:
/** * Creates a new {@link GenericPropertyMatcher} with a {@link StringMatcher} and {@code ignoreCase}. * * @param stringMatcher must not be {@literal null}. * @return */
public static GenericPropertyMatcher of(StringMatcher stringMatcher) { return new GenericPropertyMatcher().stringMatcher(stringMatcher); }
Sets ignores case to true.
Returns:
/** * Sets ignores case to {@literal true}. * * @return */
public GenericPropertyMatcher ignoreCase() { this.ignoreCase = true; return this; }
Sets ignores case to ignoreCase.
Params:
  • ignoreCase –
Returns:
/** * Sets ignores case to {@code ignoreCase}. * * @param ignoreCase * @return */
public GenericPropertyMatcher ignoreCase(boolean ignoreCase) { this.ignoreCase = ignoreCase; return this; }
Sets ignores case to false.
Returns:
/** * Sets ignores case to {@literal false}. * * @return */
public GenericPropertyMatcher caseSensitive() { this.ignoreCase = false; return this; }
Sets string matcher to StringMatcher.CONTAINING.
Returns:
/** * Sets string matcher to {@link StringMatcher#CONTAINING}. * * @return */
public GenericPropertyMatcher contains() { this.stringMatcher = StringMatcher.CONTAINING; return this; }
Sets string matcher to StringMatcher.ENDING.
Returns:
/** * Sets string matcher to {@link StringMatcher#ENDING}. * * @return */
public GenericPropertyMatcher endsWith() { this.stringMatcher = StringMatcher.ENDING; return this; }
Sets string matcher to StringMatcher.STARTING.
Returns:
/** * Sets string matcher to {@link StringMatcher#STARTING}. * * @return */
public GenericPropertyMatcher startsWith() { this.stringMatcher = StringMatcher.STARTING; return this; }
Sets string matcher to StringMatcher.EXACT.
Returns:
/** * Sets string matcher to {@link StringMatcher#EXACT}. * * @return */
public GenericPropertyMatcher exact() { this.stringMatcher = StringMatcher.EXACT; return this; }
Sets string matcher to StringMatcher.DEFAULT.
Returns:
/** * Sets string matcher to {@link StringMatcher#DEFAULT}. * * @return */
public GenericPropertyMatcher storeDefaultMatching() { this.stringMatcher = StringMatcher.DEFAULT; return this; }
Sets string matcher to StringMatcher.REGEX.
Returns:
/** * Sets string matcher to {@link StringMatcher#REGEX}. * * @return */
public GenericPropertyMatcher regex() { this.stringMatcher = StringMatcher.REGEX; return this; }
Sets string matcher to stringMatcher.
Params:
  • stringMatcher – must not be null.
Returns:
/** * Sets string matcher to {@code stringMatcher}. * * @param stringMatcher must not be {@literal null}. * @return */
public GenericPropertyMatcher stringMatcher(StringMatcher stringMatcher) { Assert.notNull(stringMatcher, "StringMatcher must not be null!"); this.stringMatcher = stringMatcher; return this; }
Sets the PropertyValueTransformer to propertyValueTransformer.
Params:
  • propertyValueTransformer – must not be null.
Returns:
/** * Sets the {@link PropertyValueTransformer} to {@code propertyValueTransformer}. * * @param propertyValueTransformer must not be {@literal null}. * @return */
public GenericPropertyMatcher transform(PropertyValueTransformer propertyValueTransformer) { Assert.notNull(propertyValueTransformer, "PropertyValueTransformer must not be null!"); this.valueTransformer = propertyValueTransformer; return this; } }
Predefined property matchers to create a GenericPropertyMatcher.
Author:Mark Paluch
/** * Predefined property matchers to create a {@link GenericPropertyMatcher}. * * @author Mark Paluch */
class GenericPropertyMatchers {
Creates a GenericPropertyMatcher that matches string case insensitive.
Returns:
/** * Creates a {@link GenericPropertyMatcher} that matches string case insensitive. * * @return */
public static GenericPropertyMatcher ignoreCase() { return new GenericPropertyMatcher().ignoreCase(); }
Creates a GenericPropertyMatcher that matches string case sensitive.
Returns:
/** * Creates a {@link GenericPropertyMatcher} that matches string case sensitive. * * @return */
public static GenericPropertyMatcher caseSensitive() { return new GenericPropertyMatcher().caseSensitive(); }
Creates a GenericPropertyMatcher that matches string using StringMatcher.CONTAINING.
Returns:
/** * Creates a {@link GenericPropertyMatcher} that matches string using {@link StringMatcher#CONTAINING}. * * @return */
public static GenericPropertyMatcher contains() { return new GenericPropertyMatcher().contains(); }
Creates a GenericPropertyMatcher that matches string using StringMatcher.ENDING.
Returns:
/** * Creates a {@link GenericPropertyMatcher} that matches string using {@link StringMatcher#ENDING}. * * @return */
public static GenericPropertyMatcher endsWith() { return new GenericPropertyMatcher().endsWith(); }
Creates a GenericPropertyMatcher that matches string using StringMatcher.STARTING.
Returns:
/** * Creates a {@link GenericPropertyMatcher} that matches string using {@link StringMatcher#STARTING}. * * @return */
public static GenericPropertyMatcher startsWith() { return new GenericPropertyMatcher().startsWith(); }
Creates a GenericPropertyMatcher that matches string using StringMatcher.EXACT.
Returns:
/** * Creates a {@link GenericPropertyMatcher} that matches string using {@link StringMatcher#EXACT}. * * @return */
public static GenericPropertyMatcher exact() { return new GenericPropertyMatcher().exact(); }
Creates a GenericPropertyMatcher that matches string using StringMatcher.DEFAULT.
Returns:
/** * Creates a {@link GenericPropertyMatcher} that matches string using {@link StringMatcher#DEFAULT}. * * @return */
public static GenericPropertyMatcher storeDefaultMatching() { return new GenericPropertyMatcher().storeDefaultMatching(); }
Creates a GenericPropertyMatcher that matches string using StringMatcher.REGEX.
Returns:
/** * Creates a {@link GenericPropertyMatcher} that matches string using {@link StringMatcher#REGEX}. * * @return */
public static GenericPropertyMatcher regex() { return new GenericPropertyMatcher().regex(); } }
Match modes for treatment of String values.
Author:Christoph Strobl, Jens Schauder
/** * Match modes for treatment of {@link String} values. * * @author Christoph Strobl * @author Jens Schauder */
enum StringMatcher {
Store specific default.
/** * Store specific default. */
DEFAULT,
Matches the exact string
/** * Matches the exact string */
EXACT,
Matches string starting with pattern
/** * Matches string starting with pattern */
STARTING,
Matches string ending with pattern
/** * Matches string ending with pattern */
ENDING,
Matches string containing pattern
/** * Matches string containing pattern */
CONTAINING,
Treats strings as regular expression patterns
/** * Treats strings as regular expression patterns */
REGEX; }
Allows to transform the property value before it is used in the query.
/** * Allows to transform the property value before it is used in the query. */
interface PropertyValueTransformer extends Function<Optional<Object>, Optional<Object>> {}
Author:Christoph Strobl, Oliver Gierke
Since:1.12
/** * @author Christoph Strobl * @author Oliver Gierke * @since 1.12 */
enum NoOpPropertyValueTransformer implements ExampleMatcher.PropertyValueTransformer { INSTANCE; /* * (non-Javadoc) * @see java.util.function.Function#apply(java.lang.Object) */ @Override @SuppressWarnings("null") public Optional<Object> apply(Optional<Object> source) { return source; } }
Define specific property handling for a Dot-Path.
Author:Christoph Strobl, Mark Paluch
Since:1.12
/** * Define specific property handling for a Dot-Path. * * @author Christoph Strobl * @author Mark Paluch * @since 1.12 */
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) @RequiredArgsConstructor(access = AccessLevel.PRIVATE) @EqualsAndHashCode class PropertySpecifier { String path; @Nullable StringMatcher stringMatcher; @Nullable Boolean ignoreCase; PropertyValueTransformer valueTransformer;
Creates new PropertySpecifier for given path.
Params:
  • path – Dot-Path to the property. Must not be null.
/** * Creates new {@link PropertySpecifier} for given path. * * @param path Dot-Path to the property. Must not be {@literal null}. */
PropertySpecifier(String path) { Assert.hasText(path, "Path must not be null/empty!"); this.path = path; this.stringMatcher = null; this.ignoreCase = null; this.valueTransformer = NoOpPropertyValueTransformer.INSTANCE; }
Creates a new PropertySpecifier containing all values from the current instance and sets StringMatcher in the returned instance.
Params:
  • stringMatcher – must not be null.
Returns:
/** * Creates a new {@link PropertySpecifier} containing all values from the current instance and sets * {@link StringMatcher} in the returned instance. * * @param stringMatcher must not be {@literal null}. * @return */
public PropertySpecifier withStringMatcher(StringMatcher stringMatcher) { Assert.notNull(stringMatcher, "StringMatcher must not be null!"); return new PropertySpecifier(this.path, stringMatcher, this.ignoreCase, this.valueTransformer); }
Creates a new PropertySpecifier containing all values from the current instance and sets ignoreCase.
Params:
  • ignoreCase – must not be null.
Returns:
/** * Creates a new {@link PropertySpecifier} containing all values from the current instance and sets * {@code ignoreCase}. * * @param ignoreCase must not be {@literal null}. * @return */
public PropertySpecifier withIgnoreCase(boolean ignoreCase) { return new PropertySpecifier(this.path, this.stringMatcher, ignoreCase, this.valueTransformer); }
Creates a new PropertySpecifier containing all values from the current instance and sets PropertyValueTransformer in the returned instance.
Params:
  • valueTransformer – must not be null.
Returns:
/** * Creates a new {@link PropertySpecifier} containing all values from the current instance and sets * {@link PropertyValueTransformer} in the returned instance. * * @param valueTransformer must not be {@literal null}. * @return */
public PropertySpecifier withValueTransformer(PropertyValueTransformer valueTransformer) { Assert.notNull(valueTransformer, "PropertyValueTransformer must not be null!"); return new PropertySpecifier(this.path, this.stringMatcher, this.ignoreCase, valueTransformer); }
Get the properties Dot-Path.
Returns:never null.
/** * Get the properties Dot-Path. * * @return never {@literal null}. */
public String getPath() { return path; }
Get the StringMatcher.
Returns:can be null.
/** * Get the {@link StringMatcher}. * * @return can be {@literal null}. */
@Nullable public StringMatcher getStringMatcher() { return stringMatcher; }
Returns:null if not set.
/** * @return {@literal null} if not set. */
@Nullable public Boolean getIgnoreCase() { return ignoreCase; }
Get the property transformer to be applied.
Returns:never null.
/** * Get the property transformer to be applied. * * @return never {@literal null}. */
public PropertyValueTransformer getPropertyValueTransformer() { return valueTransformer == null ? NoOpPropertyValueTransformer.INSTANCE : valueTransformer; }
Transforms a given source using the PropertyValueTransformer.
Params:
  • source –
Returns:
/** * Transforms a given source using the {@link PropertyValueTransformer}. * * @param source * @return */
public Optional<Object> transformValue(Optional<Object> source) { return getPropertyValueTransformer().apply(source); } }
Define specific property handling for Dot-Paths.
Author:Christoph Strobl, Mark Paluch
Since:1.12
/** * Define specific property handling for Dot-Paths. * * @author Christoph Strobl * @author Mark Paluch * @since 1.12 */
@EqualsAndHashCode class PropertySpecifiers { private final Map<String, PropertySpecifier> propertySpecifiers = new LinkedHashMap<>(); PropertySpecifiers() {} PropertySpecifiers(PropertySpecifiers propertySpecifiers) { this.propertySpecifiers.putAll(propertySpecifiers.propertySpecifiers); } public void add(PropertySpecifier specifier) { Assert.notNull(specifier, "PropertySpecifier must not be null!"); propertySpecifiers.put(specifier.getPath(), specifier); } public boolean hasSpecifierForPath(String path) { return propertySpecifiers.containsKey(path); } public PropertySpecifier getForPath(String path) { return propertySpecifiers.get(path); } public boolean hasValues() { return !propertySpecifiers.isEmpty(); } public Collection<PropertySpecifier> getSpecifiers() { return propertySpecifiers.values(); } }
The match modes to expose so that clients can find about how to concatenate the predicates.
Author:Oliver Gierke
See Also:
Since:1.13
/** * The match modes to expose so that clients can find about how to concatenate the predicates. * * @author Oliver Gierke * @since 1.13 * @see ExampleMatcher#isAllMatching() */
enum MatchMode { ALL, ANY; } }