http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java
----------------------------------------------------------------------
diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java 
b/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java
index 50f25f6..725387a 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java
@@ -424,65 +424,358 @@ public final class RestResponse extends 
HttpServletResponseWrapper {
        }
 
        /**
-        * Sets the page title for HTML views.
+        * Sets the HTML page title.
         * <p>
-        * This is the programmatic equivalent to the {@link 
RestResource#pageTitle() @RestResource#pageTitle()}/
-        * {@link RestMethod#pageTitle() @RestMethod#pageTitle()} annotations.
+        * The format of this value is plain text.
+        * <p>
+        * It gets wrapped in a <code><xt>&lt;h3&gt; 
<xa>class</xa>=<xs>'title'</xs>&gt;</xt></code> element and then added
+        *      to the <code><xt>&lt;header&gt;</code> section on the page.
+        * <p>
+        * If not specified, the page title is pulled from one of the following 
locations:
+        * <ol>
+        *      <li><code>{servletClass}.{methodName}.pageTitle</code> resource 
bundle value.
+        *      <li><code>{servletClass}.pageTitle</code> resource bundle value.
+        *      <li><code><ja>@RestResource</ja>(title)</code> annotation.
+        *      <li><code>{servletClass}.title</code> resource bundle value.
+        *      <li><code>info/title</code> entry in swagger file.
+        * <ol>
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
         * <p>
-        * This is a shortcut for calling 
<code>setProperty(<jsf>HTMLDOC_title</jsf>, title);</code>
         * <ul class='doctree'>
         *      <li class='info'>
-        *              <b>Tip:</b>  Use {@link StringMessage} to generate a 
page title with delayed serialization so as not to
-        *              waste string concatenation cycles on non-HTML views.
+        *              In most cases, you'll simply want to use the 
<code>@RestResource(title)</code> annotation to specify the
+        *              page title.
+        *              However, this annotation is provided in cases where you 
want the page title to be different that the one
+        *              shown in the swagger document.
         * </ul>
+        * <p>
+        * This is the programmatic equivalent to the {@link HtmlDoc#title() 
@HtmlDoc.title()} annotation.
         *
-        * @param title The localized page title to render on the page.
-        * Object will be converted to a string using {@link Object#toString()}.
+        * @param value The HTML page title.
+        *      Object will be converted to a string using {@link 
Object#toString()}.
+        *      <p>
+        *      <ul class='doctree'>
+        *              <li class='info'>
+        *                      <b>Tip:</b>  Use {@link StringMessage} to 
generate value with delayed serialization so as not to
+        *                              waste string concatenation cycles on 
non-HTML views.
+        *      </ul>
         * @return This object (for method chaining).
         */
