Commit Graph

444 Commits

Author SHA1 Message Date
Oliver Gierke
167b52f7b4 DATACMNS-761 - Fixed page size detection for a PageableHandlerMethodArgumentResolver configured to one-indexed parameters. 2015-09-02 16:13:36 +02:00
Oliver Gierke
8c90594e9e DATACMNS-760 - Removed cyclic dependency in Querydsl packages.
Moved @QuerydslPredicate into the non-web-related Querydsl package to avoid a cyclic dependency.
2015-09-01 09:23:04 +02:00
Oliver Gierke
cc2696fcc4 DATACMNS-755 - Fixed QSort property translation for plain paths.
If standard Querydsl StringPaths are used without any reference to a query class tree, we previously dropped the first segment of the path expression.

Moved to a completely different algorithm to determine the path by just using the Path's toString() representation and the root removed if necessary.
2015-08-18 13:53:02 +02:00
Oliver Gierke
cc1aa713f9 DATACMNS-750 - Fixed part creation in query methods that have keywords in property paths.
If a keyword was contained in a complex property path (like In in SomeInfo), the property path was invalidly cut of in the middle. We now simply use the length of the keyword to extract the actual property from the candidate. This should be faster anyway as it doesn't require another lookup of the pattern in the source candidate.

Related pull request: #136.
2015-08-13 12:37:30 +02:00
Oliver Gierke
6775d11c65 DATACMNS-749 - RepositoryFactorySupport now registers global ExposeInvocationInterceptor.
This frees RepositoryProxyPostProcessors from having to register the interceptor manually and thus prevents it from being registered multiple times.
2015-08-08 10:58:06 +02:00
Oliver Gierke
7b791d2825 DATACMNS-748 - Fixed Spring 4.2 detection in QueryExecutionConverters.
Replaced the unreliable usage of SpringVersion.getVersion() with a dedicated lookup for a type only present in Spring 4.2.
2015-08-08 10:51:09 +02:00
Oliver Gierke
1befa529e9 DATACMNS-746 - Improved JavaDoc of PersistentPropertyAccessor.
The JavaDoc of PersistentPropertyAccessor now explicitly hints to PersistentEntity.getPropertyAccessor(…) to make obvious how instances of it can be obtained.
2015-08-07 16:16:21 +02:00
Oliver Gierke
9afb5777e9 DATACMNS-744 - Removed strong dependency to Querydsl in web support.
Moved all Querydsl related bean definitions and customizations to a dedicated configuration class that only gets included if Querydsl is on the classpath.

Extracted a QuerydslActivator for use in Spring Data REST, which uses HateoasAwareSpringDataWebConfiguration via inheritance, not via @EnableSpringDataWebSupport.

Previously, we exposed a QuerydslBindingsFactory as bean method return type which breaks Spring bootstrap even if it's lazy due to its references to Querydsl types.

Related tickets: DATACMNS-669.
2015-08-04 09:05:58 +02:00
Oliver Gierke
8d2933f109 DATACMNS-669 - Introduced QuerydslBindingsFactory.
QuerydslBindingsFactory creates a completely build up and customized QuerydslBindings instance for a given QuerydslBinderCustomizer type and domain type.

This basically involves creating or obtaining an instance of the customizer with the following algorithm:

1. If an explicit customizer type is given and no BeanFactory is configured, we'll simply instantiate the configured type. This allows simple customizer implementations with a no-arg constructor.
2. If a BeanFactory is configured and a customizer type configured, we're trying to locate a bean of that type in the BeanFactory, falling back to creating an instance of the customizer through the BeanFactory if no existing bean definition can be found. This allows unique customizer bean definitions or complex prototype scoped customizer beans created on the fly.
3. If no customizer type is configured, we check whether the the repository of the domain type implements QuerydslBinderCustomizer and use it if so.

The extraction of that functionality allows that algorithm being used by Spring Data REST, although only step 3 is currently used there as no explicit customizer can currently be configured with Spring Data REST.
2015-08-03 15:34:47 +02:00
Oliver Gierke
9dc581df43 DATACMNS-738 - Removed deprecations in BeanWrapper.
Removed deprecated static factory method and made the class package protected.
2015-08-03 15:34:47 +02:00
David Syer
a597549c4e DATACMNS-736 - Fixed validation error message in PointFormatter.
PointFormatter error message now states it's expecting comma separated values. Previously it erroneously reported expecting a semicolon.

