diff --git a/README.md b/README.md
index 4ec79052..269ee976 100644
--- a/README.md
+++ b/README.md
@@ -36,12 +36,12 @@ To use the Swagger Doclet in your Maven project, add the following to your POM f
ServiceDoclet
com.unclehulka
- swagger-jaxrs-doclet
- 0.0.1.6-SNAPSHOT
+ jaxrs-doclet
+ 0.0.2-SNAPSHOT
${project.build.outputDirectory}
false
- -apiVersion 1 -docBasePath ${server.url} -apiBasePath ${server.url}
+ -apiVersion 1 -docBasePath ${server.url}/apidocs -apiBasePath ${server.url}
javadoc
diff --git a/jaxrs-doclet-sample-dropwizard/src/main/java/com/yammer/dropwizard/apidocs/sample/api/Recursive.java b/jaxrs-doclet-sample-dropwizard/src/main/java/com/yammer/dropwizard/apidocs/sample/api/Recursive.java
new file mode 100644
index 00000000..2c638095
--- /dev/null
+++ b/jaxrs-doclet-sample-dropwizard/src/main/java/com/yammer/dropwizard/apidocs/sample/api/Recursive.java
@@ -0,0 +1,15 @@
+package com.yammer.dropwizard.apidocs.sample.api;
+
+public class Recursive {
+
+ private Recursive recursive;
+
+ public Recursive getRecursive() {
+ return recursive;
+ }
+
+ public void setRecursive(Recursive recursive) {
+ this.recursive = recursive;
+ }
+
+}
diff --git a/jaxrs-doclet-sample-dropwizard/src/main/java/com/yammer/dropwizard/apidocs/sample/resources/RecursiveResource.java b/jaxrs-doclet-sample-dropwizard/src/main/java/com/yammer/dropwizard/apidocs/sample/resources/RecursiveResource.java
new file mode 100644
index 00000000..09407bb8
--- /dev/null
+++ b/jaxrs-doclet-sample-dropwizard/src/main/java/com/yammer/dropwizard/apidocs/sample/resources/RecursiveResource.java
@@ -0,0 +1,14 @@
+package com.yammer.dropwizard.apidocs.sample.resources;
+
+import com.yammer.dropwizard.apidocs.sample.api.Recursive;
+
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+
+@Path("/Recursive")
+public class RecursiveResource {
+ @POST
+ public Recursive recurse(Recursive recursive) {
+ return recursive;
+ }
+}
diff --git a/jaxrs-doclet/src/main/java/com/yammer/dropwizard/apidocs/ServiceDoclet.java b/jaxrs-doclet/src/main/java/com/yammer/dropwizard/apidocs/ServiceDoclet.java
index c82d893b..49bd0e64 100644
--- a/jaxrs-doclet/src/main/java/com/yammer/dropwizard/apidocs/ServiceDoclet.java
+++ b/jaxrs-doclet/src/main/java/com/yammer/dropwizard/apidocs/ServiceDoclet.java
@@ -127,8 +127,7 @@ public static boolean startInternal(RootDoc doc, Recorder recorder) {
//build model for body parameter
for (Parameter parameter : method.parameters()) {
if (shouldIncludeParameter(parameter)) {
- if (paramTypeOf(parameter).equalsIgnoreCase("body") && !PRIMITIVES.contains(typeOf(parameter.type())))
- classModelMap = parseModels(parameter.type(), classModelMap);
+ classModelMap = parseModels(parameter.type(), classModelMap);
}
}
@@ -139,11 +138,8 @@ public static boolean startInternal(RootDoc doc, Recorder recorder) {
if (me.getReturnType() == null || !me.getReturnType().equals(name)) {
me.setReturnType(name);
}
- if (!PRIMITIVES.contains(name)) {
- classModelMap = parseModels(type, classModelMap);
- }
+ classModelMap = parseModels(type, classModelMap);
}
-
}
}
apiMap.put(apiPath, methodMap);
@@ -261,63 +257,75 @@ private static Method parseMethod(MethodDoc method) {
*/
private static Map parseModels(Type type, Map modelMap) {
String typeName = typeOf(type);
- ClassDoc cd = type.asClassDoc();
- if (cd != null) {
- Model model = modelMap.get(typeName);
- if (model == null) {
- Map eleMap = new HashMap<>();
-
- //Get fields
- FieldDoc[] fdArr = cd.fields();
- if (fdArr != null && fdArr.length > 0) {
- for (FieldDoc fd : fdArr) {
- if (eleMap.get(fd.name()) == null) {
- eleMap.put(fd.name(), fd.type());
+ if(!PRIMITIVES.contains(typeName) && !type.qualifiedTypeName().startsWith("javax.")) {
+ ClassDoc cd = type.asClassDoc();
+ if (cd != null) {
+ Model model = modelMap.get(typeName);
+ if (model == null) {
+ Map eleMap = new HashMap<>();
+
+ //Get fields
+ FieldDoc[] fdArr = cd.fields();
+ if (fdArr != null && fdArr.length > 0) {
+ for (FieldDoc fd : fdArr) {
+ if (eleMap.get(fd.name()) == null) {
+ eleMap.put(fd.name(), fd.type());
+ }
}
}
- }
- //Get methods
- MethodDoc[] mdArr = cd.methods();
- if (mdArr != null && mdArr.length > 0) {
- for (MethodDoc md : mdArr) {
- if (md.name().startsWith("get") && md.name().length() > 3) {
- String name = md.name().substring(3);
- name = name.substring(0, 1).toLowerCase() + (name.length() > 1 ? name.substring(1) : "");
- if (eleMap.get(name) == null) {
- eleMap.put(name, md.returnType());
+ //Get methods
+ MethodDoc[] mdArr = cd.methods();
+ if (mdArr != null && mdArr.length > 0) {
+ for (MethodDoc md : mdArr) {
+ if (md.name().startsWith("get") && md.name().length() > 3) {
+ String name = md.name().substring(3);
+ name = name.substring(0, 1).toLowerCase() + (name.length() > 1 ? name.substring(1) : "");
+ if (eleMap.get(name) == null) {
+ eleMap.put(name, md.returnType());
+ }
}
}
}
- }
- //Process all fields & methods
- if (eleMap.keySet().size() > 0) {
- Map fieldMap = new HashMap<>();
- for (Map.Entry entry : eleMap.entrySet()) {
- //Check if it is a collection and get collection type
- String containerOf = null;
- ParameterizedType pt = entry.getValue().asParameterizedType();
- if (pt != null) {
- Type[] typeArgs = pt.typeArguments();
- if (typeArgs != null && typeArgs.length > 0) {
- containerOf = typeOf(typeArgs[0]);
- if (!PRIMITIVES.contains(containerOf)) {
- parseModels(typeArgs[0], modelMap);
+ //Process all fields & methods
+ if (eleMap.keySet().size() > 0) {
+
+ //Add to the model
+ Map fieldMap = new HashMap<>();
+ for (Map.Entry entry : eleMap.entrySet()) {
+ //Check if it is a collection and get collection type
+ String containerOf = null;
+ ParameterizedType pt = entry.getValue().asParameterizedType();
+ if (pt != null) {
+ Type[] typeArgs = pt.typeArguments();
+ if (typeArgs != null && typeArgs.length > 0) {
+ containerOf = typeOf(typeArgs[0]);
}
}
+
+ //Add to map
+ String eleTypeName = typeOf(entry.getValue());
+ fieldMap.put(entry.getKey(), new Property(eleTypeName, null, containerOf));
+
}
- //Add to map
- String eleTypeName = typeOf(entry.getValue());
- fieldMap.put(entry.getKey(), new Property(eleTypeName, null, containerOf));
+ modelMap.put(typeName, new Model(typeName, fieldMap));
+
+ //Build contained models
+ for (Map.Entry entry : eleMap.entrySet()) {
+ //Check if it is a collection and get collection type
+ ParameterizedType pt = entry.getValue().asParameterizedType();
+ if (pt != null) {
+ Type[] typeArgs = pt.typeArguments();
+ if (typeArgs != null && typeArgs.length > 0) {
+ parseModels(typeArgs[0], modelMap);
+ }
+ }
- //If not primitive, build the model for it too
- if (!PRIMITIVES.contains(eleTypeName)) {
parseModels(entry.getValue(), modelMap);
}
}
- modelMap.put(typeName, new Model(typeName, fieldMap));
}
}
}
@@ -331,8 +339,13 @@ private static boolean shouldIncludeParameter(Parameter parameter) {
AnnotationDesc[] annotations = parameter.annotations();
//Include if it has no annotations
- if (annotations == null || annotations.length == 0)
- return true;
+ if (annotations == null || annotations.length == 0){
+ if (paramTypeOf(parameter).equalsIgnoreCase("body")){
+ return true;
+ } else {
+ return false;
+ }
+ }
//Include if it has a jax-rs annotation
for (AnnotationDesc annotation : annotations) {