juneau-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From jamesbog...@apache.org
Subject [juneau] branch master updated: Update Javadocs.
Date Mon, 05 Feb 2018 00:02:46 GMT
This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 69814d9  Update Javadocs.
69814d9 is described below

commit 69814d9ec2b14ccb5d3c6992057df7adc5937579
Author: JamesBognar <jamesbognar@apache.org>
AuthorDate: Sun Feb 4 19:02:38 2018 -0500

    Update Javadocs.
---
 .../java/org/apache/juneau/dto/LinkString.java     |   1 +
 .../org/apache/juneau/html/HtmlParserSession.java  |   1 +
 .../apache/juneau/html/HtmlSerializerSession.java  |   1 +
 .../juneau/html/{ => annotation}/HtmlLink.java     |   4 +-
 .../javadoc/doc-files/PredefinedLabelBeans.1.png   | Bin 0 -> 23665 bytes
 .../javadoc/doc-files/PredefinedLabelBeans.2.png   | Bin 0 -> 72375 bytes
 .../javadoc/doc-files/PredefinedLabelBeans.3.png   | Bin 0 -> 7975 bytes
 .../src/main/javadoc/doc-files/Stylesheets.1.png   | Bin 0 -> 26898 bytes
 .../src/main/javadoc/doc-files/Stylesheets.2.png   | Bin 0 -> 347467 bytes
 .../src/main/javadoc/doc-files/Stylesheets.3.png   | Bin 0 -> 317232 bytes
 .../main/javadoc/doc-files/UiCustomization.1.png   | Bin 0 -> 278647 bytes
 .../main/javadoc/doc-files/UiCustomization.2.png   | Bin 0 -> 7196 bytes
 .../main/javadoc/doc-files/UiCustomization.3.png   | Bin 0 -> 6957 bytes
 juneau-doc/src/main/javadoc/overview.html          | 389 +++++++++++++++++++--
 .../src/main/javadoc/resources/juneau-doc.css      |   2 +-
 .../examples/rest/PredefinedLabelsResource.java    |  77 ++++
 .../apache/juneau/examples/rest/RootResources.java |   1 +
 .../juneau/microservice/ResourceJenaGroup.java     |   3 +-
 .../org/apache/juneau/rest/HtmlDocBuilder.java     | 298 +++++++++-------
 .../java/org/apache/juneau/rest/RestContext.java   |   5 +
 .../org/apache/juneau/rest/RestServletDefault.java |   2 +-
 .../org/apache/juneau/rest/annotation/HtmlDoc.java | 105 +++---
 .../apache/juneau/rest/annotation/RestMethod.java  |   2 +-
 .../juneau/rest/annotation/RestResource.java       |   5 +
 .../apache/juneau/rest/labels/BeanDescription.java |   2 +
 .../apache/juneau/rest/labels/NameDescription.java |  10 +-
 .../apache/juneau/rest/widget/StyleMenuItem.java   |   4 +-
 .../java/org/apache/juneau/rest/widget/Widget.java |   6 +-
 28 files changed, 672 insertions(+), 246 deletions(-)

diff --git a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/LinkString.java b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/LinkString.java
index 111665f..0bb04d6 100644
--- a/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/LinkString.java
+++ b/juneau-core/juneau-dto/src/main/java/org/apache/juneau/dto/LinkString.java
@@ -17,6 +17,7 @@ import static org.apache.juneau.internal.StringUtils.*;
 import java.text.*;
 
 import org.apache.juneau.html.*;
+import org.apache.juneau.html.annotation.*;
 import org.apache.juneau.httppart.*;
 import org.apache.juneau.utils.*;
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
index b1d2779..e4f22d3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
@@ -22,6 +22,7 @@ import java.util.*;
 import javax.xml.stream.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.html.annotation.*;
 import org.apache.juneau.parser.*;
 import org.apache.juneau.transform.*;
 import org.apache.juneau.xml.*;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index 75cfbf5..912b6f5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -21,6 +21,7 @@ import java.util.*;
 import java.util.regex.*;
 
 import org.apache.juneau.*;
+import org.apache.juneau.html.annotation.*;
 import org.apache.juneau.internal.*;
 import org.apache.juneau.serializer.*;
 import org.apache.juneau.transform.*;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlLink.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlLink.java
similarity index 95%
rename from juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlLink.java
rename to juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlLink.java
index 716ff0a..735e970 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlLink.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlLink.java
@@ -10,13 +10,15 @@
 // * "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.html;
+package org.apache.juneau.html.annotation;
 
 import static java.lang.annotation.ElementType.*;
 import static java.lang.annotation.RetentionPolicy.*;
 
 import java.lang.annotation.*;
 
+import org.apache.juneau.html.*;
+
 /**
  * Used in conjunction with the {@link HtmlSerializer} class to define hyperlinks.
  * 
diff --git a/juneau-doc/src/main/javadoc/doc-files/PredefinedLabelBeans.1.png b/juneau-doc/src/main/javadoc/doc-files/PredefinedLabelBeans.1.png
new file mode 100644
index 0000000..76a85e2
Binary files /dev/null and b/juneau-doc/src/main/javadoc/doc-files/PredefinedLabelBeans.1.png differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/PredefinedLabelBeans.2.png b/juneau-doc/src/main/javadoc/doc-files/PredefinedLabelBeans.2.png
new file mode 100644
index 0000000..9a56c43
Binary files /dev/null and b/juneau-doc/src/main/javadoc/doc-files/PredefinedLabelBeans.2.png differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/PredefinedLabelBeans.3.png b/juneau-doc/src/main/javadoc/doc-files/PredefinedLabelBeans.3.png
new file mode 100644
index 0000000..0ccbc37
Binary files /dev/null and b/juneau-doc/src/main/javadoc/doc-files/PredefinedLabelBeans.3.png differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/Stylesheets.1.png b/juneau-doc/src/main/javadoc/doc-files/Stylesheets.1.png
new file mode 100644
index 0000000..ab4d89f
Binary files /dev/null and b/juneau-doc/src/main/javadoc/doc-files/Stylesheets.1.png differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/Stylesheets.2.png b/juneau-doc/src/main/javadoc/doc-files/Stylesheets.2.png
new file mode 100644
index 0000000..34fb4a1
Binary files /dev/null and b/juneau-doc/src/main/javadoc/doc-files/Stylesheets.2.png differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/Stylesheets.3.png b/juneau-doc/src/main/javadoc/doc-files/Stylesheets.3.png
new file mode 100644
index 0000000..f2f8e87
Binary files /dev/null and b/juneau-doc/src/main/javadoc/doc-files/Stylesheets.3.png differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/UiCustomization.1.png b/juneau-doc/src/main/javadoc/doc-files/UiCustomization.1.png
new file mode 100644
index 0000000..d058fba
Binary files /dev/null and b/juneau-doc/src/main/javadoc/doc-files/UiCustomization.1.png differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/UiCustomization.2.png b/juneau-doc/src/main/javadoc/doc-files/UiCustomization.2.png
new file mode 100644
index 0000000..a2a6a07
Binary files /dev/null and b/juneau-doc/src/main/javadoc/doc-files/UiCustomization.2.png differ
diff --git a/juneau-doc/src/main/javadoc/doc-files/UiCustomization.3.png b/juneau-doc/src/main/javadoc/doc-files/UiCustomization.3.png
new file mode 100644
index 0000000..e196d1a
Binary files /dev/null and b/juneau-doc/src/main/javadoc/doc-files/UiCustomization.3.png differ
diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html
index 18d8491..5f1bcd6 100644
--- a/juneau-doc/src/main/javadoc/overview.html
+++ b/juneau-doc/src/main/javadoc/overview.html
@@ -4495,7 +4495,7 @@
 				Extensive listener APIs.
 		</ul>
 		
-		<h5 class='topic'>Example:</h5>
+		<h5 class='figure'>Example:</h5>
 		<p class='bcode'>
 	<cc>#--------------------------</cc>
 	<cc># My section</cc>
@@ -6264,7 +6264,8 @@
 				</p>
 				<p class='bcode'>
 	<jk>public class</jk> IsAdminMatcher <jk>extends</jk> RestMatcher {
-		<ja>@Override</ja>
+
+		<ja>@Override</ja> <jc>/* RestMatcher */</jc>
 		<jk>public boolean</jk> matches(RestRequest req) {
 			<jk>return</jk> req.isUserInRole(<js>"ADMINS_GROUP"</js>);
 		}