Original pull request: #134.
2015-07-21 16:52:44 +02:00
Oliver Gierke
e3668c621d DATACMNS-734 - Improved Querydsl predicate binding using formatters.
We now default to a FormattingConversionService to make sure comma-separated values are transformed into arrays correctly. Also, we now build up dedicated TypeDescriptor instances for the property or field about to be bound to potentially pick up formatting annotations on those.
2015-07-21 15:47:09 +02:00
Christoph Strobl
11056be292 DATACMNS-734 - Allow comma separated list of values to be bound to an array.
We now convert comma separated values for an array property by splitting values and converting each of them. This allows to convert address.location=40.740337,-73.995146 to 

class Address {
  Double[] location;
}
2015-07-21 15:47:09 +02:00
Oliver Gierke
ac080bacf7 DATACMNS-733 - Made all references to DefaultParameterNameDiscoverer non-static.
To prevent classes from being garbage collected due to Class<?> references within DefaultParameterNameDiscoverer we no keep all ParameterNameDiscoverer instances in a non-static field.
2015-07-20 08:28:26 +02:00
Oliver Gierke
c5e5244162 DATACMNS-669 - Moved some types for better code structure.
Introduced dedicated querydsl.bindings package to contain all non-web projects to make sure domain types and repositories don't have to depend on types in a web package.

Updated Sonargraph architecture description accordingly.

Original pull request: #132.
2015-07-20 08:12:28 +02:00
Oliver Gierke
0330cdc3d3 DATACMNS-669 - Final polishing.
Mostly Javadoc. Removed all API that took String paths so far.

Changed return type of bean definition for QuerydslPredicateArgumentResolver to HandlerMethodArgumentResolver so that Querydsl stays optional during class loading.

Original pull request: #132.
2015-07-20 08:12:20 +02:00
Christoph Strobl
64c8549db4 DATACMNS-669 - Register QuerydslPredicateArgumentResolver as bean.
If no QuerydslBinderCustomizer is configured on @QuerydslPredicate specifically, we now also consider the domain types repository as candidate for binding customization.

The lookup algorithm for explicitly configured customizers has been refined to try to find a bean in the BeanFactory first, resorting to on-the-fly creation eventually.

QuerydslPredicateArgumentResolver is now registered as a lazily initialized bean and its usage is guarded by checking presence of Querydsl itself.

The according test needs to do some reflection in order to stay out of trouble when types are loaded by different class loaders required to hide certain types.

Original pull request: #132.
2015-07-20 08:12:14 +02:00
Oliver Gierke
cccfa5e5c5 DATACMNS-669 - Polishing.
Javadoc on MultiValueBinding. Hide QuerydslBindings.bind(…), ….include(…) and ….exclude(…) methods that take String arguments to reduce the probability of no query class being present.

Refined the value handling for empty request values which are represented as String[] containing an empty String. We now massage those into an empty Collection for MultiValueBindings and a null value for SingleValueInvocations.

We currently skip property values that match this pattern entirely but are prepared to allow a configuration flip switch to handle those scenarios in the future. We currently stick to skipping those values to prevent the bindings from having to deal with null values.

We now also allow the bindings to return null to indicate they don't want to get applied in the resulting predicate at all.

Switched to interface based customization to make it easier to use customizations with Spring Data REST. Added Querydsl-specific adapter of RepositoryInvoker to allow Spring Data REST to hook in the execution of the predicate obtained from request parameters.

Original pull request: #132.
2015-07-20 08:12:11 +02:00
Christoph Strobl
dc49101850 DATACMNS-669 - Ignore non-reachable paths for Querydsl parameter binding.
We now ignore invalid PropertyPaths on property binding to Querydsl Predicates. Those may occur since the request also holds non-property-related arguments, such as pagination parameters.

Fixed two potential NullPointerExceptions along the way since we no longer depend on the presence of @QuerydslPredicate.

Original pull request: #132.
2015-07-20 08:11:47 +02:00
Oliver Gierke
5db3def79b DATACMNS-669 - Polishing.
QuerydslBindings now uses a builder style pattern to define custom bindings. This allows to define the same binding for multiple properties of the same type in one configuration call.

