You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2019/05/12 18:59:02 UTC

[juneau] branch master updated: JUNEAU-102 Expanded REST annotations

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 5ac48a1  JUNEAU-102 Expanded REST annotations
5ac48a1 is described below

commit 5ac48a18b0e326c35b536aecc6c63b819c936639
Author: JamesBognar <ja...@apache.org>
AuthorDate: Sun May 12 14:58:26 2019 -0400

    JUNEAU-102 Expanded REST annotations
---
 .../org/apache/juneau/testutils/TestUtils.java     |  7 ++++-
 .../java/org/apache/juneau/html/HtmlWidgetVar.java |  2 +-
 .../org/apache/juneau/svl/VarResolverSession.java  | 15 +++++++++++
 .../juneau/examples/rest/ContentComboTestBase.java |  8 +++---
 .../org/apache/juneau/examples/rest/TestUtils.java | 25 +++++++++++++++++
 .../apache/juneau/rest/BasicRestCallHandler.java   |  6 ++---
 .../java/org/apache/juneau/rest/RestRequest.java   | 11 +++++++-
 .../java/org/apache/juneau/rest/vars/FileVar.java  |  7 ++++-
 .../apache/juneau/rest/vars/LocalizationVar.java   | 11 ++++++--
 .../juneau/rest/vars/RequestAttributeVar.java      | 12 +++++----
 .../juneau/rest/vars/RequestFormDataVar.java       | 13 ++++-----
 .../apache/juneau/rest/vars/RequestHeaderVar.java  | 13 ++++-----
 .../apache/juneau/rest/vars/RequestPathVar.java    | 13 ++++-----
 .../apache/juneau/rest/vars/RequestQueryVar.java   | 13 ++++-----
 .../org/apache/juneau/rest/vars/RequestVar.java    | 18 ++++++-------
 .../org/apache/juneau/rest/vars/RestInfoVar.java   | 13 ++++-----
 .../juneau/rest/vars/SerializedRequestAttrVar.java | 11 ++++++--
 .../juneau/rest/vars/ServletInitParamVar.java      | 11 ++++++--
 .../org/apache/juneau/rest/vars/SwaggerVar.java    | 13 ++++-----
 .../org/apache/juneau/rest/vars/UrlEncodeVar.java  |  2 +-
 .../java/org/apache/juneau/rest/vars/UrlVar.java   |  7 ++++-
 .../org/apache/juneau/rest/vars/WidgetVar.java     | 11 +++++---
 .../java/org/apache/juneau/rest/widget/Widget.java | 31 +++++++++++++++++++++-
 23 files changed, 197 insertions(+), 76 deletions(-)