-       public RestResponse setPageTitle(Object title) {
-               return setProperty(HtmlDocSerializerContext.HTMLDOC_title, 
title);
+       public RestResponse setHtmlTitle(Object value) {
+               return setProperty(HtmlDocSerializerContext.HTMLDOC_title, 
value);
        }
 
        /**
-        * Sets the page text for HTML views.
+        * Sets the HTML page description.
+        * <p>
+        * The format of this value is plain text.
+        * <p>
+        * It gets wrapped in a <code><xt>&lt;h5&gt; 
<xa>class</xa>=<xs>'description'</xs>&gt;</xt></code> element and then
+        *      added to the <code><xt>&lt;header&gt;</code> section on the 
page.
+        * <p>
+        * If not specified, the page title is pulled from one of the following 
locations:
+        * <ol>
+        *      <li><code>{servletClass}.{methodName}.pageText</code> resource 
bundle value.
+        *      <li><code>{servletClass}.pageText</code> resource bundle value.
+        *      <li><code><ja>@RestMethod</ja>(summary)</code> annotation.
+        *      <li><code>{servletClass}.{methodName}.summary</code> resource 
bundle value.
+        *      <li><code>summary</code> entry in swagger file for method.
+        *      <li><code>{servletClass}.description</code> resource bundle 
value.
+        *      <li><code>info/description</code> entry in swagger file.
+        * <ol>
         * <p>
-        * This is the programmatic equivalent to the {@link 
RestResource#pageText() @RestResource#pageText()}/
-        * {@link RestMethod#pageText() @RestMethod#pageText()} annotations.
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
         * <p>
-        * This is a shortcut for calling 
<code>setProperty(<jsf>HTMLDOC_text</jsf>, text);</code>
         * <ul class='doctree'>
         *      <li class='info'>
-        *              <b>Tip:</b>  Use {@link StringMessage} to generate page 
text with delayed serialization so as not to
-        *              waste string concatenation cycles on non-HTML views.
+        *              In most cases, you'll simply want to use the 
<code>@RestResource(description)</code> or
+        *              <code>@RestMethod(summary)</code> annotations to 
specify the page text.
+        *              However, this annotation is provided in cases where you 
want the text to be different that the values shown
+        *              in the swagger document.
         * </ul>
+        * <p>
+        * This is the programmatic equivalent to the {@link 
HtmlDoc#description() @HtmlDoc.description()} annotation.
         *
-        * @param text The localized page text to render on the page.
+        * @param value The HTML page description.
+        *      Object will be converted to a string using {@link 
Object#toString()}.
+        *      <p>
+        *      <ul class='doctree'>
+        *              <li class='info'>
+        *                      <b>Tip:</b>  Use {@link StringMessage} to 
generate value with delayed serialization so as not to
+        *                              waste string concatenation cycles on 
non-HTML views.
+        *      </ul>
         * @return This object (for method chaining).
         */
-       public RestResponse setPageText(Object text) {
-               return setProperty(HtmlDocSerializerContext.HTMLDOC_text, text);
+       public RestResponse setHtmlDescription(Object value) {
+               return 
setProperty(HtmlDocSerializerContext.HTMLDOC_description, value);
        }
 
        /**
-        * Sets the page text for HTML views.
+        * Sets the HTML header section contents.
+        * <p>
+        * The format of this value is HTML.
+        * <p>
+        * The page header normally contains the title and description, but 
this value can be used to override the contents
+        *      to be whatever you want.
         * <p>
-        * This is the programmatic equivalent to the {@link 
RestResource#pageLinks() @RestResource#pageLinks()}/
-        * {@link RestMethod#pageLinks() @RestMethod#pageLinks()} annotations.
+        * When a value is specified, the {@link #setHtmlTitle(Object)} and 
{@link #setHtmlDescription(Object)} values will be ignored.
         * <p>
-        * This is a shortcut for calling 
<code>setProperty(<jsf>HTMLDOC_links</jsf>, links);</code>
+        * A value of <js>"NONE"</js> can be used to force no header.
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * This is the programmatic equivalent to the {@link HtmlDoc#header() 
@HtmlDoc.header()} annotation.
         *
-        * <ul class='doctree'>
-        *      <li class='info'>
-        *              <b>Tip:</b>  Use {@link StringMessage} to generate page 
links with delayed serialization so as not to
-        *              waste string concatenation cycles on non-HTML views.
-        * </ul>
+        * @param value The HTML header section contents.
+        *      Object will be converted to a string using {@link 
Object#toString()}.
+        *      <p>
+        *      <ul class='doctree'>
+        *              <li class='info'>
+        *                      <b>Tip:</b>  Use {@link StringMessage} to 
generate value with delayed serialization so as not to
+        *                              waste string concatenation cycles on 
non-HTML views.
+        *      </ul>
+        * @return This object (for method chaining).
+        */
+       public RestResponse setHtmlHeader(Object value) {
+               return setProperty(HtmlDocSerializerContext.HTMLDOC_title, 
value);
+       }
+
+       /**
+        * Sets the links in the HTML nav section.
+        * <p>
+        * The format of this value is a lax-JSON map of key/value pairs where 
the keys are the link text and the values are
+        *      relative (to the servlet) or absolute URLs.
+        * <p>
+        * The page links are positioned immediately under the title and text.
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * This field can also use URIs of any support type in {@link 
UriResolver}.
+        * <p>
+        * This is the programmatic equivalent to the {@link HtmlDoc#links() 
@HtmlDoc.links()} annotation.
+        *
+        * @param value The HTML nav section links links.
+        *      Object will be converted to a string using {@link 
Object#toString()}.
+        *      <p>
+        *      <ul class='doctree'>
+        *              <li class='info'>
+        *                      <b>Tip:</b>  Use {@link StringMessage} to 
generate value with delayed serialization so as not to
+        *                              waste string concatenation cycles on 
non-HTML views.
+        *      </ul>
+        * @return This object (for method chaining).
+        */
+       public RestResponse setHtmlLinks(Object value) {
+               properties.put(HtmlDocSerializerContext.HTMLDOC_links, value);
+               return this;
+       }
+
+       /**
+        * Sets the HTML nav section contents.
+        * <p>
+        * The format of this value is HTML.
+        * <p>
+        * The nav section of the page contains the links.
+        * <p>
+        * The format of this value is HTML.
+        * <p>
+        * When a value is specified, the {@link #setHtmlLinks(Object)} value 
will be ignored.
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * This is the programmatic equivalent to the {@link HtmlDoc#nav() 
@HtmlDoc.nav()} annotation.
+        *
+        * @param value The HTML nav section contents.
+        *      Object will be converted to a string using {@link 
Object#toString()}.
+        *      <p>
+        *      <ul class='doctree'>
+        *              <li class='info'>
+        *                      <b>Tip:</b>  Use {@link StringMessage} to 
generate value with delayed serialization so as not to
+        *                              waste string concatenation cycles on 
non-HTML views.
+        *      </ul>
+        * @return This object (for method chaining).
+        */
+       public RestResponse setHtmlNav(Object value) {
+               properties.put(HtmlDocSerializerContext.HTMLDOC_nav, value);
+               return this;
+       }
+
+       /**
+        * Sets the HTML aside section contents.
+        * <p>
+        * The format of this value is HTML.
+        * <p>
+        * The aside section typically floats on the right side of the page.
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * This is the programmatic equivalent to the {@link HtmlDoc#aside() 
@HtmlDoc.aside()} annotation.
+        *
+        * @param value The HTML aside section contents.
+        *      Object will be converted to a string using {@link 
Object#toString()}.
+        *      <p>
+        *      <ul class='doctree'>
+        *              <li class='info'>
+        *                      <b>Tip:</b>  Use {@link StringMessage} to 
generate value with delayed serialization so as not to
+        *                              waste string concatenation cycles on 
non-HTML views.
+        *      </ul>
+        * @return This object (for method chaining).
+        */
+       public RestResponse setHtmlAside(Object value) {
+               properties.put(HtmlDocSerializerContext.HTMLDOC_aside, value);
+               return this;
+       }
+
+       /**
+        * Sets the HTML footer section contents.
+        * <p>
+        * The format of this value is HTML.
+        * <p>
+        * The footer section typically floats on the bottom of the page.
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * This is the programmatic equivalent to the {@link HtmlDoc#footer() 
@HtmlDoc.footer()} annotation.
+        *
+        * @param value The HTML footer section contents.
+        *      Object will be converted to a string using {@link 
Object#toString()}.
+        *      <p>
+        *      <ul class='doctree'>
+        *              <li class='info'>
+        *                      <b>Tip:</b>  Use {@link StringMessage} to 
generate value with delayed serialization so as not to
+        *                              waste string concatenation cycles on 
non-HTML views.
+        *      </ul>
+        * @return This object (for method chaining).
+        */
+       public RestResponse setHtmlFooter(Object value) {
+               properties.put(HtmlDocSerializerContext.HTMLDOC_footer, value);
+               return this;
+       }
+
+       /**
+        * Sets the HTML CSS style section contents.
+        * <p>
+        * The format of this value is CSS.
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * This is the programmatic equivalent to the {@link HtmlDoc#css() 
@HtmlDoc.css()} annotation.
+        *
+        * @param value The HTML CSS style section contents.
+        *      Object will be converted to a string using {@link 
Object#toString()}.
+        *      <p>
+        *      <ul class='doctree'>
+        *              <li class='info'>
+        *                      <b>Tip:</b>  Use {@link StringMessage} to 
generate value with delayed serialization so as not to
+        *                              waste string concatenation cycles on 
non-HTML views.
+        *      </ul>
+        * @return This object (for method chaining).
+        */
+       public RestResponse setHtmlCss(Object value) {
+               properties.put(HtmlDocSerializerContext.HTMLDOC_css, value);
+               return this;
+       }
+
+       /**
+        * Sets the CSS URL in the HTML CSS style section.
+        * <p>
+        * The format of this value is a URL.
+        * <p>
+        * Specifies the URL to the stylesheet to add as a link in the style 
tag in the header.
+        * <p>
+        * The format of this value is CSS.
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>) and can use URL protocols defined
+        *      by {@link UriResolver}.
+        * <p>
+        * This is the programmatic equivalent to the {@link HtmlDoc#cssUrl() 
@HtmlDoc.cssUrl()} annotation.
+        *
+        * @param value The CSS URL in the HTML CSS style section.
+        *      Object will be converted to a string using {@link 
Object#toString()}.
+        *      <p>
+        *      <ul class='doctree'>
+        *              <li class='info'>
+        *                      <b>Tip:</b>  Use {@link StringMessage} to 
generate value with delayed serialization so as not to
+        *                              waste string concatenation cycles on 
non-HTML views.
+        *      </ul>
+        * @return This object (for method chaining).
+        */
+       public RestResponse setHtmlCssUrl(Object value) {
+               properties.put(HtmlDocSerializerContext.HTMLDOC_cssUrl, value);
+               return this;
+       }
+
+       /**
+        * Shorthand method for forcing the rendered HTML content to be no-wrap.
+        * <p>
+        * This is the programmatic equivalent to the {@link HtmlDoc#nowrap() 
@HtmlDoc.nowrap()} annotation.
+        *
+        * @param value The new nowrap setting.
+        * @return This object (for method chaining).
+        */
+       public RestResponse setHtmlNoWrap(boolean value) {
+               properties.put(HtmlDocSerializerContext.HTMLDOC_nowrap, value);
+               return this;
+       }
+
+       /**
+        * Specifies the text to display when serializing an empty array or 
collection.
+        * <p>
+        * This is the programmatic equivalent to the {@link 
HtmlDoc#noResultsMessage() @HtmlDoc.noResultsMessage()} annotation.
+        *
+        * @param value The text to display when serializing an empty array or 
collection.
+        * @return This object (for method chaining).
+        */
+       public RestResponse setHtmlNoResultsMessage(Object value) {
+               
properties.put(HtmlDocSerializerContext.HTMLDOC_noResultsMessage, value);
+               return this;
+       }
+
+       /**
+        * Specifies the template class to use for rendering the HTML page.
+        * <p>
+        * By default, uses {@link HtmlDocTemplateBasic} to render the 
contents, although you can provide
+        *       your own custom renderer or subclasses from the basic class to 
have full control over how the page is
+        *      rendered.
+        * <p>
+        * This is the programmatic equivalent to the {@link HtmlDoc#template() 
@HtmlDoc.template()} annotation.
+        *
+        * @param value The HTML page template to use to render the HTML page.
+        * @return This object (for method chaining).
+        */
+       public RestResponse setHtmlTemplate(Class<? extends HtmlDocTemplate> 
value) {
+               properties.put(HtmlDocSerializerContext.HTMLDOC_template, 
value);
+               return this;
+       }
+
+       /**
+        * Specifies the template class to use for rendering the HTML page.
+        * <p>
+        * By default, uses {@link HtmlDocTemplateBasic} to render the 
contents, although you can provide
+        *       your own custom renderer or subclasses from the basic class to 
have full control over how the page is
+        *      rendered.
+        * <p>
+        * This is the programmatic equivalent to the {@link HtmlDoc#template() 
@HtmlDoc.template()} annotation.
         *
-        * @param links The localized page links render on the page.
+        * @param value The HTML page template to use to render the HTML page.
         * @return This object (for method chaining).
         */
-       public RestResponse setPageLinks(Object links) {
-               properties.put(HtmlDocSerializerContext.HTMLDOC_links, links);
+       public RestResponse setHtmlTemplate(HtmlDocTemplate value) {
+               properties.put(HtmlDocSerializerContext.HTMLDOC_template, 
value);
                return this;
        }
 

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java 
b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java
index 51252b2..050ad0e 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java
@@ -167,8 +167,7 @@ import org.apache.juneau.xml.*;
                UrlEncodingSerializer.class,
                MsgPackSerializer.class,
                SoapXmlSerializer.class,
-               PlainTextSerializer.class,
-               JsoSerializer.class
+               PlainTextSerializer.class
        },
        parsers={
                JsonParser.class,
@@ -197,9 +196,13 @@ public abstract class RestServletDefault extends 
RestServlet {
         * @return A bean containing the contents for the OPTIONS page.
         */
        @RestMethod(name="OPTIONS", path="/*",
-               pageLinks="{back:'$R{servletURI}'}",
+               htmldoc=@HtmlDoc(
+                       
links="{back:'servlet:/',json:'servlet:/?method=OPTIONS&Accept=text/json&plainText=true'}",
+                       description="Swagger documentation",
+                       aside="NONE"
+               ),
                summary="Resource options",
-               description="Description of this resource"
+               description="Swagger documentation"
        )
        public Swagger getOptions(RestRequest req) {
                return req.getSwagger();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java 
b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java
new file mode 100644
index 0000000..80ddf10
--- /dev/null
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java
@@ -0,0 +1,339 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.rest.annotation;
+
+import org.apache.juneau.*;
+import org.apache.juneau.html.*;
+import org.apache.juneau.rest.*;
+
+/**
+ * Contains all the configurable annotations for the {@link HtmlDocSerializer}.
+ * <p>
+ * Used with {@link RestResource#htmldoc()} and {@link RestMethod#htmldoc()} 
to customize the HTML view of
+ *     serialized POJOs.
+ * <p>
+ * All annotations specified here have no effect on any serializers other than 
{@link HtmlDocSerializer} and is
+ *     provided as a shorthand method of for specifying configuration 
properties.
+ * <p>
+ * For example, the following two methods for defining the HTML document title 
are considered equivalent:
+ * <p class='bcode'>
+ *     <ja>@RestResource</ja>(
+ *             properties={
+ *                     <ja>@Property</ja>(name=<jsf>HTMLDOC_title</jsf>, 
value=<js>"My Resource Page"</js>)
+ *             }
+ *     )
+ *
+ *     <ja>@RestResource</ja>(
+ *             htmldoc=<ja>@HtmlDoc</ja>(
+ *                     title=<js>"My Resource Page"</js>
+ *             )
+ *     )
+ * </p>
+ * <p>
+ * The purpose of these annotation is to populate the HTML document view which 
by default consists of the following
+ *     structure:
+ * <p class='bcode'>
+ *     <xt>&lt;html&gt;
+ *             &lt;head&gt;
+ *                     &lt;style <xa>type</xa>=<xs>'text/css'</xs>&gt;
+ *                             <xv>CSS styles and links to stylesheets</xv>
+ *                     &lt/style&gt;
+ *             &lt;/head&gt;
+ *             &lt;body&gt;
+ *                     &lt;header&gt;
+ *                             <xv>Page title and description</xv>
+ *                     &lt;/header&gt;
+ *                     &lt;nav&gt;
+ *                             <xv>Page links</xv>
+ *                     &lt;/nav&gt;
+ *                     &lt;aside&gt;
+ *                             <xv>Side-bar page links</xv>
+ *                     &lt;/aside&gt;
+ *                     &lt;article&gt;
+ *                             <xv>Contents of serialized object</xv>
+ *                     &lt;/article&gt;
+ *                     &lt;footer&gt;
+ *                             <xv>Footer message</xv>
+ *                     &lt;/footer&gt;
+ *             &lt;/body&gt;
+ *     &lt;/html&gt;</xt>
+ * </p>
+ */
+public @interface HtmlDoc {
+
+       /**
+        * Sets the HTML page title.
+        * <p>
+        * The format of this value is plain text.
+        * <p>
+        * It gets wrapped in a <code><xt>&lt;h3&gt; 
<xa>class</xa>=<xs>'title'</xs>&gt;</xt></code> element and then added
+        *      to the <code><xt>&lt;header&gt;</code> section on the page.
+        * <p>
+        * If not specified, the page title is pulled from one of the following 
locations:
+        * <ol>
+        *      <li><code>{servletClass}.{methodName}.pageTitle</code> resource 
bundle value.
+        *      <li><code>{servletClass}.pageTitle</code> resource bundle value.
+        *      <li><code><ja>@RestResource</ja>(title)</code> annotation.
+        *      <li><code>{servletClass}.title</code> resource bundle value.
+        *      <li><code>info/title</code> entry in swagger file.
+        * <ol>
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * <ul class='doctree'>
+        *      <li class='info'>
+        *              In most cases, you'll simply want to use the 
<code>@RestResource(title)</code> annotation to specify the
+        *              page title.
+        *              However, this annotation is provided in cases where you 
want the page title to be different that the one
+        *              shown in the swagger document.
+        * </ul>
+        * <p>
+        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setHtmlTitle(String)}/{@link RestResponse#setHtmlTitle(Object)} 
methods.
+        */
+       String title() default "";
+
+       /**
+        * Sets the HTML page description.
+        * <p>
+        * The format of this value is plain text.
+        * <p>
+        * It gets wrapped in a <code><xt>&lt;h5&gt; 
<xa>class</xa>=<xs>'description'</xs>&gt;</xt></code> element and then
+        *      added to the <code><xt>&lt;header&gt;</code> section on the 
page.
+        * <p>
+        * If not specified, the page title is pulled from one of the following 
locations:
+        * <ol>
+        *      <li><code>{servletClass}.{methodName}.pageText</code> resource 
bundle value.
+        *      <li><code>{servletClass}.pageText</code> resource bundle value.
+        *      <li><code><ja>@RestMethod</ja>(summary)</code> annotation.
+        *      <li><code>{servletClass}.{methodName}.summary</code> resource 
bundle value.
+        *      <li><code>summary</code> entry in swagger file for method.
+        *      <li><code>{servletClass}.description</code> resource bundle 
value.
+        *      <li><code>info/description</code> entry in swagger file.
+        * <ol>
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * <ul class='doctree'>
+        *      <li class='info'>
+        *              In most cases, you'll simply want to use the 
<code>@RestResource(description)</code> or
+        *              <code>@RestMethod(summary)</code> annotations to 
specify the page text.
+        *              However, this annotation is provided in cases where you 
want the text to be different that the values shown
+        *              in the swagger document.
+        * </ul>
+        * <p>
+        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setHtmlDescription(String)}/{@link 
RestResponse#setHtmlDescription(Object)} methods.
+        */
+       String description() default "";
+
+       /**
+        * Sets the HTML header section contents.
+        * <p>
+        * The format of this value is HTML.
+        * <p>
+        * The page header normally contains the title and description, but 
this value can be used to override the contents
+        *      to be whatever you want.
+        * <p>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestResource</ja>(
+        *              htmldoc=<ja>@HtmlDoc</ja>(
+        *                      header=<js>"&lt;p&gtThis is my REST 
interface&lt;/p&gt;"</js>
+        *              )
+        *      )
+        * </p>
+        * <p>
+        * When a value is specified, the {@link #title()} and {@link 
#description()} values will be ignored.
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no header.
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setHtmlHeader(String)}/{@link RestResponse#setHtmlHeader(Object)} 
methods.
+        */
+       String header() default "";
+
+       /**
+        * Sets the links in the HTML nav section.
+        * <p>
+        * The format of this value is a lax-JSON map of key/value pairs where 
the keys are the link text and the values are
+        *      relative (to the servlet) or absolute URLs.
+        * <p>
+        * The page links are positioned immediately under the title and text.
+        * <p>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestResource</ja>(
+        *              htmldoc=<ja>@HtmlDoc</ja>(
+        *                      
links=<js>"{up:'request:/..',options:'servlet:/?method=OPTIONS'}"</js>
+        *              )
+        *      )
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * This field can also use URIs of any support type in {@link 
UriResolver}.
+        * <p>
+        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setHtmlLinks(String)}/{@link RestResponse#setHtmlLinks(Object)} 
methods.
+        */
+       String links() default "";
+
+       /**
+        * Sets the HTML nav section contents.
+        * <p>
+        * The format of this value is HTML.
+        * <p>
+        * The nav section of the page contains the links.
+        * <p>
+        * The format of this value is HTML.
+        * <p>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestResource</ja>(
+        *              htmldoc=<ja>@HtmlDoc</ja>(
+        *                      nav=<js>"&lt;p&gt;Custom nav 
content&lt;/p&gt;"</js>
+        *              )
+        *      )
+        * </p>
+        * <p>
+        * When a value is specified, the {@link #links()} value will be 
ignored.
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setHtmlNav(String)}/{@link RestResponse#setHtmlNav(Object)} methods.
+        */
+       String nav() default "";
+
+       /**
+        * Sets the HTML aside section contents.
+        * <p>
+        * The format of this value is HTML.
+        * <p>
+        * The aside section typically floats on the right side of the page.
+        * <p>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestResource</ja>(
+        *              htmldoc=<ja>@HtmlDoc</ja>(
+        *                      aside=<js>"&lt;p&gt;Custom aside 
content&lt;/p&gt;"</js>
+        *              )
+        *      )
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setHtmlAside(String)}/{@link RestResponse#setHtmlAside(Object)} 
methods.
+        */
+       String aside() default "";
+
+       /**
+        * Sets the HTML footer section contents.
+        * <p>
+        * The format of this value is HTML.
+        * <p>
+        * The footer section typically floats on the bottom of the page.
+        * <p>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestResource</ja>(
+        *              htmldoc=<ja>@HtmlDoc</ja>(
+        *                      footer=<js>"&lt;p&gt;Custom footer 
content&lt;/p&gt;"</js>
+        *              )
+        *      )
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setHtmlFooter(String)}/{@link RestResponse#setHtmlFooter(Object)} 
methods.
+        */
+       String footer() default "";
+
+       /**
+        * Sets the HTML CSS style section contents.
+        * <p>
+        * The format of this value is CSS.
+        * <p>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestResource</ja>(
+        *              htmldoc=<ja>@HtmlDoc</ja>(
+        *                      
css=<js>".red{color:red;}\n.blue{color:blue}"</js>
+        *              )
+        *      )
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * <p>
+        * A value of <js>"NONE"</js> can be used to force no value.
+        * <p>
+        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setHtmlCss(String)}/{@link RestResponse#setHtmlCss(Object)} methods.
+        */
+       String css() default "";
+
+       /**
+        * Sets the CSS URL in the HTML CSS style section.
+        * <p>
+        * The format of this value is a URL.
+        * <p>
+        * Specifies the URL to the stylesheet to add as a link in the style 
tag in the header.
+        * <p>
+        * The format of this value is CSS.
+        * <p>
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestResource</ja>(
+        *              htmldoc=<ja>@HtmlDoc</ja>(
+        *                      
cssUrl=<js>"http://someOtherHost/stealTheir.css";</js>
+        *              )
+        *      )
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>) and can use URL protocols defined
+        *      by {@link UriResolver}.
+        * <p>
+        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setHtmlCssUrl(String)}/{@link RestResponse#setHtmlCssUrl(Object)} 
methods.
+        */
+       String cssUrl() default "servlet:/style.css";
+
+       /**
+        * Shorthand method for forcing the rendered HTML content to be no-wrap.
+        */
+       boolean nowrap() default false;
+
+       /**
+        * Specifies the text to display when serializing an empty array or 
collection.
+        */
+       String noResultsMessage() default "no results";
+
+       /**
+        * Specifies the template class to use for rendering the HTML page.
+        * <p>
+        * By default, uses {@link HtmlDocTemplateBasic} to render the 
contents, although you can provide
+        *       your own custom renderer or subclasses from the basic class to 
have full control over how the page is
+        *      rendered.
+        * <p>
+        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setHtmlTemplate(Class)}/{@link RestResponse#setHtmlTemplate(Class)} 
methods.
+        */
+       Class<? extends HtmlDocTemplate> template() default 
HtmlDocTemplate.class;
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java
 
b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java
new file mode 100644
index 0000000..b43affe
--- /dev/null
+++ 
b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/MethodSwagger.java
@@ -0,0 +1,161 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.rest.annotation;
+
+/**
+ * Extended annotation for {@link RestMethod#swagger() RestMethod.swagger()}.
+ */
+public @interface MethodSwagger {
+       
+       /**
+        * Optional external documentation information for the exposed API.
+        * <p>
+        * Used to populate the Swagger external documentation field.
+        * <p>
+        * A simplified JSON string with the following fields:
+        * <p class='bcode'>
+        *      {
+        *              description: string,
+        *              url: string
+        *      }
+        * </p>
+        * <p>
+        * The default value pulls the description from the 
<code>(className.?)[javaMethodName].externalDocs</code> entry in the servlet 
resource bundle.
+        *      (e.g. <js>"MyClass.myMethod.externalDocs = 
{url:'http://juneau.apache.org'}"</js> or <js>"myMethod.externalDocs = 
{url:'http://juneau.apache.org'}"</js>).
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      
<ja>@RestMethod</ja>(externalDocs=<js>"{url:'http://juneau.apache.org'}"</js>)
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. "$L{my.localized.variable}").
+        * <p>
+        * Corresponds to the swagger field 
<code>/paths/{path}/{method}/externalDocs</code>.
+        */
+       String externalDocs() default "";
+
+       /**
+        * Optional tagging information for the exposed API.
+        * <p>
+        * Used to populate the Swagger tags field.
+        * <p>
+        * A comma-delimited list of tags for API documentation control.
+        * Tags can be used for logical grouping of operations by resources or 
any other qualifier.
+        * <p>
+        * The default value pulls the description from the 
<code>(className.?)[javaMethodName].tags</code> entry in the servlet resource 
bundle.
+        *      (e.g. <js>"MyClass.myMethod.tags = foo,bar"</js> or 
<js>"myMethod.tags = foo,bar"</js>).
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestMethod</ja>(tags=<js>"foo,bar"</js>)
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. "$L{my.localized.variable}").
+        * <p>
+        * Corresponds to the swagger field 
<code>/paths/{path}/{method}/tags</code>.
+        */
+       String tags() default "";
+
+       /**
+        * Optional deprecated flag for the exposed API.
+        * <p>
+        * Used to populate the Swagger deprecated field.
+        * <p>
+        * The default value pulls the description from the 
<code>(className.?)[javaMethodName].deprecated</code> entry in the servlet 
resource bundle.
+        *      (e.g. <js>"MyClass.myMethod.deprecated = true"</js> or 
<js>"myMethod.deprecated = foo,bar"</js>).
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestMethod</ja>(deprecated=<jk>true</jk>)
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. "$L{my.localized.variable}").
+        * <p>
+        * Corresponds to the swagger field 
<code>/paths/{path}/{method}/deprecated</code>.
+        */
+       boolean deprecated() default false;
+
+       /**
+        * Optional parameter descriptions.
+        * <p>
+        * This annotation is provided for documentation purposes and is used 
to populate the method <js>"parameters"</js> column
+        *      on the Swagger page.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestMethod</ja>(
+        *              name=<js>"POST"</js>, path=<js>"/{a}"</js>,
+        *              description=<js>"This is my method."</js>,
+        *              parameters={
+        *                      <ja>@Parameter</ja>(in=<js>"path"</js>, 
name=<js>"a"</js>, description=<js>"The 'a' attribute"</js>),
+        *                      <ja>@Parameter</ja>(in=<js>"query"</js>, 
name=<js>"b"</js>, description=<js>"The 'b' parameter"</js>, 
required=<jk>true</jk>),
+        *                      <ja>@Parameter</ja>(in=<js>"body"</js>, 
description=<js>"The HTTP content"</js>),
+        *                      <ja>@Parameter</ja>(in=<js>"header"</js>, 
name=<js>"D"</js>, description=<js>"The 'D' header"</js>),
+        *              }
+        *      )
+        * </p>
+        * This is functionally equivalent to specifying the following keys in 
the resource bundle for the class, except in this case
+        *      the strings are internationalized.
+        * <p class='bcode'>
+        *      <jk>MyClass.myMethod.description</jk> = <js>This is my 
method.</js>
+        *      <jk>MyClass.myMethod.req.path.a.description</jk> = <js>The 'a' 
attribute</js>
+        *      <jk>MyClass.myMethod.req.query.b.description</jk> = <js>The 'b' 
parameter</js>
+        *      <jk>MyClass.myMethod.req.body.description</jk> = <js>The HTTP 
content</js>
+        *      <jk>MyClass.myMethod.req.header.d.description</jk> = <js>The 
'D' header</js>
+        * <p>
+        * As a general rule, use annotations when you don't care about 
internationalization (i.e. you only want to support English),
+        *      and use resource bundles if you need to support localization.
+        * <p>
+        * These annotations can contain variables (e.g. 
"$L{my.localized.variable}").
+        * <p>
+        * Corresponds to the swagger field 
<code>/paths/{path}/{method}/parameters</code>.
+        */
+       Parameter[] parameters() default {};
+
+       /**
+        * Optional output description.
+        * <p>
+        * This annotation is provided for documentation purposes and is used 
to populate the method <js>"responses"</js> column
+        *      on the Swagger page.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestMethod</ja>(
+        *              name=<js>"GET"</js>, path=<js>"/"</js>,
+        *              responses={
+        *                      <ja>@Response</ja>(200),
+        *                      <ja>@Response</ja>(
+        *                              value=302,
+        *                              description=<js>"Thing wasn't found 
here"</js>,
+        *                              headers={
+        *                                      
<ja>@Parameter</ja>(name=<js>"Location"</js>, description=<js>"The place to 
find the thing"</js>)
+        *                              }
+        *                      )
+        *              }
+        *      )
+        * </p>
+        * This is functionally equivalent to specifying the following keys in 
the resource bundle for the class, except in this case
+        *      the strings are internationalized.
+        * <p class='bcode'>
+        *      <jk>MyClass.myMethod.res.200.description</jk> = <js>OK</js>
+        *      <jk>MyClass.myMethod.res.302.description</jk> = <js>Thing 
wasn't found here</js>
+        *      <jk>MyClass.myMethod.res.302.header.Location.description</jk> = 
<js>The place to find the thing</js>
+        * <p>
+        * As a general rule, use annotations when you don't care about 
internationalization (i.e. you only want to support English),
+        *      and use resource bundles if you need to support localization.
+        * <p>
+        * These annotations can contain variables (e.g. 
"$L{my.localized.variable}").
+        */
+       Response[] responses() default {};
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Parameter.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Parameter.java 
b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Parameter.java
index 76c7b77..26c0971 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Parameter.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Parameter.java
@@ -18,16 +18,18 @@ import static java.lang.annotation.RetentionPolicy.*;
 import java.lang.annotation.*;
 
 /**
- * Annotation used in conjunction with {@link RestMethod#parameters()} to 
identify content and header descriptions
+ * Annotation used in conjunction with {@link MethodSwagger#parameters()} to 
identify content and header descriptions
  *     on specific method requests.
  *
  * <h5 class='section'>Example:</h5>
  * <p class='bcode'>
  *     <ja>@RestMethod</ja>(
  *             name=<js>"*"</js>,
- *             parameters={
- *                     <ja>@Parameter</ja>(in=<js>"header"</js>, 
name=<js>"Range"</js>, description=<js>"$L{ContentRange.description}"</js>)
- *             }
+ *             swagger=@MethodSwagger(
+ *                     parameters={
+ *                             <ja>@Parameter</ja>(in=<js>"header"</js>, 
name=<js>"Range"</js>, description=<js>"$L{ContentRange.description}"</js>)
+ *                     }
+ *                     )
  *     )
  *     <jk>public void</jk> doAnything(RestRequest req, RestResponse res, 
<ja>@Method</ja> String method) {
  *             ...

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java
 
b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java
new file mode 100644
index 0000000..d925bbc
--- /dev/null
+++ 
b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/ResourceSwagger.java
@@ -0,0 +1,177 @@
+// 
***************************************************************************************************************************
+// * Licensed to the Apache Software Foundation (ASF) under one or more 
contributor license agreements.  See the NOTICE file *
+// * distributed with this work for additional information regarding copyright 
ownership.  The ASF licenses this file        *
+// * to you under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance            *
+// * with the License.  You may obtain a copy of the License at                
                                              *
+// *                                                                           
                                              *
+// *  http://www.apache.org/licenses/LICENSE-2.0                               
                                              *
+// *                                                                           
                                              *
+// * Unless required by applicable law or agreed to in writing, software 
distributed under the License is distributed on an  *
+// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 
express or implied.  See the License for the        *
+// * specific language governing permissions and limitations under the 
License.                                              *
+// 
***************************************************************************************************************************
+package org.apache.juneau.rest.annotation;
+
+import org.apache.juneau.rest.*;
+
+/**
+ * Extended annotation for {@link RestResource#swagger() 
@RestResource.swagger()}.
+ */
+public @interface ResourceSwagger {
+       /**
+        * Optional servlet terms-of-service for this API.
+        * <p>
+        * It is used to populate the Swagger terms-of-service field.
+        * <p>
+        * The default value pulls the description from the 
<code>termsOfService</code> entry in the servlet resource bundle.
+        *      (e.g. <js>"termsOfService = foo"</js> or 
<js>"MyServlet.termsOfService = foo"</js>).
+        * <p>
+        * This field can contain variables (e.g. "$L{my.localized.variable}").
+        * <p>
+        * Corresponds to the swagger field <code>/info/termsOfService</code>.
+        * <p>
+        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getTermsOfService(RestRequest)} method.
+        */
+       String termsOfService() default "";
+
+       /**
+        * Optional contact information for the exposed API.
+        * <p>
+        * It is used to populate the Swagger contact field and to display on 
HTML pages.
+        * <p>
+        * A simplified JSON string with the following fields:
+        * <p class='bcode'>
+        *      {
+        *              name: string,
+        *              url: string,
+        *              email: string
+        *      }
+        * </p>
+        * <p>
+        * The default value pulls the description from the 
<code>contact</code> entry in the servlet resource bundle.
+        *      (e.g. <js>"contact = {name:'John 
Smith',email:'[email protected]'}"</js> or <js>"MyServlet.contact = 
{name:'John Smith',email:'[email protected]'}"</js>).
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestResource</ja>(contact=<js>"{name:'John 
Smith',email:'[email protected]'}"</js>)
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. "$L{my.localized.variable}").
+        * <p>
+        * Corresponds to the swagger field <code>/info/contact</code>.
+        * <p>
+        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getContact(RestRequest)} method.
+        */
+       String contact() default "";
+
+       /**
+        * Optional license information for the exposed API.
+        * <p>
+        * It is used to populate the Swagger license field and to display on 
HTML pages.
+        * <p>
+        * A simplified JSON string with the following fields:
+        * <p class='bcode'>
+        *      {
+        *              name: string,
+        *              url: string
+        *      }
+        * </p>
+        * <p>
+        * The default value pulls the description from the 
<code>license</code> entry in the servlet resource bundle.
+        *      (e.g. <js>"license = {name:'Apache 
2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'}"</js> or 
<js>"MyServlet.license = {name:'Apache 
2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'}"</js>).
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      <ja>@RestResource</ja>(license=<js>"{name:'Apache 
2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'}"</js>)
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. "$L{my.localized.variable}").
+        * <p>
+        * Corresponds to the swagger field <code>/info/license</code>.
+        * <p>
+        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getLicense(RestRequest)} method.
+        */
+       String license() default "";
+
+       /**
+        * Provides the version of the application API (not to be confused with 
the specification version).
+        * <p>
+        * It is used to populate the Swagger version field and to display on 
HTML pages.
+        * <p>
+        * The default value pulls the description from the 
<code>version</code> entry in the servlet resource bundle.
+        *      (e.g. <js>"version = 2.0"</js> or <js>"MyServlet.version = 
2.0"</js>).
+        * <p>
+        * This field can contain variables (e.g. "$L{my.localized.variable}").
+        * <p>
+        * Corresponds to the swagger field <code>/info/version</code>.
+        * <p>
+        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getVersion(RestRequest)} method.
+        */
+       String version() default "";
+
+       /**
+        * Optional tagging information for the exposed API.
+        * <p>
+        * It is used to populate the Swagger tags field and to display on HTML 
pages.
+        * <p>
+        * A simplified JSON string with the following fields:
+        * <p class='bcode'>
+        *      [
+        *              {
+        *                      name: string,
+        *                      description: string,
+        *                      externalDocs: {
+        *                              description: string,
+        *                              url: string
+        *                      }
+        *              }
+        *      ]
+        * </p>
+        * <p>
+        * The default value pulls the description from the <code>tags</code> 
entry in the servlet resource bundle.
+        *      (e.g. <js>"tags = [{name:'Foo',description:'Foobar'}]"</js> or 
<js>"MyServlet.tags = [{name:'Foo',description:'Foobar'}]"</js>).
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      
<ja>@RestResource</ja>(tags=<js>"[{name:'Foo',description:'Foobar'}]"</js>)
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. "$L{my.localized.variable}").
+        * <p>
+        * Corresponds to the swagger field <code>/tags</code>.
+        * <p>
+        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getTags(RestRequest)} method.
+        */
+       String tags() default "";
+
+       /**
+        * Optional external documentation information for the exposed API.
+        * <p>
+        * It is used to populate the Swagger external documentation field and 
to display on HTML pages.
+        * <p>
+        * A simplified JSON string with the following fields:
+        * <p class='bcode'>
+        *      {
+        *              description: string,
+        *              url: string
+        *      }
+        * </p>
+        * <p>
+        * The default value pulls the description from the 
<code>externalDocs</code> entry in the servlet resource bundle.
+        *      (e.g. <js>"externalDocs = 
{url:'http://juneau.apache.org'}"</js> or <js>"MyServlet.externalDocs = 
{url:'http://juneau.apache.org'}"</js>).
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bcode'>
+        *      
<ja>@RestResource</ja>(externalDocs=<js>"{url:'http://juneau.apache.org'}"</js>)
+        * </p>
+        * <p>
+        * This field can contain variables (e.g. "$L{my.localized.variable}").
+        * <p>
+        * Corresponds to the swagger field <code>/tags</code>.
+        * <p>
+        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getExternalDocs(RestRequest)} method.
+        */
+       String externalDocs() default "";
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Response.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Response.java 
b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Response.java
index 3b72a74..1c1bd39 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Response.java
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/Response.java
@@ -18,17 +18,19 @@ import static java.lang.annotation.RetentionPolicy.*;
 import java.lang.annotation.*;
 
 /**
- * Annotation used in conjunction with {@link RestMethod#responses()} to 
identify possible responses by the method.
+ * Annotation used in conjunction with {@link MethodSwagger#responses()} to 
identify possible responses by the method.
  *
  * <h5 class='section'>Example:</h5>
  * <p class='bcode'>
  *     <ja>@RestMethod</ja>(
  *             name=<js>"*"</js>,
- *             responses={
- *                     
<ja>@Response</ja>(value=200,description=<js>"Everything was great."</js>),
- *                     <ja>@Response</ja>(value=404,description=<js>"File was 
not found."</js>)
- *                     <ja>@Response</ja>(500),
- *             }
+ *             swagger=@ResourceSwagger(
+ *                     responses={
+ *                             
<ja>@Response</ja>(value=200,description=<js>"Everything was great."</js>),
+ *                             
<ja>@Response</ja>(value=404,description=<js>"File was not found."</js>)
+ *                             <ja>@Response</ja>(500),
+ *                     }
+ *             )
  *     )
  *     <jk>public void</jk> doAnything(RestRequest req, RestResponse res, 
<ja>@Method</ja> String method) {
  *             ...
@@ -70,9 +72,11 @@ public @interface Response {
         * <p class='bcode'>
         *      <ja>@RestMethod</ja>(
         *              name=<js>"*"</js>,
-        *              responses={
-        *                      
<ja>@Response</ja>(value=200,schema=<js>"{type:'string',description:'A 
serialized Person bean.'}"</js>),
-        *              }
+        *              swagger=@MethodSwagger(
+        *                      responses={
+        *                              
<ja>@Response</ja>(value=200,schema=<js>"{type:'string',description:'A 
serialized Person bean.'}"</js>),
+        *                      }
+        *              )
         * </p>
         */
        String schema() default "";

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java 
b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
index b2fa562..fc770a5 100644
--- 
a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
+++ 
b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
@@ -21,6 +21,7 @@ import org.apache.juneau.encoders.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.remoteable.*;
 import org.apache.juneau.rest.*;
+import org.apache.juneau.rest.widget.*;
 import org.apache.juneau.serializer.*;
 
 /**
@@ -374,147 +375,6 @@ public @interface RestMethod {
        String description() default "";
 
        /**
-        * Optional external documentation information for the exposed API.
-        * <p>
-        * Used to populate the Swagger external documentation field.
-        * <p>
-        * A simplified JSON string with the following fields:
-        * <p class='bcode'>
-        *      {
-        *              description: string,
-        *              url: string
-        *      }
-        * </p>
-        * <p>
-        * The default value pulls the description from the 
<code>(className.?)[javaMethodName].externalDocs</code> entry in the servlet 
resource bundle.
-        *      (e.g. <js>"MyClass.myMethod.externalDocs = 
{url:'http://juneau.apache.org'}"</js> or <js>"myMethod.externalDocs = 
{url:'http://juneau.apache.org'}"</js>).
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode'>
-        *      
<ja>@RestMethod</ja>(externalDocs=<js>"{url:'http://juneau.apache.org'}"</js>)
-        * </p>
-        * <p>
-        * This field can contain variables (e.g. "$L{my.localized.variable}").
-        * <p>
-        * Corresponds to the swagger field 
<code>/paths/{path}/{method}/externalDocs</code>.
-        */
-       String externalDocs() default "";
-
-       /**
-        * Optional tagging information for the exposed API.
-        * <p>
-        * Used to populate the Swagger tags field.
-        * <p>
-        * A comma-delimited list of tags for API documentation control.
-        * Tags can be used for logical grouping of operations by resources or 
any other qualifier.
-        * <p>
-        * The default value pulls the description from the 
<code>(className.?)[javaMethodName].tags</code> entry in the servlet resource 
bundle.
-        *      (e.g. <js>"MyClass.myMethod.tags = foo,bar"</js> or 
<js>"myMethod.tags = foo,bar"</js>).
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode'>
-        *      <ja>@RestMethod</ja>(tags=<js>"foo,bar"</js>)
-        * </p>
-        * <p>
-        * This field can contain variables (e.g. "$L{my.localized.variable}").
-        * <p>
-        * Corresponds to the swagger field 
<code>/paths/{path}/{method}/tags</code>.
-        */
-       String tags() default "";
-
-       /**
-        * Optional deprecated flag for the exposed API.
-        * <p>
-        * Used to populate the Swagger deprecated field.
-        * <p>
-        * The default value pulls the description from the 
<code>(className.?)[javaMethodName].deprecated</code> entry in the servlet 
resource bundle.
-        *      (e.g. <js>"MyClass.myMethod.deprecated = true"</js> or 
<js>"myMethod.deprecated = foo,bar"</js>).
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode'>
-        *      <ja>@RestMethod</ja>(deprecated=<jk>true</jk>)
-        * </p>
-        * <p>
-        * This field can contain variables (e.g. "$L{my.localized.variable}").
-        * <p>
-        * Corresponds to the swagger field 
<code>/paths/{path}/{method}/deprecated</code>.
-        */
-       boolean deprecated() default false;
-
-       /**
-        * Optional parameter descriptions.
-        * <p>
-        * This annotation is provided for documentation purposes and is used 
to populate the method <js>"parameters"</js> column
-        *      on the Swagger page.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode'>
-        *      <ja>@RestMethod</ja>(
-        *              name=<js>"POST"</js>, path=<js>"/{a}"</js>,
-        *              description=<js>"This is my method."</js>,
-        *              parameters={
-        *                      <ja>@Parameter</ja>(in=<js>"path"</js>, 
name=<js>"a"</js>, description=<js>"The 'a' attribute"</js>),
-        *                      <ja>@Parameter</ja>(in=<js>"query"</js>, 
name=<js>"b"</js>, description=<js>"The 'b' parameter"</js>, 
required=<jk>true</jk>),
-        *                      <ja>@Parameter</ja>(in=<js>"body"</js>, 
description=<js>"The HTTP content"</js>),
-        *                      <ja>@Parameter</ja>(in=<js>"header"</js>, 
name=<js>"D"</js>, description=<js>"The 'D' header"</js>),
-        *              }
-        *      )
-        * </p>
-        * This is functionally equivalent to specifying the following keys in 
the resource bundle for the class, except in this case
-        *      the strings are internationalized.
-        * <p class='bcode'>
-        *      <jk>MyClass.myMethod.description</jk> = <js>This is my 
method.</js>
-        *      <jk>MyClass.myMethod.req.path.a.description</jk> = <js>The 'a' 
attribute</js>
-        *      <jk>MyClass.myMethod.req.query.b.description</jk> = <js>The 'b' 
parameter</js>
-        *      <jk>MyClass.myMethod.req.body.description</jk> = <js>The HTTP 
content</js>
-        *      <jk>MyClass.myMethod.req.header.d.description</jk> = <js>The 
'D' header</js>
-        * <p>
-        * As a general rule, use annotations when you don't care about 
internationalization (i.e. you only want to support English),
-        *      and use resource bundles if you need to support localization.
-        * <p>
-        * These annotations can contain variables (e.g. 
"$L{my.localized.variable}").
-        * <p>
-        * Corresponds to the swagger field 
<code>/paths/{path}/{method}/parameters</code>.
-        */
-       Parameter[] parameters() default {};
-
-       /**
-        * Optional output description.
-        * <p>
-        * This annotation is provided for documentation purposes and is used 
to populate the method <js>"responses"</js> column
-        *      on the Swagger page.
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode'>
-        *      <ja>@RestMethod</ja>(
-        *              name=<js>"GET"</js>, path=<js>"/"</js>,
-        *              responses={
-        *                      <ja>@Response</ja>(200),
-        *                      <ja>@Response</ja>(
-        *                              value=302,
-        *                              description=<js>"Thing wasn't found 
here"</js>,
-        *                              headers={
-        *                                      
<ja>@Parameter</ja>(name=<js>"Location"</js>, description=<js>"The place to 
find the thing"</js>)
-        *                              }
-        *                      )
-        *              }
-        *      )
-        * </p>
-        * This is functionally equivalent to specifying the following keys in 
the resource bundle for the class, except in this case
-        *      the strings are internationalized.
-        * <p class='bcode'>
-        *      <jk>MyClass.myMethod.res.200.description</jk> = <js>OK</js>
-        *      <jk>MyClass.myMethod.res.302.description</jk> = <js>Thing 
wasn't found here</js>
-        *      <jk>MyClass.myMethod.res.302.header.Location.description</jk> = 
<js>The place to find the thing</js>
-        * <p>
-        * As a general rule, use annotations when you don't care about 
internationalization (i.e. you only want to support English),
-        *      and use resource bundles if you need to support localization.
-        * <p>
-        * These annotations can contain variables (e.g. 
"$L{my.localized.variable}").
-        */
-       Response[] responses() default {};
-
-       /**
         * Specifies whether this method can be called based on the client 
version.
         * <p>
         * The client version is identified via the HTTP request header 
identified by {@link RestResource#clientVersionHeader()} which
@@ -573,17 +433,22 @@ public @interface RestMethod {
        String clientVersion() default "";
 
        /**
-        * Overrides the HTML page title defined on the servlet via the {@link 
RestResource#pageTitle() @RestResource.pageTitle()} annotation.
+        * Defines widgets that can be used in conjunction with string 
variables of the form <js>"$W{name}"</js>to quickly
+        *      generate arbitrary replacement text.
+        * <p>
+        * Widgets are inherited from parent to child, but can be overridden by 
reusing the widget name.
         */
-       String pageTitle() default "";
+       Class<? extends Widget>[] widgets() default {};
 
        /**
-        * Overrides the HTML page text defined on the servlet via the {@link 
RestResource#pageText() @RestResource.pageText()} annotation.
+        * Provides swagger-specific metadata on this method.
         */
-       String pageText() default "";
+       MethodSwagger swagger() default @MethodSwagger;
 
        /**
-        * Overrides the HTML page links defined on the servlet via the {@link 
RestResource#pageLinks() @RestResource.pageLinks()} annotation.
+        * Provides HTML-doc-specific metadata on this method.
+        * <p>
+        * Information provided here overrides information provided in the 
servlet-level annotation.
         */
-       String pageLinks() default "";
+       HtmlDoc htmldoc() default @HtmlDoc;
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestResource.java 
b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
index 5e86742..321b11d 100644
--- 
a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
+++ 
b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
@@ -21,12 +21,12 @@ import javax.servlet.http.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.encoders.Encoder;
-import org.apache.juneau.html.*;
 import org.apache.juneau.ini.*;
 import org.apache.juneau.jena.*;
 import org.apache.juneau.json.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.rest.*;
+import org.apache.juneau.rest.widget.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.transform.*;
 import org.apache.juneau.utils.*;
@@ -348,7 +348,7 @@ public @interface RestResource {
        /**
         * Optional servlet title.
         * <p>
-        * It is used to populate the Swagger title field and as a default 
value for the {@link #pageTitle()} value.
+        * It is used to populate the Swagger title field and as a default 
value for the {@link HtmlDoc#title()} value.
         * This value can be retrieved programmatically through the {@link 
RestRequest#getServletTitle()} method.
         * <p>
         * The default value pulls the label from the <code>label</code> entry 
in the servlet resource bundle.
@@ -365,7 +365,7 @@ public @interface RestResource {
        /**
         * Optional servlet description.
         * <p>
-        * It is used to populate the Swagger description field and as a 
default value for the {@link #pageText()} value.
+        * It is used to populate the Swagger description field and as a 
default value for the {@link HtmlDoc#description()} value.
         * This value can be retrieved programmatically through the {@link 
RestRequest#getServletDescription()} method.
         * <p>
         * The default value pulls the description from the 
<code>description</code> entry in the servlet resource bundle.
@@ -380,161 +380,6 @@ public @interface RestResource {
        String description() default "";
 
        /**
-        * Optional servlet terms-of-service for this API.
-        * <p>
-        * It is used to populate the Swagger terms-of-service field.
-        * <p>
-        * The default value pulls the description from the 
<code>termsOfService</code> entry in the servlet resource bundle.
-        *      (e.g. <js>"termsOfService = foo"</js> or 
<js>"MyServlet.termsOfService = foo"</js>).
-        * <p>
-        * This field can contain variables (e.g. "$L{my.localized.variable}").
-        * <p>
-        * Corresponds to the swagger field <code>/info/termsOfService</code>.
-        * <p>
-        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getTermsOfService(RestRequest)} method.
-        */
-       String termsOfService() default "";
-
-       /**
-        * Optional contact information for the exposed API.
-        * <p>
-        * It is used to populate the Swagger contact field and to display on 
HTML pages.
-        * <p>
-        * A simplified JSON string with the following fields:
-        * <p class='bcode'>
-        *      {
-        *              name: string,
-        *              url: string,
-        *              email: string
-        *      }
-        * </p>
-        * <p>
-        * The default value pulls the description from the 
<code>contact</code> entry in the servlet resource bundle.
-        *      (e.g. <js>"contact = {name:'John 
Smith',email:'[email protected]'}"</js> or <js>"MyServlet.contact = 
{name:'John Smith',email:'[email protected]'}"</js>).
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode'>
-        *      <ja>@RestResource</ja>(contact=<js>"{name:'John 
Smith',email:'[email protected]'}"</js>)
-        * </p>
-        * <p>
-        * This field can contain variables (e.g. "$L{my.localized.variable}").
-        * <p>
-        * Corresponds to the swagger field <code>/info/contact</code>.
-        * <p>
-        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getContact(RestRequest)} method.
-        */
-       String contact() default "";
-
-       /**
-        * Optional license information for the exposed API.
-        * <p>
-        * It is used to populate the Swagger license field and to display on 
HTML pages.
-        * <p>
-        * A simplified JSON string with the following fields:
-        * <p class='bcode'>
-        *      {
-        *              name: string,
-        *              url: string
-        *      }
-        * </p>
-        * <p>
-        * The default value pulls the description from the 
<code>license</code> entry in the servlet resource bundle.
-        *      (e.g. <js>"license = {name:'Apache 
2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'}"</js> or 
<js>"MyServlet.license = {name:'Apache 
2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'}"</js>).
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode'>
-        *      <ja>@RestResource</ja>(license=<js>"{name:'Apache 
2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'}"</js>)
-        * </p>
-        * <p>
-        * This field can contain variables (e.g. "$L{my.localized.variable}").
-        * <p>
-        * Corresponds to the swagger field <code>/info/license</code>.
-        * <p>
-        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getLicense(RestRequest)} method.
-        */
-       String license() default "";
-
-       /**
-        * Provides the version of the application API (not to be confused with 
the specification version).
-        * <p>
-        * It is used to populate the Swagger version field and to display on 
HTML pages.
-        * <p>
-        * The default value pulls the description from the 
<code>version</code> entry in the servlet resource bundle.
-        *      (e.g. <js>"version = 2.0"</js> or <js>"MyServlet.version = 
2.0"</js>).
-        * <p>
-        * This field can contain variables (e.g. "$L{my.localized.variable}").
-        * <p>
-        * Corresponds to the swagger field <code>/info/version</code>.
-        * <p>
-        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getVersion(RestRequest)} method.
-        */
-       String version() default "";
-
-       /**
-        * Optional tagging information for the exposed API.
-        * <p>
-        * It is used to populate the Swagger tags field and to display on HTML 
pages.
-        * <p>
-        * A simplified JSON string with the following fields:
-        * <p class='bcode'>
-        *      [
-        *              {
-        *                      name: string,
-        *                      description: string,
-        *                      externalDocs: {
-        *                              description: string,
-        *                              url: string
-        *                      }
-        *              }
-        *      ]
-        * </p>
-        * <p>
-        * The default value pulls the description from the <code>tags</code> 
entry in the servlet resource bundle.
-        *      (e.g. <js>"tags = [{name:'Foo',description:'Foobar'}]"</js> or 
<js>"MyServlet.tags = [{name:'Foo',description:'Foobar'}]"</js>).
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode'>
-        *      
<ja>@RestResource</ja>(tags=<js>"[{name:'Foo',description:'Foobar'}]"</js>)
-        * </p>
-        * <p>
-        * This field can contain variables (e.g. "$L{my.localized.variable}").
-        * <p>
-        * Corresponds to the swagger field <code>/tags</code>.
-        * <p>
-        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getTags(RestRequest)} method.
-        */
-       String tags() default "";
-
-       /**
-        * Optional external documentation information for the exposed API.
-        * <p>
-        * It is used to populate the Swagger external documentation field and 
to display on HTML pages.
-        * <p>
-        * A simplified JSON string with the following fields:
-        * <p class='bcode'>
-        *      {
-        *              description: string,
-        *              url: string
-        *      }
-        * </p>
-        * <p>
-        * The default value pulls the description from the 
<code>externalDocs</code> entry in the servlet resource bundle.
-        *      (e.g. <js>"externalDocs = 
{url:'http://juneau.apache.org'}"</js> or <js>"MyServlet.externalDocs = 
{url:'http://juneau.apache.org'}"</js>).
-        *
-        * <h5 class='section'>Example:</h5>
-        * <p class='bcode'>
-        *      
<ja>@RestResource</ja>(externalDocs=<js>"{url:'http://juneau.apache.org'}"</js>)
-        * </p>
-        * <p>
-        * This field can contain variables (e.g. "$L{my.localized.variable}").
-        * <p>
-        * Corresponds to the swagger field <code>/tags</code>.
-        * <p>
-        * The programmatic equivalent to this annotation is the {@link 
RestInfoProvider#getExternalDocs(RestRequest)} method.
-        */
-       String externalDocs() default "";
-
-       /**
         * Optional location of configuration file for this servlet.
         * <p>
         * The configuration file .
@@ -728,116 +573,85 @@ public @interface RestResource {
        Class<? extends RestInfoProvider> infoProvider() default 
RestInfoProvider.class;
 
        /**
-        * Specifies the page title to use on the HTML view of all pages 
produced by this resource.
-        * <p>
-        * This annotation has no effect on any serializers other than {@link 
HtmlDocSerializer} and is a shorthand method
-        * for setting the {@link HtmlDocSerializerContext#HTMLDOC_title} 
property:
-        * <p class='bcode'>
-        *      <ja>@RestResource</ja>(
-        *              properties={
-        *                      
<ja>@Property</ja>(name=<jsf>HTMLDOC_title</jsf>, value=<js>"My Resource 
Page"</js>)
-        *              }
-        *      )
-        *      <jk>public class</jk> MyResource <jk>extends</jk> 
RestServletDefault {
-        * </p>
-        * <p>
-        * If not specified, the page title is pulled from one of the following 
locations:
-        * <ol>
-        *      <li><code>{servletClass}.{methodName}.pageTitle</code> resource 
bundle value.
-        *      <li><code>{servletClass}.pageTitle</code> resource bundle value.
-        *      <li><code><ja>@RestResource</ja>(title)</code> annotation.
-        *      <li><code>{servletClass}.title</code> resource bundle value.
-        *      <li><code>info/title</code> entry in swagger file.
-        * <ol>
+        * Specifies the serializer listener class to use for listening for 
non-fatal errors.
+        */
+       Class<? extends SerializerListener> serializerListener() default 
SerializerListener.class;
+
+       /**
+        * Specifies the parser listener class to use for listening for 
non-fatal errors.
+        */
+       Class<? extends ParserListener> parserListener() default 
ParserListener.class;
+
+       /**
+        * Defines widgets that can be used in conjunction with string 
variables of the form <js>"$W{name}"</js>to quickly
+        *      generate arbitrary replacement text.
         * <p>
-        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
+        * Widgets are inherited from parent to child, but can be overridden by 
reusing the widget name.
         * <p>
-        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setPageTitle(String)}/{@link RestResponse#setPageTitle(Object)} 
methods.
-        * <ul class='doctree'>
-        *      <li class='info'>
-        *              In most cases, you'll simply want to use the 
<code>@RestResource(title)</code> annotation to specify the page title.
-        *              However, this annotation is provided in cases where you 
want the page title to be different that the one
-        *              shown in the swagger document.
-        * </ul>
+        * See {@link #htmldoc()} for an example of usage.
         */
-       String pageTitle() default "";
+       Class<? extends Widget>[] widgets() default {};
 
        /**
-        * Specifies the page text to use on the HTML view of all pages 
produced by this resource.
+        * Provides swagger-specific metadata on this resource.
         * <p>
-        * The page text is portion of the page immediately under the title and 
above the links.
-        * <p>
-        * This annotation has no effect on any serializers other than {@link 
HtmlDocSerializer} and is a shorthand method
-        * for setting the {@link HtmlDocSerializerContext#HTMLDOC_text} 
property:
+        * Used to populate the auto-generated OPTIONS swagger documentation.
+        *
+        * <h5 class='section'>Example:</h5>
         * <p class='bcode'>
         *      <ja>@RestResource</ja>(
-        *              properties={
-        *                      
<ja>@Property</ja>(name=<jsf>HTMLDOC_text</jsf>, value=<js>"This is my awesome 
resource page"</js>)
-        *              }
+        *              path=<js>"/addressBook"</js>,
+        *
+        *              <jc>// Swagger info.</jc>
+        *              swagger=<ja>@ResourceSwagger</ja>(
+        *                      contact=<js>"{name:'John 
Smith',email:'[email protected]'}"</js>,
+        *                      license=<js>"{name:'Apache 
2.0',url:'http://www.apache.org/licenses/LICENSE-2.0.html'}"</js>,
+        *                      version=<js>"2.0"</js>,
+        *                      termsOfService=<js>"You're on your own."</js>,
+        *                      tags=<js>"[{name:'Java',description:'Java 
utility',externalDocs:{description:'Home 
page',url:'http://juneau.apache.org'}}]"</js>,
+        *                      externalDocs=<js>"{description:'Home 
page',url:'http://juneau.apache.org'}"</js>
+        *              )
         *      )
-        *      <jk>public class</jk> MyResource <jk>extends</jk> 
RestServletDefault {
         * </p>
-        * If not specified, the page title is pulled from one of the following 
locations:
-        * <ol>
-        *      <li><code>{servletClass}.{methodName}.pageText</code> resource 
bundle value.
-        *      <li><code>{servletClass}.pageText</code> resource bundle value.
-        *      <li><code><ja>@RestMethod</ja>(summary)</code> annotation.
-        *      <li><code>{servletClass}.{methodName}.summary</code> resource 
bundle value.
-        *      <li><code>summary</code> entry in swagger file for method.
-        *      <li><code>{servletClass}.description</code> resource bundle 
value.
-        *      <li><code>info/description</code> entry in swagger file.
-        * <ol>
-        * <p>
-        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
-        * <p>
-        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setPageText(String)}/{@link RestResponse#setPageText(Object)} 
methods.
-        * <ul class='doctree'>
-        *      <li class='info'>
-        *              In most cases, you'll simply want to use the 
<code>@RestResource(description)</code> or <code>@RestMethod(summary)</code> 
annotations to specify the page text.
-        *              However, this annotation is provided in cases where you 
want the text to be different that the values shown in the swagger document.
-        * </ul>
         */
-       String pageText() default "";
+       ResourceSwagger swagger() default @ResourceSwagger;
 
        /**
-        * Specifies the page hyperlinks to use on the HTML view of all pages 
produced by this resource.
-        * <p>
-        * The page links is positioned immediately under the title and text.
+        * Provides HTML-doc-specific metadata on this method.
         * <p>
-        * This annotation has no effect on any serializers other than {@link 
HtmlDocSerializer} and is a shorthand method
-        * for setting the {@link HtmlDocSerializerContext#HTMLDOC_text} 
property:
+        * Used to customize the output from the HTML Doc serializer.
         * <p class='bcode'>
         *      <ja>@RestResource</ja>(
-        *              properties={
-        *                      
<ja>@Property</ja>(name=<jsf>HTMLDOC_links</jsf>, 
value=<js>"{up:'request:/..',options:'servlet:/?method=OPTIONS'}"</js>)
+        *              path=<js>"/addressBook"</js>,
+        *
+        *              <jc>// Links on the HTML rendition page.
+        *              // "request:/..." URIs are relative to the request URI.
+        *              // "servlet:/..." URIs are relative to the servlet URI.
+        *              // "$C{...}" variables are pulled from the config 
file.</jc>
+        *              htmldoc=<ja>@HtmlDoc</ja>(
+        *                      
links=<js>"{up:'request:/..',options:'servlet:/?method=OPTIONS',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java'}"</js>,
+        *                              aside=<js>""</js>
+        *                                      + <js>"&lt;div 
style='max-width:400px;min-width:200px'&gt;"</js>
+        *                                      + <js>" 
&lt;p&gt;Proof-of-concept resource that shows off the capabilities of working 
with POJO resources.&lt;/p&gt;"</js>
+        *                                      + <js>" &lt;p&gt;Provides 
examples of: &lt;/p&gt;"</js>
+        *                                      + <js>"         &lt;ul&gt;"</js>
+        *                                      + <js>"                 
&lt;li&gt;XML and RDF namespaces"</js>
+        *                                      + <js>"                 
&lt;li&gt;Swagger documentation"</js>
+        *                                      + <js>"                 
&lt;li&gt;Widgets"</js>
+        *                                      + <js>"         
&lt;/ul&gt;"</js>
+        *                                      + <js>" &lt;p 
style='text-weight:bold;text-decoration:underline;'&gt;Available Content 
Types&lt;/p&gt;"</js>
+        *                                      + <js>" 
$W{contentTypeLinks}"</js>
+        *                                      + <js>"&lt;/div&gt;"</js>,
+        *                      footer=<js>"$W{poweredByJuneau}"</js>
+        *              ),
+        *
+        *              <jc>// Widgets for $W variables above.</jc>
+        *              widgets={
+        *                      PoweredByJuneauWidget.<jk>class</jk>,
+        *                      ContentTypeLinksWidget.<jk>class</jk>
         *              }
         *      )
-        *      <jk>public class</jk> MyResource <jk>extends</jk> 
RestServletDefault {
         * </p>
-        * <p>
-        * The format of this value is a lax-JSON string of key/value pairs 
where the keys are the link text and the values are relative (to the servlet) or
-        * absolute URLs.
-        * If not specified, the page title is pulled from one of the following 
locations:
-        * <ol>
-        *      <li><code>{servletClass}.{methodName}.pageLinks</code> resource 
bundle value.
-        *      <li><code>{servletClass}.pageLinks</code> resource bundle value.
-        * <ol>
-        * <p>
-        * This field can contain variables (e.g. 
<js>"$L{my.localized.variable}"</js>).
-        * <p>
-        * This field can also use URIs of any support type in {@link 
UriResolver}.
-        * <p>
-        * The programmatic equivalent to this annotation are the {@link 
RestConfig#setPageLinks(String)}/{@link RestResponse#setPageLinks(Object)} 
methods.
         */
-       String pageLinks() default "";
-
-       /**
-        * Specifies the serializer listener class to use for listening for 
non-fatal errors.
-        */
-       Class<? extends SerializerListener> serializerListener() default 
SerializerListener.class;
-
-       /**
-        * Specifies the parser listener class to use for listening for 
non-fatal errors.
-        */
-       Class<? extends ParserListener> parserListener() default 
ParserListener.class;
+       HtmlDoc htmldoc() default @HtmlDoc;
 }

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java
 
b/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java
index 4b26bcb..a2099d3 100644
--- 
a/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java
+++ 
b/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java
@@ -200,7 +200,6 @@ import org.apache.juneau.xml.*;
                UrlEncodingSerializer.class,
                MsgPackSerializer.class,
                SoapXmlSerializer.class,
-               JsoSerializer.class,
                PlainTextSerializer.class,
                RdfSerializer.Xml.class,
                RdfSerializer.XmlAbbrev.class,
@@ -239,8 +238,10 @@ public abstract class RestServletJenaDefault extends 
RestServlet {
         */
        @RestMethod(name="OPTIONS", path="/*",
                summary="Resource options",
-               pageLinks="{back:'$R{servletURI}'}",
-               description="Resource options"
+               description="Resource options",
+               htmldoc=@HtmlDoc(
+                       links="{back:'$R{servletURI}'}"
+               )
        )
        public Swagger getOptions(RestRequest req) {
                return req.getSwagger();

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/package.html
----------------------------------------------------------------------
diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/package.html 
b/juneau-rest/src/main/java/org/apache/juneau/rest/package.html
index 5214b64..a5bed6e 100644
--- a/juneau-rest/src/main/java/org/apache/juneau/rest/package.html
+++ b/juneau-rest/src/main/java/org/apache/juneau/rest/package.html
@@ -226,7 +226,9 @@
         */</jd>
        <ja>@RestResource</ja>(
                messages=<js>"nls/HelloWorldResource"</js>, 
-               
pageLinks=<js>"{up:'request:/..',options:'servlet:/?method=OPTIONS'}"</js>
+               htmldoc=<ja>@HtmlDoc</ja>(
+                       
links=<js>"{up:'request:/..',options:'servlet:/?method=OPTIONS'}"</js>
+               )
        )
        <jk>public class</jk> HelloWorldResource <jk>extends</jk> Resource {
        
@@ -1084,7 +1086,9 @@
         */</jd>
        <ja>@RestMethod</ja>(name=<js>"OPTIONS"</js>, path=<js>"/*"</js>,
                summary=<js>"Resource options"</js>,
-               pageLinks=<js>"{back:'$R{servletURI}'}"</js>
+               htmldoc=<ja>@HtmlDoc</ja>(
+                       links=<js>"{back:'$R{servletURI}'}"</js>
+               )
        )
        <jk>public</jk> Swagger getOptions(RestRequest req) {
                <jk>return</jk> req.getSwagger();
@@ -1194,8 +1198,8 @@
                <img class='bordered' src='doc-files/Options2.png'>
                <p>
                        This method is described through the {@link 
org.apache.juneau.rest.annotation.RestMethod#description() 
@RestMethod.description()}, 
-                               {@link 
org.apache.juneau.rest.annotation.RestMethod#parameters() 
@RestMethod.parameters()},
-                               and {@link 
org.apache.juneau.rest.annotation.RestMethod#responses() 
@RestMethod.responses()} annotations.
+                               {@link 
org.apache.juneau.rest.annotation.RestMethod#swagger() @RestMethod.swagger()},
+                               and {@link 
org.apache.juneau.rest.annotation.MethodSwagger @MethodSwagger} annotations.
                </p>
                <p class='bcode'>
        <ja>@RestMethod</ja>(
@@ -1275,7 +1279,7 @@
                                <td>
                                        A description of the HTTP request body.
                                </td>
-                               <td>{@link 
org.apache.juneau.rest.annotation.RestMethod#parameters() 
@RestMethod.parameters()}</td>
+                               <td>{@link 
org.apache.juneau.rest.annotation.MethodSwagger#parameters() 
@MethodSwagger.parameters()}</td>
                        </tr>
                        <tr>
                                
<td><ck>[javaMethodName].req.[category].[name].description</ck></td>
@@ -1283,38 +1287,35 @@
                                        A request input variable.
                                        <br>Categories: <l>path, query, 
formData, header</l>
                                </td>
-                               <td>{@link 
org.apache.juneau.rest.annotation.RestMethod#parameters() 
@RestMethod.parameters()}</td>
+                               <td>{@link 
org.apache.juneau.rest.annotation.MethodSwagger#parameters() 
@MethodSwagger.parameters()}</td>
                        </tr>
                        <tr>
                                
<td><ck>[javaMethodName].res.[code].description</ck></td>
                                <td>
                                        A possible HTTP response code and 
description.
                                </td>
-                               <td>{@link 
org.apache.juneau.rest.annotation.RestMethod#responses() 
@RestMethod.responses()}</td>
+                               <td>{@link 
org.apache.juneau.rest.annotation.MethodSwagger#responses() 
@MethodSwagger.responses()}</td>
                        </tr>
                        <tr>
                                
<td><ck>[javaMethodName].res.[code].body.description</ck></td>
                                <td>
                                        A description of response content for 
the specified HTTP response.
                                </td>
-                               <td>{@link 
org.apache.juneau.rest.annotation.RestMethod#responses() 
@RestMethod.responses()}</td>
+                               <td>{@link 
org.apache.juneau.rest.annotation.MethodSwagger#responses() 
@MethodSwagger.responses()}</td>
                        </tr>
                        <tr>
                                
<td><ck>[javaMethodName].res.[code].header.[name].description</ck></td>
                                <td>
                                        A response header.
                                </td>
-                               <td>{@link 
org.apache.juneau.rest.annotation.RestMethod#responses() 
@RestMethod.responses()}</td>
+                               <td>{@link 
org.apache.juneau.rest.annotation.MethodSwagger#responses() 
@MethodSwagger.responses()}</td>
                        </tr>
                </table>
                <h6 class='topic'>Additional Information</h6>
                <ul class='doctree'>
                        <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestMethod#description() 
@RestMethod.description()}
-                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestMethod#parameters() 
@RestMethod.parameters()}
-                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.RestMethod#responses() 
@RestMethod.responses()}
-                       <li class='jm'>{@link 
org.apache.juneau.rest.RestRequest#getServletTitle()}
-                       <li class='jm'>{@link 
org.apache.juneau.rest.RestRequest#getServletDescription()}
-                       <li class='jm'>{@link 
org.apache.juneau.rest.RestRequest#getMethodDescription()}
+                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.MethodSwagger#parameters() 
@MethodSwagger.parameters()}
+                       <li class='ja'>{@link 
org.apache.juneau.rest.annotation.MethodSwagger#responses() 
@MethodSwagger.responses()}
                </ul>
        </div>
 
@@ -2174,7 +2175,9 @@
                messages=<js>"nls/UrlEncodedFormResource"</js>, 
                title=<js>"URL-encoded Form Post Resource"</js>, 
                description=<js>"Shows how form posts are converted into 
beans."</js>, 
-               
pageLinks=<js>"{up:'request:/..',options:'servlet:/?method=OPTIONS'}"</js> 
+               htmldoc=<ja>@HtmlDoc</ja>(
+                       
links=<js>"{up:'request:/..',options:'servlet:/?method=OPTIONS'}"</js> 
+               )
        ) 
        <jk>public class</jk> UrlEncodedFormResource <jk>extends</jk> Resource 
{ 
                <jk>private static final long</jk> <jsf>serialVersionUID</jsf> 
= 1L; 
@@ -2929,7 +2932,9 @@
                messages=<js>"nls/PhotosResource"</js>,
                title=<js>"Photo REST service"</js>,
                description=<js>"Use a tool like Poster to upload and retrieve 
jpeg and png images."</js>,
-               pageLinks=<js>"{options:'?method=OPTIONS'}"</js>
+               htmldoc=<ja>@HtmlDoc</ja>(
+                       links=<js>"{options:'?method=OPTIONS'}"</js>
+               )
        )
        <jk>public class</jk> PhotosResource <jk>extends</jk> 
RestServletDefault {
        
@@ -3215,7 +3220,9 @@
                // "request:/..." URIs are relative to the request URI.
                // "servlet:/..." URIs are relative to the servlet URI.
                // "$C{...}" variables are pulled from the config file.</jc>
-               pageLinks=<js>"{up:'request:/..', 
options:'servlet:/?method=OPTIONS', 
source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java'}"</js>,
+               htmldoc=<ja>@HtmlDoc</ja>(
+                       links=<js>"{up:'request:/..', 
options:'servlet:/?method=OPTIONS', 
source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java'}"</js>
+               ),
 
                <jc>// Properties that get applied to all serializers and 
parsers.</jc>
                properties={

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f4812b7c/juneau-rest/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java
----------------------------------------------------------------------
diff --git 
a/juneau-rest/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java 
b/juneau-rest/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java
index 158aca7..fe7aab6 100644
--- 
a/juneau-rest/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java
+++ 
b/juneau-rest/src/main/java/org/apache/juneau/rest/response/DefaultHandler.java
@@ -19,6 +19,7 @@ import java.io.*;
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.http.*;
+import org.apache.juneau.internal.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.serializer.*;
 
@@ -58,11 +59,21 @@ public class DefaultHandler implements ResponseHandler {
                                }
                                p.append("mediaType", 
mediaType).append("characterEncoding", res.getCharacterEncoding());
                                if (! s.isWriterSerializer()) {
-                                       OutputStreamSerializer s2 = 
(OutputStreamSerializer)s;
-                                       OutputStream os = 
res.getNegotiatedOutputStream();
-                                       SerializerSession session = 
s.createSession(os, p, req.getJavaMethod(), req.getLocale(), 
req.getHeaders().getTimeZone(), mediaType, req.getUriContext());
-                                       s2.serialize(session, output);
-                                       os.close();
+                                       if (req.isPlainText()) {
+                                               OutputStreamSerializer s2 = 
(OutputStreamSerializer)s;
+                                               Writer w = 
res.getNegotiatedWriter();
+                                               ByteArrayOutputStream baos = 
new ByteArrayOutputStream();
+                                               SerializerSession session = 
s.createSession(baos, p, req.getJavaMethod(), req.getLocale(), 
req.getHeaders().getTimeZone(), mediaType, req.getUriContext());
+                                               s2.serialize(session, output);
+                                               
w.write(StringUtils.toHex(baos.toByteArray()));
+                                               w.close();
+                                       } else {
+                                               OutputStreamSerializer s2 = 
(OutputStreamSerializer)s;
+                                               OutputStream os = 
res.getNegotiatedOutputStream();
+                                               SerializerSession session = 
s.createSession(os, p, req.getJavaMethod(), req.getLocale(), 
req.getHeaders().getTimeZone(), mediaType, req.getUriContext());
+                                               s2.serialize(session, output);
+                                               os.close();
+                                       }
                                } else {
                                        WriterSerializer s2 = 
(WriterSerializer)s;
                                        Writer w = res.getNegotiatedWriter();

Reply via email to