Introduced MultiValueBinding to be able to register a binding for multiple source values (i.e. if multiple values are provided for the same parameter). The previously named QuerydslBinding is now a SingleValueBinding which gets adapted to by extracting the first element of the values provided considered as collection.

Slightly refined the generics signature in QuerydslBinding for better type derivation in Lambdas. Removed the need for QuerydslBindingContext by moving a few properties around. The ConversionService instance is now piped into the QuerydslPredicateBuilder directly.

Added a bit of sample data to the Users test domain type to be able to execute the generated Predicates in tests to validate their correctness.

Original pull request: #132.
2015-07-20 08:11:28 +02:00
Christoph Strobl
e645501174 DATACMNS-669 - Added support to bind Querydsl Predicates to Spring MVC controllers.
Adding @QuerydslPredicate to a parameter within SpringMVC Controller when having registered the QueryDslPredicateArgumentResolver allows to generate a Querydsl Predicate based on the request parameters.

Parameters will be converted into their corresponding property types before using the as predicate value. Given more than one attribute will connect those using 'and'. Collections of values will force usage of 'in' while single values on collection like properties result in 'contains'.

The base type for building the Querydsl Path is extracted from the methods return type. In case of non domain type return values it can optionally be specified via @QueydslPredicate(root = …). Specific Predicate conversions can be registered via '@QuerydslSpecification'.

This allows to sneak in specific property path handlings more easily.

new QueryDslPredicateSpecification() {
  {
    define(new StringPath("address.city"), (path, value) -> path.like(value.toString()));
  }
};

Renamed resolver, accessor etc. to express operation of binding properties to a resolved path and introduced explicit binding context which allows reuse of predicate builder within the ArgumentResolver.

Added registration of QuerydslPredicateArgumentResolver directly in SpringDataWebConfiguration reusing the provided ConversionService.

Added Javadoc and changed visibility of non public API and types.

Original pull request: #132.
2015-07-20 08:11:04 +02:00
Oliver Gierke
30b4cf53fc DATACMNS-715 - Introduced support for JTA 2.1 @Transactional.
Refreshed the copy of AnnotationTransactionAttributeSource to pull in the JTA 2.1 support introduced in the Spring Framework class. Opened up a ticket [0] to improve Spring Framework to eventually be able to ditch the copies to prevent such scenarios in the future (the missing feature introduced that is).
2015-07-17 09:43:24 +02:00
Oliver Gierke
174e9a6e93 DATACMNS-731 - Parameter now exposes whether it's named explicitly.
Parameter now has a isExplicitlyNamed() to indicate whether the user explicitly assigned a name to it in contrast to an implicitly discovered parameter name.
2015-07-15 16:18:37 +02:00
Oliver Gierke
cd6b2c09c6 DATACMNS-542 - Be more lenient about simplified way to customize repository base classes.
We now leniently return null for the repository base class name from the AnnotationRepositoryConfigurationSource to make sure Spring Data modules compile against Spring Data Commons 1.10 continue to work on 1.11 without having the annotation attribute added.
2015-07-13 17:39:49 +02:00
Oliver Gierke
709bb5c4b1 DATACMNS-727 - Improved error handling in MappingContext.getPersistentPropertyPath(…).
A failure to resolve a property path into a PersistentPropertyPath now causes an InvalidPropertyPath exception being thrown. It captures the context of the failure like the resolved path, the offending segment. Added getPersistentPropertyPath(InvalidPropertyPath) that resolves the resolvable part for further use downstream.

Added null-checking assertions to AbstractMappingContext.getPersistentPropertyPath(…) variants. Improved DefaultPersistentPropertyPath to be able to append properties while building and to allow representing an empty path.
2015-07-09 14:10:26 +02:00
Oliver Gierke
d859540f92 DATACMNS-703 - PropertyReferenceException now exposes potential matches.
We now use Spring's PropertyMatches to build up the exception message and include a list of potentially meant properties.

Removed unused config file for tests along the way.