diff --git a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/testutils/TestUtils.java b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/testutils/TestUtils.java
index 6455cd4..cd9aec1 100644
--- a/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/testutils/TestUtils.java
+++ b/juneau-core/juneau-core-test/src/test/java/org/apache/juneau/testutils/TestUtils.java
@@ -484,8 +484,13 @@ public class TestUtils {
 
 	public static final void assertContains(Object value, String...substrings) {
 		for (String substring : substrings)
-			if (! contains(toString(value), substring))
+			if (! contains(toString(value), substring)) {
+				System.err.println("Text did not contain expected substring: '" + toString(substring) + "'");
+				System.err.println("=== TEXT ===");
+				System.err.println(toString(value));
+				System.err.println("============");
 				throw new ComparisonFailure("Text did not contain expected substring.", toString(substring), toString(value));
+			}
 	}
 
 	public static final void assertContains(Exception e, String...substrings) {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWidgetVar.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWidgetVar.java
index 12c7383..eb83946 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWidgetVar.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWidgetVar.java
@@ -70,6 +70,6 @@ public class HtmlWidgetVar extends SimpleVar {
 
 	@Override
 	public boolean canResolve(VarResolverSession session) {
-		return session.getSessionObject(Object.class, SESSION_htmlWidgets, false) != null;
+		return session.hasSessionObject(SESSION_htmlWidgets);
 	}
 }
\ No newline at end of file
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
index 0a716bf..828ed8e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
@@ -414,6 +414,16 @@ public class VarResolverSession {
 	}
 
 	/**
+	 * Returns <jk>true</jk> if this session has the specified session object.
+	 *
+	 * @param name Session object name.
+	 * @return <jk>true</jk> if this session has the specified session object
+	 */
+	public boolean hasSessionObject(String name) {
+		return getSessionObject(Object.class, name, false) != null;
+	}
+
+	/**
 	 * Returns the {@link Var} with the specified name.
 	 *
 	 * @param name The var name (e.g. <js>"S"</js>).
@@ -423,4 +433,9 @@ public class VarResolverSession {
 		Var v = this.context.getVarMap().get(name);
 		return v != null && v.canResolve(this) ? v : null;
 	}
+
+	@Override /* Object */
+	public String toString() {
+		return "var=" + this.context.getVarMap().keySet() + ", contextObjects=" + this.context.getContextObjects().keySet() + ", sessionObjects=" + this.sessionObjects.keySet();
+	}
 }
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/test/java/org/apache/juneau/examples/rest/ContentComboTestBase.java b/juneau-examples/juneau-examples-rest-jetty/src/test/java/org/apache/juneau/examples/rest/ContentComboTestBase.java
index e376d8c..4203744 100644
--- a/juneau-examples/juneau-examples-rest-jetty/src/test/java/org/apache/juneau/examples/rest/ContentComboTestBase.java
+++ b/juneau-examples/juneau-examples-rest-jetty/src/test/java/org/apache/juneau/examples/rest/ContentComboTestBase.java
@@ -12,6 +12,8 @@
 // ***************************************************************************************************************************
 package org.apache.juneau.examples.rest;
 
+import static org.apache.juneau.examples.rest.TestUtils.*;
+
 import java.io.*;
 import java.util.*;
 
@@ -98,10 +100,6 @@ public class ContentComboTestBase extends RestTestcase {
 	public void doTest() throws Exception {
 		RestClient rc = getClient(comboInput.mediaType);
 		String s = rc.doGet(comboInput.url).getResponseAsString();
-		for (String s2 : comboInput.expectedResults) {
-			if (! s.contains(s2)) {
-				throw new FormattedRuntimeException("String ''{0}'' not found at URL ''{1}'' for media type ''{2}''", s2, comboInput.url, comboInput.mediaType);
-			}
-		}
+		assertContains(s, comboInput.expectedResults);
 	}
 }
diff --git a/juneau-examples/juneau-examples-rest-jetty/src/test/java/org/apache/juneau/examples/rest/TestUtils.java b/juneau-examples/juneau-examples-rest-jetty/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
index 5961649..4642866 100644
--- a/juneau-examples/juneau-examples-rest-jetty/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
+++ b/juneau-examples/juneau-examples-rest-jetty/src/test/java/org/apache/juneau/examples/rest/TestUtils.java
@@ -365,4 +365,29 @@ public class TestUtils {
 		String s2 = o.toString().replaceAll("\\r?\\n", "|");
 		Assert.assertEquals(s, s2);
 	}
+
+	/**
+	 * Tries to turn the serialized output to a String.
+	 * If it's a byte[], convert it to a UTF-8 encoded String.
+	 */
+	public static final String toString(Object o) {
+		if (o == null)
+			return null;
+		if (o instanceof String)
+			return (String)o;
+		if (o instanceof byte[])
+			return new String((byte[])o, UTF8);
+		return o.toString();
+	}
+
+	public static final void assertContains(Object value, String...substrings) {
+		for (String substring : substrings)
+			if (! contains(toString(value), substring)) {
+				System.err.println("Text did not contain expected substring: '" + toString(substring) + "'");
+				System.err.println("=== TEXT ===");
+				System.err.println(toString(value));
+				System.err.println("============");
+				throw new ComparisonFailure("Text did not contain expected substring.", toString(substring), toString(value));
+			}
+	}
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java
index 2c524f9..9d23a0d 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/BasicRestCallHandler.java
@@ -28,7 +28,6 @@ import org.apache.juneau.http.StreamResource;
 import org.apache.juneau.rest.RestContext.*;
 import org.apache.juneau.rest.exception.*;
 import org.apache.juneau.rest.util.RestUtils;
-import org.apache.juneau.rest.vars.*;
 
 /**
  * Default implementation of {@link RestCallHandler}.
@@ -141,6 +140,7 @@ public class BasicRestCallHandler implements RestCallHandler {
 
 			req = createRequest(r1);
 			RestResponse res = createResponse(req, r2);
+			req.setResponse(res);
 			context.setRequest(req);
 			context.setResponse(res);
 			String method = req.getMethod();
@@ -334,8 +334,8 @@ public class BasicRestCallHandler implements RestCallHandler {
 	@Override /* RestCallHandler */
 	public Map<String,Object> getSessionObjects(RestRequest req, RestResponse res) {
 		Map<String,Object> m = new HashMap<>();
-		m.put(RequestVar.SESSION_req, req);
-		m.put(RequestVar.SESSION_res, res);
+		m.put("req", req);
+		m.put("res", res);
 		return m;
 	}
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
index 4d1742d..20bec98 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestRequest.java
@@ -212,6 +212,11 @@ public final class RestRequest extends HttpServletRequestWrapper {
 		}
 	}
 
