[resteasy-dev] Fwd: SPI to add JAX-RS annotations dynamically

Christian Kaltepoth christian at kaltepoth.de
Sun Dec 24 03:45:41 EST 2017


Hi Alessio,

sorry for the delayed response. I finally found some time to have a deeper
look at this. I would like to describe my idea, so I can get feedback
before starting the implementation.


To recap what I'm trying to achieve: Basically the idea is to create a SPI
which allows to alter the metadata of resource classes. I came up with the
following interface for such a SPI:

    public interface ResourceClassProcessor {
        ResourceClass process( ResourceClass clazz );
    }

IMO this interface provides most flexibility. The idea is similar to what
CDI provides with AnnotatedType
<https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedType.html>.
Implementations of the new SPI can either return the provided class (if
they don't want to change it) or they can return a new instance, typically
something that wraps the original class and changes only a few methods.

Integrating this SPI requires two refactorings of the existing code base,
but I really think that this will improve the overall structure of the
metadata handling:

   - Currently ResourceClass
   <https://github.com/resteasy/Resteasy/blob/master/resteasy-jaxrs/src/main/java/org/jboss/resteasy/spi/metadata/ResourceClass.java>,
   ResourceMethod
   <https://github.com/resteasy/Resteasy/blob/master/resteasy-jaxrs/src/main/java/org/jboss/resteasy/spi/metadata/ResourceMethod.java>,
   etc. are classes with protected fields which are directly accessed by the
   ResourceBuilder
   <https://github.com/resteasy/Resteasy/blob/master/resteasy-jaxrs/src/main/java/org/jboss/resteasy/spi/metadata/ResourceBuilder.java>.
   The first required refactoring would be to extract interfaces from these
   classes so that we get an interface ResourceClass with a default
   implementation DefaultResourceClass. Same for ResourceMethod, etc. This
   will allow other implementations of these interfaces later on.
   - Currently ResourceBuilder
   <https://github.com/resteasy/Resteasy/blob/master/resteasy-jaxrs/src/main/java/org/jboss/resteasy/spi/metadata/ResourceBuilder.java>
   has only static methods to build ResourceClasse instances. This makes it
   difficult to "configure" this builder with such processors. Therefore, I
   would like to refactor the builder from a "utility class" with static
   methods to something that can be instantiated and therefore also be
   configured. I think ResteasyProviderFactory
   <https://github.com/resteasy/Resteasy/blob/master/resteasy-jaxrs/src/main/java/org/jboss/resteasy/spi/ResteasyProviderFactory.java>
would
   be a good place to create such a builder _once_ and then provide it to all
   components that want to use it.

With these refactorings integrating the new SPI should be easy.
ResteasyProviderFactory
<https://github.com/resteasy/Resteasy/blob/master/resteasy-jaxrs/src/main/java/org/jboss/resteasy/spi/ResteasyProviderFactory.java>
could lookup the SPI implementations using the default provider mechanism.
The processors will then be feed into the ResourceBuilder when creating it.
The ResourceBuilder can then build the metadata for classes from
annotations (as it is done today) and after that apply all
ResourceClassProcessors before returning the ResourceClass to the other
components (like the registry). This will ensure that the processors are
applied consistently.

I think the two refactorings mentioned above a worth the effort because
they improve the overall structure of the metadata package
<https://github.com/resteasy/Resteasy/tree/master/resteasy-jaxrs/src/main/java/org/jboss/resteasy/spi/metadata>
and provides much more flexibility in the future. And they also allow
integrate the new SPI very easily.


What do you think? If you agree that the refactorings are a good thing, I
will start to work on them and provide a pull request.

Christian



2017-09-27 22:25 GMT+02:00 Alessio Soldano <asoldano at redhat.com>:

> Forwarding to the list :-)
>
>
> ---------- Forwarded message ----------
> From: Alessio Soldano <asoldano at redhat.com>
> Date: Wed, Sep 27, 2017 at 10:24 PM
> Subject: Re: [resteasy-dev] SPI to add JAX-RS annotations dynamically
> To: Christian Kaltepoth <christian at kaltepoth.de>
>
>
> Hi Christian,
>
> On Wed, Sep 27, 2017 at 9:19 PM, Christian Kaltepoth <
> christian at kaltepoth.de> wrote:
>
>>
>> sorry for the delayed response. I agree that if some SPI would allow to
>> modify the builders, it should be done before the resource is registered in
>> the resource factory. Do you think such a SPI would be useful for others?
>>
>
> Probably yes, but your scenario might even be enough to justify it.
>
>
> I would be happy to contribute some code if it improves portability
>> between RESTEasy and the MVC RI.
>>
>
> Sure, feel free to work on that and send a PR.
>
>
>> Thanks for pointing me to the resteasy-cdi integration. I'll have a
>> deeper look at it in the next days.
>>
>
> OK, good, I hope that can offer some idea for integrating.
>
> Cheers
> Alessio
>
>
>
> _______________________________________________
> resteasy-dev mailing list
> resteasy-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/resteasy-dev
>
>


-- 
Christian Kaltepoth
Blog: http://blog.kaltepoth.de/
Twitter: http://twitter.com/chkal
GitHub: https://github.com/chkal
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/resteasy-dev/attachments/20171224/d9532ddf/attachment-0001.html 


More information about the resteasy-dev mailing list