Author: zhoresh
Date: Fri Jul 2 21:22:09 2010
New Revision: 960109
URL: http://svn.apache.org/viewvc?rev=960109&view=rev
Log:
Improve error handling for Js config
http://codereview.appspot.com/1708051/show
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/DefaultJsUriManagerTest.java
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java?rev=960109&r1=960108&r2=960109&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
(original)
+++
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsServlet.java
Fri Jul 2 21:22:09 2010
@@ -29,6 +29,7 @@ import org.apache.shindig.common.servlet
import org.apache.shindig.common.uri.UriBuilder;
import org.apache.shindig.config.ContainerConfig;
import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.GadgetException;
import org.apache.shindig.gadgets.RenderingContext;
import org.apache.shindig.gadgets.config.ConfigContributor;
import org.apache.shindig.gadgets.features.FeatureRegistry;
@@ -78,7 +79,7 @@ public class JsServlet extends InjectedS
}
this.registry = registry;
}
-
+
@Inject
public void setUrlGenerator(JsUriManager jsUriManager) {
if (initialized) {
@@ -115,7 +116,13 @@ public class JsServlet extends InjectedS
// If an If-Modified-Since header is ever provided, we always say
// not modified. This is because when there actually is a change,
// cache busting should occur.
- UriStatus vstatus = jsUriManager.processExternJsUri(new
UriBuilder(req).toUri()).getStatus();
+ UriStatus vstatus;
+ try {
+ vstatus = jsUriManager.processExternJsUri(new
UriBuilder(req).toUri()).getStatus();
+ } catch (GadgetException e) {
+ resp.sendError(e.getHttpStatusCode(), e.getMessage());
+ return;
+ }
if (req.getHeader("If-Modified-Since") != null &&
vstatus == UriStatus.VALID_VERSIONED) {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
@@ -142,7 +149,7 @@ public class JsServlet extends InjectedS
boolean debug = "1".equals(debugStr);
final RenderingContext context = "1".equals(containerStr) ?
RenderingContext.CONTAINER : RenderingContext.GADGET;
- final String container =
+ final String container =
containerParam != null ? containerParam :
ContainerConfig.DEFAULT_CONTAINER;
GadgetContext ctx = new GadgetContext() {
@@ -150,7 +157,7 @@ public class JsServlet extends InjectedS
public RenderingContext getRenderingContext() {
return context;
}
-
+
@Override
public String getContainer() {
return container;
@@ -194,7 +201,7 @@ public class JsServlet extends InjectedS
jsData.append("gadgets.config.init(").append(JsonSerializer.serialize(config)).append(");\n");
}
}
-
+
String onloadStr = req.getParameter("onload");
if (onloadStr != null) {
if (!ONLOAD_FN_PATTERN.matcher(onloadStr).matches()) {
@@ -203,7 +210,7 @@ public class JsServlet extends InjectedS
}
jsData.append(String.format(ONLOAD_JS_TPL,
StringEscapeUtils.escapeJavaScript(onloadStr)));
}
-
+
if (jsData.length() == 0) {
resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
return;
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java?rev=960109&r1=960108&r2=960109&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java
(original)
+++
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/DefaultJsUriManager.java
Fri Jul 2 21:22:09 2010
@@ -26,6 +26,9 @@ import org.apache.shindig.common.uri.Uri
import org.apache.shindig.common.uri.UriBuilder;
import org.apache.shindig.config.ContainerConfig;
import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetException;
+import org.apache.shindig.gadgets.GadgetException.Code;
+import org.apache.shindig.gadgets.http.HttpResponse;
import org.apache.shindig.gadgets.uri.UriCommon.Param;
import java.util.Arrays;
@@ -40,10 +43,10 @@ public class DefaultJsUriManager impleme
static final JsUri INVALID_URI = new JsUri(UriStatus.BAD_URI,
Lists.<String>newArrayList());
protected static final String JS_SUFFIX = ".js";
protected static final String JS_DELIMITER = ":";
-
+
private final ContainerConfig config;
private final Versioner versioner;
-
+
@Inject
public DefaultJsUriManager(ContainerConfig config,
Versioner versioner) {
@@ -55,10 +58,10 @@ public class DefaultJsUriManager impleme
String container = gadget.getContext().getContainer();
String jsHost = getReqConfig(container, JS_HOST_PARAM);
String jsPathBase = getReqConfig(container, JS_PATH_PARAM);
-
+
// We somewhat cheat in that jsHost may contain protocol/scheme as well.
UriBuilder uri = new UriBuilder(Uri.parse(jsHost));
-
+
// Add JS info to path and set it in URI.
StringBuilder jsPath = new StringBuilder(jsPathBase);
if (!jsPathBase.endsWith("/")) {
@@ -67,29 +70,29 @@ public class DefaultJsUriManager impleme
jsPath.append(addJsLibs(extern));
jsPath.append(JS_SUFFIX);
uri.setPath(jsPath.toString());
-
+
// Standard container param, as JS may be container-specific.
uri.addQueryParameter(Param.CONTAINER.getKey(), container);
-
+
// Pass through nocache param for dev purposes.
uri.addQueryParameter(Param.NO_CACHE.getKey(),
gadget.getContext().getIgnoreCache() ? "1" : "0");
-
+
// Pass through debug param for debugging use.
uri.addQueryParameter(Param.DEBUG.getKey(),
gadget.getContext().getDebug() ? "1" : "0");
-
+
// Pass through gadget Uri
if (addGadgetUri()) {
uri.addQueryParameter(Param.URL.getKey(),
gadget.getSpec().getUrl().toString());
}
-
+
// Finally, version it, but only if !nocache.
if (versioner != null && !gadget.getContext().getIgnoreCache()) {
uri.addQueryParameter(Param.VERSION.getKey(),
versioner.version(gadget.getContext().getUrl(), container, extern));
}
-
+
return uri.toUri();
}
@@ -97,23 +100,23 @@ public class DefaultJsUriManager impleme
* Essentially pulls apart a Uri created by makeExternJsUri, validating its
* contents, especially the version key.
*/
- public JsUri processExternJsUri(Uri uri) {
+ public JsUri processExternJsUri(Uri uri) throws GadgetException {
// Validate basic Uri structure and params
String container = uri.getQueryParameter(Param.CONTAINER.getKey());
if (container == null) {
container = ContainerConfig.DEFAULT_CONTAINER;
}
-
+
// Get config values up front.
getReqConfig(container, JS_HOST_PARAM); // validate that it exists
String jsPrefix = getReqConfig(container, JS_PATH_PARAM);
-
+
String host = uri.getAuthority();
if (host == null) {
issueUriFormatError("Unexpected: Js Uri has no host");
return INVALID_URI;
}
-
+
// Pull out the collection of features referenced by the Uri.
String path = uri.getPath();
if (path == null) {
@@ -128,14 +131,14 @@ public class DefaultJsUriManager impleme
issueUriFormatError("Js Uri path invalid, expected suffix: " + JS_SUFFIX
+ ", is: " + path);
return INVALID_URI;
}
-
+
// Pull off prefix and suffix strings
path = path.substring(jsPrefix.length());
path = path.substring(0, path.length() - JS_SUFFIX.length());
while (path.startsWith("/")) {
path = path.substring(1);
}
-
+
Collection<String> libs = getJsLibs(path);
UriStatus status = UriStatus.VALID_UNVERSIONED;
String version = uri.getQueryParameter(Param.VERSION.getKey());
@@ -147,32 +150,35 @@ public class DefaultJsUriManager impleme
}
status = versioner.validate(gadgetUri, container, libs, version);
}
-
+
return new JsUri(status, libs);
}
-
+
static String addJsLibs(Collection<String> extern) {
return StringUtils.join(extern, JS_DELIMITER);
}
-
+
static Collection<String> getJsLibs(String path) {
return Arrays.asList(StringUtils.split(path, JS_DELIMITER));
}
-
+
private String getReqConfig(String container, String key) {
String ret = config.getString(container, key);
if (ret == null) {
- throw new RuntimeException("Container '" + container +
- "' missing config for required param: " + key);
+ ret = config.getString(ContainerConfig.DEFAULT_CONTAINER, key);
+ if (ret == null) {
+ throw new RuntimeException("Container '" + container +
+ "' missing config for required param: " + key);
+ }
}
return ret;
}
-
+
// May be overridden to report errors in an alternate way to the user.
- protected void issueUriFormatError(String err) {
- throw new RuntimeException(err);
+ protected void issueUriFormatError(String err) throws GadgetException {
+ throw new GadgetException(Code.INVALID_PARAMETER, err,
HttpResponse.SC_BAD_REQUEST);
}
-
+
// Overridable in the event that a Versioner implementation is injected
// that uses the gadget itself to perform intelligent optimization and
versioning.
// This isn't the cleanest logic, so should be cleaned up when better
concrete
Modified:
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java?rev=960109&r1=960108&r2=960109&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java
(original)
+++
shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/uri/JsUriManager.java
Fri Jul 2 21:22:09 2010
@@ -23,6 +23,7 @@ import java.util.Collections;
import org.apache.shindig.common.uri.Uri;
import org.apache.shindig.gadgets.Gadget;
+import org.apache.shindig.gadgets.GadgetException;
import com.google.inject.ImplementedBy;
@@ -33,34 +34,34 @@ public interface JsUriManager {
* @return The uri for the externed javascript that includes all listed
extern libraries.
*/
Uri makeExternJsUri(Gadget gadget, Collection<String> extern);
-
+
/**
* Processes the inbound URL, for use by serving code in determining which
JS to serve
* and with what caching properties.
- *
+ *
* @param uri Generated extern JS Uri
* @return Processed status of the provided Uri.
*/
- JsUri processExternJsUri(Uri uri);
-
+ JsUri processExternJsUri(Uri uri) throws GadgetException;
+
public static class JsUri {
private final UriStatus status;
private final Collection<String> libs;
-
+
public JsUri(UriStatus status, Collection<String> libs) {
this.status = status;
this.libs = libs;
}
-
+
public UriStatus getStatus() {
return status;
}
-
+
public Collection<String> getLibs() {
return Collections.unmodifiableCollection(libs);
}
}
-
+
@ImplementedBy(DefaultJsVersioner.class)
public interface Versioner {
/**
@@ -69,7 +70,7 @@ public interface JsUriManager {
* @return Version string for the Uri.
*/
String version(Uri gadgetUri, String container, Collection<String> extern);
-
+
/**
* @param gadgetUri Gadget for which extern Uri was generated.
* @param extern Collection of libs externed.
Modified:
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/DefaultJsUriManagerTest.java
URL:
http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/DefaultJsUriManagerTest.java?rev=960109&r1=960108&r2=960109&view=diff
==============================================================================
---
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/DefaultJsUriManagerTest.java
(original)
+++
shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/uri/DefaultJsUriManagerTest.java
Fri Jul 2 21:22:09 2010
@@ -34,6 +34,7 @@ import org.apache.shindig.common.uri.Uri
import org.apache.shindig.config.ContainerConfig;
import org.apache.shindig.gadgets.Gadget;
import org.apache.shindig.gadgets.GadgetContext;
+import org.apache.shindig.gadgets.GadgetException;
import org.apache.shindig.gadgets.uri.JsUriManager.JsUri;
import org.apache.shindig.gadgets.uri.JsUriManager.Versioner;
import org.apache.shindig.gadgets.uri.UriCommon.Param;
@@ -45,7 +46,7 @@ import java.util.List;
public class DefaultJsUriManagerTest {
private static final String CONTAINER = "container";
private static final Uri GADGET_URI =
Uri.parse("http://example.com/gadget.xml");
-
+
// makeJsUri tests
@Test(expected = RuntimeException.class)
public void makeMissingHostConfig() {
@@ -54,7 +55,7 @@ public class DefaultJsUriManagerTest {
Gadget gadget = mockGadget(false, false);
manager.makeExternJsUri(gadget, null);
}
-
+
@Test(expected = RuntimeException.class)
public void makeMissingPathConfig() {
ContainerConfig config = mockConfig("foo", null);
@@ -62,7 +63,7 @@ public class DefaultJsUriManagerTest {
Gadget gadget = mockGadget(false, false);
manager.makeExternJsUri(gadget, null);
}
-
+
@Test
public void makeJsUriNoPathSlashNoVersion() {
ContainerConfig config = mockConfig("http://www.js.org", "/gadgets/js/");
@@ -78,7 +79,7 @@ public class DefaultJsUriManagerTest {
assertEquals("0", jsUri.getQueryParameter(Param.NO_CACHE.getKey()));
assertEquals("0", jsUri.getQueryParameter(Param.DEBUG.getKey()));
}
-
+
@Test
public void makeJsUriAddPathSlashNoVersion() {
ContainerConfig config = mockConfig("http://www.js.org", "/gadgets/js");
@@ -94,7 +95,7 @@ public class DefaultJsUriManagerTest {
assertEquals("0", jsUri.getQueryParameter(Param.NO_CACHE.getKey()));
assertEquals("0", jsUri.getQueryParameter(Param.DEBUG.getKey()));
}
-
+
@Test
public void makeJsUriAddPathSlashVersioned() {
ContainerConfig config = mockConfig("http://www.js.org", "/gadgets/js");
@@ -113,7 +114,7 @@ public class DefaultJsUriManagerTest {
assertEquals("0", jsUri.getQueryParameter(Param.NO_CACHE.getKey()));
assertEquals("0", jsUri.getQueryParameter(Param.DEBUG.getKey()));
}
-
+
@Test
public void makeJsUriWithVersionerNoVersionOnIgnoreCache() {
ContainerConfig config = mockConfig("http://www.js.org", "/gadgets/js");
@@ -133,24 +134,31 @@ public class DefaultJsUriManagerTest {
assertEquals("1", jsUri.getQueryParameter(Param.NO_CACHE.getKey()));
assertEquals("0", jsUri.getQueryParameter(Param.DEBUG.getKey()));
}
-
+
// processJsUri tests
@Test(expected = RuntimeException.class)
- public void processMissingHostConfig() {
+ public void processMissingHostConfig() throws GadgetException {
ContainerConfig config = mockConfig(null, "/gadgets/js");
DefaultJsUriManager manager = makeManager(config, null);
manager.processExternJsUri(Uri.parse("http://example.com?container=" +
CONTAINER));
}
-
+
@Test(expected = RuntimeException.class)
- public void processMissingPathConfig() {
+ public void processMissingPathConfig() throws GadgetException {
ContainerConfig config = mockConfig("foo", null);
DefaultJsUriManager manager = makeManager(config, null);
manager.processExternJsUri(Uri.parse("http://example.com?container=" +
CONTAINER));
}
-
+
@Test
- public void processPathPrefixMismatch() {
+ public void processDefaultConfig() throws GadgetException {
+ ContainerConfig config = mockDefaultConfig("foo", "/gadgets/js");
+ DefaultJsUriManager manager = makeManager(config, null);
+ manager.processExternJsUri(Uri.parse("http://example.com?container=" +
CONTAINER));
+ }
+
+ @Test
+ public void processPathPrefixMismatch() throws GadgetException {
String targetHost = "target-host.org";
ContainerConfig config = mockConfig("http://" + targetHost, "/gadgets/js");
TestDefaultJsUriManager manager = makeManager(config, null);
@@ -161,9 +169,20 @@ public class DefaultJsUriManagerTest {
assertEquals(jsUri.getStatus(), UriStatus.BAD_URI);
assertSame(DefaultJsUriManager.INVALID_URI, jsUri);
}
-
+
+ @Test(expected = GadgetException.class)
+ public void processNoValidJs() throws GadgetException {
+ String targetHost = "target-host.org";
+ ContainerConfig config = mockConfig("http://" + targetHost, "/gadgets/js");
+ List<String> extern = Lists.newArrayList("feature", "another");
+ String version = "verstring";
+ DefaultJsUriManager manager = new DefaultJsUriManager(config, null);
+ Uri testUri = Uri.parse("http://target-host.org/gadgets/js?container=" +
CONTAINER );
+ JsUri jsUri = manager.processExternJsUri(testUri);
+ }
+
@Test
- public void processPathSuffixMismatch() {
+ public void processPathSuffixMismatch() throws GadgetException {
String targetHost = "target-host.org";
ContainerConfig config = mockConfig("http://" + targetHost, "/gadgets/js");
TestDefaultJsUriManager manager = makeManager(config, null);
@@ -174,9 +193,9 @@ public class DefaultJsUriManagerTest {
assertEquals(jsUri.getStatus(), UriStatus.BAD_URI);
assertSame(DefaultJsUriManager.INVALID_URI, jsUri);
}
-
+
@Test
- public void processValidUnversionedNoVersioner() {
+ public void processValidUnversionedNoVersioner() throws GadgetException {
String targetHost = "target-host.org";
ContainerConfig config = mockConfig("http://" + targetHost, "/gadgets/js");
List<String> extern = Lists.newArrayList("feature", "another");
@@ -190,9 +209,9 @@ public class DefaultJsUriManagerTest {
assertEquals(jsUri.getStatus(), UriStatus.VALID_UNVERSIONED);
assertCollectionEquals(jsUri.getLibs(), extern);
}
-
+
@Test
- public void processValidInvalidVersion() {
+ public void processValidInvalidVersion() throws GadgetException {
String targetHost = "target-host.org";
ContainerConfig config = mockConfig("http://" + targetHost, "/gadgets/js");
List<String> extern = Lists.newArrayList("feature", "another");
@@ -208,9 +227,9 @@ public class DefaultJsUriManagerTest {
assertEquals(jsUri.getStatus(), UriStatus.INVALID_VERSION);
assertCollectionEquals(jsUri.getLibs(), extern);
}
-
+
@Test
- public void processValidUnversionedNoParam() {
+ public void processValidUnversionedNoParam() throws GadgetException {
String targetHost = "target-host.org";
ContainerConfig config = mockConfig("http://" + targetHost, "/gadgets/js");
List<String> extern = Lists.newArrayList("feature", "another");
@@ -224,9 +243,9 @@ public class DefaultJsUriManagerTest {
assertEquals(jsUri.getStatus(), UriStatus.VALID_UNVERSIONED);
assertCollectionEquals(jsUri.getLibs(), extern);
}
-
+
@Test
- public void processValidVersioned() {
+ public void processValidVersioned() throws GadgetException {
String targetHost = "target-host.org";
ContainerConfig config = mockConfig("http://" + targetHost, "/gadgets/js");
List<String> extern = Lists.newArrayList("feature", "another");
@@ -241,10 +260,10 @@ public class DefaultJsUriManagerTest {
assertEquals(jsUri.getStatus(), UriStatus.VALID_VERSIONED);
assertCollectionEquals(jsUri.getLibs(), extern);
}
-
+
// end-to-end integration-ish test: makeX builds a Uri that processX
correctly handles
@Test
- public void makeAndProcessSymmetric() {
+ public void makeAndProcessSymmetric() throws GadgetException {
// Make...
ContainerConfig config = mockConfig("http://www.js.org", "/gadgets/js");
Gadget gadget = mockGadget(false, false);
@@ -261,30 +280,48 @@ public class DefaultJsUriManagerTest {
assertEquals(version, jsUri.getQueryParameter(Param.VERSION.getKey()));
assertEquals("0", jsUri.getQueryParameter(Param.NO_CACHE.getKey()));
assertEquals("0", jsUri.getQueryParameter(Param.DEBUG.getKey()));
-
+
// ...and process
JsUri processed = manager.processExternJsUri(jsUri);
assertEquals(UriStatus.VALID_VERSIONED, processed.getStatus());
assertCollectionEquals(extern, processed.getLibs());
}
-
+
private void assertCollectionEquals(Collection<String> expected,
Collection<String> test) {
assertEquals(expected.size(), test.size());
List<String> expectedCopy = Lists.newArrayList(expected);
List<String> testCopy = Lists.newArrayList(test);
assertEquals(expectedCopy, testCopy);
}
-
+
private ContainerConfig mockConfig(String jsHost, String jsPath) {
ContainerConfig config = createMock(ContainerConfig.class);
expect(config.getString(CONTAINER, DefaultJsUriManager.JS_HOST_PARAM))
.andReturn(jsHost).anyTimes();
expect(config.getString(CONTAINER, DefaultJsUriManager.JS_PATH_PARAM))
.andReturn(jsPath).anyTimes();
+ expect(config.getString(ContainerConfig.DEFAULT_CONTAINER,
DefaultJsUriManager.JS_HOST_PARAM))
+ .andReturn(null).anyTimes();
+ expect(config.getString(ContainerConfig.DEFAULT_CONTAINER,
DefaultJsUriManager.JS_PATH_PARAM))
+ .andReturn(null).anyTimes();
replay(config);
return config;
}
-
+
+ private ContainerConfig mockDefaultConfig(String jsHost, String jsPath) {
+ ContainerConfig config = createMock(ContainerConfig.class);
+ expect(config.getString(CONTAINER, DefaultJsUriManager.JS_HOST_PARAM))
+ .andReturn(null).anyTimes();
+ expect(config.getString(CONTAINER, DefaultJsUriManager.JS_PATH_PARAM))
+ .andReturn(null).anyTimes();
+ expect(config.getString(ContainerConfig.DEFAULT_CONTAINER,
DefaultJsUriManager.JS_HOST_PARAM))
+ .andReturn(jsHost).anyTimes();
+ expect(config.getString(ContainerConfig.DEFAULT_CONTAINER,
DefaultJsUriManager.JS_PATH_PARAM))
+ .andReturn(jsPath).anyTimes();
+ replay(config);
+ return config;
+ }
+
private Versioner mockVersioner(
Collection<String> extern, String genVersion, String testVersion) {
JsUriManager.Versioner versioner = createMock(Versioner.class);
@@ -299,7 +336,7 @@ public class DefaultJsUriManagerTest {
replay(versioner);
return versioner;
}
-
+
private Gadget mockGadget(boolean nocache, boolean debug) {
GadgetContext context = createMock(GadgetContext.class);
expect(context.getContainer()).andReturn(CONTAINER).anyTimes();
@@ -309,23 +346,23 @@ public class DefaultJsUriManagerTest {
replay(context);
return new Gadget().setContext(context);
}
-
+
private TestDefaultJsUriManager makeManager(ContainerConfig config,
Versioner versioner) {
return new TestDefaultJsUriManager(config, versioner);
}
-
+
private static final class TestDefaultJsUriManager extends
DefaultJsUriManager {
private boolean errorReported = false;
-
+
private TestDefaultJsUriManager(ContainerConfig config, Versioner
versioner) {
super(config, versioner);
}
-
+
@Override
protected void issueUriFormatError(String err) {
this.errorReported = true;
}
-
+
public boolean hadError() {
return errorReported;
}