/*
* 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() {}
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);
}
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;
}
}