Repository: incubator-juneau Updated Branches: refs/heads/master 357342a17 -> 633619e80
Better handling of query parameters from ContentTypeMenuItem and StyleMenuItem. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/633619e8 Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/633619e8 Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/633619e8 Branch: refs/heads/master Commit: 633619e80ed9d70403c87b3cf9917eee9c5e11c1 Parents: 357342a Author: JamesBognar <[email protected]> Authored: Thu Jul 6 16:49:51 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Thu Jul 6 16:49:51 2017 -0400 ---------------------------------------------------------------------- .../org/apache/juneau/rest/RequestQuery.java | 30 ++++++++++++++++++++ .../org/apache/juneau/rest/RestRequest.java | 30 ++++++++++++++++++++ .../org/apache/juneau/rest/UrlPathPattern.java | 5 ++++ .../rest/jena/RestServletJenaDefault.java | 10 ++++--- .../juneau/rest/widget/ContentTypeMenuItem.java | 11 +++---- .../juneau/rest/widget/StyleMenuItem.java | 7 ++--- .../org/apache/juneau/rest/styles/light.css | 2 +- 7 files changed, 81 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/633619e8/juneau-rest/src/main/java/org/apache/juneau/rest/RequestQuery.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RequestQuery.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RequestQuery.java index e714344..6b6b492 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RequestQuery.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RequestQuery.java @@ -25,6 +25,7 @@ import org.apache.juneau.json.*; import org.apache.juneau.parser.*; import org.apache.juneau.urlencoding.*; import org.apache.juneau.utils.*; +import org.apache.juneau.xml.*; /** * Represents the query parameters in an HTTP request. @@ -47,6 +48,15 @@ public final class RequestQuery extends LinkedHashMap<String,String[]> { } /** + * Create a copy of the request query parameters. + */ + RequestQuery copy() { + RequestQuery rq = new RequestQuery(); + rq.putAll(this); + return rq; + } + + /** * Adds default entries to these query parameters. * * <p> @@ -468,6 +478,26 @@ public final class RequestQuery extends LinkedHashMap<String,String[]> { return JsonSerializer.DEFAULT_LAX.toString(m); } + /** + * Converts this object to a query string. + * + * <p> + * Returned query string does not start with <js>'?'</js>. + * + * @return A new query string, or an empty string if this object is empty. + */ + public String toQueryString() { + StringBuilder sb = new StringBuilder(); + for (Map.Entry<String,String[]> e : this.entrySet()) { + for (int i = 0; i < e.getValue().length; i++) { + if (sb.length() > 0) + sb.append("&"); + sb.append(XmlUtils.urlEncode(e.getKey())).append('=').append(XmlUtils.urlEncode(e.getValue()[i])); + } + } + return sb.toString(); + } + @Override /* Object */ public String toString() { return toString(false); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/633619e8/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 cb58d86..937a429 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 @@ -19,6 +19,7 @@ import static org.apache.juneau.internal.IOUtils.*; import java.io.*; import java.lang.reflect.*; +import java.net.*; import java.nio.charset.*; import java.text.*; import java.util.*; @@ -541,6 +542,35 @@ public final class RestRequest extends HttpServletRequestWrapper { return new UriResolver(UriResolution.ROOT_RELATIVE, UriRelativity.RESOURCE, getUriContext()); } + /** + * Returns the URI for this request. + * + * <p> + * Similar to {@link #getRequestURL()} but returns the value as a {@link URI}. + * It also gives you the capability to override the query parameters (e.g. add new query parameters to the existing + * URI). + * + * @param includeQuery If <jk>true</jk> include the query parameters on the request. + * @param addQueryParams Augment the request URI with the specified query parameters. + * @return A new URI. + */ + public URI getUri(boolean includeQuery, Map<String,?> addQueryParams) { + StringBuffer sb = getRequestURL(); + if (includeQuery || addQueryParams != null) { + RequestQuery rq = this.queryParams.copy(); + if (addQueryParams != null) + for (Map.Entry<String,?> e : addQueryParams.entrySet()) + rq.put(e.getKey(), e.getValue()); + if (! rq.isEmpty()) + sb.append('?').append(rq.toQueryString()); + } + try { + return new URI(sb.toString()); + } catch (URISyntaxException e) { + // Shouldn't happen. + throw new RuntimeException(e); + } + } //-------------------------------------------------------------------------------- // Labels http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/633619e8/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 2ed259e..bbbb716 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 @@ -94,6 +94,11 @@ public final class UrlPathPattern implements Comparable<UrlPathPattern> { if (path == null) return (patternString.equals("/") ? new String[]{} : null); + // If we're not doing a /* match, ignore all trailing slashes. + if (! isDotAll) + while (path.length() > 1 && path.charAt(path.length()-1) == '/') + path = path.substring(0, path.length()-1); + Matcher m = pattern.matcher(path); if (! m.matches()) return null; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/633619e8/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java b/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java index 327d6d1..4b8984a 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/jena/RestServletJenaDefault.java @@ -261,11 +261,13 @@ public abstract class RestServletJenaDefault extends RestServlet { * @return The bean containing the contents of the OPTIONS page. */ @RestMethod(name="OPTIONS", path="/*", - summary="Resource options", - description="Resource options", htmldoc=@HtmlDoc( - links="{back:'$R{servletURI}'}" - ) + links="{back:'servlet:/',json:'servlet:/?method=OPTIONS&Accept=text/json&plainText=true'}", + description="Swagger documentation", + aside="NONE" + ), + summary="Resource options", + description="Swagger documentation" ) public Swagger getOptions(RestRequest req) { return req.getSwagger(); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/633619e8/juneau-rest/src/main/java/org/apache/juneau/rest/widget/ContentTypeMenuItem.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/widget/ContentTypeMenuItem.java b/juneau-rest/src/main/java/org/apache/juneau/rest/widget/ContentTypeMenuItem.java index 64c0daf..c8fd158 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/widget/ContentTypeMenuItem.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/widget/ContentTypeMenuItem.java @@ -12,11 +12,12 @@ // *************************************************************************************************************************** package org.apache.juneau.rest.widget; +import java.net.*; import java.util.*; -import org.apache.juneau.*; import org.apache.juneau.http.*; import org.apache.juneau.rest.*; +import org.apache.juneau.utils.*; /** * Widget that returns back a list of hyperlinks for rendering the contents of a page in a variety of content types. @@ -61,7 +62,6 @@ public class ContentTypeMenuItem extends MenuItemWidget { */ @Override /* Widget */ public String getHtml(RestRequest req) throws Exception { - UriResolver r = req.getUriResolver(); StringBuilder sb = new StringBuilder(); sb.append("" + "<div class='menu-item'>" @@ -70,9 +70,10 @@ public class ContentTypeMenuItem extends MenuItemWidget { ); List<MediaType> l = new ArrayList<MediaType>(req.getSerializerGroup().getSupportedMediaTypes()); Collections.sort(l); - for (MediaType mt : l) - sb.append("\n\t\t<a class='link' href='").append(r.resolve("request:/?plainText=true&Accept="+mt)) - .append("'>").append(mt).append("</a><br>"); + for (MediaType mt : l) { + URI uri = req.getUri(true, new AMap<String,String>().append("plainText","true").append("Accept",mt.toString())); + sb.append("\n\t\t<a class='link' href='").append(uri).append("'>").append(mt).append("</a><br>"); + } sb.append("" + "\n\t</div>" + "\n</div>" http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/633619e8/juneau-rest/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java b/juneau-rest/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java index ac11c6a..ce7d52f 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java @@ -12,8 +12,8 @@ // *************************************************************************************************************************** package org.apache.juneau.rest.widget; -import org.apache.juneau.*; import org.apache.juneau.rest.*; +import org.apache.juneau.utils.*; /** * Widget that returns back a list of hyperlinks for rendering the contents of a page in the various default styles. @@ -56,7 +56,6 @@ public class StyleMenuItem extends MenuItemWidget { */ @Override /* Widget */ public String getHtml(RestRequest req) throws Exception { - UriResolver r = req.getUriResolver(); StringBuilder sb = new StringBuilder(); sb.append("" + "<div class='menu-item'>" @@ -64,8 +63,8 @@ public class StyleMenuItem extends MenuItemWidget { + "\n\t<div class='popup-content'>" ); for (String s : BUILT_IN_STYLES) { - sb.append("\n\t\t<a class='link' href='").append(r.resolve("request:/?stylesheet=styles/"+s+".css")) - .append("'>").append(s).append("</a><br>"); + java.net.URI uri = req.getUri(true, new AMap<String,String>().append("stylesheet", "styles/"+s+".css")); + sb.append("\n\t\t<a class='link' href='").append(uri).append("'>").append(s).append("</a><br>"); } sb.append("" + "\n\t</div>" http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/633619e8/juneau-rest/src/main/resources/org/apache/juneau/rest/styles/light.css ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/resources/org/apache/juneau/rest/styles/light.css b/juneau-rest/src/main/resources/org/apache/juneau/rest/styles/light.css index f261cf7..d7787e2 100644 --- a/juneau-rest/src/main/resources/org/apache/juneau/rest/styles/light.css +++ b/juneau-rest/src/main/resources/org/apache/juneau/rest/styles/light.css @@ -30,7 +30,7 @@ header { height: 50px; padding: 10px 20px; box-shadow: 5px 5px 2px #999999; - text-shadow: rgba(0,0,0,.2) 2px 4px 5px, rgba(125,32,191,.4) 0 -4px 30px; + text-shadow: rgba(1,1,1,.2) 2px 4px 5px, rgba(125,32,191,.05) 0 -10px 30px; white-space: nowrap; } header * {