+	RestRequest setResponse(RestResponse res) {
+		this.res = res;
+		return this;
+	}
+
 	/**
 	 * Returns a string of the form <js>"HTTP method-name full-url"</js>
 	 *
@@ -1317,7 +1322,11 @@ public final class RestRequest extends HttpServletRequestWrapper {
 	 */
 	public VarResolverSession getVarResolverSession() {
 		if (varSession == null)
-			varSession = context.getVarResolver().createSession(context.getCallHandler().getSessionObjects(this, context.getResponse()));
+			varSession = context
+				.getVarResolver()
+				.createSession(context.getCallHandler().getSessionObjects(this, context.getResponse()))
+				.sessionObject("req", this)
+				.sessionObject("res", res);
 		return varSession;
 	}
 
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/FileVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/FileVar.java
index 6fb42eb..d882823 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/FileVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/FileVar.java
@@ -82,7 +82,7 @@ public class FileVar extends DefaultingVar {
 		super(NAME);
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) throws Exception {
 
 		RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, false);
@@ -97,4 +97,9 @@ public class FileVar extends DefaultingVar {
 
 		return null;
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req) || session.hasSessionObject(SESSION_crm);
+	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java
index 7ad5d53..0bc9f90 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java
@@ -42,6 +42,8 @@ import org.apache.juneau.svl.*;
  */
 public class LocalizationVar extends MultipartVar {
 
+	private static final String SESSION_req = "req";
+
 	/** The name of this variable. */
 	public static final String NAME = "L";
 
@@ -52,13 +54,18 @@ public class LocalizationVar extends MultipartVar {
 		super(NAME);
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String[] args) {
 		if (args.length > 0) {
 			String key = args[0];
 			String[] a = (args.length > 1) ? Arrays.copyOfRange(args, 1, args.length) : new String[0];
-			return session.getSessionObject(RestRequest.class, RequestVar.SESSION_req, true).getMessage(key, (Object[])a);
+			return session.getSessionObject(RestRequest.class, SESSION_req, true).getMessage(key, (Object[])a);
 		}
 		return "";
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req);
+	}
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestAttributeVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestAttributeVar.java
index 86c77ac..6f5d00c 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestAttributeVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestAttributeVar.java
@@ -51,10 +51,7 @@ import org.apache.juneau.svl.*;
  */
 public class RequestAttributeVar extends MultipartResolvingVar {
 
-	/**
-	 * The name of the session or context object that identifies the {@link RestRequest} object.
-	 */
-	public static final String SESSION_req = "req";
+	private static final String SESSION_req = "req";
 
 
 	/** The name of this variable. */
@@ -77,9 +74,14 @@ public class RequestAttributeVar extends MultipartResolvingVar {
 		return false;
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
 		RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
 		return stringify(req.getAttribute(key));
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req);
+	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestFormDataVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestFormDataVar.java
index 54107f9..de8e085 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestFormDataVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestFormDataVar.java
@@ -47,11 +47,7 @@ import org.apache.juneau.svl.*;
  */
 public class RequestFormDataVar extends MultipartResolvingVar {
 
-	/**
-	 * The name of the session or context object that identifies the {@link RestRequest} object.
-	 */
-	public static final String SESSION_req = "req";
-
+	private static final String SESSION_req = "req";
 
 	/** The name of this variable. */
 	public static final String NAME = "RF";
@@ -73,9 +69,14 @@ public class RequestFormDataVar extends MultipartResolvingVar {
 		return false;
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
 		RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
 		return req.getFormData(key);
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req);
+	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestHeaderVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestHeaderVar.java
index b61c1b0..a6ce8b4 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestHeaderVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestHeaderVar.java
@@ -47,11 +47,7 @@ import org.apache.juneau.svl.*;
  */
 public class RequestHeaderVar extends MultipartResolvingVar {
 
-	/**
-	 * The name of the session or context object that identifies the {@link RestRequest} object.
-	 */
-	public static final String SESSION_req = "req";
-
+	private static final String SESSION_req = "req";
 
 	/** The name of this variable. */
 	public static final String NAME = "RH";
@@ -73,9 +69,14 @@ public class RequestHeaderVar extends MultipartResolvingVar {
 		return false;
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
 		RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
 		return req.getHeader(key);
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req);
+	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestPathVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestPathVar.java
index a910e1d..d231f35 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestPathVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestPathVar.java
@@ -48,11 +48,7 @@ import org.apache.juneau.svl.*;
  */
 public class RequestPathVar extends MultipartResolvingVar {
 
-	/**
-	 * The name of the session or context object that identifies the {@link RestRequest} object.
-	 */
-	public static final String SESSION_req = "req";
-
+	private static final String SESSION_req = "req";
 
 	/** The name of this variable. */
 	public static final String NAME = "RP";
@@ -74,11 +70,16 @@ public class RequestPathVar extends MultipartResolvingVar {
 		return false;
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
 		RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
 		if ("REMAINDER".equals(key))
 			return req.getPathRemainder();
 		return req.getPath(key);
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req);
+	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestQueryVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestQueryVar.java
index 68d9e44..0990929 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestQueryVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestQueryVar.java
@@ -48,11 +48,7 @@ import org.apache.juneau.svl.*;
  */
 public class RequestQueryVar extends MultipartResolvingVar {
 
-	/**
-	 * The name of the session or context object that identifies the {@link RestRequest} object.
-	 */
-	public static final String SESSION_req = "req";
-
+	private static final String SESSION_req = "req";
 
 	/** The name of this variable. */
 	public static final String NAME = "RQ";
@@ -74,9 +70,14 @@ public class RequestQueryVar extends MultipartResolvingVar {
 		return false;
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
 		RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
 		return req.getQuery(key);
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req);
+	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestVar.java
index b6cf13d..af51584 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RequestVar.java
@@ -64,15 +64,8 @@ import org.apache.juneau.svl.*;
  */
 public class RequestVar extends MultipartResolvingVar {
 
-	/**
-	 * The name of the session or context object that identifies the {@link RestRequest} object.
-	 */
-	public static final String SESSION_req = "req";
-
-	/**
-	 * The name of the session or context object that identifies the {@link RestResponse} object.
-	 */
-	public static final String SESSION_res = "res";
+	private static final String SESSION_req = "req";
+	private static final String SESSION_res = "res";
 
 
 	/** The name of this variable. */
@@ -95,7 +88,7 @@ public class RequestVar extends MultipartResolvingVar {
 		return false;
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
 		RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
 		char c = StringUtils.charAt(key, 0);
@@ -140,4 +133,9 @@ public class RequestVar extends MultipartResolvingVar {
 		}
 		return req.getProperties().getString(key);
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req) && session.hasSessionObject(SESSION_res);
+	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RestInfoVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RestInfoVar.java
index 7c5c0c1..6091f32 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RestInfoVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/RestInfoVar.java
@@ -71,11 +71,7 @@ import org.apache.juneau.svl.*;
  */
 public class RestInfoVar extends MultipartResolvingVar {
 
-	/**
-	 * The name of the session or context object that identifies the {@link RestRequest} object.
-	 */
-	public static final String SESSION_req = "req";
-
+	private static final String SESSION_req = "req";
 
 	/** The name of this variable. */
 	public static final String NAME = "RI";
@@ -97,7 +93,7 @@ public class RestInfoVar extends MultipartResolvingVar {
 		return false;
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) throws RestException, InternalServerError {
 		try {
 			RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
@@ -151,4 +147,9 @@ public class RestInfoVar extends MultipartResolvingVar {
 			throw new InternalServerError(e);
 		}
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req);
+	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java
index f922a94..62fb3da 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java
@@ -41,6 +41,8 @@ import org.apache.juneau.svl.*;
  */
 public class SerializedRequestAttrVar extends StreamedVar {
 
+	private static final String SESSION_req = "req";
+
 	/** The name of this variable. */
 	public static final String NAME = "SA";
 
@@ -51,13 +53,13 @@ public class SerializedRequestAttrVar extends StreamedVar {
 		super(NAME);
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public void resolveTo(VarResolverSession session, Writer w, String key) throws Exception {
 		int i = key.indexOf(',');
 		if (i == -1)
 			throw new RuntimeException("Invalid format for $SA var.  Must be of the format $SA{contentType,key[,defaultValue]}");
 		String[] s2 = split(key);
-		RestRequest req = session.getSessionObject(RestRequest.class, RequestVar.SESSION_req, true);
+		RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
 		if (req != null) {
 			Object o = req.getAttribute(key);
 			if (o == null)
@@ -77,4 +79,9 @@ public class SerializedRequestAttrVar extends StreamedVar {
 	protected boolean allowRecurse() {
 		return false;
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req);
+	}
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java
index 388065d..95c74b5 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java
@@ -39,6 +39,8 @@ import org.apache.juneau.svl.*;
  */
 public class ServletInitParamVar extends DefaultingVar {
 
+	private static final String SESSION_req = "req";
+
 	/** The name of this variable. */
 	public static final String NAME = "I";
 
@@ -49,8 +51,13 @@ public class ServletInitParamVar extends DefaultingVar {
 		super(NAME);
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
-		return session.getSessionObject(RestRequest.class, RequestVar.SESSION_req, true).getContext().getServletInitParameter(key);
+		return session.getSessionObject(RestRequest.class, SESSION_req, true).getContext().getServletInitParameter(key);
+	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req);
 	}
 }
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SwaggerVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SwaggerVar.java
index 0fb9dba..2ef272d 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SwaggerVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/SwaggerVar.java
@@ -46,11 +46,7 @@ import org.apache.juneau.svl.*;
  */
 public class SwaggerVar extends MultipartResolvingVar {
 
-	/**
-	 * The name of the session or context object that identifies the {@link RestRequest} object.
-	 */
-	public static final String SESSION_req = "req";
-
+	private static final String SESSION_req = "req";
 
 	/** The name of this variable. */
 	public static final String NAME = "SS";
@@ -72,9 +68,14 @@ public class SwaggerVar extends MultipartResolvingVar {
 		return false;
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
 		RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
 		return req.getProperties().getString(key);
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req);
+	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlEncodeVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlEncodeVar.java
index 20ff8e2..aa47b43 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlEncodeVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlEncodeVar.java
@@ -48,7 +48,7 @@ public class UrlEncodeVar extends SimpleVar {
 		super(NAME);
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
 		return urlEncode(key);
 	}
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlVar.java
index 113cf9c..a1b5581 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/UrlVar.java
@@ -55,9 +55,14 @@ public class UrlVar extends SimpleVar {
 		super(NAME);
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) {
 		RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
 		return req.getUriResolver().resolve(key);
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req);
+	}
 }
\ No newline at end of file
diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/WidgetVar.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/WidgetVar.java
index f0d1288..b404677 100644
--- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/WidgetVar.java
+++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/vars/WidgetVar.java
@@ -39,9 +39,6 @@ import org.apache.juneau.svl.*;
  */
 public class WidgetVar extends SimpleVar {
 
-	/**
-	 * The name of the session or context object that identifies the {@link RestRequest} object.
-	 */
 	private static final String SESSION_req = "req";
 	private static final String SESSION_res = "res";
 
@@ -57,12 +54,13 @@ public class WidgetVar extends SimpleVar {
 		super(NAME);
 	}
 
-	@Override /* Parameter */
+	@Override /* Var */
 	public String resolve(VarResolverSession session, String key) throws Exception {
 		RestRequest req = session.getSessionObject(RestRequest.class, SESSION_req, true);
 		RestResponse res = session.getSessionObject(RestResponse.class, SESSION_res, true);
 		boolean isScript = false, isStyle = false;
 
+		// TODO - The following lines are deprecated.
 		if (key.endsWith(".script")) {
 			key = key.substring(0, key.length() - 7);
 			isScript = true;
@@ -83,4 +81,9 @@ public class WidgetVar extends SimpleVar {
 			return w.getStyle(req, res);
 		return w.getHtml(req, res);
 	}
+
+	@Override /* Var */
+	public boolean canResolve(VarResolverSession session) {
+		return session.hasSessionObject(SESSION_req) && session.hasSessionObject(SESSION_res);
+	}
 }
\ No newline at end of file
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 0011d06..1ee6e6d 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
@@ -16,7 +16,9 @@ import java.io.*;
 import java.util.*;
 
 import org.apache.juneau.rest.*;
+import org.apache.juneau.svl.*;
 import org.apache.juneau.utils.*;
+import org.apache.juneau.html.*;
 
 /**
  * Defines an interface for resolvers of <js>"$W{...}"</js> string variables.
@@ -36,10 +38,13 @@ import org.apache.juneau.utils.*;
  * 	<li class='link'>{@doc juneau-rest-server.HtmlDocAnnotation.Widgets}
  * </ul>
  */
-public abstract class Widget {
+public abstract class Widget implements HtmlWidget {
 
 	private final ClasspathResourceManager rm = new ClasspathResourceManager(getClass(), ClasspathResourceFinderRecursive.INSTANCE, false);
 
+	private static final String SESSION_req = "req";
+	private static final String SESSION_res = "res";
+
 	/**
 	 * The widget key.
 	 *
@@ -54,10 +59,34 @@ public abstract class Widget {
 	 *
 	 * @return The widget key.
 	 */
+	@Override
 	public String getName() {
 		return getClass().getSimpleName();
 	}
 
+	private RestRequest req(VarResolverSession session) {
+		return session.getSessionObject(RestRequest.class, SESSION_req, true);
+	}
+
+	private RestResponse res(VarResolverSession session) {
+		return session.getSessionObject(RestResponse.class, SESSION_res, true);
+	}
+
+	@Override /* HtmlWidget */
+	public String getHtml(VarResolverSession session) throws Exception {
+		return getHtml(req(session), res(session));
+	}
+
+	@Override /* HtmlWidget */
+	public String getScript(VarResolverSession session) throws Exception {
+		return getScript(req(session), res(session));
+	}
+
+	@Override /* HtmlWidget */
+	public String getStyle(VarResolverSession session) throws Exception {
+		return getStyle(req(session), res(session));
+	}
+
 	/**
 	 * Resolves the HTML content for this widget.
 	 *