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/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() {
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