Original pull request: #125.
2015-07-06 12:44:13 +02:00
Oliver Gierke
bad0edef06 DATACMNS-722 - ProxyProjectionFactory now deals with arrays.
We now handle primitive and non-primitive arrays in ProxyProjectionFactory. WE basically skip element projections for the former and correctly implement exactly that for the latter.
2015-06-25 14:04:28 +02:00
Oliver Gierke
ac2faab0d2 DATACMNS-720 - Improved disabling of default transactions.
When default transactions get disabled, we now still configure a TransactionInterceptor to make sure explicitly defined transactions are still applied. Previously the interceptor was not registered at all if default transactions were configured to be turned off and thus even explicitly declared transaction configuration was not considered.

Related tickets: DATACMNS-656.
2015-06-22 17:06:41 +02:00
Oliver Gierke
e0dafd29f4 DATACMNS-714 - Improved test cases for CompletableFuture support.
We now make sure the converter for CompletableFuture is only registered if Spring 4.2 or better is on the classpath. Adapted test cases to only run tests for CompletableFuture support in the very same scenario.
2015-06-22 11:33:31 +02:00
Oliver Gierke
6da31347b8 DATACMNS-719 - Version now parses strings with non-numeric suffixes correctly.
Extended Version value object to correctly dump a non-numeric last segment of a version string to parse. Incorrect source version strings now raise an IllegalArgumentException better explaining the cause.

Related tickets: DATACMNS-496.
2015-06-22 11:25:52 +02:00
Oliver Gierke
3a2dc3d1d4 DATACMNS-713 - Disabled total adaption in PageImpl for empty pages.
The newly introduced adaption of the total in PageImpl must only be applied if the page accessed is not empty.
2015-06-19 15:26:40 +02:00
Oliver Gierke
c49f8357b6 DATACMNS-718 - Class loader improvements in ProxyProjectionFactory.
ProxyProjectionFactory now implements ResourceLoaderAware to be able to use the class loader used by the framework. SpringDataWebConfiguration now forwards the Application context as ResourceLoader through ProxyingHandlerMethodArgumentResolver into the target factory.
2015-06-19 13:05:56 +02:00
Oliver Gierke
26e398e553 DATACMNS-717 - AnnotatedTypeScanner now uses Environment and ResourceLoader configured.
We now implement EnvironmentAware and ResourceLoaderAware to respect the current environment setup when scanning for types. We use the ResourceLoader's ClassLoader if configured but indicate to fall back to the default one if none configured.
2015-06-18 17:44:05 +02:00
Thomas Darimont
7adb67351b DATACMNS-716 - Allow collection executions with wrapper types as return values.
We now support collection executions in query derivation in combination with wrapper types like (Future, Optional, CompletableFuture, ListenableFuture) that wrap a collection, e.g. Future<List<User>>. Previously we used the "raw" return type which tricked our detection for Collection / Page / Slice executions.

Original pull request: #130.
2015-06-17 17:39:31 +02:00
Oliver Gierke
9eb4603503 DATACMNS-715 - Repository factory now adds TransactionProxy interface if available.
We now leniently add the TransactionProxy marker interface to the repository proxy to opt-out of any further transaction handling potentially applied through @EnableTransactionManagement or its XML equivalent.

The interface will be introduced in Spring 4.1.7 / 4.2 RC2 so we're reflectively adding it if present. Might be something we can think of making less indirect for Fowler once 4.1.7 has been released.
2015-06-17 15:44:26 +02:00
Oliver Gierke
b294bfce3b DATACMNS-714 - Added support for CompletableFuture and ListenableFuture for query methods.
Spring Framework 4.2 is going to introduce support for CompletableFuture as return type for @Async methods. Support for Spring's ListenableFuture has already been supported in the framework 4.1. We've added the necessary infrastructure to  allow these types as return types on repository methods, too.

Related tickets: SPR-13128.
2015-06-16 14:35:21 +02:00
Oliver Gierke
a8b64c3828 DATACMNS-710 - Polishing.
Some additional JavaDoc, deprecations, copyright headers.

Original pull request: #128.
2015-06-15 22:16:46 +02:00
Phillip Webb
8156c2a151 DATACMNS-710 - Replace ObjectInstantiatorClassGenerator
Deprecate ObjectInstantiatorClassGenerator and provide a replacement
ClassGeneratingEntityInstantiator which doesn't retain a reference to
the context class loader.

