Repository: incubator-juneau Updated Branches: refs/heads/master edbba9377 -> d59d737c3
Code refactoring. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/d59d737c Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/d59d737c Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/d59d737c Branch: refs/heads/master Commit: d59d737c3a6791ec7f24effeb107c6f67676f98e Parents: edbba93 Author: JamesBognar <[email protected]> Authored: Mon Feb 27 16:56:24 2017 -0500 Committer: JamesBognar <[email protected]> Committed: Mon Feb 27 16:56:24 2017 -0500 ---------------------------------------------------------------------- .../main/java/org/apache/juneau/Streamable.java | 2 +- .../org/apache/juneau/svl/vars/ArgsVar.java | 5 +- .../apache/juneau/svl/vars/ConfigFileVar.java | 5 +- .../apache/juneau/svl/vars/EnvVariablesVar.java | 5 +- .../java/org/apache/juneau/svl/vars/IfVar.java | 5 +- .../apache/juneau/svl/vars/ManifestFileVar.java | 5 +- .../org/apache/juneau/svl/vars/SwitchVar.java | 5 +- .../juneau/svl/vars/SystemPropertiesVar.java | 5 +- .../juneau/rest/test/UrlPathPatternTest.java | 2 +- .../org/apache/juneau/rest/ReaderResource.java | 198 +++++++++++++++---- .../java/org/apache/juneau/rest/Redirect.java | 36 +++- .../org/apache/juneau/rest/RestException.java | 2 +- .../org/apache/juneau/rest/RestRequest.java | 26 ++- .../org/apache/juneau/rest/RestResponse.java | 2 +- .../org/apache/juneau/rest/RestServlet.java | 28 +-- .../org/apache/juneau/rest/StreamResource.java | 24 ++- .../org/apache/juneau/rest/UrlPathPattern.java | 76 ++++--- .../rest/matchers/MultipartFormDataMatcher.java | 1 + .../rest/matchers/UrlEncodedFormMatcher.java | 1 + .../rest/remoteable/RemoteableServlet.java | 2 +- .../juneau/rest/response/StreamableHandler.java | 4 +- .../juneau/rest/vars/LocalizationVar.java | 5 +- .../org/apache/juneau/rest/vars/RequestVar.java | 5 +- .../rest/vars/SerializedRequestAttrVar.java | 5 +- .../juneau/rest/vars/ServletInitParamVar.java | 5 +- .../apache/juneau/rest/vars/UrlEncodeVar.java | 5 +- 26 files changed, 348 insertions(+), 116 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-core/src/main/java/org/apache/juneau/Streamable.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/Streamable.java b/juneau-core/src/main/java/org/apache/juneau/Streamable.java index 9dc9b44..6cb8237 100644 --- a/juneau-core/src/main/java/org/apache/juneau/Streamable.java +++ b/juneau-core/src/main/java/org/apache/juneau/Streamable.java @@ -35,5 +35,5 @@ public interface Streamable { * * @return The media type, or <jk>null</jk> if the media type is not known. */ - String getMediaType(); + MediaType getMediaType(); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-core/src/main/java/org/apache/juneau/svl/vars/ArgsVar.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/svl/vars/ArgsVar.java b/juneau-core/src/main/java/org/apache/juneau/svl/vars/ArgsVar.java index b005c1f..6ec840e 100644 --- a/juneau-core/src/main/java/org/apache/juneau/svl/vars/ArgsVar.java +++ b/juneau-core/src/main/java/org/apache/juneau/svl/vars/ArgsVar.java @@ -48,11 +48,14 @@ public class ArgsVar extends DefaultingVar { */ public static final String SESSION_args = "args"; + /** The name of this variable. */ + public static final String NAME = "ARG"; + /** * Constructor. */ public ArgsVar() { - super("ARG"); + super(NAME); } @Override /* Var */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-core/src/main/java/org/apache/juneau/svl/vars/ConfigFileVar.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/svl/vars/ConfigFileVar.java b/juneau-core/src/main/java/org/apache/juneau/svl/vars/ConfigFileVar.java index ff0d2d3..a6f96c9 100644 --- a/juneau-core/src/main/java/org/apache/juneau/svl/vars/ConfigFileVar.java +++ b/juneau-core/src/main/java/org/apache/juneau/svl/vars/ConfigFileVar.java @@ -49,11 +49,14 @@ public class ConfigFileVar extends DefaultingVar { */ public static final String SESSION_config = "config"; + /** The name of this variable. */ + public static final String NAME = "C"; + /** * Constructor. */ public ConfigFileVar() { - super("C"); + super(NAME); } @Override /* Var */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-core/src/main/java/org/apache/juneau/svl/vars/EnvVariablesVar.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/svl/vars/EnvVariablesVar.java b/juneau-core/src/main/java/org/apache/juneau/svl/vars/EnvVariablesVar.java index d58e442..ecda3fd 100644 --- a/juneau-core/src/main/java/org/apache/juneau/svl/vars/EnvVariablesVar.java +++ b/juneau-core/src/main/java/org/apache/juneau/svl/vars/EnvVariablesVar.java @@ -35,11 +35,14 @@ import org.apache.juneau.svl.*; */ public class EnvVariablesVar extends DefaultingVar { + /** The name of this variable. */ + public static final String NAME = "E"; + /** * Constructor. */ public EnvVariablesVar() { - super("E"); + super(NAME); } @Override /* Var */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-core/src/main/java/org/apache/juneau/svl/vars/IfVar.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/svl/vars/IfVar.java b/juneau-core/src/main/java/org/apache/juneau/svl/vars/IfVar.java index b0b0f1b..f7eca79 100644 --- a/juneau-core/src/main/java/org/apache/juneau/svl/vars/IfVar.java +++ b/juneau-core/src/main/java/org/apache/juneau/svl/vars/IfVar.java @@ -45,11 +45,14 @@ import org.apache.juneau.svl.*; */ public class IfVar extends MultipartVar { + /** The name of this variable. */ + public static final String NAME = "IF"; + /** * Constructor. */ public IfVar() { - super("IF"); + super(NAME); } @Override /* MultipartVar */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-core/src/main/java/org/apache/juneau/svl/vars/ManifestFileVar.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/svl/vars/ManifestFileVar.java b/juneau-core/src/main/java/org/apache/juneau/svl/vars/ManifestFileVar.java index 2e35666..f117102 100644 --- a/juneau-core/src/main/java/org/apache/juneau/svl/vars/ManifestFileVar.java +++ b/juneau-core/src/main/java/org/apache/juneau/svl/vars/ManifestFileVar.java @@ -48,11 +48,14 @@ public class ManifestFileVar extends DefaultingVar { */ public static final String SESSION_manifest = "manifest"; + /** The name of this variable. */ + public static final String NAME = "MF"; + /** * Constructor. */ public ManifestFileVar() { - super("MF"); + super(NAME); } @Override /* Var */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-core/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java b/juneau-core/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java index 67bef8c..1f66516 100644 --- a/juneau-core/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java +++ b/juneau-core/src/main/java/org/apache/juneau/svl/vars/SwitchVar.java @@ -46,11 +46,14 @@ import org.apache.juneau.svl.*; */ public class SwitchVar extends MultipartVar { + /** The name of this variable. */ + public static final String NAME = "SWITCH"; + /** * Constructor. */ public SwitchVar() { - super("SWITCH"); + super(NAME); } @Override /* MultipartVar */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-core/src/main/java/org/apache/juneau/svl/vars/SystemPropertiesVar.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/svl/vars/SystemPropertiesVar.java b/juneau-core/src/main/java/org/apache/juneau/svl/vars/SystemPropertiesVar.java index 937b149..7242db4 100644 --- a/juneau-core/src/main/java/org/apache/juneau/svl/vars/SystemPropertiesVar.java +++ b/juneau-core/src/main/java/org/apache/juneau/svl/vars/SystemPropertiesVar.java @@ -35,10 +35,13 @@ import org.apache.juneau.svl.*; */ public class SystemPropertiesVar extends MapVar { + /** The name of this variable. */ + public static final String NAME = "S"; + /** * Constructor. */ public SystemPropertiesVar() { - super("S", System.getProperties()); + super(NAME, System.getProperties()); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlPathPatternTest.java ---------------------------------------------------------------------- diff --git a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlPathPatternTest.java b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlPathPatternTest.java index f577d5f..c05bc2e 100644 --- a/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlPathPatternTest.java +++ b/juneau-rest-test/src/test/java/org/apache/juneau/rest/test/UrlPathPatternTest.java @@ -35,6 +35,6 @@ public class UrlPathPatternTest extends RestTestcase { l.add(new UrlPathPattern("/foo/{id}/bar/*")); Collections.sort(l); - assertEquals("['/foo/bar','/foo/bar/*','/foo/{id}/bar','/foo/{id}/bar/*','/foo/{id}','/foo/{id}/*','/foo','/foo/*']", JsonSerializer.DEFAULT_LAX.serialize(l)); + assertEquals("[{vars:[],patternString:'/foo/bar'},{vars:[],patternString:'/foo/bar/*'},{vars:['id'],patternString:'/foo/{id}/bar'},{vars:['id'],patternString:'/foo/{id}/bar/*'},{vars:['id'],patternString:'/foo/{id}'},{vars:['id'],patternString:'/foo/{id}/*'},{vars:[],patternString:'/foo'},{vars:[],patternString:'/foo/*'}]", JsonSerializer.DEFAULT_LAX.serialize(l)); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/ReaderResource.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/ReaderResource.java b/juneau-rest/src/main/java/org/apache/juneau/rest/ReaderResource.java index 2dc65a1..5fd0268 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/ReaderResource.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/ReaderResource.java @@ -16,6 +16,7 @@ import java.io.*; import java.util.*; import org.apache.juneau.*; +import org.apache.juneau.internal.*; import org.apache.juneau.rest.annotation.*; import org.apache.juneau.rest.response.*; import org.apache.juneau.svl.*; @@ -28,44 +29,167 @@ import org.apache.juneau.svl.*; */ public class ReaderResource implements Writable { - private String contents; - private MediaType mediaType; - private VarResolverSession varSession; - private Map<String,String> headers = new LinkedHashMap<String,String>(); + private final MediaType mediaType; + private final String[] contents; + private final VarResolverSession varSession; + private final Map<String,String> headers; /** * Constructor. - * - * @param contents The contents of this resource. * @param mediaType The HTTP media type. + * @param contents The contents of this resource. + * <br>If multiple contents are specified, the results will be concatenated. + * <br>Contents can be any of the following: + * <ul> + * <li><code>CharSequence</code> + * <li><code>Reader</code> + * <li><code>File</code> + * </ul> + * @throws IOException */ - protected ReaderResource(String contents, MediaType mediaType) { - this.contents = contents; - this.mediaType = mediaType; + protected ReaderResource(MediaType mediaType, Object...contents) throws IOException { + this(mediaType, null, null, contents); } /** - * Add an HTTP response header. - * - * @param name The header name. - * @param value The header value converted to a string using {@link Object#toString()}. - * @return This object (for method chaining). + * Constructor. + * @param mediaType The resource media type. + * @param headers The HTTP response headers for this streamed resource. + * @param varSession Optional variable resolver for resolving variables in the string. + * @param contents The resource contents. + * <br>If multiple contents are specified, the results will be concatenated. + * <br>Contents can be any of the following: + * <ul> + * <li><code>InputStream</code> + * <li><code>Reader</code> - Converted to UTF-8 bytes. + * <li><code>File</code> + * <li><code>CharSequence</code> - Converted to UTF-8 bytes. + * </ul> + * @throws IOException */ - public ReaderResource setHeader(String name, Object value) { - headers.put(name, value == null ? "" : value.toString()); - return this; + public ReaderResource(MediaType mediaType, Map<String,Object> headers, VarResolverSession varSession, Object...contents) throws IOException { + this.mediaType = mediaType; + this.varSession = varSession; + + Map<String,String> m = new LinkedHashMap<String,String>(); + if (headers != null) + for (Map.Entry<String,Object> e : headers.entrySet()) + m.put(e.getKey(), StringUtils.toString(e.getValue())); + this.headers = Collections.unmodifiableMap(m); + + this.contents = new String[contents.length]; + for (int i = 0; i < contents.length; i++) { + Object c = contents[i]; + if (c == null) + this.contents[i] = ""; + else if (c instanceof InputStream) + this.contents[i] = IOUtils.read((InputStream)c); + else if (c instanceof File) + this.contents[i] = IOUtils.read((File)c); + else if (c instanceof Reader) + this.contents[i] = IOUtils.read((Reader)c); + else if (c instanceof CharSequence) + this.contents[i] = ((CharSequence)c).toString(); + else + throw new IOException("Invalid class type passed to ReaderResource: " + c.getClass().getName()); + } } /** - * Use the specified {@link VarResolver} to resolve any {@link Parameter StringVars} in the - * contents of this file when the {@link #writeTo(Writer)} or {@link #toString()} methods are called. - * - * @param varSession The string variable resolver to use to resolve string variables. - * @return This object (for method chaining). + * Builder class for constructing {@link ReaderResource} objects. */ - public ReaderResource setVarSession(VarResolverSession varSession) { - this.varSession = varSession; - return this; + @SuppressWarnings("hiding") + public static class Builder { + ArrayList<Object> contents = new ArrayList<Object>(); + MediaType mediaType; + VarResolverSession varResolver; + Map<String,String> headers = new LinkedHashMap<String,String>(); + + /** + * Specifies the resource media type string. + * @param mediaType The resource media type string. + * @return This object (for method chaining). + */ + public Builder mediaType(String mediaType) { + this.mediaType = MediaType.forString(mediaType); + return this; + } + + /** + * Specifies the resource media type string. + * @param mediaType The resource media type string. + * @return This object (for method chaining). + */ + public Builder mediaType(MediaType mediaType) { + this.mediaType = mediaType; + return this; + } + + /** + * Specifies the contents for this resource. + * <p> + * This method can be called multiple times to add more content. + * + * @param contents The resource contents. + * <br>If multiple contents are specified, the results will be concatenated. + * <br>Contents can be any of the following: + * <ul> + * <li><code>InputStream</code> + * <li><code>Reader</code> - Converted to UTF-8 bytes. + * <li><code>File</code> + * <li><code>CharSequence</code> - Converted to UTF-8 bytes. + * </ul> + * @return This object (for method chaining). + */ + public Builder contents(Object...contents) { + this.contents.addAll(Arrays.asList(contents)); + return this; + } + + /** + * Specifies an HTTP response header value. + * + * @param name The HTTP header name. + * @param value The HTTP header value. Will be converted to a <code>String</code> using {@link Object#toString()}. + * @return This object (for method chaining). + */ + public Builder header(String name, Object value) { + this.headers.put(name, StringUtils.toString(value)); + return this; + } + + /** + * Specifies HTTP response header values. + * + * @param headers The HTTP headers. Values will be converted to <code>Strings</code> using {@link Object#toString()}. + * @return This object (for method chaining). + */ + public Builder headers(Map<String,Object> headers) { + for (Map.Entry<String,Object> e : headers.entrySet()) + header(e.getKey(), e.getValue()); + return this; + } + + /** + * Specifies the variable resolver to use for this resource. + * + * @param varResolver The variable resolver. + * @return This object (for method chaining). + */ + public Builder varResolver(VarResolverSession varResolver) { + this.varResolver = varResolver; + return this; + } + + /** + * Create a new {@link ReaderResource} using values in this builder. + * + * @return A new immutable {@link ReaderResource} object. + * @throws IOException + */ + public ReaderResource build() throws IOException { + return new ReaderResource(mediaType, headers, varResolver, contents.toArray()); + } } /** @@ -79,21 +203,29 @@ public class ReaderResource implements Writable { @Override /* Writeable */ public void writeTo(Writer w) throws IOException { - if (varSession != null) - varSession.resolveTo(contents, w); - else - w.write(contents); + for (String s : contents) { + if (varSession != null) + varSession.resolveTo(s, w); + else + w.write(s); + } } - @Override /* Streamable */ + @Override /* Writeable */ public MediaType getMediaType() { return mediaType; } @Override /* Object */ public String toString() { - if (varSession != null) - return varSession.resolve(contents); - return contents; + if (contents.length == 1 && varSession == null) + return contents[0]; + StringWriter sw = new StringWriter(); + for (String s : contents) { + if (varSession != null) + return varSession.resolve(s); + sw.write(s); + } + return sw.toString(); } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/Redirect.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/Redirect.java b/juneau-rest/src/main/java/org/apache/juneau/rest/Redirect.java index 962e432..348346a 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/Redirect.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/Redirect.java @@ -66,20 +66,25 @@ import org.apache.juneau.urlencoding.*; */ public final class Redirect { - private int httpResponseCode; - private String url; - private Object[] args; + private final int httpResponseCode; + private final String url; + private final Object[] args; /** * Redirect to the specified URL. * Relative paths are interpreted as relative to the servlet path. * * @param url The URL to redirect to. + * <br>Can be any of the following: + * <ul> + * <li><code>URL</code> + * <li><code>URI</code> + * <li><code>CharSequence</code> + * </ul> * @param args Optional {@link MessageFormat}-style arguments. */ - public Redirect(CharSequence url, Object...args) { - this.url = (url == null ? null : url.toString()); - this.args = args; + public Redirect(Object url, Object...args) { + this(0, url, args); } /** @@ -87,9 +92,15 @@ public final class Redirect { * Same as calling <code>toString()</code> on the object and using the other constructor. * * @param url The URL to redirect to. + * <br>Can be any of the following: + * <ul> + * <li><code>URL</code> + * <li><code>URI</code> + * <li><code>CharSequence</code> + * </ul> */ public Redirect(Object url) { - this.url = (url == null ? null : url.toString()); + this(0, url, (Object[])null); } /** @@ -98,9 +109,15 @@ public final class Redirect { * * @param httpResponseCode The HTTP response code. * @param url The URL to redirect to. + * <br>Can be any of the following: + * <ul> + * <li><code>URL</code> + * <li><code>URI</code> + * <li><code>CharSequence</code> + * </ul> * @param args Optional {@link MessageFormat}-style arguments. */ - public Redirect(int httpResponseCode, CharSequence url, Object...args) { + public Redirect(int httpResponseCode, Object url, Object...args) { this.httpResponseCode = httpResponseCode; this.url = (url == null ? null : url.toString()); this.args = args; @@ -110,6 +127,7 @@ public final class Redirect { * Shortcut for redirecting to the servlet root. */ public Redirect() { + this(0, null, (Object[])null); } /** @@ -122,7 +140,7 @@ public final class Redirect { if (url != null && args != null && args.length > 0) { for (int i = 0; i < args.length; i++) args[i] = s.serializeUrlPart(args[i]); - url = MessageFormat.format(url, args); + return MessageFormat.format(url, args); } return url; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/RestException.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestException.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestException.java index 5fd3d2c..77d695a 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestException.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestException.java @@ -25,7 +25,7 @@ public class RestException extends RuntimeException { private static final long serialVersionUID = 1L; - private int status; + private final int status; private int occurrence; /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java index 5682f24..113d9da 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestRequest.java @@ -63,8 +63,9 @@ import org.apache.juneau.utils.*; public final class RestRequest extends HttpServletRequestWrapper { private final RestServlet servlet; - private String method, pathRemainder, body; - Method javaMethod; + private final String method; + private String pathRemainder, body; + private Method javaMethod; private ObjectMap properties; private SerializerGroup serializerGroup; private ParserGroup parserGroup; @@ -74,8 +75,9 @@ public final class RestRequest extends HttpServletRequestWrapper { private UrlEncodingParser urlEncodingParser; // The parser used to parse URL attributes and parameters (beanContext also used to parse headers) private BeanSession beanSession; private VarResolverSession varSession; - private Map<String,String[]> queryParams; - private Map<String,String> defaultServletHeaders, defaultMethodHeaders, overriddenHeaders, overriddenQueryParams, overriddenFormDataParams, pathParameters; + private final Map<String,String[]> queryParams; + private final Map<String,String> defaultServletHeaders; + private Map<String,String> defaultMethodHeaders, overriddenHeaders, overriddenQueryParams, overriddenFormDataParams, pathParameters; private boolean isPost; private String servletURI, relativeServletURI; private String charset, defaultCharset; @@ -103,11 +105,13 @@ public final class RestRequest extends HttpServletRequestWrapper { // Get the HTTP method. // Can be overridden through a "method" GET attribute. - method = super.getMethod(); + String _method = super.getMethod(); String m = getQueryParameter("method"); if (! StringUtils.isEmpty(m) && (servlet.context.allowMethodParams.contains(m) || servlet.context.allowMethodParams.contains("*"))) - method = m; + _method = m; + + method = _method; if (servlet.context.allowBodyParam) body = getQueryParameter("body"); @@ -1798,10 +1802,10 @@ public final class RestRequest extends HttpServletRequestWrapper { String s = servlet.getResourceAsString(name, getLocale()); if (s == null) return null; - ReaderResource rr = new ReaderResource(s, mediaType); + ReaderResource.Builder b = new ReaderResource.Builder().mediaType(mediaType).contents(s); if (resolveVars) - rr.setVarSession(getVarResolverSession()); - return rr; + b.varResolver(getVarResolverSession()); + return b.build(); } /** @@ -1969,4 +1973,8 @@ public final class RestRequest extends HttpServletRequestWrapper { } return h; } + + void setJavaMethod(Method method) { + this.javaMethod = method; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java index d4fbd50..3fa5398 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java @@ -55,7 +55,7 @@ public final class RestResponse extends HttpServletResponseWrapper { SerializerGroup serializerGroup; UrlEncodingSerializer urlEncodingSerializer; // The serializer used to convert arguments passed into Redirect objects. private EncoderGroup encoders; - private RestServlet servlet; + private final RestServlet servlet; private ServletOutputStream os; /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java index 9bbd5a4..396e5e1 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServlet.java @@ -825,7 +825,7 @@ public abstract class RestServlet extends HttpServlet { if (sm.isRequestAllowed(req)) { Operation o = sm.getSwaggerOperation(req); s.path( - sm.pathPattern.patternString, + sm.pathPattern.getPatternString(), sm.httpMethod.toLowerCase(), o ); @@ -1349,7 +1349,7 @@ public abstract class RestServlet extends HttpServlet { String name = (i == -1 ? p2 : p2.substring(i+1)); String mediaType = getMimetypesFileTypeMap().getContentType(name); ObjectMap headers = new ObjectMap().append("Cache-Control", "max-age=86400, public"); - staticFilesCache.put(pathInfo, new StreamResource(mediaType, headers, is)); + staticFilesCache.put(pathInfo, new StreamResource(MediaType.forString(mediaType), headers, is)); return staticFilesCache.get(pathInfo); } finally { is.close(); @@ -1864,7 +1864,7 @@ public abstract class RestServlet extends HttpServlet { for (String path : StringUtils.split(getVarResolver().resolve(r.stylesheet()), ',')) contents.add(getResource(path, null)); - return new StreamResource("text/css", contents.toArray()); + return new StreamResource(MediaType.forString("text/css"), contents.toArray()); } return null; } @@ -1890,7 +1890,7 @@ public abstract class RestServlet extends HttpServlet { InputStream is = getResource(path, null); if (is != null) { try { - return new StreamResource("image/x-icon", is); + return new StreamResource(MediaType.forString("image/x-icon"), is); } finally { is.close(); } @@ -2268,9 +2268,9 @@ public abstract class RestServlet extends HttpServlet { for (int i = 0; i < params.length; i++) { params[i] = new MethodParam(this, pt[i], method, pa[i]); if (params[i].paramType == PATH && params[i].name.isEmpty()) { - if (pathPattern.vars.length <= attrIdx) + if (pathPattern.getVars().length <= attrIdx) throw new RestServletException("Number of attribute parameters in method ''{0}'' exceeds the number of URL pattern variables.", method.getName()); - params[i].name = pathPattern.vars[attrIdx++]; + params[i].name = pathPattern.getVars()[attrIdx++]; } } @@ -2309,8 +2309,8 @@ public abstract class RestServlet extends HttpServlet { private Operation getSwaggerOperationFromFile(RestRequest req) { Swagger s = req.getSwaggerFromFile(); - if (s != null && s.getPaths() != null && s.getPaths().get(pathPattern.patternString) != null) - return s.getPaths().get(pathPattern.patternString).get(httpMethod); + if (s != null && s.getPaths() != null && s.getPaths().get(pathPattern.getPatternString()) != null) + return s.getPaths().get(pathPattern.getPatternString()).get(httpMethod); return null; } @@ -2580,7 +2580,7 @@ public abstract class RestServlet extends HttpServlet { private boolean isRequestAllowed(RestRequest req) { for (RestGuard guard : guards) { - req.javaMethod = method; + req.setJavaMethod(method); if (! guard.isRequestAllowed(req)) return false; } @@ -2595,10 +2595,10 @@ public abstract class RestServlet extends HttpServlet { return SC_NOT_FOUND; String remainder = null; - if (patternVals.length > pathPattern.vars.length) - remainder = patternVals[pathPattern.vars.length]; - for (int i = 0; i < pathPattern.vars.length; i++) - req.setPathParameter(pathPattern.vars[i], patternVals[i]); + if (patternVals.length > pathPattern.getVars().length) + remainder = patternVals[pathPattern.getVars().length]; + for (int i = 0; i < pathPattern.getVars().length; i++) + req.setPathParameter(pathPattern.getVars()[i], patternVals[i]); req.init(method, remainder, createRequestProperties(mProperties, req), mDefaultRequestHeaders, mDefaultEncoding, mSerializers, mParsers, mUrlEncodingParser); res.init(req.getProperties(), mDefaultEncoding, mSerializers, mUrlEncodingSerializer, mEncoders); @@ -2679,7 +2679,7 @@ public abstract class RestServlet extends HttpServlet { @Override /* Object */ public String toString() { - return "SimpleMethod: name=" + httpMethod + ", path=" + pathPattern.patternString; + return "SimpleMethod: name=" + httpMethod + ", path=" + pathPattern.getPatternString(); } /* http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/StreamResource.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/StreamResource.java b/juneau-rest/src/main/java/org/apache/juneau/rest/StreamResource.java index 31290ae..dbd5076 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/StreamResource.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/StreamResource.java @@ -31,13 +31,12 @@ import org.apache.juneau.rest.response.*; */ public class StreamResource implements Streamable { + private final MediaType mediaType; private final byte[][] contents; - private final String mediaType; private final Map<String,String> headers; /** * Constructor. - * * @param mediaType The resource media type. * @param contents The resource contents. * <br>If multiple contents are specified, the results will be concatenated. @@ -51,13 +50,12 @@ public class StreamResource implements Streamable { * </ul> * @throws IOException */ - public StreamResource(String mediaType, Object...contents) throws IOException { + public StreamResource(MediaType mediaType, Object...contents) throws IOException { this(mediaType, null, contents); } /** * Constructor. - * * @param mediaType The resource media type. * @param headers The HTTP response headers for this streamed resource. * @param contents The resource contents. @@ -72,7 +70,7 @@ public class StreamResource implements Streamable { * </ul> * @throws IOException */ - public StreamResource(String mediaType, Map<String,Object> headers, Object...contents) throws IOException { + public StreamResource(MediaType mediaType, Map<String,Object> headers, Object...contents) throws IOException { this.mediaType = mediaType; Map<String,String> m = new LinkedHashMap<String,String>(); @@ -103,12 +101,11 @@ public class StreamResource implements Streamable { /** * Builder class for constructing {@link StreamResource} objects. - * <p> */ @SuppressWarnings("hiding") public static class Builder { ArrayList<Object> contents = new ArrayList<Object>(); - String mediaType; + MediaType mediaType; Map<String,String> headers = new LinkedHashMap<String,String>(); /** @@ -117,6 +114,16 @@ public class StreamResource implements Streamable { * @return This object (for method chaining). */ public Builder mediaType(String mediaType) { + this.mediaType = MediaType.forString(mediaType); + return this; + } + + /** + * Specifies the resource media type string. + * @param mediaType The resource media type string. + * @return This object (for method chaining). + */ + public Builder mediaType(MediaType mediaType) { this.mediaType = mediaType; return this; } @@ -178,7 +185,6 @@ public class StreamResource implements Streamable { } } - /** * Get the HTTP response headers. * @return The HTTP response headers. An unmodifiable map. Never <jk>null</jk>. @@ -194,7 +200,7 @@ public class StreamResource implements Streamable { } @Override /* Streamable */ - public String getMediaType() { + public MediaType getMediaType() { return mediaType; } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/UrlPathPattern.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/UrlPathPattern.java b/juneau-rest/src/main/java/org/apache/juneau/rest/UrlPathPattern.java index 25fe89d..ad6eb60 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/UrlPathPattern.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/UrlPathPattern.java @@ -26,10 +26,11 @@ import org.apache.juneau.rest.annotation.*; * Handles aspects of matching and precedence ordering. */ public final class UrlPathPattern implements Comparable<UrlPathPattern> { - private Pattern pattern; - String patternString; - private boolean isOnlyDotAll, isDotAll; - String[] vars = new String[0]; + + private final Pattern pattern; + private final String patternString; + private final boolean isOnlyDotAll, isDotAll; + private final String[] vars; /** * Constructor. @@ -38,26 +39,39 @@ public final class UrlPathPattern implements Comparable<UrlPathPattern> { */ public UrlPathPattern(String patternString) { this.patternString = patternString; - if (! StringUtils.startsWith(patternString, '/')) - patternString = '/' + patternString; - if (patternString.equals("/*")) { - isOnlyDotAll = true; - return; + Builder b = new Builder(patternString); + pattern = b.pattern; + isDotAll = b.isDotAll; + isOnlyDotAll = b.isOnlyDotAll; + vars = b.vars.toArray(new String[b.vars.size()]); + } + + @SuppressWarnings("hiding") + class Builder { + boolean isDotAll, isOnlyDotAll; + Pattern pattern; + List<String> vars = new LinkedList<String>(); + + private Builder(String patternString) { + if (! StringUtils.startsWith(patternString, '/')) + patternString = '/' + patternString; + if (patternString.equals("/*")) { + isOnlyDotAll = true; + return; + } + if (patternString.endsWith("/*")) + isDotAll = true; + + // Find all {xxx} variables. + Pattern p = Pattern.compile("\\{([^\\}]+)\\}"); + Matcher m = p.matcher(patternString); + while (m.find()) + vars.add(m.group(1)); + + patternString = patternString.replaceAll("\\{[^\\}]+\\}", "([^\\/]+)"); + patternString = patternString.replaceAll("\\/\\*$", "((?:)|(?:\\/.*))"); + pattern = Pattern.compile(patternString); } - if (patternString.endsWith("/*")) - isDotAll = true; - - // Find all {xxx} variables. - Pattern p = Pattern.compile("\\{([^\\}]+)\\}"); - List<String> vl = new LinkedList<String>(); - Matcher m = p.matcher(patternString); - while (m.find()) - vl.add(m.group(1)); - this.vars = vl.toArray(new String[vl.size()]); - - patternString = patternString.replaceAll("\\{[^\\}]+\\}", "([^\\/]+)"); - patternString = patternString.replaceAll("\\/\\*$", "((?:)|(?:\\/.*))"); - pattern = Pattern.compile(patternString); } /** @@ -156,4 +170,20 @@ public final class UrlPathPattern implements Comparable<UrlPathPattern> { public String toRegEx() { return isOnlyDotAll ? "*" : pattern.pattern(); } + + /** + * Bean property getter: <property>vars</property>. + * @return The value of the <property>vars</property> property on this bean, or <jk>null</jk> if it is not set. + */ + public String[] getVars() { + return vars; + } + + /** + * Bean property getter: <property>patternString</property>. + * @return The value of the <property>patternString</property> property on this bean, or <jk>null</jk> if it is not set. + */ + public String getPatternString() { + return patternString; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/matchers/MultipartFormDataMatcher.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/matchers/MultipartFormDataMatcher.java b/juneau-rest/src/main/java/org/apache/juneau/rest/matchers/MultipartFormDataMatcher.java index a27d0f1..b7ffdfa 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/matchers/MultipartFormDataMatcher.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/matchers/MultipartFormDataMatcher.java @@ -18,6 +18,7 @@ import org.apache.juneau.rest.*; * Predefined matcher for matching requests with content type <js>"multipart/form-data"</js>. */ public class MultipartFormDataMatcher extends RestMatcher { + @Override /* RestMatcher */ public boolean matches(RestRequest req) { String contentType = req.getContentType(); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/matchers/UrlEncodedFormMatcher.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/matchers/UrlEncodedFormMatcher.java b/juneau-rest/src/main/java/org/apache/juneau/rest/matchers/UrlEncodedFormMatcher.java index 6a39db6..d0ed660 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/matchers/UrlEncodedFormMatcher.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/matchers/UrlEncodedFormMatcher.java @@ -18,6 +18,7 @@ import org.apache.juneau.rest.*; * Predefined matcher for matching requests with content type <js>"application/x-www-form-urlencoded"</js>. */ public class UrlEncodedFormMatcher extends RestMatcher { + @Override /* RestMatcher */ public boolean matches(RestRequest req) { String contentType = req.getContentType(); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java b/juneau-rest/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java index df1a7e3..6ba3997 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/remoteable/RemoteableServlet.java @@ -36,7 +36,7 @@ import org.apache.juneau.rest.annotation.*; @SuppressWarnings("serial") public abstract class RemoteableServlet extends RestServletDefault { - private Map<String,Class<?>> classNameMap = new ConcurrentHashMap<String,Class<?>>(); + private final Map<String,Class<?>> classNameMap = new ConcurrentHashMap<String,Class<?>>(); //-------------------------------------------------------------------------------- // Abstract methods http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/response/StreamableHandler.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/response/StreamableHandler.java b/juneau-rest/src/main/java/org/apache/juneau/rest/response/StreamableHandler.java index 724584e..041665b 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/response/StreamableHandler.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/response/StreamableHandler.java @@ -33,9 +33,9 @@ public final class StreamableHandler implements ResponseHandler { if (output instanceof Streamable) { if (output instanceof StreamResource) { StreamResource r = (StreamResource)output; - String mediaType = r.getMediaType(); + MediaType mediaType = r.getMediaType(); if (mediaType != null) - res.setContentType(mediaType); + res.setContentType(mediaType.toString()); for (Map.Entry<String,String> h : r.getHeaders().entrySet()) res.setHeader(h.getKey(), h.getValue()); } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java index 10161cd..341c3cf 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/LocalizationVar.java @@ -35,11 +35,14 @@ import org.apache.juneau.svl.*; */ public class LocalizationVar extends MultipartVar { + /** The name of this variable. */ + public static final String NAME = "L"; + /** * Constructor. */ public LocalizationVar() { - super("L"); + super(NAME); } @Override /* Parameter */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/vars/RequestVar.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/RequestVar.java b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/RequestVar.java index 5d3c31d..455a375 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/RequestVar.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/RequestVar.java @@ -51,11 +51,14 @@ public class RequestVar extends SimpleVar { */ public static final String SESSION_req = "req"; + /** The name of this variable. */ + public static final String NAME = "R"; + /** * Constructor. */ public RequestVar() { - super("R"); + super(NAME); } @Override /* Parameter */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java index d4c24fa..a7af629 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/SerializedRequestAttrVar.java @@ -34,11 +34,14 @@ import org.apache.juneau.svl.*; */ public class SerializedRequestAttrVar extends StreamedVar { + /** The name of this variable. */ + public static final String NAME = "SA"; + /** * Constructor. */ public SerializedRequestAttrVar() { - super("SA"); + super(NAME); } @Override /* Parameter */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java index f24cd98..7f534ce 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/ServletInitParamVar.java @@ -32,11 +32,14 @@ import org.apache.juneau.svl.*; */ public class ServletInitParamVar extends DefaultingVar { + /** The name of this variable. */ + public static final String NAME = "I"; + /** * Constructor. */ public ServletInitParamVar() { - super("I"); + super(NAME); } @Override /* Parameter */ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/d59d737c/juneau-rest/src/main/java/org/apache/juneau/rest/vars/UrlEncodeVar.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/UrlEncodeVar.java b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/UrlEncodeVar.java index d3e85e2..cc7f4c8 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/vars/UrlEncodeVar.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/vars/UrlEncodeVar.java @@ -29,11 +29,14 @@ import org.apache.juneau.svl.*; */ public class UrlEncodeVar extends SimpleVar { + /** The name of this variable. */ + public static final String NAME = "UE"; + /** * Constructor. */ public UrlEncodeVar() { - super("UE"); + super(NAME); } @Override /* Parameter */
