From cdfc04f1391ea548762307fd51df7bd73efaf48f Mon Sep 17 00:00:00 2001 From: Konstantin Gribov Date: Wed, 25 Jul 2012 14:09:27 +0400 Subject: [PATCH 1/2] Updated jsr311-api to v1.1.1 to support ApplicationPath --- doclets/pom.xml | 6 +++--- pom.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doclets/pom.xml b/doclets/pom.xml index a22efe4..dc87d8f 100644 --- a/doclets/pom.xml +++ b/doclets/pom.xml @@ -138,7 +138,7 @@ javax.ws.rs jsr311-api - 1.1 + 1.1.1 jpadocs @@ -203,7 +203,7 @@ javax.ws.rs jsr311-api - 1.1 + 1.1.1 org.jboss.resteasy @@ -220,7 +220,7 @@ javax.ws.rs jsr311-api - 1.1 + 1.1.1 org.hibernate.javax.persistence diff --git a/pom.xml b/pom.xml index c109a21..e095542 100644 --- a/pom.xml +++ b/pom.xml @@ -136,7 +136,7 @@ javax.ws.rs jsr311-api - 1.1 + 1.1.1 jar From ff508c3aab079d2a310069d746b85454d54caa85 Mon Sep 17 00:00:00 2001 From: Konstantin Gribov Date: Wed, 25 Jul 2012 18:31:02 +0400 Subject: [PATCH 2/2] Added support for @ApplicationPath in JAX-RS Fixed #47 "Support for @ApplicationPath in JAX-RS doclet" Now application path from javax.ws.rs.core.Application child prepended to resources. --- .../doclets/jax/jaxrs/JAXRSDoclet.java | 35 ++++++++++++++++++- .../jax/jaxrs/model/ResourceClass.java | 9 +++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/doclets/src/main/java/com/lunatech/doclets/jax/jaxrs/JAXRSDoclet.java b/doclets/src/main/java/com/lunatech/doclets/jax/jaxrs/JAXRSDoclet.java index 20ede36..aef9490 100644 --- a/doclets/src/main/java/com/lunatech/doclets/jax/jaxrs/JAXRSDoclet.java +++ b/doclets/src/main/java/com/lunatech/doclets/jax/jaxrs/JAXRSDoclet.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.LinkedList; +import javax.ws.rs.ApplicationPath; import javax.ws.rs.Path; import com.lunatech.doclets.jax.JAXDoclet; @@ -32,6 +33,7 @@ import com.lunatech.doclets.jax.jaxrs.tags.*; import com.lunatech.doclets.jax.jaxrs.writers.IndexWriter; import com.lunatech.doclets.jax.jaxrs.writers.SummaryWriter; +import com.sun.javadoc.AnnotationDesc; import com.sun.javadoc.ClassDoc; import com.sun.javadoc.DocErrorReporter; import com.sun.javadoc.LanguageVersion; @@ -43,10 +45,12 @@ import com.sun.tools.doclets.internal.toolkit.taglets.LegacyTaglet; public class JAXRSDoclet extends JAXDoclet { + public static final String JAX_RS_APP_CLASS = "javax.ws.rs.core.Application"; public final HtmlDoclet htmlDoclet = new HtmlDoclet(); private static final Class[] jaxrsAnnotations = new Class[] { Path.class }; + private String rootPath; public static int optionLength(final String option) { if ("-jaxrscontext".equals(option)) { @@ -92,6 +96,7 @@ protected JAXRSConfiguration makeConfiguration(ConfigurationImpl configuration) public void start() { final ClassDoc[] classes = conf.parentConfiguration.root.classes(); + findApplicationRoot(classes); for (final ClassDoc klass : classes) { if (Utils.findAnnotatedClass(klass, jaxrsAnnotations) != null) { handleJAXRSClass(klass); @@ -105,8 +110,36 @@ public void start() { Utils.copyResources(conf); } + private void findApplicationRoot(ClassDoc[] classes) { + List applicationClasses = new LinkedList(); + + for (final ClassDoc klass : classes) { + if (Utils.findSuperTypeFromClass(klass, JAX_RS_APP_CLASS) != null) { + applicationClasses.add(klass); + } + } + + switch (applicationClasses.size()) { + case 0: + getRootDoc().printNotice("JAX-RS root will be set by servlet-mapping for " + JAX_RS_APP_CLASS + "."); + break; + + case 1: + AnnotationDesc annotation = Utils.findAnnotation(applicationClasses.get(0), ApplicationPath.class); + rootPath = (String) Utils.getAnnotationValue(annotation); + break; + + default: + getRootDoc().printWarning("Ambiguous JAX-RS " + JAX_RS_APP_CLASS + " def:"); + for (final ClassDoc klass : classes) { + getRootDoc().printWarning(klass.position(), ""); + } + break; + } + } + private void handleJAXRSClass(final ClassDoc klass) { - jaxrsMethods.addAll(new ResourceClass(klass, null).getMethods()); + jaxrsMethods.addAll(new ResourceClass(klass, null, rootPath).getMethods()); } public void warn(String warning) { diff --git a/doclets/src/main/java/com/lunatech/doclets/jax/jaxrs/model/ResourceClass.java b/doclets/src/main/java/com/lunatech/doclets/jax/jaxrs/model/ResourceClass.java index 2bd374d..ab79fa1 100644 --- a/doclets/src/main/java/com/lunatech/doclets/jax/jaxrs/model/ResourceClass.java +++ b/doclets/src/main/java/com/lunatech/doclets/jax/jaxrs/model/ResourceClass.java @@ -42,6 +42,8 @@ public class ResourceClass { private ClassDoc declaringClass; + private String applicationRootPath; + private AnnotationDesc rootPathAnnotation; private AnnotationDesc rootProducesAnnotation; @@ -55,7 +57,12 @@ public class ResourceClass { private Map regexFragments = new HashMap(); public ResourceClass(ClassDoc resourceClass, ResourceMethod methodLocator) { + this(resourceClass, methodLocator, null); + } + + public ResourceClass(ClassDoc resourceClass, ResourceMethod methodLocator, String applicationRootPath) { this.parentMethod = methodLocator; + this.applicationRootPath = applicationRootPath; // find the annotated class or interface declaringClass = Utils.findAnnotatedClass(resourceClass, Path.class); // sub-resources may not have a path, but they're still resources @@ -104,6 +111,8 @@ private void setupPath() { path = null; if (parentMethod != null) path = Utils.appendURLFragments(parentMethod.getPath(), path); + if (parentMethod == null && applicationRootPath != null) + path = Utils.appendURLFragments("/", applicationRootPath, path); } public ClassDoc getDeclaringClass() {