Commit Graph

522 Commits

Author SHA1 Message Date
Oliver Gierke
241d18a212 DATACMNS-863 - Fixed parameter type lookup for wrapper types.
When repository parameters use wrapper types (e.g. Optional) the Parameter instance for that parameter now returns the component type.
2016-06-04 14:35:39 +02:00
Oliver Gierke
e414cd6801 DATACMNS-862 - ReturnedInterface now considers interfaces implemented by the domain type.
We now check whether the interface return type is implemented by the domain type and opt out of all projection efforts if so.
2016-06-01 17:50:08 +02:00
Oliver Gierke
bdc61a044f DATACMNS-859, DATACMNS-860 - Improvements to ResourceProcessor.
ResourceProcessor supports Streams now and adds a map(…) step to apply projections.

Also, the ProjectingConverter falls back to use a default ConversionService instance to make use of the object mapping functionality implemented in ObjectToObjectConverter, i.e. the ability to just map an object returned from the store to a DTO in case that latter exposes a constructor or factory methods taking the source instance as parameter.

Related tickets: DATAJPA-903.
2016-05-25 15:04:29 +02:00
Oliver Gierke
3a36ed55dd DATACMNS-854 - Polishing.
Simplified conditional expressions in DefaultRepositoryInformation. Reordered test method to reflect natural order of adding.

Original pull request: #162.
2016-05-24 19:05:37 +02:00
Terje Strand
e0fc7deb05 DATACMNS-854 - Allow custom implementation of repository methods with generics.
Add additional check for detecting customized method where method contains generics. Overriding methods without generics already works, this patch simply makes the behavior consistent.

Original pull request: #162.
2016-05-24 19:05:31 +02:00
Oliver Gierke
fa7ab50c5f DATACMNS-855 - Fixed generic type lookup in SyntheticParamterizedType.
The translation of the list of actual type parameters into an array now uses the loop index correctly. Previously, it always used the first type parameter.
2016-05-13 11:32:31 +02:00
Oliver Gierke
9db6278e77 DATACMNS-855 - Prevent memory leak in SyntheticParameterizedType.
Added proper equals(…) and hashCode() methods to SyntheticParameterizedType to make sure instances created for the same type information and type parameters are considered equal.
2016-05-12 16:48:01 +02:00
Oliver Gierke
f29cbf5752 DATACMNS-853 - Polishing.
Simplified test case. Formatting in ClassGeneratingPropertyAccessorFactory.

Related tickets: DATACMNS-809.
Original pull request: #161.
Related pull request: #160.
2016-05-12 15:45:05 +02:00
John Blum
08e8f15845 DATACMNS-853 - Added test case reproducing the issue.
Reproduce issue accessing persistent properties from interface-based entities using the ClassGeneratingPropertyAccessorFactory.

Related tickets: DATACMNS-809.
Original pull request: #161.
Related pull request: #160.
2016-05-12 15:31:09 +02:00
Oliver Gierke
38a41139fc DATACMNS-809 - Polishing.
Removed DefaultPersistentPropertyAccessorFactory as it only delegates to the class generating one. Tweaked AbstractMappingContext to actually use the latter in the first place. Introduced BeanWrapperPropertyAccessorFactory to implement the default behavior of using a BeanWrapper and initialize BasicPersistentEntity to avoid a null clause in getPersistentPropertyAccessor(…).

Removed getPersistentPropertyAccessorFactory and rather rely on ReflectionTestUtils in tests to avoid additional API being exposed.

Original pull request: #159.
2016-05-03 16:47:54 +02:00
Mark Paluch
defc3c7874 DATACMNS-809 - Refactor BasicPersistentEntity to set PersistentPropertyAccessorFactory.
PersistentPropertyAccessorFactory can be set on a BasicPersistentEntity. This is done by AbstractMappingContext once the entity is verified. This change reduces the count of PersistentPropertyAccessorFactory instances and performs the isSupported check only once, when initializing the entity.

Original pull request: #159.
2016-05-03 16:47:54 +02:00
Oliver Gierke
41fe89743b DATACMNS-809 - Polishing.
Made as many methods in ClassGeneratingPropertyAccessorFactory static as possible. Some code formatting. Some warning suppressions where needed.

