SpringSource/spring-data-rest — pull request #34 by olivergierke (2012-08-22 14:31:04+00:00)
Title: DATAREST-40 - General purpose post-processing mechanism for resources.

This commit implements the components described in DATAREST-40. The core
of it is the ResourceProcessingHandlerMethodReturnValueHandler. It gets
ResourceProcessor and ResourcesProcessor instances handed into its
constructor and selects the ones that need to be invoked in the calls to
handleReturnValue(…). In this process it does a variety of generics
checks to ensure only the correct post-processors. To do so it inspects
the controller method's return type, the object value type as well as
the returned value potentially.

Assume we have a specialized Resource type
StringResource extends Resource. Beyond that we have a
ResourceProcessor> registered. Here's the decision
matrix:

Return type	Returned type	What get's used?
Resource	Resource	object value inspected (Resource.getContent())
Resource	Resource	method return type
Resource	StringResource	object value type as it's more specialized
StringResource	StringResource	method return type
Resource	Resource	no invocation, object value doesn't match
Resource	Resource	no invocation, object value doesn't match
Resource	Resource	no invocation, object value doesn't match

This works exactly the same for Resources returned. We peek into the
collection returned by getContent() in case return value inspection is
needed for type matches. If the collection is empty we don't match. The
same applies to null values returned.

The second component added is the ResourcePostProcessorInvokingHandlerAdapter
which customizes the setup of a RequestMappingHandlerAdapter by fronting
the current configuration with the
ResourceProcessingHandlerMethodReturnValueHandler to let it intercept
the handling and potentially call the post-processors.

Upgraded to snapshots of Spring Data Commons until we get to the next
release and added Mockito as dependency.