You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@camel.apache.org by zregvart <gi...@git.apache.org> on 2017/04/04 21:16:02 UTC
[GitHub] camel pull request #1594: CAMEL-11087 Create a Annotation processor that cre...
GitHub user zregvart opened a pull request:
https://github.com/apache/camel/pull/1594
CAMEL-11087 Create a Annotation processor that creates REST DSL source code from Swagger specification
**This crazy implementation submitted for review, thanks for looking at it \U0001f947**
I would specifically like to know:
- is there a need for this (I have a Maven plugin in mind also)?
- is this too convoluted and too hacky?
- as usual any other suggestions on code style/implementation choices
This is an implementation of the Annotation processor to generate REST
DSL RouteBuilder source code from Swagger specification. The processor
is triggered by the presence of @SwaggerRestDsl annotation:
@SwaggerRestDsl(className = "MyRestRoute",
packageName = "com.example",
specificationUri = "specification.json"
destinationGenerator = CustomDestinationGenerator.class)
This would generate source code for `com.example.MyRestRoute` from
`specification.json` using `CustomDestinationGenerator` to generate `to`
route endpoint.
`@SwaggerRestDsl` annotation can be placed on a Java type
(`ElementType.TYPE`), and it is not present in the compiled class
(`RetentionPolicy.SOURCE`).
Annotation processors do not _in general_ access resources outside Java
type system, this can be done but not with 100% reliability, most
notably when used in IDEs accessing resources can fail. This is mostly
due to a fact that `Filer::getResource`[1] does not mandate the support
for `StandardLocation.SOURCE_PATH`[2] location. So this implementation
tries to search for the specified `specificationUri`.
There is no support for remote (i.e. http) `specificationUri`s.
The use of `destinationGenerator` is also very contrary to annotation
processor architecture. Accessing `Class` objects that are being
compiled is not possible as one has access to a partial AST (with
com.sun.* full AST) through `javax.lang.model.element`
and `javax.lang.model.type` packages. So if the `destinationGenerator`
is not present on the output (usually target/classes with Maven), the
implementation locates the source code for the DestinationGenerator and
spawns another compiler to output the compiled class into a temp
directory. The classpath needed for this step is computed by enumerating
all elements within `StandardLocation.CLASS_PATH` and computing paths to
either JAR files or directories (`bin`, and directories containing the
word `classes` are picked). If the class is found compiled within output
directory (incremental compile) or class has been compiled into the temp
directory (clean compile) it can be loaded and instantiated and used in
REST DSL generation.
[1] https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Filer.html#getResource-javax.tools.JavaFileManager.Location-java.lang.CharSequence-java.lang.CharSequence-
[2] https://docs.oracle.com/javase/8/docs/api/javax/tools/StandardLocation.html#SOURCE_PATH
You can merge this pull request into a Git repository by running:
$ git pull https://github.com/zregvart/camel CAMEL-11087
Alternatively you can review and apply these changes as the patch at:
https://github.com/apache/camel/pull/1594.patch
To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:
This closes #1594
----
commit 58b77c2ffbf9a36f3d43ccdde2e13ae79eafde90
Author: Zoran Regvart <zr...@apache.org>
Date: 2017-04-03T19:47:45Z
CAMEL-11087 Create a Annotation processor that ...
...creates REST DSL source code from Swagger specification
This is an implementation of the Annotation processor to generate REST
DSL RouteBuilder source code from Swagger specification. The processor
is triggered by the presence of @SwaggerRestDsl annotation:
@SwaggerRestDsl(className = "MyRestRoute",
packageName = "com.example",
specificationUri = "specification.json"
destinationGenerator = CustomDestinationGenerator.class)
This would generate source code for `com.example.MyRestRoute` from
`specification.json` using `CustomDestinationGenerator` to generate `to`
route endpoint.
`@SwaggerRestDsl` annotation can be placed on a Java type
(`ElementType.TYPE`), and it is not present in the compiled class
(`RetentionPolicy.SOURCE`).
Annotation processors do not _in general_ access resources outside Java
type system, this can be done but not with 100% reliability, most
notably when used in IDEs accessing resources can fail. This is mostly
due to a fact that `Filer::getResource`[1] does not mandate the support
for `StandardLocation.SOURCE_PATH`[2] location. So this implementation
tries to search for the specified `specificationUri`.
There is no support for remote (i.e. http) `specificationUri`s.
The use of `destinationGenerator` is also very contrary to annotation
processor architecture. Accessing `Class` objects that are being
compiled is not possible as one has access to a partial AST (with
com.sun.* full AST) through `javax.lang.model.element`
and `javax.lang.model.type` packages. So if the `destinationGenerator`
is not present on the output (usually target/classes with Maven), the
implementation locates the source code for the DestinationGenerator and
spawns another compiler to output the compiled class into a temp
directory. The classpath needed for this step is computed by enumerating
all elements within `StandardLocation.CLASS_PATH` and computing paths to
either JAR files or directories (`bin`, and directories containing the
word `classes` are picked). If the class is found compiled within output
directory (incremental compile) or class has been compiled into the temp
directory (clean compile) it can be loaded and instantiated and used in
REST DSL generation.
[1] https://docs.oracle.com/javase/8/docs/api/javax/annotation/processing/Filer.html#getResource-javax.tools.JavaFileManager.Location-java.lang.CharSequence-java.lang.CharSequence-
[2] https://docs.oracle.com/javase/8/docs/api/javax/tools/StandardLocation.html#SOURCE_PATH
----
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---
[GitHub] camel pull request #1594: CAMEL-11087 Create a Annotation processor that cre...
Posted by zregvart <gi...@git.apache.org>.
Github user zregvart closed the pull request at:
https://github.com/apache/camel/pull/1594
---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastructure@apache.org or file a JIRA ticket
with INFRA.
---