Original pull request: #159.
2016-05-03 16:47:54 +02:00
Mark Paluch
899a98c83e DATACMNS-809 - Add Class-generating property accessor factory.
We now support generated PersistentPropertyAccessors when using Java 7 and if property/association name hashCodes are unique within a PersistentEntity.
Generated PersistentPropertyAccessors provide optimized access to properties. They use either MethodHandles or direct property/field access, depending on the visibility/final modifiers of the entity type and its members. A generated PersistentPropertyAccessor is injected into the originating class loader of the entity class to enable optimizations for package-default/protected member access.

Original pull request: #159.
2016-05-03 16:47:53 +02:00
Oliver Gierke
0515b1308c DATACMNS-850 - ReturnedClass now does not consider core Java types DTOs.
We now completely ignore all core Java types (i.e. types with a package name starting with "java.") from being DTOs. This allows query methods to project on date time types, too.
2016-04-28 16:43:06 +02:00
Oliver Gierke
e1c69c9a2d DATACMNS-840 - Repository query methods returning enums are not considered projecting now. 2016-04-10 11:24:37 +02:00
Oliver Gierke
f6c876b9bd DATACMNS-842 - Projections on repository methods support Slices now.
ResultProcessor now checks for Slice instead of Page as the projection applying method map(…) is available on Slice as well.
2016-04-09 14:09:40 +02:00
Oliver Gierke
3ff31e5f89 DATACMNS-840 - ReturnedType's need for custom construction no includes availability of input properties.
The indicator of whether custom construction is needed for a class based return type now includes whether input properties are available in the first place.
2016-04-08 18:50:57 +02:00
Oliver Gierke
5cfed9e003 DATACMNS-840 - ReturnedClass now aborts parameter name detection for types with multiple constructors.
In case a DTO type exposes multiple no-argument constructors we now leniently abort the parameter name detection and let downstream users decide what to do in this particular case.

The problematic case can't be outright rejected here already as there's valid scenarios for that, e.g. in JPA the type could be used for multiple query methods, using explict constructor expressions listing arguments explicitly and thereby select one of the multiple constructors.
2016-04-08 10:09:37 +02:00
Oliver Gierke
137d7cc544 DATACMNS-818 - Renamed Tuple to Pair.
Got rid off manual implementation code in favor of Lombok annotations.
2016-03-18 09:54:29 +01:00
Oliver Gierke
26f725be0d DATACMNS-810 - Polishing.
Renamed ExampleSpecification to ExampleMatcher and introduced a matching() factory method, dropping the dedicated override mechanism for types for now. Updated documentation accordingly.

Used Lombok for constructor creation, field defaults, toString() as well as equals(…) and hashCode() implementations.

Tweaked imports in unit tests. Renamed methods to express expected behavior.

Original pull request: #153.
2016-03-17 16:22:55 +01:00
Mark Paluch
b0ce7009e8 DATACMNS-810 - Refactor Query by Example API.
Split Example and ExampleSpec to create reusable components. Refactor builder pattern to a fluent API that creates immutable instances. Split user and framework API, Example and ExampleSpec are user API, created ExampleSpecAccessor for modules to access example spec configuration. Create static methods in GenericPropertyMatchers to ease creation of matchers in a readable style. Convert PropertySpecifier to inner class  and move PropertySpecifiers to ExampleSpec.

Related tickets: DATAJPA-218, DATAMONGO-1245.
Original pull request: #153.
2016-03-17 16:17:39 +01:00
Christoph Strobl
4092f0716f DATACMNS-810 - Add core types for Query by Example support.
Added required types for Query by Example which should be used by the individual store implementations. 

Generally the Example type captures a sample object and allow various settings concerning the mapping into an actual query. So there’s configuration options for handling null values, string matching, property paths to ignore,

Related tickets: DATAJPA-218, DATAMONGO-1245.
Original pull request: #153.
2016-03-17 16:17:39 +01:00
Oliver Gierke
a8db5e3d23 DATACMNS-829 - Fixed handling of Map null values in ProxyProjectionFactory.
We now eagerly return null values in attempts to project Map values.
2016-03-15 15:46:56 +01:00
Oliver Gierke
f8ea9fb8ab DATACMNS-828 - Polishing.
Fixed JavaDoc in unit tests.
2016-03-15 15:05:03 +01:00
Oliver Gierke
c57bfec696 DATACMNS-828 - Fixed potential NullPointerException in ResultProcessor.
ResultProcessor.processResult(…) now explicitly handles null values to prevent IllegalArgumentExceptions being provoked in the ProjectionFactory which occurred if null values were handed down to it.
2016-03-15 15:04:28 +01:00
Oliver Gierke
f0f9d5bc20 DATACMNS-825 - Polishing.
Tweaked annotation cache usage in BasicPersistentEntity.findAnnotation(…).