Original pull request: #128.
2015-06-15 22:16:43 +02:00
Oliver Gierke
b60f5d84ec DATACMNS-648 - Parameters now holds a non-static ParameterNameDiscoverer.
Turned the previously static ParameterNameDiscoverer into an instance variable to make sure the instance can be GCed correctly.
2015-06-15 18:01:42 +02:00
Oliver Gierke
de4f1ffb7b DATACMNS-713 - PageImpl now adapts total if necessary.
On a last page the total handed into a PageImpl constructor might not necessarily fit the content as there's the change of an insertion or deletion between the calculated count and the retrieval of the content. We now leniently mitigate those differences if the page created is the last page of the result.

Related tickets: DATAJPA-728, DATACMNS-615.
2015-06-15 14:24:03 +02:00
Oliver Gierke
7107a599bb DATACMNS-710 - ObjectInstantiatorClassGenerator now uses default class loader.
We're now using ClassUtils.getDefaultClassloader() to make sure we adhere to any class loading tricks the framework might impose for domain type instantiation.
2015-06-09 22:01:25 +02:00
阮杰锋
a57bac07e2 DATACMNS-707 - Fixed typo in JavaDoc of CrudRepository
Changed from ( to { in JavaDoc of file CrudRepository.

Original pull request: #127.
2015-06-09 11:33:41 +02:00
Oliver Gierke
501f0c8493 DATACMNS-700 - ReflectionRepositoryInvoker now captures context for failed parameter conversions.
Introduced QueryMethodParameterConversionException to capture the context of a failed ConversionException to allow better error reporting.

Cleaned up test cases to not use deprecated API anymore.
2015-05-22 10:29:19 +02:00
Oliver Gierke
1fb7466065 DATACMNS-701 - First and last links are now always rendered for navigable PagedResources.
We now always render both first and last links in case the page returned is navigable, which essentially means: whenever the result spans across more than one page. I.e. whenever either a next or prev link will be rendered, both first and last links are rendered, too.

Clients can still reason about the fact whether they're on the first or last page by the non-presence of prev (indicates you're on the first page) or next (indicates you're on the last page).
2015-05-20 13:33:53 +02:00
Oliver Gierke
62170ab767 DATACMNS-701 - PagedResourcesAssembler now adds first and last links.
We now add first and last links to the PagedResources created in line with the appearance of the prev and next links. The PagedResourcesAssembler can be configured to enforce the rendering using setForceFirstAndLastRels(…).
2015-05-20 13:30:41 +02:00
Oliver Gierke
c5aaebd0e4 DATACMNS-699 - PagedResourcesAssembler now allows to create empty Page with type information. 2015-05-18 16:19:14 +02:00
Oliver Gierke
65104a4a3a DATACMNS-697 - TypeDiscoverer now considers field-local generics information.
In case we create a ParameterizedTypeInformation for a property we now also analyze the field-local generics information and add the discovered type mappings to the type variable map.
2015-05-16 18:55:47 +02:00
Oliver Gierke
6ebb05e606 DATACMNS-515 - Links for PagedResources should be canonical.
PagedResourcesAssembler now creates the self, prev and next links for a PagedResource to be canonical and not contain any template parameters. This is to make sure a client can not actually tweak the links and follow a link that's not strictly conforming to semantics of the rel.
2015-05-14 14:06:35 +02:00
Oliver Gierke
5b60d487e1 DATACMNS-695 - Fixed potential NullPointerException in AbstractMappingContext.getPersistentPropertyPath(…).
When traversing nested property paths, AbstractMappingContext.getPersistentPropertyPath(…) previously used the raw actual property type. If the property path contains a reference to a generically typed property, this causes the deeper paths not being resolved correctly.

We now explicitly use the TypeInformation of the property to retain generics information while traversing the path.
2015-05-13 18:33:58 +02:00
Oliver Gierke
9230b5f30f DATACMNS-692 - Fixed web parameter range handling for Pageables.
In case the PageableHandlerMethodArgumentResolver was configured to use one-indexed parameters, it wasn't defaulting the lower bounds for the page number. This caused indexes out of the allowed bound submitted causing an invalid index handed tor PageRequest. We now apply better range shifting before the bounds are applied.
2015-05-13 18:00:19 +02:00