This is an automated email from the ASF dual-hosted git repository.
jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git
The following commit(s) were added to refs/heads/master by this push:
new ad8e540 Swagger UI updates.
ad8e540 is described below
commit ad8e54059d729070c7b25f75dc61eac5fc69d0ca
Author: JamesBognar <[email protected]>
AuthorDate: Sun Mar 25 15:20:21 2018 -0400
Swagger UI updates.
---
.../org/apache/juneau/dto/swagger/Contact.java | 30 ++++++-
.../juneau/dto/swagger/ExternalDocumentation.java | 21 ++++-
.../java/org/apache/juneau/dto/swagger/Info.java | 38 +++++++++
.../org/apache/juneau/dto/swagger/License.java | 22 ++++-
.../org/apache/juneau/dto/swagger/Operation.java | 94 +++++++++++++---------
.../apache/juneau/dto/swagger/ui/SwaggerUI.java | 60 +++++++++++---
.../org/apache/juneau/dto/swagger/ui/SwaggerUI.css | 34 ++++++++
.../src/main/java/org/apache/juneau/ClassMeta.java | 18 ++++-
.../examples/rest/petstore/PetStoreResource.java | 57 +++++++++++--
.../examples/rest/petstore/PetStoreResource.json | 4 +-
.../apache/juneau/rest/BasicRestInfoProvider.java | 15 ++--
.../org/apache/juneau/rest/BasicRestServlet.java | 10 ++-
.../org/apache/juneau/rest/styles/dark.css | 4 +-
.../org/apache/juneau/rest/styles/devops.css | 5 +-
.../org/apache/juneau/rest/styles/light.css | 4 +-
.../org/apache/juneau/rest/styles/original.css | 2 +
16 files changed, 345 insertions(+), 73 deletions(-)
diff --git
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Contact.java
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Contact.java
index f1565d0..d6db1e3 100644
---
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Contact.java
+++
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Contact.java
@@ -13,6 +13,7 @@
package org.apache.juneau.dto.swagger;
import static org.apache.juneau.internal.BeanPropertyUtils.*;
+import static org.apache.juneau.internal.StringUtils.*;
import java.net.*;
import java.net.URI;
@@ -141,7 +142,7 @@ public class Contact extends SwaggerElement {
* @return This object (for method chaining).
*/
public Contact url(Object value) {
- return setUrl(toURI(value));
+ return setUrl(StringUtils.toURI(value));
}
/**
@@ -187,6 +188,33 @@ public class Contact extends SwaggerElement {
return setEmail(toStringVal(value));
}
+ /**
+ * Returns <jk>true</jk> if the name property is not null or empty.
+ *
+ * @return <jk>true</jk> if the name property is not null or empty.
+ */
+ public boolean hasName() {
+ return ! isEmpty(name);
+ }
+
+ /**
+ * Returns <jk>true</jk> if the URL property is not null.
+ *
+ * @return <jk>true</jk> if the URL property is not null.
+ */
+ public boolean hasUrl() {
+ return url != null;
+ }
+
+ /**
+ * Returns <jk>true</jk> if the email property is not null or empty.
+ *
+ * @return <jk>true</jk> if the email property is not null or empty.
+ */
+ public boolean hasEmail() {
+ return ! isEmpty(email);
+ }
+
@Override /* SwaggerElement */
public <T> T get(String property, Class<T> type) {
if (property == null)
diff --git
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ExternalDocumentation.java
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ExternalDocumentation.java
index 3b2aeb3..b693f47 100644
---
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ExternalDocumentation.java
+++
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ExternalDocumentation.java
@@ -13,6 +13,7 @@
package org.apache.juneau.dto.swagger;
import static org.apache.juneau.internal.BeanPropertyUtils.*;
+import static org.apache.juneau.internal.StringUtils.*;
import java.net.*;
import java.net.URI;
@@ -145,7 +146,25 @@ public class ExternalDocumentation extends SwaggerElement {
* @return This object (for method chaining).
*/
public ExternalDocumentation url(Object value) {
- return setUrl(toURI(value));
+ return setUrl(StringUtils.toURI(value));
+ }
+
+ /**
+ * Returns <jk>true</jk> if the url property is not null.
+ *
+ * @return <jk>true</jk> if the url property is not null.
+ */
+ public boolean hasUrl() {
+ return url != null;
+ }
+
+ /**
+ * Returns <jk>true</jk> if the description property is not null or
empty.
+ *
+ * @return <jk>true</jk> if the description property is not null or
empty.
+ */
+ public boolean hasDescription() {
+ return ! isEmpty(description);
}
@Override /* SwaggerElement */
diff --git
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Info.java
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Info.java
index b77e490..5dfe36e 100644
---
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Info.java
+++
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Info.java
@@ -13,6 +13,7 @@
package org.apache.juneau.dto.swagger;
import static org.apache.juneau.internal.BeanPropertyUtils.*;
+import static org.apache.juneau.internal.StringUtils.*;
import java.util.*;
@@ -342,6 +343,43 @@ public class Info extends SwaggerElement {
return setVersion(toStringVal(value));
}
+
+ /**
+ * Returns <jk>true</jk> if the title property is not null or empty.
+ *
+ * @return <jk>true</jk> if the title property is not null or empty.
+ */
+ public boolean hasTitle() {
+ return ! isEmpty(title);
+ }
+
+ /**
+ * Returns <jk>true</jk> if the description property is not null or
empty.
+ *
+ * @return <jk>true</jk> if the description property is not null or
empty.
+ */
+ public boolean hasDescription() {
+ return ! isEmpty(description);
+ }
+
+ /**
+ * Returns <jk>true</jk> if the version property is not null or empty.
+ *
+ * @return <jk>true</jk> if the version property is not null or empty.
+ */
+ public boolean hasVersion() {
+ return ! isEmpty(version);
+ }
+
+ /**
+ * Returns <jk>true</jk> if the termsOfService property is not null or
empty.
+ *
+ * @return <jk>true</jk> if the termsOfService property is not null or
empty.
+ */
+ public boolean hasTermsOfService() {
+ return ! isEmpty(termsOfService);
+ }
+
@Override /* SwaggerElement */
public <T> T get(String property, Class<T> type) {
if (property == null)
diff --git
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/License.java
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/License.java
index 3ca8fb4..61ef053 100644
---
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/License.java
+++
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/License.java
@@ -13,6 +13,8 @@
package org.apache.juneau.dto.swagger;
import static org.apache.juneau.internal.BeanPropertyUtils.*;
+import static org.apache.juneau.internal.StringUtils.*;
+
import java.net.*;
import java.net.URI;
import java.util.*;
@@ -142,7 +144,25 @@ public class License extends SwaggerElement {
* @return This object (for method chaining).
*/
public License url(Object value) {
- return setUrl(toURI(value));
+ return setUrl(StringUtils.toURI(value));
+ }
+
+ /**
+ * Returns <jk>true</jk> if the name property is not null or empty.
+ *
+ * @return <jk>true</jk> if the name property is not null or empty.
+ */
+ public boolean hasName() {
+ return ! isEmpty(name);
+ }
+
+ /**
+ * Returns <jk>true</jk> if the url property is not null.
+ *
+ * @return <jk>true</jk> if the url property is not null.
+ */
+ public boolean hasUrl() {
+ return url != null;
}
@Override /* SwaggerElement */
diff --git
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java
index e05da41..28e5de6 100644
---
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java
+++
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/Operation.java
@@ -13,6 +13,8 @@
package org.apache.juneau.dto.swagger;
import static org.apache.juneau.internal.BeanPropertyUtils.*;
+import static org.apache.juneau.internal.StringUtils.*;
+
import java.util.*;
import org.apache.juneau.annotation.*;
@@ -988,6 +990,61 @@ public class Operation extends SwaggerElement {
return this;
}
+ /**
+ * Returns <jk>true</jk> if the summary property is not null or empty.
+ *
+ * @return <jk>true</jk> if the summary property is not null or empty.
+ */
+ public boolean hasSummary() {
+ return ! isEmpty(summary);
+ }
+
+ /**
+ * Returns <jk>true</jk> if the description property is not null or
empty.
+ *
+ * @return <jk>true</jk> if the description property is not null or
empty.
+ */
+ public boolean hasDescription() {
+ return ! isEmpty(description);
+ }
+
+ /**
+ * Returns <jk>true</jk> if this operation has the specified tag
associated with it.
+ *
+ * @param name The tag name.
+ * @return <jk>true</jk> if this operation has the specified tag
associated with it.
+ */
+ public boolean hasTag(String name) {
+ return tags != null && tags.contains(name);
+ }
+
+ /**
+ * Returns <jk>true</jk> if this operation has no tags associated with
it.
+ *
+ * @return <jk>true</jk> if this operation has no tags associated with
it.
+ */
+ public boolean hasNoTags() {
+ return tags == null || tags.isEmpty();
+ }
+
+ /**
+ * Returns <jk>true</jk> if this operation has parameters associated
with it.
+ *
+ * @return <jk>true</jk> if this operation has parameters associated
with it.
+ */
+ public boolean hasParameters() {
+ return parameters != null && ! parameters.isEmpty();
+ }
+
+ /**
+ * Returns <jk>true</jk> if this operation has responses associated
with it.
+ *
+ * @return <jk>true</jk> if this operation has responses associated
with it.
+ */
+ public boolean hasResponses() {
+ return responses != null && ! responses.isEmpty();
+ }
+
@Override /* SwaggerElement */
public <T> T get(String property, Class<T> type) {
if (property == null)
@@ -1049,41 +1106,4 @@ public class Operation extends SwaggerElement {
.appendIf(security != null, "security");
return new MultiSet<>(s, super.keySet());
}
-
- /**
- * Returns <jk>true</jk> if this operation has the specified tag
associated with it.
- *
- * @param name The tag name.
- * @return <jk>true</jk> if this operation has the specified tag
associated with it.
- */
- public boolean hasTag(String name) {
- return tags != null && tags.contains(name);
- }
-
- /**
- * Returns <jk>true</jk> if this operation has no tags associated with
it.
- *
- * @return <jk>true</jk> if this operation has no tags associated with
it.
- */
- public boolean hasNoTags() {
- return tags == null || tags.isEmpty();
- }
-
- /**
- * Returns <jk>true</jk> if this operation has parameters associated
with it.
- *
- * @return <jk>true</jk> if this operation has parameters associated
with it.
- */
- public boolean hasParameters() {
- return parameters != null && ! parameters.isEmpty();
- }
-
- /**
- * Returns <jk>true</jk> if this operation has responses associated
with it.
- *
- * @return <jk>true</jk> if this operation has responses associated
with it.
- */
- public boolean hasResponses() {
- return responses != null && ! responses.isEmpty();
- }
}
diff --git
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ui/SwaggerUI.java
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ui/SwaggerUI.java
index d720eea..2f86fde 100644
---
a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ui/SwaggerUI.java
+++
b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/swagger/ui/SwaggerUI.java
@@ -20,7 +20,6 @@ import org.apache.juneau.*;
import org.apache.juneau.dto.html5.*;
import org.apache.juneau.dto.swagger.*;
import org.apache.juneau.http.*;
-import org.apache.juneau.internal.*;
import org.apache.juneau.transform.*;
import org.apache.juneau.utils.*;
@@ -40,8 +39,9 @@ public class SwaggerUI extends PojoSwap<Swagger,Div> {
public Div swap(BeanSession session, Swagger s) throws Exception {
Div outer = div(
style(RM.getString("SwaggerUI.css")),
- script("text/javascript", RM.getString("SwaggerUI.js"))
- );
+ script("text/javascript", RM.getString("SwaggerUI.js")),
+ header(s)
+ )._class("swagger-ui");
// Operations without tags are rendered first.
outer.child(div()._class("tag-block
tag-block-open").children(tagBlockContents(s, null)));
@@ -59,16 +59,57 @@ public class SwaggerUI extends PojoSwap<Swagger,Div> {
return outer;
}
+ // Creates the informational summary before the ops.
+ private Table header(Swagger s) {
+ Table table = table()._class("header");
+
+ Info info = s.getInfo();
+ if (info != null) {
+
+ if (info.hasVersion())
+
table.child(tr(th("Version:"),td(info.getVersion())));
+
+ if (info.hasTermsOfService())
+ table.child(tr(th("Terms of
Service:"),td(a(info.getTermsOfService(), info.getTermsOfService()))));
+
+ Contact c = info.getContact();
+ if (c != null) {
+ Table t2 = table();
+
+ if (c.hasName())
+
t2.child(tr(th("Name:"),td(c.getName())));
+ if (c.hasUrl())
+ t2.child(tr(th("URL:"),td(a(c.getUrl(),
c.getUrl()))));
+ if (c.hasEmail())
+
t2.child(tr(th("Email:"),td(a("mailto:"+ c.getEmail(), c.getEmail()))));
+
+ table.child(tr(th("Contact:"),td(t2)));
+ }
+
+ License l = info.getLicense();
+ if (l != null) {
+ Object child = l.hasUrl() ? a(l.getUrl(),
l.hasName() ? l.getName() : l.getUrl()) : l.getName();
+ table.child(tr(th("License:"),td(child)));
+ }
+
+ ExternalDocumentation ed = s.getExternalDocs();
+ if (ed != null) {
+ Object child = ed.hasUrl() ? a(ed.getUrl(),
ed.hasDescription() ? ed.getDescription() : ed.getUrl()) : ed.getDescription();
+ table.child(tr(th("Docs:"),td(child)));
+ }
+ }
+
+ return table;
+ }
+
// Creates the "pet Everything about your Pets ext-link" header.
private HtmlElement tagBlockSummary(Tag t) {
ExternalDocumentation ed = t.getExternalDocs();
- String edd = ed == null ? null : ed.getDescription();
- Object extDocText = ed == null ? null : (edd != null ? edd :
ed.getUrl());
return div()._class("tag-block-summary").children(
span(t.getName())._class("name"),
span(t.getDescription())._class("description"),
- ed == null ? null : span(a(ed.getUrl(),
extDocText))._class("extdocs")
+ ed == null ? null : span(a(ed.getUrl(),
ed.hasDescription() ? ed.getDescription() : ed.getUrl()))._class("extdocs")
).onclick("toggleTagBlock(this)");
}
@@ -102,16 +143,15 @@ public class SwaggerUI extends PojoSwap<Swagger,Div> {
return div()._class("op-block-summary").children(
span(opName.toUpperCase())._class("method-button"),
span(path)._class("path"),
- span(op.getSummary())._class("summary")
+ op.hasSummary() ?
span(op.getSummary())._class("summary") : null
).onclick("toggleOpBlock(this)");
}
private Div tableContainer(Swagger s, Operation op) {
Div tableContainer = div()._class("table-container");
- String d = op.getDescription();
- if (! StringUtils.isEmpty(d))
-
tableContainer.child(div(d)._class("op-block-description"));
+ if (op.hasDescription())
+
tableContainer.child(div(op.getDescription())._class("op-block-description"));
if (op.hasParameters()) {
tableContainer.child(div(h4("Parameters")._class("title"))._class("op-block-section-header"));
diff --git
a/juneau-core/juneau-dto/src/main/resources/org/apache/juneau/dto/swagger/ui/SwaggerUI.css
b/juneau-core/juneau-dto/src/main/resources/org/apache/juneau/dto/swagger/ui/SwaggerUI.css
index 315fd34..f2a16b3 100644
---
a/juneau-core/juneau-dto/src/main/resources/org/apache/juneau/dto/swagger/ui/SwaggerUI.css
+++
b/juneau-core/juneau-dto/src/main/resources/org/apache/juneau/dto/swagger/ui/SwaggerUI.css
@@ -13,6 +13,40 @@
***************************************************************************************************************************
*/
+.swagger-ui {
+}
+
+/*-----------------------------------------------------------------------------------------------------------
+ - Header key-value pairs
+
----------------------------------------------------------------------------------------------------------*/
+
+.swagger-ui table.header {
+ margin-bottom: 20px;
+ width: 95%;
+ border: none;
+}
+
+.swagger-ui table.header * {
+ font-size: 14px;
+ vertical-align: middle;
+}
+
+.swagger-ui table.header th {
+ font-weight: bold;
+ padding: 5px 10px;
+ text-align: left;
+ white-space: nowrap;
+ border: none;
+ border-radius: 3px;
+}
+
+.swagger-ui table.header td {
+ padding: 5px 10px;
+ text-align: left;
+ vertical-align: middle;
+ border: none;
+}
+
/*-----------------------------------------------------------------------------------------------------------
- Method buttons (e.g GET/PUT/... buttons)
----------------------------------------------------------------------------------------------------------*/
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index 097021a..3e4e829 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -947,7 +947,23 @@ public final class ClassMeta<T> implements Type {
return (T)invokeMethodFuzzy(exampleMethod,
null, session);
if (exampleField != null)
return (T)exampleField.get(null);
- return example;
+ if (example != null)
+ return example;
+
+ if (isCollection()) {
+ Object element =
getElementType().getExample(session);
+ if (element != null)
+ return
(T)Collections.singleton(element);
+ } else if (isArray()) {
+ Object element =
getElementType().getExample(session);
+ if (element != null) {
+ Object o =
Array.newInstance(getElementType().innerClass, 1);
+ Array.set(o, 0, example);
+ return (T)o;
+ }
+ }
+
+ return null;
} catch (Exception e) {
throw new ClassMetaRuntimeException(e);
}
diff --git
a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreResource.java
b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreResource.java
index de07c4f..1a385e1 100644
---
a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreResource.java
+++
b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/petstore/PetStoreResource.java
@@ -16,6 +16,7 @@ import java.util.*;
import org.apache.juneau.microservice.*;
import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.rest.labels.*;
import org.apache.juneau.rest.widget.*;
/**
@@ -24,7 +25,10 @@ import org.apache.juneau.rest.widget.*;
@RestResource(
path="/petstore2",
title="Swagger Petstore",
- description="This is a sample server Petstore server. You can find out
more about Swagger at [http://swagger.io](http://swagger.io) or on
[irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can
use the api key `special-key` to test the authorization filters.",
+ description=
+ "This is a sample server Petstore server."
+ + "<br>You can find out more about Swagger at <a class='link'
href='http://swagger.io'>http://swagger.io</a> or on <a class='link'
href='http://swagger.io/irc'>irc.freenode.net#swagger</a>."
+ + "<br>For this sample, you can use the api key `special-key`
to test the authorization filters.",
htmldoc=@HtmlDoc(
widgets={
ContentTypeMenuItem.class,
@@ -43,19 +47,62 @@ import org.apache.juneau.rest.widget.*;
public class PetStoreResource extends BasicRestServletJena {
private static final long serialVersionUID = 1L;
- @RestMethod(name="GET", path="/*")
- public String doGet() {
- return "Hello";
+ @RestMethod(
+ name="GET",
+ path="/",
+ summary="Top-level page"
+ )
+ public ResourceDescription[] getTopPage() {
+ return new ResourceDescription[] {
+ new ResourceDescription("pet", "All pets in the
store"),
+ new ResourceDescription("store", "Petstore orders"),
+ new ResourceDescription("user", "Petstore users")
+ };
}
@RestMethod(
+ name="GET",
+ path="/pet",
+ summary="All pets in the store",
+ swagger={
+ "tags:['pet']"
+ }
+ )
+ public Collection<Pet> getPets() {
+ return null;
+ }
+
+ @RestMethod(
+ name="GET",
+ path="/store",
+ summary="Petstore orders",
+ swagger={
+ "tags:['store']"
+ }
+ )
+ public Collection<Order> getOrders() {
+ return null;
+ }
+
+ @RestMethod(
+ name="GET",
+ path="/user",
+ summary="Petstore users",
+ swagger={
+ "tags:['user']"
+ }
+ )
+ public Collection<Order> getUsers() {
+ return null;
+ }
+
+ @RestMethod(
name="POST",
path="/pet",
summary="Add a new pet to the store",
swagger={
"tags:['pet'],",
"parameters:[",
-// "{ in:'body', name:'body', description:'Pet
object that needs to be added to the store', required:true, schema:{
$ref:'#/definitions/Pet' } }",
"{ in:'body', description:'Pet object that
needs to be added to the store', required:true }",
"],",
"responses:{",
diff --git
a/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/petstore/PetStoreResource.json
b/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/petstore/PetStoreResource.json
index 138c141..f525b66 100644
---
a/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/petstore/PetStoreResource.json
+++
b/juneau-examples/juneau-examples-rest/src/main/resources/org/apache/juneau/examples/rest/petstore/PetStoreResource.json
@@ -19,7 +19,9 @@
"title": "Swagger Petstore",
"termsOfService": "http://swagger.io/terms/",
"contact": {
- "email": "[email protected]"
+ "name": "John Smith",
+ "email": "[email protected]",
+ "url": "http://swagger.io"
},
"license": {
"name": "Apache 2.0",
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
index c729a8f..2eadfa8 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestInfoProvider.java
@@ -389,19 +389,14 @@ public class BasicRestInfoProvider implements
RestInfoProvider {
ObjectMap okResponse = responses.getObjectMap("200");
- ClassMeta<?> cm = bs.getClassMeta(m.getReturnType());
+ ClassMeta<?> cm =
bs.getClassMeta(m.getGenericReturnType());
if ((cm.isMapOrBean() || cm.isCollectionOrArray()) && !
okResponse.containsKey("schema") && cm.getInnerClass() != Swagger.class) {
String name = cm.getSimpleName();
if (! definitions.containsKey(name)) {
- ObjectMap definition;
- try {
- definition =
JsonSchemaUtils.getSchema(bs, cm);
- } catch (Exception e1) {
- System.err.println(cm);
- throw e1;
- }
+ ObjectMap definition =
JsonSchemaUtils.getSchema(bs, cm);
+
Object example = cm.getExample(bs);
if (example != null) {
@@ -709,7 +704,7 @@ public class BasicRestInfoProvider implements
RestInfoProvider {
if (title != null)
return vr.resolve(title);
Swagger s = getSwagger(req);
- if (s != null && s.getInfo() != null)
+ if (s != null && s.getInfo() != null && s.getInfo().hasTitle())
return s.getInfo().getTitle();
return null;
}
@@ -765,7 +760,7 @@ public class BasicRestInfoProvider implements
RestInfoProvider {
if (description != null)
return vr.resolve(description);
Swagger s = getSwagger(req);
- if (s != null && s.getInfo() != null)
+ if (s != null && s.getInfo() != null &&
s.getInfo().hasDescription())
return s.getInfo().getDescription();
return null;
}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java
index 4079598..dceac46 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestServlet.java
@@ -184,15 +184,19 @@ public abstract class BasicRestServlet extends
RestServlet implements BasicRestC
* @return A bean containing the contents for the OPTIONS page.
*/
@RestMethod(name=OPTIONS, path="/*",
+ summary="Swagger documentation",
+ description="Swagger documentation for this resource.",
htmldoc=@HtmlDoc(
+ header={
+ "<h1>$R{resourceTitle}</h1>",
+ "<h2>$R{resourceDescription}</h2>"
+ },
navlinks={
"back: servlet:/",
"json:
servlet:/?method=OPTIONS&Accept=text/json&plainText=true"
},
aside="NONE"
- ),
- summary="Swagger documentation",
- description="Auto-generated swagger documentation for this
resource"
+ )
)
public Swagger getOptions(RestRequest req) {
return req.getSwagger();
diff --git
a/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/dark.css
b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/dark.css
index b67e1f0..c81702d 100644
---
a/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/dark.css
+++
b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/dark.css
@@ -280,4 +280,6 @@ footer {
.table {display:table;}
.row {display:table-row;}
.cell {display:table-cell;}
-.monospace {font-family:monospace;}
\ No newline at end of file
+.monospace {font-family:monospace;}
+.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
+.link:hover { text-decoration: underline; }
diff --git
a/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/devops.css
b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/devops.css
index 6d02195..ad7188a 100644
---
a/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/devops.css
+++
b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/devops.css
@@ -270,4 +270,7 @@ footer {
.table {display:table;}
.row {display:table-row;}
.cell {display:table-cell;}
-.monospace {font-family:monospace;}
\ No newline at end of file
+.monospace {font-family:monospace;}
+.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
+.link:hover { text-decoration: underline; }
+
diff --git
a/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/light.css
b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/light.css
index 6152780..d5a1e28 100644
---
a/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/light.css
+++
b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/light.css
@@ -261,4 +261,6 @@ footer {
.table {display:table;}
.row {display:table-row;}
.cell {display:table-cell;}
-.monospace {font-family:monospace;}
\ No newline at end of file
+.monospace {font-family:monospace;}
+.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
+.link:hover { text-decoration: underline; }
diff --git
a/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/original.css
b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/original.css
index e4f4c9d..bad8907 100644
---
a/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/original.css
+++
b/juneau-rest/juneau-rest-server/src/main/resources/org/apache/juneau/rest/styles/original.css
@@ -225,4 +225,6 @@ footer {
.row {display:table-row;}
.cell {display:table-cell;}
.monospace {font-family:monospace;}
+.link { color: #94A3AB; text-decoration: none; cursor: pointer;}
+.link:hover { text-decoration: underline; }
--
To stop receiving notification emails like this one, please contact
[email protected].