Original pull request: #156.
2016-03-15 13:20:20 +01:00
Christoph Strobl
a40e247c25 DATACMNS-825 - Allow usage of composed annotations using @AliasFor.
We now resolve composed annotation values using @AliasFor within AnnotationBasedPersistentProperty and BasicPersistentEntity. Nevertheless it is up to the individual store implementation to make use of this.

Original pull request: #156.
2016-03-13 16:30:03 +00:00
Oliver Gierke
deb884dfb1 DATACMNS-821 - Improved type prediction for FactoryBean implementations.
Previously, we registered an InstantiationAwareBeanPostProcessor to predict the type to be created by RepositoryFactoryBeanSupport by inspecting a particular property value of the registered BeanDefinition.

This has now been elevated to a more generic mechanism that can get a FactoryBean type configured with a set of properties to inspect for a configured type. That new infrastructure now replaces the explicit configuration for RepositoryFactoryBeanSupport with one that's set up via configuration.
2016-02-26 19:21:01 +01:00
Oliver Gierke
d3e6ad104c DATACMNS-820 - Polishing.
Fixed indentation to use tabs instead of spaces. Tweaked structure of if-clauses in PropertyAccessingMethodInterceptor to reduce nesting. Made helper method static. 

Restructured test cases slightly and used ExpectedException rule to verify exceptions. Moved newly introduced test methods more to the end of the file (new tests last).

Added author and copyright year extensions where necessary.

Original pull request: #155.
2016-02-20 20:33:14 +01:00
Mark Paluch
e868577def DATACMNS-820 - Allow setter invocations in projections backed by beans.
Invocations to setter methods are now passed to the backing bean.

Original pull request: #155.
2016-02-20 20:33:13 +01:00
Oliver Gierke
85e569b4f6 DATACMNS-804 - ParametersParameterAccessor now correctly iterates over only the bindable values.
Corrected the way the BindableParametersIterator works by limiting the upper bound of the iteration to the number of actually bindable parameters.
2016-01-21 10:19:59 +01:00
Oliver Gierke
b17a797fe6 DATACMNS-802 - PagedResourceAssembler now allows customizing the PagedResource instance.
Introduced a template method to override the creation of a PagedResource to allow subclasses to create a more concrete instance than PagedResource itself.
2016-01-20 14:24:38 +01:00
Oliver Gierke
c916fcb1c1 DATACMNS-801 - Make sure PropertyReferenceException does not expose duplicate potential matches.
We now use a Set to collect potential matches from fields and accessors.

Polished assertions and JavaDoc in PropertyPath along the way.
2016-01-12 08:39:44 +01:00
Oliver Gierke
80e44a3fc0 DATACMNS-89 - Returned type now does not consider Number types DTO types. 2016-01-08 16:00:15 +01:00
Oliver Gierke
306795468d DATACMNS-795 - Added support for Scala's Option type on repositories.
Just like with Google's or Java 8's optional we now support Scala's Option type as wrapper fro return values on repositories.
2015-12-16 19:54:27 +01:00
Oliver Gierke
4af7fe3165 DATACMNS-89 - ChainingConverter now eagerly returns values.
The ChainingConverter now returns values as soon as one converter in the chain produces an instance that's compatible to the target type. This allows ResourceProcessor clients to provide a Converter to take care of the complete conversion themselves.
2015-12-15 13:34:36 +01:00
Oliver Gierke
dbe79f89a9 DATACMNS-89 - Infrastructure for projections on repository queries.
QueryMethods now expose a ResourceProcessor which is exposes information about the final to be created object types which can either be DTOs containing a persistence constructor (see @PersistenceConstructor) or projection interfaces. The former are analyzed for constructor properties so that store implementations can use that information to create projected queries that return exactly the fields required for that DTO.

Projection interfaces are inspected, their properties are considered input properties and the same projection queries can be issued against the data store. If a projection contains dynamically calculated properties (i.e. it uses SpEL expressions via @Value) the original entities have to be queried and can be projected during post processing.

ProjectionFactory now exposes a more advanced ProjectionInformation that has additional meta information about the projection type. ProxyProjectionFactory now refers to the BeanClassLoader instead of the ResourceLoader.