@@ -6438,6 +6439,7 @@
 	
 		<jd>/** Causes a 404 if POST isn't multipart/form-data */</jd>
 		<jk>public static class</jk> MultipartFormDataMatcher <jk>extends</jk> RestMatcher {
+		
 			<ja>@Override</ja> <jc>/* RestMatcher */</jc>
 			<jk>public boolean</jk> matches(RestRequest req) {
 				String contentType = req.getContentType();
@@ -6903,7 +6905,7 @@
 	<jc>// Define a guard that only lets Billy make a request</jc>
 	<jk>public</jk> BillyGuard <jk>extends</jk> RestGuard {
 
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* RestGuard */</jc>
 		<jk>public boolean</jk> isRequestAllowed(RestRequest req) {
 			<jk>return</jk> req.getUserPrincipal().getName().equals(<js>"Billy"</js>);
 		}
@@ -6928,7 +6930,8 @@
 			</p>
 			<p class='bcode'>
 	<jk>public class</jk> AdminGuard <jk>extends</jk> RestGuard {
-		<ja>@Override</ja>
+
+		<ja>@Override</ja> <jc>/* RestGuard */</jc>
 		<jk>public boolean</jk> isRequestAllowed(RestRequest req) {
 			<jk>return</jk> req.getUserPrincipal().isUserInRole(<js>"ADMIN"</js>);
 		}
@@ -6942,7 +6945,8 @@
 			</p>
 			<p class='bcode'>
 	<jk>public class</jk> AdminGuard <jk>extends</jk> RestGuard {
-		<ja>@Override</ja>
+
+		<ja>@Override</ja> <jc>/* RestGuard */</jc>
 		<jk>public boolean</jk> guard(RestRequest req, RestResponse res) <jk>throws</jk> RestException {
 			<jk>if</jk> (! isOkay(req))
 				<jk>throw new</jk> RestException(<jsf>SC_FORBIDDEN</jsf>, <js>"Access denied!!!"</js>);
@@ -7013,7 +7017,7 @@
 	 */</jd>
 	<jk>public class</jk> Traversable <jk>implements</jk> RestConverter {
 	
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* RestConverter */</jc>
 		<jk>public</jk> Object convert(RestRequest req, Object o) <jk>throws</jk> RestException {
 			if (o == <jk>null</jk>)
 				<jk>return null</jk>;
@@ -7200,7 +7204,7 @@
 			<jk>super</jk>(<js>"BRACKET"</js>);
 		}
 			
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* Var */</jc>
 		<jk>public</jk> String resolve(VarResolverSession session, String arg) {
 			<jk>return</jk> <js>'['</js> + arg + <js>']'</js>;
 		}
@@ -7742,7 +7746,7 @@
 			<jk>super</jk>(context);
 		}
 
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* RestInfoProvider */</jc>
 		<jk>public</jk> Swagger getSwagger(RestRequest req) <jk>throws</jk> RestException {
 			Swagger s = <jk>super</jk>.getSwagger(req);
 			<jc>// Made inline modifications to generated swagger.</jc>
@@ -7915,10 +7919,13 @@
 				<p>
 					The <l>Widget</l> class is composed of the following methods:
 				</p>
-				<ul>
-					<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getHtml(RestRequest) getHtml(RestRequest)}
-					<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getStyle(RestRequest) getStyle(RestRequest)}
-					<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getScript(RestRequest) getScript(RestRequest)}
+				<ul class='doctree'>
+					<li class='jac'>{@link org.apache.juneau.rest.widget.Widget}
+					<ul>
+						<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getHtml(RestRequest) getHtml(RestRequest)}
+						<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getStyle(RestRequest) getStyle(RestRequest)}
+						<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getScript(RestRequest) getScript(RestRequest)}
+					</ul>
 				</ul>
 				<p>
 					The HTML content returned by the {@link org.apache.juneau.rest.widget.Widget#getHtml(RestRequest) getHtml(RestRequest)}
@@ -7941,13 +7948,13 @@
 				<p class='bcode'>
 	<jk>public class</jk> MyWidget <jk>extends</jk> Widget {
 
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* Widget */</jc>
 		<jk>public</jk> String getHtml(RestRequest req) <jk>throws</jk> Exception {
 			UriResolver r = req.getUriResolver(); <jc>// API used for resolving URIs.</jc>
 			<jk>return</jk> <js>"&lt;img class='myimage' onclick='myalert(this)' src='"</js>+r.resolve(<js>"servlet:/htdocs/myimage.png"</js>)+<js>"'&gt;"</js>;
 		}
 
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* Widget */</jc>
 		<jk>public</jk> String getScript(RestRequest req) <jk>throws</jk> Exception {
 			<jk>return</jk> <js>""</js>
 				+ <js>"\n function myalert(imageElement) {"</js>
@@ -7955,7 +7962,7 @@
 				+ <js>"\n }"</js>;
 		}
 
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* Widget */</jc>
 		<jk>public</jk> String getStyle(RestRequest req) <jk>throws</jk> Exception {
 			<jk>return</jk> <js>""</js>
 				+ <js>"\n .myimage {"</js>
@@ -7968,24 +7975,27 @@
 					The <l>Widget</l> class also defines the following two convenience methods for loading Javascript and CSS
 					files from the classpath or file system.
 				</p>
-				<ul>
-					<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getClasspathResourceAsString(String) getClasspathResourceAsString(String)}
-					<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getClasspathResourceAsString(String,Locale) getClasspathResourceAsString(String,Locale)}
+				<ul class='doctree'>
+					<li class='jac'>{@link org.apache.juneau.rest.widget.Widget}
+					<ul>
+						<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getClasspathResourceAsString(String) getClasspathResourceAsString(String)}
+						<li class='jm'>{@link org.apache.juneau.rest.widget.Widget#getClasspathResourceAsString(String,Locale) getClasspathResourceAsString(String,Locale)}
+					</ul>
 				</ul>
-				<h5 class='section'>Example:</h5>
+				<h5 class='figure'>Example:</h5>
 				<p class='bcode'>
 	<jk>public class</jk> MyWidget <jk>extends</jk> Widget {
 
 		...
 
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* Widget */</jc>
 		<jk>public</jk> String getScript(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> getResourceAsString(<js>"MyWidget.js"</js>);
+			<jk>return</jk> getClasspathResourceAsString(<js>"MyWidget.js"</js>);
 		}
 
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* Widget */</jc>
 		<jk>public</jk> String getStyle(RestRequest req) <jk>throws</jk> Exception {
-			<jk>return</jk> getResourceAsString(<js>"MyWidget.css"</js>);
+			<jk>return</jk> getClasspathResourceAsString(<js>"MyWidget.css"</js>);
 		}
 	}
 				</p>
@@ -7999,14 +8009,231 @@
 			<a id="juneau-rest-server.UiCustomization"></a>
 			<h4 class='topic' onclick='toggle(this)'>3.1.24.2 - UI Customization</h4>
 			<div class='topic'>
-				TODO
+				<p>
+					The HTML views of POJOs can somewhat be considered a rudimentary User Interface.
+					<br>In reality, a better term for them would be a Developer Interface as they're meant to be used 
+					primarily by developers and not end users.
+					<br>Despite that distinction, it is possible to 'brand' the HTML page to whatever you desire.
+				</p>
+				<p>
+					The sample root page below includes some default branding for Juneau and Apache:
+				</p>
+				<img class='bordered' src='doc-files/UiCustomization.1.png' style='width:800px'/>
+				<p>
+					In particular, you may want to replace these icons:
+				</p>
+				<img class='bordered' src='doc-files/UiCustomization.2.png'/>
+				<img class='bordered' src='doc-files/UiCustomization.3.png'/>
+				<p>
+					The Juneau REST framework does not provide specific branding support (i.e. there is no concept of a brand icon).
+					<br>Instead, it just uses the existing open-ended API for defining branding.
+				</p>
+				<p>
+					The Juneau icon shown is a result of the header annotation on the {@link org.apache.juneau.rest.RestServletDefault} class:
+				</p>	
+				<p class='bcode'>			
+	<ja>@RestResource</ja>(
+		...
+		htmldoc=<ja>@HtmlDoc</ja>(
+			header={
+				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,
+				<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>,
+				<js>"&lt;a href='http://juneau.apache.org'&gt;"</js>
+					+<js>"&lt;img src='$U{servlet:/htdocs/juneau.png}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;"</js>
+				+<js>"&lt;/a&gt;"</js>
+			},
+			head={
+				<jc>// Browser tab icon.</jc>
+				<js>"&lt;link rel='icon' href='$U{servlet:/htdocs/juneau.png}'/&gt;"</js>
+			}
+		),
+		staticFiles={<js>"htdocs:htdocs"</js>}
+	)
+	<jk>public abstract class</jk> RestServletDefault <jk>extends</jk> RestServlet {...}
+				</p>
+				<p>
+					The <js>"juneau.png"</js> image file is located in <code>org.apache.juneau.rest.htdocs</code> package and 
+					is served up via the <code>staticFiles</code> annotation (i.e. anything in the <code>org.apache.juneau.rest.htdocs</code> 
+					package is served up under the path <code>/servlet-path/htdocs</code>).  
+					<br>Then we just reference using a URI resolution variable <js>"$U{servlet:/htdocs/juneau.png}"</js>.
+				</p>
+				<p>
+					To change this image, you can extend the <l>RestServletDefault</l> class and simply override the annotations
+					pointing to your own icon.
+				</p>
+				<p class='bcode'>			
+	<ja>@RestResource</ja>(
+		...
+		htmldoc=<ja>@HtmlDoc</ja>(
+			header={
+				<js>"&lt;h1&gt;$R{resourceTitle}&lt;/h1&gt;"</js>,
+				<js>"&lt;h2&gt;$R{methodSummary,resourceDescription}&lt;/h2&gt;"</js>,
+				<js>"&lt;a href='http://my.project.org'&gt;"</js>
+					+<js>"&lt;img src='$U{servlet:/my-htdocs/my-project.png}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/&gt;"</js>
+				+<js>"&lt;/a&gt;"</js>
+			},
+			head={
+				<jc>// Browser tab icon.</jc>
+				<js>"&lt;link rel='icon' href='$U{servlet:/my-htdocs/my-project.png}'/&gt;"</js>
+			}
+		),
+		staticFiles={<js>"my-htdocs:my-htdocs"</js>}
+	)
+	<jk>public class</jk> MyResourceBaseClass <jk>extends</jk> RestServletDefault {...}
+				</p>
+				<p>
+					The footer icon shown is generated by a predefined widget:
+				</p>
+				<p class='bcode'>
+	<ja>@RestResource</ja>(
+		htmldoc=<ja>@HtmlDoc</ja>(
+			widgets={
+				PoweredByApache.<jk>class</jk>
+			},
+			footer=<js>"$W{PoweredByApache}"</js>
+		),
+		...
+	)
+	<jk>public class</jk> RootResources <jk>extends</jk> ResourceJenaGroup {...}
+				</p>			
+				<p>
+					The widget definition is shown below:
+				</p>
+				<p class='bcode'>
+	<jk>public class</jk> PoweredByApache <jk>extends</jk> Widget {
+	
+		<jd>/**
+		 * Returns an Apache image tag hyperlinked to <js>"http://apache.org"</js>
+		 */</jd>
+		<ja>@Override</ja> <jc>/* Widget */</jc>
+		<jk>public</jk> String getHtml(RestRequest req) <jk>throws</jk> Exception {
+			UriResolver r = req.getUriResolver();
+			<jk>return</jk> <js>"&lt;a href='http://apache.org'&gt;&lt;img style='float:right;padding-right:20px;height:32px' src='"</js>+r.resolve(<js>"servlet:/htdocs/asf.png"</js>)+<js>"'&gt;"</js>;
+		}
+	}
+				</p>
+				<p>
+					To provide your own footer icon, simply define it in your own footer section:
+				</p>
+				<p class='bcode'>
+	<ja>@RestResource</ja>(
+		htmldoc=<ja>@HtmlDoc</ja>(
+			footer=<js>"&lt;img style='float:right;padding-right:20px;height:32px' src='$U{servlet:/my-htdocs/my-project.png}'&gt;"</js>
+		),
+		staticFiles={<js>"my-htdocs:my-htdocs"</js>}
+		...
+	)
+	<jk>public class</jk> MyResourceBaseClass <jk>extends</jk> RestServletDefault {...}
+				</p>
+				<p>
+					Note how the "User Interface" is open-ended to pretty much lets you do whatever you want.
+				</p>
 			</div>
 
 			<!-- ======================================================================================================== -->
 			<a id="juneau-rest-server.Stylesheets"></a>
 			<h4 class='topic' onclick='toggle(this)'>3.1.24.3 - Stylesheets</h4>
 			<div class='topic'>
-				TODO
+				<p>
+					The sample root page renders in the default "devops" look-and-feel:
+				</p>
+				<img class='bordered' src='doc-files/UiCustomization.1.png' style='width:800px'/>
+				<p>
+					The sample root page provides a dropdown widget to try out the other default look-and-feels:
+				</p>
+				<img class='bordered' src='doc-files/Stylesheets.1.png'/>
+				<p>
+					For example, the "light" look-and-feel:
+				</p>
+				<img class='bordered' src='doc-files/Stylesheets.2.png' style='width:800px'/>
+				<p>
+					And the "dark" look-and-feel:
+				</p>
+				<img class='bordered' src='doc-files/Stylesheets.3.png' style='width:800px'/>
+				<p>
+					The stylesheet URL is controlled by the {@link org.apache.juneau.rest.annotation.HtmlDoc#stylesheet() @HtmlDoc.stylesheet()} annotation.
+					<br>The {@link org.apache.juneau.rest.RestServletDefault} class defines the stylesheet served up as a static file:
+				<p class='bcode'>
+	<ja>@RestResource</ja>(
+		htmldoc=<ja>@HtmlDoc</ja>(
+			stylesheet=<js>"$C{REST/stylesheet,servlet:/styles/devops.css}"</js>,
+		),
+	
+		staticFiles={<js>"styles:styles"</js>}
+	)
+	<jk>public abstract class</jk> RestServletDefault <jk>extends</jk> RestServlet {...}
+				</p>		
+				<p>
+					The <js>"$C{REST/stylesheet,servlet:/styles/devops.css}"</js> variable says to use the URI defined
+					in your servlet's config file, if there is one, and to default to serving up the file
+					<code>org/apache/juneau/rest/styles/devops.css</code>.
+				</p>
+				<p>
+					To provide your own stylesheet, simply override the stylesheet attribute and point to a different
+					file:	
+				</p>
+				<p class='bcode'>
+	<ja>@RestResource</ja>(
+		htmldoc=<ja>@HtmlDoc</ja>(
+			stylesheet=<js>"servlet:/my-styles/my-style.css}"</js>,
+		),
+		staticFiles={<js>"my-styles:my-styles"</js>}
+	)
+	<jk>public class</jk> MyResourceBaseClass <jk>extends</jk> RestServletDefault {...}
+				</p>
+				<p>
+					You can try out different stylesheets by passing in a <code>stylesheet</code> attribute in the request
+					URL.
+					<br>The example above show this in use.
+				</p>
+				<p>
+					In case you're curious about how the menu item works, it's defined via a widget:
+				</p>
+				<p class='bcode'>
+	<ja>@RestResource</ja>(
+		htmldoc=<ja>@HtmlDoc</ja>(
+			widgets={
+				PoweredByApache.<jk>class</jk>,
+				ContentTypeMenuItem.<jk>class</jk>,
+				StyleMenuItem.<jk>class</jk>
+			},
+			navlinks={
+				<js>"options: ?method=OPTIONS"</js>,
+				<js>"$W{ContentTypeMenuItem}"</js>,
+				<js>"$W{StyleMenuItem}"</js>,
+				<js>"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"</js>
+			},
+	)
+	<jk>public class</jk> RootResources <jk>extends</jk> ResourceJenaGroup {...}
+				</p>
+				<p>
+					The <l>StyleMenuItem</l> is a widget that extends from {@link org.apache.juneau.rest.widget.MenuItemWidget}, a
+					specialized widget for creating pop-up menus.
+					<br>In the case of <l>StyleMenuItem</l>, it's simply returning a list of links wrapped in a div tag:
+				</p>
+				<p class='bcode'>
+	<jk>import static</jk> org.apache.juneau.dto.html5.HtmlBuilder.*;
+
+	<jk>public class</jk> StyleMenuItem <jk>extends</jk> MenuItemWidget {
+	
+		<jk>private static final</jk> String[] <jsf>BUILT_IN_STYLES</jsf> = {<js>"devops"</js>, <js>"light"</js>, <js>"original"</js>, <js>"dark"</js>};
+	
+		<ja>@Override</ja> <jc>/* Widget */</jc>
+		<jk>public</jk> String getLabel(RestRequest req) {
+			<jk>return</jk> <js>"styles"</js>;
+		}
+
+		<ja>@Override</ja> <jc>/* MenuItemWidget */</jc>
+		<jk>public</jk> Div getContent(RestRequest req) <jk>throws</jk> Exception {
+			Div div = <jsm>div</jsm>();
+			<jk>for</jk> (String s : <jsf>BUILT_IN_STYLES</jsf>) {
+				java.net.URI uri = req.getUri(<jk>true</jk>, <jk>new</jk> AMap&lt;String,String&gt;().append(<js>"stylesheet"</js>, <js>"styles/"</js>+s+<js>".css"</js>));
+				div.children(<jsm>a</jsm>(uri, s), <jsm>br</jsm>());
+			}
+			<jk>return</jk> div;
+		}
+	}
+				</p>
 			</div>
 		</div>
 
@@ -8385,7 +8612,8 @@
 		<jd>/** Serializer for converting images to byte streams */</jd>
 		<ja>@Produces</ja>(<js>"image/png,image/jpeg"</js>)
 		<jk>public static class</jk> ImageSerializer <jk>extends</jk> OutputStreamSerializer {
-			<ja>@Override</ja>
+		
+			<ja>@Override</ja> <jc>/* Serializer */</jc>
 			<jk>public void</jk> serialize(Object o, OutputStream out, SerializerSession session) <jk>throws</jk> IOException, SerializeException {
 				RenderedImage image = (RenderedImage)o;
 				String mediaType = ctx.getMediaType();
@@ -8396,7 +8624,8 @@
 		<jd>/** Parser for converting byte streams to images */</jd>
 		<ja>@Consumes</ja>(<js>"image/png,image/jpeg"</js>)
 		<jk>public static class</jk> ImageParser <jk>extends</jk> InputStreamParser {
-			<ja>@Override</ja>
+		
+			<ja>@Override</ja> <jc>/* Parser */</jc>
 			<jk>public</jk> &lt;T&gt; T parse(InputStream in, ClassMeta&lt;T&gt; type, ParserSession session) <jk>throws</jk> ParseException, IOException {
 				BufferedImage image = ImageIO.<jsm>read</jsm>(in);
 				<jk>return</jk> (T)image;
@@ -8434,19 +8663,19 @@
 		<jk>private</jk> ServiceTracker <jf>httpServiceTracker</jf>;
 		<jk>private</jk> BundleContext <jf>context</jf>;
 	
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* BundleActivator */</jc>
 		<jk>public void</jk> start(BundleContext context) <jk>throws</jk> Exception {
 			<jk>this</jk>.<jf>context</jf> = context;
 			<jf>httpServiceTracker</jf> = <jk>new</jk> ServiceTracker(context, HttpService.<jk>class</jk>.getName(), <jk>this</jk>);
 			<jf>httpServiceTracker</jf>.open();
 		}
 	
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* BundleActivator */</jc>
 		<jk>public void</jk> stop(BundleContext context) <jk>throws</jk> Exception {
 			<jf>httpServiceTracker</jf>.close();
 		}
 	
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* ServiceTrackerCustomizer */</jc>
 		<jk>public</jk> Object addingService(ServiceReference reference) {
 			Object service = <jf>context</jf>.getService(reference);
 	
@@ -8462,11 +8691,11 @@
 			<jk>return</jk> service;
 		}
 	
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* ServiceTrackerCustomizer */</jc>
 		<jk>public void</jk> modifiedService(ServiceReference reference, Object service) {
 		}
 	
-		<ja>@Override</ja>
+		<ja>@Override</ja> <jc>/* ServiceTrackerCustomizer */</jc>
 		<jk>public void</jk> removedService(ServiceReference reference, Object service) {
 		}
 	}
@@ -8701,7 +8930,7 @@
 			interfaceClass.getClassLoader(),
 			<jk>new</jk> Class[] { interfaceClass },
 			<jk>new</jk> InvocationHandler() {
-				<ja>@Override</ja>
+				<ja>@Override</ja> <jc>/* InvocationHandler */</jc>
 				<jk>public</jk> Object invoke(Object proxy, Method method, Object[] args) {
 					<jk>try</jk> {
 						String uri = <jf>remoteableServletUri</jf> + '/' + interfaceClass.getName() + '/' + ClassUtils.<jsm>getMethodSignature</jsm>(method);
@@ -9035,7 +9264,7 @@
 			<p>
 				Juneau is built as a veneer on top of the Servlet API, allowing you to use low-level Servlet APIs
 				whenever needed.
-				This allows you to take advantage of the newest HTTP/2 features implemented in the new Servlet 4.0 
+				<br>This allows you to take advantage of the newest HTTP/2 features implemented in the new Servlet 4.0 
 				specification.
 			</p>
 			<p>
@@ -9047,7 +9276,89 @@
 		<a id="juneau-rest-server.PredefinedLabelBeans"></a>
 		<h4 class='topic' onclick='toggle(this)'>3.1.35 - Predefined Label Beans</h4>
 		<div class='topic'>
-			TODO
+			<p>
+				The {@link org.apache.juneau.rest.labels} package contains some reusable beans that are useful for 
+				creating linked items in HTML views.
+			</p>
+			<p>
+				The {@link org.apache.juneau.rest.labels.ResourceDescription} class is a bean with name/description
+				properties for labeling and linking to child resources.
+				<br>The following examples is pulled from the REST examples:
+			</p>
+			<p class='bcode'>
+	<jk>public class</jk> PredefinedLabelsResource <jk>extends</jk> Resource {
+	
+		<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/"</js>)
+		<jk>public</jk> ResourceDescription[] getChildMethods() {
+			<jk>return new</jk> ResourceDescription[] {
+				<jk>new</jk> ResourceDescription(<js>"beanDescription"</js>, <js>"BeanDescription"</js>),
+				<jk>new</jk> ResourceDescription(<js>"htmlLinks"</js>, <js>"HtmlLink"</js>)
+			};
+		}
+	}
+			</p>
+			<p>
+				It get rendered as a table of name/description columns with links to child methods:
+			</p>
+			<img class='bordered' src='doc-files/PredefinedLabelBeans.1.png' style='width:240px'/>
+			<p>
+				The internals of the class show it simply has two bean properties with a link annotation
+				defined on the name property:
+			</p>
+			<p class='bcode'>
+	<jk>public class</jk> ResourceDescription {
+
+		<ja>@Html</ja>(link=<js>"servlet:/{name}"</js>)
+		<jk>public</jk> Object getName() {...}
+		
+		<jk>public</jk> Object getDescription() {...}
+	}
+			</p>
+			<p>
+				The {@link org.apache.juneau.rest.labels.BeanDescription} class provides a simple view
+				of a bean and it's properties.
+			</p>
+			<p class='bcode'>
+	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/beanDescription"</js>)
+	<jk>public</jk> BeanDescription getBeanDescription() {
+		<jk>return new</jk> BeanDescription(Person.<jk>class</jk>);
+	}	
+			</p>
+			<p>
+				This example renders the following:
+			</p>
+			<img class='bordered' src='doc-files/PredefinedLabelBeans.2.png' style='width:584px'/>
+			<p>
+				The {@link org.apache.juneau.html.annotation.HtmlLink @HtmlLink} annotation can also be useful
+				for rendering custom hyperlinks:
+			</p>
+			<p class='bcode'>
+	<ja>@RestMethod</ja>(name=<jsf>GET</jsf>, path=<js>"/htmlLinks"</js>)
+	<jk>public</jk> ALink[] htmlLinks() {
+		<jk>return new</jk> ALink[] {
+			<jk>new</jk> ALink(<js>"apache"</js>, <js>"http://apache.org"</js>),
+			<jk>new</jk> ALink(<js>"juneau"</js>, <js>"http://juneau.apache.org"</js>)
+		};
+	}
+	
+	<ja>@HtmlLink</ja>(nameProperty=<js>"n"</js>, hrefProperty=<js>"l"</js>)
+	<jk>public static class</jk> ALink {
+		<jk>public</jk> String <jf>n</jf>, <jf>l</jf>;
+		<jk>public</jk> ALink(String n, String l) {
+			<jk>this</jk>.<jf>n</jf> = n;
+			<jk>this</jk>.<jf>l</jf> = l;
+		}
+	}
+			</p>			
+			<p>
+				This example renders the following consisting of a list of hyperlinks:
+			</p>
+			<img class='bordered' src='doc-files/PredefinedLabelBeans.3.png' style='width:92px'/>
+			
+			<h5 class='section'>See Also:</h5>
+			<ul>
+				<li class='jf'>{@link org.apache.juneau.dto.LinkString}
+			</ul>
 		</div>
 		
 		<!-- ======================================================================================================== -->
@@ -11152,7 +11463,7 @@
 		* [OPTIONS /*] 
 		* View resource options 
 		*/</jd> 
-		<ja>@Override</ja> /* RestServletDefault */ 
+		<ja>@Override</ja> <jc>/* RestServletDefault */</jc> 
 		<ja>@RestMethod</ja>(name=<jsf>OPTIONS</jsf>, path=<js>"/*"</js>) 
 		<jk>public</jk> Swagger getOptions(RestRequest req) { 
 			<jk>return</jk> req.getSwagger(); 
@@ -12207,7 +12518,8 @@
 		<jd>/** Serializer for converting images to byte streams */</jd>
 		<ja>@Produces</ja>(<js>"image/png,image/jpeg"</js>)
 		<jk>public static class</jk> ImageSerializer <jk>extends</jk> OutputStreamSerializer {
-			<ja>@Override</ja>
+
+			<ja>@Override</ja> <jc>/* Serializer */</jc>
 			<jk>public void</jk> serialize(Object o, OutputStream out, SerializerSession session) <jk>throws</jk> IOException, SerializeException {
 				RenderedImage image = (RenderedImage)o;
 				String mediaType = ctx.getMediaType();
@@ -12218,7 +12530,8 @@
 		<jd>/** Parser for converting byte streams to images */</jd>
 		<ja>@Consumes</ja>(<js>"image/png,image/jpeg"</js>)
 		<jk>public static class</jk> ImageParser <jk>extends</jk> InputStreamParser {
-			<ja>@Override</ja>
+
+			<ja>@Override</ja> <jc>/* Parser */</jc>
 			<jk>public</jk> &lt;T&gt; T parse(InputStream in, ClassMeta&lt;T&gt; type, ParserSession session) <jk>throws</jk> ParseException, IOException {
 				BufferedImage image = ImageIO.<jsm>read</jsm>(in);
 				<jk>return</jk> (T)image;
diff --git a/juneau-doc/src/main/javadoc/resources/juneau-doc.css b/juneau-doc/src/main/javadoc/resources/juneau-doc.css
index 7fbf285..50d8478 100755
--- a/juneau-doc/src/main/javadoc/resources/juneau-doc.css
+++ b/juneau-doc/src/main/javadoc/resources/juneau-doc.css
@@ -125,7 +125,7 @@ h4.closed {
 
 div.topic { margin-left: 10px; }
 
-h6.figure {
+h5.figure {
 	color: #2c4557;
 	margin-left: 30px;
 	margin-right: 30px;
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PredefinedLabelsResource.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PredefinedLabelsResource.java
new file mode 100644
index 0000000..e2c9548
--- /dev/null
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PredefinedLabelsResource.java
@@ -0,0 +1,77 @@
+// ***************************************************************************************************************************
+// * 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.examples.rest;
+
+import static org.apache.juneau.http.HttpMethodName.*;
+
+import org.apache.juneau.examples.addressbook.*;
+import org.apache.juneau.html.annotation.*;
+import org.apache.juneau.microservice.*;
+import org.apache.juneau.rest.annotation.*;
+import org.apache.juneau.rest.labels.*;
+import org.apache.juneau.rest.widget.*;
+
+/**
+ * Sample REST resource for rendering predefined label beans.
+ */
+@RestResource(
+	path="/predefinedLabels",
+	title="Predefined Label Beans",
+	description="Shows examples of predefined label beans",
+	htmldoc=@HtmlDoc(
+		widgets={
+			ContentTypeMenuItem.class,
+			StyleMenuItem.class
+		},
+		navlinks={
+			"up: request:/..",
+			"options: servlet:/?method=OPTIONS",
+			"$W{ContentTypeMenuItem}",
+			"$W{StyleMenuItem}",
+			"source: $C{Source/gitHub}/org/apache/juneau/examples/rest/$R{servletClassSimple}.java"
+		}
+	)
+)
+public class PredefinedLabelsResource extends Resource {
+	private static final long serialVersionUID = 1L;
+
+	@RestMethod(name=GET, path="/")
+	public ResourceDescription[] getChildMethods() throws Exception {
+		return new ResourceDescription[] {
+			new ResourceDescription("beanDescription", "BeanDescription"),
+			new ResourceDescription("htmlLinks", "HtmlLink")
+		};
+	}
+	
+	@RestMethod(name=GET, path="/beanDescription")
+	public BeanDescription getBeanDescription() throws Exception {
+		return new BeanDescription(Person.class);
+	}	
+	
+	@RestMethod(name=GET, path="/htmlLinks")
+	public ALink[] htmlLinks() throws Exception {
+		return new ALink[] {
+			new ALink("apache", "http://apache.org"),
+			new ALink("juneau", "http://juneau.apache.org")
+		};
+	}
+	
+	@HtmlLink(nameProperty="n", hrefProperty="l")
+	public static class ALink {
+		public String n, l;
+		public ALink(String n, String l) {
+			this.n = n;
+			this.l = l;
+		}
+	}
+}
diff --git a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
index f643c13..fcef063 100644
--- a/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
+++ b/juneau-examples/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java
@@ -76,6 +76,7 @@ import org.apache.juneau.rest.widget.*;
 		ConfigResource.class,
 		LogsResource.class,
 		DockerRegistryResource.class,
+		PredefinedLabelsResource.class,
 		DebugResource.class,
 		ShutdownResource.class
 	}
diff --git a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java
index 624fe69..535af3a 100644
--- a/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java
+++ b/juneau-microservice/juneau-microservice-server/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java
@@ -50,8 +50,7 @@ import org.apache.juneau.svl.vars.*;
 		navlinks={
 			"up: request:/..",
 			"options: servlet:/?method=OPTIONS"
-		},
-		stylesheet="$C{REST/stylesheet,servlet:/styles/devops.css}"
+		}
 	),
 	config="$S{juneau.configFile}",
 	serializers={
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocBuilder.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocBuilder.java
index 8efc7f4..54ebe99 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocBuilder.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocBuilder.java
@@ -31,7 +31,7 @@ import org.apache.juneau.utils.*;
  * by the {@link HtmlDocSerializer} class.
  * 
  * <p>
- * This class is instantiated through the following methods.
+ * This class is instantiated through the following methods:
  * <ul>
  * 	<li class='jm'>{@link RestContextBuilder#getHtmlDocBuilder()} - Set values programmatically during servlet initialization.
  * 	<li class='jm'>{@link RestResponse#getHtmlDocBuilder()} - Set values programmatically during a REST request.
@@ -81,22 +81,25 @@ public class HtmlDocBuilder {
 	 * 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>
-	 * A value of <js>"INHERIT"</js> means copy the values from the parent.
-	 * <br>A value of <js>"NONE"</js> can be used to force no value.
-	 * 
-	 * <p>
-	 * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>).
-	 * <br>See {@link RestContext#getVarResolver()} for the list of supported variables.
-	 * 
-	 * <p>
-	 * This is the programmatic equivalent to the {@link HtmlDoc#header() @HtmlDoc.header()} annotation.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of this value is HTML.
+	 * 	<li>
+	 * 		When a value is specified, the {@link #navlinks(Object...)} value will be ignored.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		A value of <js>"INHERIT"</js> means copy the values from the parent.
+	 * 	<li>
+	 * 		A value of <js>"NONE"</js> can be used to force no value.
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#header() @HtmlDoc.header()} annotation.
+	 * </ul>
 	 * 
 	 * @param value
 	 * 	The HTML header section contents.
@@ -117,25 +120,25 @@ public class HtmlDocBuilder {
 	 * 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>).
-	 * <br>See {@link RestContext#getVarResolver()} for the list of supported variables.
-	 * 
-	 * <p>
-	 * A value of <js>"INHERIT"</js> means copy the values from the parent.
-	 * <br>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#navlinks() @HtmlDoc.navlinks()} annotation.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		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.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#juneau-marshall.URIs">URI resolution</a> (e.g. <js>"servlet:/..."</js>, <js>"request:/..."</js>).
+	 * 	<li>
+	 * 		A value of <js>"INHERIT"</js> means copy the values from the parent.
+	 * 	<li>
+	 * 		A value of <js>"NONE"</js> can be used to force no value.
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#navlinks() @HtmlDoc.navlinks()} annotation.
+	 * </ul>
 	 * 
 	 * @param value
 	 * 	The HTML nav section links links.
@@ -155,27 +158,25 @@ public class HtmlDocBuilder {
 	 * 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 #navlinks(Object[])} value will be ignored.
-	 * 
-	 * <p>
-	 * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>).
-	 * <br>See {@link RestContext#getVarResolver()} for the list of supported variables.
-	 * 
-	 * <p>
-	 * A value of <js>"INHERIT"</js> means copy the values from the parent.
-	 * <br>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.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of this value is HTML.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		When a value is specified, the {@link #navlinks(Object[])} value will be ignored.
+	 * 	<li>
+	 * 		A value of <js>"INHERIT"</js> means copy the values from the parent.
+	 * 	<li>
+	 * 		A value of <js>"NONE"</js> can be used to force no value.
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#nav() @HtmlDoc.nav()} annotation.
+	 * </ul>
 	 * 
 	 * @param value
 	 * 	The HTML nav section contents.
@@ -196,21 +197,22 @@ public class HtmlDocBuilder {
 	 * 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>).
-	 * <br>See {@link RestContext#getVarResolver()} for the list of supported variables.
-	 * 
-	 * <p>
-	 * A value of <js>"INHERIT"</js> means copy the values from the parent.
-	 * <br>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.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of this value is HTML.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		A value of <js>"INHERIT"</js> means copy the values from the parent.
+	 * 	<li>
+	 * 		A value of <js>"NONE"</js> can be used to force no value.
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#aside() @HtmlDoc.aside()} annotation.
+	 * </ul>
 	 * 
 	 * @param value
 	 * 	The HTML aside section contents.
@@ -231,21 +233,22 @@ public class HtmlDocBuilder {
 	 * 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>).
-	 * <br>See {@link RestContext#getVarResolver()} for the list of supported variables.
-	 * 
-	 * <p>
-	 * A value of <js>"INHERIT"</js> means copy the values from the parent.
-	 * <br>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.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of this value is HTML.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		A value of <js>"INHERIT"</js> means copy the values from the parent.
+	 * 	<li>
+	 * 		A value of <js>"NONE"</js> can be used to force no value.
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#footer() @HtmlDoc.footer()} annotation.
+	 * </ul>
 	 * 
 	 * @param value
 	 * 	The HTML footer section contents.
@@ -265,19 +268,20 @@ public class HtmlDocBuilder {
 	/**
 	 * 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>).
-	 * <br>See {@link RestContext#getVarResolver()} for the list of supported variables.
-	 * 
-	 * <p>
-	 * A value of <js>"INHERIT"</js> means copy the values from the parent.
-	 * <br>A value of <js>"NONE"</js> can be used to force no value.
-	 * 
-	 * <p>
-	 * This is the programmatic equivalent to the {@link HtmlDoc#style() @HtmlDoc.style()} annotation.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of this value is CSS.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		A value of <js>"INHERIT"</js> means copy the values from the parent.
+	 * 	<li>
+	 * 		A value of <js>"NONE"</js> can be used to force no value.
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#style() @HtmlDoc.style()} annotation.
+	 * </ul>
 	 * 
 	 * @param value
 	 * 	The HTML CSS style section contents.
@@ -298,21 +302,18 @@ public class HtmlDocBuilder {
 	 * Sets the CSS URL in the HTML CSS style section.
 	 * 
 	 * <p>
-	 * The format of this value is a comma-delimited list of URLs.
-	 * 
-	 * <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}.
-	 * <br>See {@link RestContext#getVarResolver()} for the list of supported variables.
-	 * 
-	 * <p>
-	 * This is the programmatic equivalent to the {@link HtmlDoc#stylesheet() @HtmlDoc.stylesheet()} annotation.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of this value is a comma-delimited list of URLs.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#stylesheet() @HtmlDoc.stylesheet()} annotation.
+	 * </ul>
 	 * 
 	 * @param value
 	 * 	The CSS URL in the HTML CSS style section.
@@ -332,19 +333,20 @@ public class HtmlDocBuilder {
 	/**
 	 * Sets the HTML script section contents.
 	 * 
-	 * <p>
-	 * The format of this value is Javascript.
-	 * 
-	 * <p>
-	 * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>).
-	 * <br>See {@link RestContext#getVarResolver()} for the list of supported variables.
-	 * 
-	 * <p>
-	 * A value of <js>"INHERIT"</js> means copy the values from the parent.
-	 * <br>A value of <js>"NONE"</js> can be used to force no value.
-	 * 
-	 * <p>
-	 * This is the programmatic equivalent to the {@link HtmlDoc#script() @HtmlDoc.script()} annotation.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of this value is Javascript.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		A value of <js>"INHERIT"</js> means copy the values from the parent.
+	 * 	<li>
+	 * 		A value of <js>"NONE"</js> can be used to force no value.
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#script() @HtmlDoc.script()} annotation.
+	 * </ul>
 	 * 
 	 * @param value
 	 * 	The HTML script section contents.
@@ -364,19 +366,20 @@ public class HtmlDocBuilder {
 	/**
 	 * Sets the HTML head section contents.
 	 * 
-	 * <p>
-	 * The format of this value is HTML.
-	 * 
-	 * <p>
-	 * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>).
-	 * <br>See {@link RestContext#getVarResolver()} for the list of supported variables.
-	 * 
-	 * <p>
-	 * A value of <js>"INHERIT"</js> means copy the values from the parent.
-	 * <br>A value of <js>"NONE"</js> can be used to force no value.
-	 * 
-	 * <p>
-	 * This is the programmatic equivalent to the {@link HtmlDoc#head() @HtmlDoc.head()} annotation.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		The format of this value is HTML.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		A value of <js>"INHERIT"</js> means copy the values from the parent.
+	 * 	<li>
+	 * 		A value of <js>"NONE"</js> can be used to force no value.
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#head() @HtmlDoc.head()} annotation.
+	 * </ul>
 	 * 
 	 * @param value
 	 * 	The HTML head section contents.
@@ -395,8 +398,14 @@ public class HtmlDocBuilder {
 	/**
 	 * 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.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#nowrap() @HtmlDoc.nowrap()} annotation.
+	 * </ul>
 	 * 
 	 * @param value The new nowrap setting.
 	 * @return This object (for method chaining).
@@ -408,9 +417,14 @@ public class HtmlDocBuilder {
 	/**
 	 * 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.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#noResultsMessage() @HtmlDoc.noResultsMessage()} annotation.
+	 * </ul>
 	 * 
 	 * @param value The text to display when serializing an empty array or collection.
 	 * @return This object (for method chaining).
@@ -426,8 +440,14 @@ public class HtmlDocBuilder {
 	 * 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.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#template() @HtmlDoc.template()} annotation.
+	 * </ul>
 	 * 
 	 * @param value The HTML page template to use to render the HTML page.
 	 * @return This object (for method chaining).
@@ -443,8 +463,14 @@ public class HtmlDocBuilder {
 	 * 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.
+	 * <h5 class='section'>Notes:</h5>
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
+	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
+	 * 	<li>
+	 * 		This is the programmatic equivalent to the {@link HtmlDoc#template() @HtmlDoc.template()} annotation.
+	 * </ul>
 	 * 
 	 * @param value The HTML page template to use to render the HTML page.
 	 * @return This object (for method chaining).
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 51a36af..631bf80 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -2720,6 +2720,11 @@ public final class RestContext extends BeanContext {
 	 * 	<li>
 	 * 		Widgets are inherited from super classes, but can be overridden by reusing the widget name.
 	 * </ul>
+	 * 
+	 * <h5 class='section'>See Also:</h5>
+	 * <ul>
+	 * 	<li class='link'><a class="doclink" href="../../../../overview-summary.html#juneau-rest-server.Widgets">Overview &gt; juneau-rest-server &gt; Widgets</a>
+	 * </ul>
 	 */
 	public static final String REST_widgets = PREFIX + "widgets.lo";
 	
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServletDefault.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServletDefault.java
index f2d193e..3e716c6 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServletDefault.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestServletDefault.java
@@ -199,7 +199,7 @@ import org.apache.juneau.xml.*;
 			"<h2>$R{methodSummary,resourceDescription}</h2>",
 			"<a href='http://juneau.apache.org'><img src='$U{servlet:/htdocs/juneau.png}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'/></a>"
 		},
-		stylesheet="servlet:/styles/light.css",
+		stylesheet="$C{REST/stylesheet,servlet:/styles/devops.css}",
 		head={
 			"<link rel='icon' href='$U{servlet:/htdocs/juneau.png}'/>"
 		}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java
index a27e9f6..fee217f 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java
@@ -12,7 +12,6 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.rest.annotation;
 
-import org.apache.juneau.*;
 import org.apache.juneau.html.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.widget.*;
@@ -90,9 +89,6 @@ public @interface HtmlDoc {
 	 * 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.
 	 * 
 	 * <h5 class='section'>Example:</h5>
@@ -109,19 +105,21 @@ public @interface HtmlDoc {
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
+	 * 		The format of this value is HTML.
+	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * 	<li>
 	 * 		A value of <js>"NONE"</js> can be used to force no value.
 	 * 	<li>
+	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
+	 * 	<li>
 	 * 		Multiple values are combined with newlines into a single string.
 	 * 	<li>
 	 * 		On methods, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the servlet/resource class.
 	 * 	<li>
 	 * 		On servlet/resource classes, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the
 	 * 		parent class.
-	 * 	<li>
-	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
 	 * </ul>
 	 * 
 	 * <h5 class='section'>See Also:</h5>
@@ -136,9 +134,6 @@ public @interface HtmlDoc {
 	 * 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.
 	 * 
 	 * <h5 class='section'>Example:</h5>
@@ -155,19 +150,21 @@ public @interface HtmlDoc {
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
+	 * 		The format of this value is HTML.
+	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * 	<li>
 	 * 		A value of <js>"NONE"</js> can be used to force no value.
 	 * 	<li>
+	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
+	 * 	<li>
 	 * 		Multiple values are combined with newlines into a single string.
 	 * 	<li>
 	 * 		On methods, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the servlet/resource class.
 	 * 	<li>
 	 * 		On servlet/resource classes, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the
 	 * 		parent class.
-	 * 	<li>
-	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
 	 * </ul>
 	 * 
 	 * <h5 class='section'>See Also:</h5>
@@ -181,9 +178,6 @@ public @interface HtmlDoc {
 	/**
 	 * Adds arbitrary content to the HTML <xt>&lt;head&gt;</xt> element on the page.
 	 * 
-	 * <p>
-	 * The format of this value is HTML.
-	 * 
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode'>
 	 * 	<ja>@RestResource</ja>(
@@ -202,6 +196,8 @@ public @interface HtmlDoc {
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
+	 * 		The format of this value is HTML.
+	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * 	<li>
@@ -227,9 +223,6 @@ public @interface HtmlDoc {
 	 * 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.
 	 * 
@@ -247,8 +240,12 @@ public @interface HtmlDoc {
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
+	 * 		The format of this value is HTML.
+	 * 	<li>
 	 * 		A value of <js>"NONE"</js> can be used to force no header.
 	 * 	<li>
+	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
+	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * 	<li>
@@ -258,8 +255,6 @@ public @interface HtmlDoc {
 	 * 	<li>
 	 * 		On servlet/resource classes, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the
 	 * 		parent class if not overridden.
-	 * 	<li>
-	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
 	 * </ul>
 	 * 
 	 * <h5 class='section'>See Also:</h5>
@@ -274,14 +269,8 @@ public @interface HtmlDoc {
 	 * 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.
-	 * 
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode'>
 	 * 	<ja>@RestResource</ja>(
@@ -296,6 +285,8 @@ public @interface HtmlDoc {
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
+	 * 		The format of this value is HTML.
+	 * 	<li>
 	 * 		When a value is specified, the {@link #navlinks()} value will be ignored.
 	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
@@ -303,14 +294,14 @@ public @interface HtmlDoc {
 	 * 	<li>
 	 * 		A value of <js>"NONE"</js> can be used to force no value.
 	 * 	<li>
+	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
+	 * 	<li>
 	 * 		Multiple values are combined with newlines into a single string.
 	 * 	<li>
 	 * 		On methods, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the servlet/resource class.
 	 * 	<li>
 	 * 		On servlet/resource classes, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the
 	 * 		parent class.
-	 * 	<li>
-	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
 	 * </ul>
 	 * 
 	 * <h5 class='section'>See Also:</h5>
@@ -325,6 +316,9 @@ public @interface HtmlDoc {
 	 * Sets the links in the HTML nav section.
 	 * 
 	 * <p>
+	 * The page links are positioned immediately under the title and text.
+	 * 
+	 * <p>
 	 * The value is an array of strings with two possible values:
 	 * <ul>
 	 * 	<li>A key-value pair representing a hyperlink label and href:
@@ -332,9 +326,6 @@ public @interface HtmlDoc {
 	 * 	<li>Arbitrary HTML.
 	 * </ul>
 	 * 
-	 * <p>
-	 * The page links are positioned immediately under the title and text.
-	 * 
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode'>
 	 * 	<ja>@RestResource</ja>(
@@ -355,16 +346,16 @@ public @interface HtmlDoc {
 	 * 	<li>
 	 * 		A value of <js>"NONE"</js> can be used to force no value.
 	 * 	<li>
-	 * 		This field can also use URIs of any support type in {@link UriResolver}.
+	 * 		The parent links can be included by adding the literal <js>"INHERIT"</js> as a value.
+	 * 		<br>Use the syntax <js>"key[index]: value"</js> or <js>"[index]: value"</js> to specify an index location
+	 * 		to place a link inside the list of parent links.
+	 * 	<li>
+	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#juneau-marshall.URIs">URI resolution</a> (e.g. <js>"servlet:/..."</js>, <js>"request:/..."</js>).
 	 * 	<li>
 	 * 		On methods, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the servlet/resource class.
 	 * 	<li>
 	 * 		On servlet/resource classes, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the
 	 * 		parent class.
-	 * 	<li>
-	 * 		The parent links can be included by adding the literal <js>"INHERIT"</js> as a value.
-	 * 		<br>Use the syntax <js>"key[index]: value"</js> or <js>"[index]: value"</js> to specify an index location
-	 * 		to place a link inside the list of parent links.
 	 * </ul>
 	 * 
 	 * <h5 class='section'>See Also:</h5>
@@ -410,9 +401,6 @@ public @interface HtmlDoc {
 	/**
 	 * Sets the HTML script section contents.
 	 * 
-	 * <p>
-	 * The format of this value is Javascript.
-	 * 
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode'>
 	 * 	<ja>@RestResource</ja>(
@@ -427,19 +415,21 @@ public @interface HtmlDoc {
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
+	 * 		The format of this value is Javascript.
+	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * 	<li>
 	 * 		A value of <js>"NONE"</js> can be used to force no value.
 	 * 	<li>
+	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
+	 * 	<li>
 	 * 		Multiple values are combined with newlines into a single string.
 	 * 	<li>
 	 * 		On methods, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the servlet/resource class.
 	 * 	<li>
 	 * 		On servlet/resource classes, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the
 	 * 		parent class.
-	 * 	<li>
-	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
 	 * </ul>
 	 * 
 	 * <h5 class='section'>See Also:</h5>
@@ -453,9 +443,6 @@ public @interface HtmlDoc {
 	/**
 	 * Sets the HTML CSS style section contents.
 	 * 
-	 * <p>
-	 * The format of this value is CSS.
-	 * 
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode'>
 	 * 	<ja>@RestResource</ja>(
@@ -471,19 +458,21 @@ public @interface HtmlDoc {
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
+	 * 		The format of this value is CSS.
+	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * 	<li>
 	 * 		A value of <js>"NONE"</js> can be used to force no value.
 	 * 	<li>
+	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
+	 * 	<li>
 	 * 		Multiple values are combined with newlines into a single string.
 	 * 	<li>
 	 * 		On methods, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the servlet/resource class.
 	 * 	<li>
 	 * 		On servlet/resource classes, this value is inherited from the <ja>@HtmlDoc</ja> annotation on the
 	 * 		parent class.
-	 * 	<li>
-	 * 		The parent value can be included by adding the literal <js>"INHERIT"</js> as a value.
 	 * </ul>
 	 * 
 	 * <h5 class='section'>See Also:</h5>
@@ -498,14 +487,8 @@ public @interface HtmlDoc {
 	 * 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.
-	 * 
 	 * <h5 class='section'>Example:</h5>
 	 * <p class='bcode'>
 	 * 	<ja>@RestResource</ja>(
@@ -518,6 +501,8 @@ public @interface HtmlDoc {
 	 * <h5 class='section'>Notes:</h5>
 	 * <ul class='spaced-list'>
 	 * 	<li>
+	 * 		The format of this value is a URL.
+	 * 	<li>
 	 * 		Supports <a class="doclink" href="../../../../../overview-summary.html#DefaultRestSvlVariables">initialization-time and request-time variables</a> 
 	 * 		(e.g. <js>"$L{my.localized.variable}"</js>).
 	 * 	<li>
@@ -567,13 +552,18 @@ public @interface HtmlDoc {
 	 * 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 resolve the following variables:
-	 * <ul>
-	 * 	<li><js>"$W{name}"</js> - Contents returned by {@link Widget#getHtml(RestRequest)}.
-	 * 	<li><js>"$W{name.script}"</js> - Contents returned by {@link Widget#getScript(RestRequest)}.
+	 * 
+	 * <ul class='spaced-list'>
+	 * 	<li>
+	 * 		<js>"$W{name}"</js> - Contents returned by {@link Widget#getHtml(RestRequest)}.
+	 * 	<li>
+	 * 		<js>"$W{name.script}"</js> - Contents returned by {@link Widget#getScript(RestRequest)}.
 	 * 		<br>The script contents are automatically inserted into the <xt>&lt;head/script&gt;</xt> section
 	 * 			 in the HTML page.
-	 * 	<li><js>"$W{name.style}"</js> - Contents returned by {@link Widget#getStyle(RestRequest)}.
+	 * 	<li>
+	 * 		<js>"$W{name.style}"</js> - Contents returned by {@link Widget#getStyle(RestRequest)}.
 	 * 		<br>The styles contents are automatically inserted into the <xt>&lt;head/style&gt;</xt> section
 	 * 			 in the HTML page.
 	 * </ul>
@@ -608,10 +598,7 @@ public @interface HtmlDoc {
 	 * 
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jf'>{@link RestContext#REST_widgets}
-	 * 	<li class='jm'>{@link RestContextBuilder#widgets(Class...)}
-	 * 	<li class='jm'>{@link RestContextBuilder#widgets(Widget...)}
-	 * 	<li class='jm'>{@link RestContextBuilder#widgets(boolean,Widget...)}
+	 * 	<li class='link'><a class="doclink" href="../../../../../overview-summary.html#juneau-rest-server.Widgets">Overview &gt; juneau-rest-server &gt; Widgets</a>
 	 * </ul>
 	 */
 	Class<? extends Widget>[] widgets() default {};
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
index e5cacfd..b181583 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestMethod.java
@@ -423,7 +423,7 @@ public @interface RestMethod {
 	 * 
 	 * <h5 class='section'>See Also:</h5>
 	 * <ul>
-	 * 	<li class='jic'>{@link RestInfoProvider}
+	 * 	<li class='link'><a class="doclink" href="../../../../../overview-summary.html#juneau-rest-server.HtmlDocAnnotation">Overview &gt; juneau-rest-server &gt; @HtmlDoc</a>
 	 * </ul>
 	 */
 	HtmlDoc htmldoc() default @HtmlDoc;
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
index 67f7de2..4cc0451 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestResource.java
@@ -416,6 +416,11 @@ public @interface RestResource {
 	 * 		)
 	 * 	)
 	 * </p>
+	 * 
+	 * <h5 class='section'>See Also:</h5>
+	 * <ul>
+	 * 	<li class='link'><a class="doclink" href="../../../../../overview-summary.html#juneau-rest-server.HtmlDocAnnotation">Overview &gt; juneau-rest-server &gt; @HtmlDoc</a>
+	 * </ul>
 	 */
 	HtmlDoc htmldoc() default @HtmlDoc;
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/BeanDescription.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/BeanDescription.java
index 8545d2c..080594d 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/BeanDescription.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/BeanDescription.java
@@ -47,6 +47,8 @@ public final class BeanDescription {
 	public BeanDescription(Class<?> c) {
 		type = c.getName();
 		BeanMeta<?> bm = BeanContext.DEFAULT.getBeanMeta(c);
+		if (bm == null)
+			throw new FormattedRuntimeException("Class ''{0}'' is not a valid bean.", c);
 		properties = new BeanPropertyDescription[bm.getPropertyMetas().size()];
 		int i = 0;
 		for (BeanPropertyMeta pm : bm.getPropertyMetas())
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/NameDescription.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/NameDescription.java
index 8a981d0..b0e120a 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/NameDescription.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/labels/NameDescription.java
@@ -58,9 +58,12 @@ public class NameDescription {
 	 * Sets the name field on this label to a new value.
 	 * 
 	 * @param name The new name.
+	 * @return This object (for method chaining).
 	 */
-	public void setName(Object name) {
+	@BeanProperty
+	public NameDescription name(Object name) {
 		this.name = name;
+		return this;
 	}
 
 	/**
@@ -76,8 +79,11 @@ public class NameDescription {
 	 * Sets the description field on this label to a new value.
 	 * 
 	 * @param description The new description.
+	 * @return This object (for method chaining).
 	 */
-	public void setDescription(Object description) {
+	@BeanProperty
+	public NameDescription description(Object description) {
 		this.description = description;
+		return this;
 	}
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java
index 289b453..de20d66 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java
@@ -57,7 +57,7 @@ public class StyleMenuItem extends MenuItemWidget {
 
 	private static final String[] BUILT_IN_STYLES = {"devops", "light", "original", "dark"};
 
-	@Override /* MenuItemWidget */
+	@Override /* Widget */
 	public String getLabel(RestRequest req) {
 		return "styles";
 	}
@@ -65,7 +65,7 @@ public class StyleMenuItem extends MenuItemWidget {
 	 * Looks at the supported media types from the request and constructs a list of hyperlinks to render the data
 	 * as plain-text.
 	 */
-	@Override /* Widget */
+	@Override /* MenuItemWidget */
 	public Div getContent(RestRequest req) throws Exception {
 		Div div = div();
 		for (String s : BUILT_IN_STYLES) {
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/Widget.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/Widget.java
index bfd707d..26ba538 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/Widget.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/Widget.java
@@ -25,9 +25,9 @@ import org.apache.juneau.utils.*;
  * <p>
  * Widgets are associated with resources through the following
  * <ul>
- * 	<li>{@link HtmlDoc#widgets() @HtmlDoc.widgets}
- * 	<li>{@link RestContextBuilder#widgets(Class...)}
- * 	<li>{@link RestContextBuilder#widgets(Widget...)}
+ * 	<li class='ja'>{@link HtmlDoc#widgets() @HtmlDoc.widgets}
+ * 	<li class='jm'>{@link RestContextBuilder#widgets(Class...)}
+ * 	<li class='jm'>{@link RestContextBuilder#widgets(Widget...)}
  * </ul>
  * 
  * <p>

-- 
To stop receiving notification emails like this one, please contact
jamesbognar@apache.org.

Mime
View raw message