RepositoryFactory(Bean)Support now also implement BeanFactoryAware to forward the BeanFactory to the SpelAwareProxyProjectionFactory which in turn now gets handed into the QueryLookupStrategy as well as the QueryMethod.

Parameter now knows about a dynamic projection type, which is a query method parameter of type Class bound to a generic method parameter and will be used to determine the projection to be used on a per call basis.

Original pull request: #150.
2015-12-14 19:31:33 +01:00
Oliver Gierke
c60cd647cc DATACMNS-794 - Repositories now exposes RepositoryInformation for repository interfaces. 2015-12-10 08:23:24 +01:00
Oliver Gierke
b0f81ef80a DATACMNS-790 - Added Tuple value type.
Related pull request: https://github.com/spring-projects/spring-data-mongodb/pull/327.
2015-11-26 16:14:56 +01:00
Oliver Gierke
3ed2f44e60 DATACMNS-787 - QuerydsBindings now allows aliasing of paths.
If a single path is now handed to QuerydslBindings.bind(…), a specialized AliasingPathBinder is returned which allows defining an alias the binding will be exposed under.

By default that alias will cause the original binding being black-listed and thus become unavailable for binding. This can be overridden by explicitly white-listing the properties to be bindable.
2015-11-23 13:07:19 +01:00
Oliver Gierke
c013c71e7a DATACMNS-670 - Upgraded to Querydsl 4.
Switched to new Querydsl 4 artifacts and adapted to changed package names and API changes.

Cleaned up some JavaDoc and APIs in QuerydslBindingsFactory and QuerydslBinderCustomizer.
2015-11-17 11:07:05 +01:00
Oliver Gierke
d2737983c3 DATACMNS-783 - DefaultTypeMapper now specializes raw generic types.
If the type lookup from the store source returns a raw generic type (e.g. resolving the value of a generic property against a value of that generic type - i.e. not a more concrete type binding the generic information) in the context of a generic property, we previously did not apply the generics information of the contextual instance to that very raw type.

We now expose a TypeInformation.specialize(ClassTypeInformation) which applies the current generics context to the given raw type and basically creates a synthetic parameterized TypeInformation instance.

DefaultTypeMapper applies this specialization by default now with ClassTypeInformation simply returning the given type as is so that we don't create any resolution overhead in case no generics are involved in the first place.
2015-11-13 17:16:47 +01:00
Oliver Gierke
0d6476c642 DATACMNS-782 - ProxyProjectionFactory now converts primitive attribute values.
The ProjectingMethodInterceptor now uses a default ConversionService instance to try to convert a potentially not matching result of the target invocation into the type the projection requires before the attempt to create nested projection.
2015-11-12 11:17:43 +01:00
Oliver Gierke
1185e71214 DATACMNS-768 - Added support for Optional as query method parameter type.
Query method parameter values of JDK 8 or Guava Optional type are now transparently unwrapped on parameter value access. ParametersParameterAccessor now unwraps them on instance creation.
2015-10-07 19:28:19 +02:00
Oliver Gierke
828c19a4e5 DATACMNS-773 - Added support for persisting ZoneId instances as Strings.
We now ship converters for JSR-310 and ThreeTenBP's ZoneId conversion to String and back.
2015-10-05 18:03:42 +02:00
Oliver Gierke
be47572e56 DATACMNS-769 - Fixed assignability check for from QueryMethod.
The assignability check of method return types now explicitly detects wrapper types supported in QueryExceutionConverters and automatically unwraps those before the actual check.
2015-10-05 12:04:26 +02:00
Oliver Gierke
01f2c30b1d DATACMNS-753 - Fixed default handling of empty sort parameter.
We now correctly inspect the sort parameter values and also fall back to the default if a single, empty parameter value is given.

Related ticket: DATACMNS-408.
Related pull request: #138.
2015-09-09 17:56:27 +02:00
Ruben Dijkstra
9d9f230ed4 DATACMNS-753 - Added test case to see parsing of Sort is not considering defaults for empty parameter.
Related ticket: DATACMNS-408.
Original pull request: #138.
2015-09-09 17:55:43 +02:00
Oliver Gierke
360e473c3a DATACMNS-763 - Fixed constructor in example of custom repository base class.
Added hint to which constructor of the superclass to override. Added test cas e to make sure the expected types are advertised in the case of an error.
2015-09-07 09:15:13 +02:00
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