Start separating out HTMLDOC-related logic from rest-servlet API. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/926b7cf9 Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/926b7cf9 Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/926b7cf9
Branch: refs/heads/master Commit: 926b7cf9a7ae0d544ebde7e32b6f2bd054bc8aeb Parents: 21a80b8 Author: JamesBognar <jamesbog...@apache.org> Authored: Sun Oct 8 10:01:08 2017 -0400 Committer: JamesBognar <jamesbog...@apache.org> Committed: Sun Oct 8 10:01:08 2017 -0400 ---------------------------------------------------------------------- .../juneau/html/HtmlDocSerializerContext.java | 36 +- .../org/apache/juneau/internal/StringUtils.java | 17 + juneau-doc/src/main/javadoc/overview.html | 43 +- .../java/org/apache/juneau/rest/CallMethod.java | 60 +-- .../org/apache/juneau/rest/HtmlDocBuilder.java | 408 +++++++++++++++++ .../org/apache/juneau/rest/HtmlDocConfig.java | 456 +++++++++++++++++++ .../org/apache/juneau/rest/HtmlDocContext.java | 171 +++++++ .../java/org/apache/juneau/rest/RestConfig.java | 347 +------------- .../org/apache/juneau/rest/RestContext.java | 217 +-------- .../org/apache/juneau/rest/RestRequest.java | 34 +- .../org/apache/juneau/rest/RestResponse.java | 394 +--------------- .../apache/juneau/rest/annotation/HtmlDoc.java | 20 +- .../java/org/apache/juneau/rest/package.html | 6 - .../org/apache/juneau/rest/vars/UrlVar.java | 2 +- .../org/apache/juneau/rest/vars/WidgetVar.java | 2 +- .../org/apache/juneau/rest/widget/Widget.java | 2 +- 16 files changed, 1161 insertions(+), 1054 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/926b7cf9/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java index f017253..13c022a 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java @@ -77,6 +77,8 @@ import org.apache.juneau.*; */ public final class HtmlDocSerializerContext extends HtmlSerializerContext { + static final String HTMLDOC = "HtmlDocSerializer."; + /** * <b>Configuration property:</b> Header section contents. * @@ -105,7 +107,7 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * <p> * A value of <js>"NONE"</js> can be used to represent no value to differentiate it from an empty string. */ - public static final String HTMLDOC_header = "HtmlDocSerializer.header"; + public static final String HTMLDOC_header = HTMLDOC + "header"; /** * <b>Configuration property:</b> Page navigation links. @@ -170,12 +172,12 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * <jk>public class</jk> AddressBookResource <jk>extends</jk> RestServletJenaDefault { * </p> */ - public static final String HTMLDOC_navlinks = "HtmlDocSerializer.navlinks.list"; + public static final String HTMLDOC_navlinks = HTMLDOC + "navlinks.list"; /** * <b>Configuration property:</b> Add to the {@link #HTMLDOC_navlinks} property. */ - public static final String HTMLDOC_navlinks_add = "HtmlDocSerializer.navlinks.list.add"; + public static final String HTMLDOC_navlinks_add = HTMLDOC + "navlinks.list.add"; /** * <b>Configuration property:</b> Nav section contents. @@ -208,7 +210,7 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * <p> * A value of <js>"NONE"</js> can be used to represent no value to differentiate it from an empty string. */ - public static final String HTMLDOC_nav = "HtmlDocSerializer.nav"; + public static final String HTMLDOC_nav = HTMLDOC + "nav"; /** * <b>Configuration property:</b> Aside section contents. @@ -246,7 +248,7 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * <p> * A value of <js>"NONE"</js> can be used to represent no value to differentiate it from an empty string. */ - public static final String HTMLDOC_aside = "HtmlDocSerializer.aside"; + public static final String HTMLDOC_aside = HTMLDOC + "aside"; /** * <b>Configuration property:</b> Footer section contents. @@ -278,7 +280,7 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * <p> * A value of <js>"NONE"</js> can be used to represent no value to differentiate it from an empty string. */ - public static final String HTMLDOC_footer = "HtmlDocSerializer.footer"; + public static final String HTMLDOC_footer = HTMLDOC + "footer"; /** * <b>Configuration property:</b> No-results message. @@ -305,7 +307,7 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * <p> * A value of <js>"NONE"</js> can be used to represent no value to differentiate it from an empty string. */ - public static final String HTMLDOC_noResultsMessage = "HtmlDocSerializer.noResultsMessage"; + public static final String HTMLDOC_noResultsMessage = HTMLDOC + "noResultsMessage"; /** * <b>Configuration property:</b> Prevent word wrap on page. @@ -320,7 +322,7 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * <p> * Adds <js>"* {white-space:nowrap}"</js> to the CSS instructions on the page to prevent word wrapping. */ - public static final String HTMLDOC_nowrap = "HtmlDocSerializer.nowrap"; + public static final String HTMLDOC_nowrap = HTMLDOC + "nowrap"; /** * <b>Configuration property:</b> Stylesheet import URLs. @@ -341,12 +343,12 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * <p> * A value of <js>"NONE"</js> can be used to represent no value to differentiate it from an empty string. */ - public static final String HTMLDOC_stylesheet = "HtmlDocSerializer.stylesheet"; + public static final String HTMLDOC_stylesheet = HTMLDOC + "stylesheet"; /** * <b>Configuration property:</b> Add to the {@link #HTMLDOC_stylesheet} property. */ - public static final String HTMLDOC_stylesheet_add = "HtmlDocSerializer.stylesheet.list.add"; + public static final String HTMLDOC_stylesheet_add = HTMLDOC + "stylesheet.list.add"; /** * <b>Configuration property:</b> CSS style code. @@ -384,12 +386,12 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * ) * </p> */ - public static final String HTMLDOC_style = "HtmlDocSerializer.style.list"; + public static final String HTMLDOC_style = HTMLDOC + "style.list"; /** * <b>Configuration property:</b> Add to the {@link #HTMLDOC_style} property. */ - public static final String HTMLDOC_style_add = "HtmlDocSerializer.style.list.add"; + public static final String HTMLDOC_style_add = HTMLDOC + "style.list.add"; /** * <b>Configuration property:</b> Javascript code. @@ -426,12 +428,12 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * ) * </p> */ - public static final String HTMLDOC_script = "HtmlDocSerializer.script.list"; + public static final String HTMLDOC_script = HTMLDOC + "script.list"; /** * <b>Configuration property:</b> Add to the {@link #HTMLDOC_script} property. */ - public static final String HTMLDOC_script_add = "HtmlDocSerializer.script.list.add"; + public static final String HTMLDOC_script_add = HTMLDOC + "script.list.add"; /** * <b>Configuration property:</b> Additional head section content. @@ -468,12 +470,12 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * ) * </p> */ - public static final String HTMLDOC_head = "HtmlDocSerializer.head.list"; + public static final String HTMLDOC_head = HTMLDOC + "head.list"; /** * <b>Configuration property:</b> Add to the {@link #HTMLDOC_head} property. */ - public static final String HTMLDOC_links_add = "HtmlDocSerializer.head.list.add"; + public static final String HTMLDOC_links_add = HTMLDOC + "head.list.add"; /** * <b>Configuration property:</b> HTML document template. @@ -501,7 +503,7 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * ) * </p> */ - public static final String HTMLDOC_template = "HtmlDocSerializer.template"; + public static final String HTMLDOC_template = HTMLDOC + "template"; final String[] style, stylesheet, script, navlinks, head; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/926b7cf9/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/StringUtils.java ---------------------------------------------------------------------- diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/StringUtils.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/StringUtils.java index 5abd77d..8ad75c8 100644 --- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/StringUtils.java +++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/StringUtils.java @@ -1181,6 +1181,23 @@ public final class StringUtils { } /** + * Converts an array of objects to an array of strings. + * + * @param o The array of objects to convert to strings. + * @return A new array of objects converted to strings. + */ + public static String[] toStrings(Object[] o) { + if (o == null) + return null; + if (o instanceof String[]) + return (String[])o; + String[] s = new String[o.length]; + for (int i = 0; i < o.length; i++) + s[i] = toString(o[i]); + return s; + } + + /** * Converts a hexadecimal byte stream (e.g. "34A5BC") into a UTF-8 encoded string. * * @param hex The hexadecimal string. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/926b7cf9/juneau-doc/src/main/javadoc/overview.html ---------------------------------------------------------------------- diff --git a/juneau-doc/src/main/javadoc/overview.html b/juneau-doc/src/main/javadoc/overview.html index 351e1af..c1cdf86 100644 --- a/juneau-doc/src/main/javadoc/overview.html +++ b/juneau-doc/src/main/javadoc/overview.html @@ -7481,6 +7481,9 @@ <js>"<link rel='icon' href='$U{servlet:/htdocs/juneau.png}'/>"</js> } </p> + <li> + Removed several of the HTMLDOC-related methods from the <code>RestResponse/RestConfig/RestContext</code> + classes and moved it into the new {@link org.apache.juneau.rest.HtmlDocBuilder} class. </ul> </div> @@ -8030,7 +8033,7 @@ <li> Modifications to the following <ja>@HtmlDoc</ja> annotations: <ul> - <li>{@link org.apache.juneau.rest.annotation.HtmlDoc#links() links()} - Now an array of strings instead of a JSON object. Simplified syntax. + <li>{@link org.apache.juneau.rest.annotation.HtmlDoc#navlinks() navlinks()} - Now an array of strings instead of a JSON object. Simplified syntax. <br>For example: <p class='bcode'> <jc>// Old syntax</jc> @@ -8513,17 +8516,17 @@ <li><code><del>setHtmlTitle(String)</del></code> <li><code><del>setHtmlDescription(String)</del></code> <li><code><del>setHtmlBranding(String)</del></code> - <li>{@link org.apache.juneau.rest.RestConfig#setHtmlHeader(String) setHtmlHeader(String)} + <li><code><del>setHtmlHeader(String)</del></code> <li><code><del>setHtmlLinks(String)</del></code> - <li>{@link org.apache.juneau.rest.RestConfig#setHtmlNav(String) setHtmlNav(String)} - <li>{@link org.apache.juneau.rest.RestConfig#setHtmlAside(String) setHtmlAside(String)} - <li>{@link org.apache.juneau.rest.RestConfig#setHtmlFooter(String) setHtmlFooter(String)} + <li><code><del>setHtmlNav(String)</del></code> + <li><code><del>setHtmlAside(String)</del></code> + <li><code><del>setHtmlFooter(String)</del></code> <li><code><del>setHtmlCss(String)</del></code> <li><code><del>setHtmlCssUrl(String)</del></code> - <li>{@link org.apache.juneau.rest.RestConfig#setHtmlNoWrap(boolean) setHtmlNoWrap(boolean)} - <li>{@link org.apache.juneau.rest.RestConfig#setHtmlNoResultsMessage(String) setHtmlNoResultsMessage(String)} - <li>{@link org.apache.juneau.rest.RestConfig#setHtmlTemplate(Class) setHtmlTemplate(Class)} - <li>{@link org.apache.juneau.rest.RestConfig#setHtmlTemplate(HtmlDocTemplate) setHtmlTemplate(HtmlDocTemplate)} + <li><code><del>setHtmlNoWrap(boolean)</del></code> + <li><code><del>setHtmlNoResultsMessage(String)</del></code> + <li><code><del>setHtmlTemplate(Class)</del></code> + <li><code><del>setHtmlTemplate(HtmlDocTemplate)</del></code> <li><code><del>addWidget(Class)</del></code> </ul> <li> @@ -8532,17 +8535,17 @@ <li><code><del>setHtmlTitle(Object)</del></code> <li><code><del>setHtmlDescription(Object)</del></code> <li><code><del>setHtmlBranding(Object)</del></code> - <li>{@link org.apache.juneau.rest.RestResponse#setHtmlHeader(Object) setHtmlHeader(Object)} + <li><code><del>setHtmlHeader(Object)</del></code> <li><code><del>setHtmlLinks(Object)</del></code> - <li>{@link org.apache.juneau.rest.RestResponse#setHtmlNav(Object) setHtmlNav(Object)} - <li>{@link org.apache.juneau.rest.RestResponse#setHtmlAside(Object) setHtmlAside(Object)} - <li>{@link org.apache.juneau.rest.RestResponse#setHtmlFooter(Object) setHtmlFooter(Object)} + <li><code><del>setHtmlNav(Object)</del></code> + <li><code><del>setHtmlAside(Object)</del></code> + <li><code><del>setHtmlFooter(Object)</del></code> <li><code><del>setHtmlCss(Object)</del></code> <li><code><del>setHtmlCssUrl(Object)</del></code> - <li>{@link org.apache.juneau.rest.RestResponse#setHtmlNoWrap(boolean) setHtmlNoWrap(boolean)} - <li>{@link org.apache.juneau.rest.RestResponse#setHtmlNoResultsMessage(Object) setHtmlNoResultsMessage(Object)} - <li>{@link org.apache.juneau.rest.RestResponse#setHtmlTemplate(Class) setHtmlTemplate(Class)} - <li>{@link org.apache.juneau.rest.RestResponse#setHtmlTemplate(HtmlDocTemplate) setHtmlTemplate(HtmlDocTemplate)} + <li><code><del>setHtmlNoWrap(boolean)</del></code> + <li><code><del>setHtmlNoResultsMessage(Object)</del></code> + <li><code><del>setHtmlTemplate(Class)</del></code> + <li><code><del>setHtmlTemplate(HtmlDocTemplate)</del></code> </ul> <li> <code>&plainText=true</code> parameter now works on byte-based serializers by converting the output to hex. @@ -9733,7 +9736,7 @@ <li>New annotations on {@link org.apache.juneau.rest.annotation.RestResource}. <ul> <li><code><del>RestResource.stylesheet()</del></code> - <li>{@link org.apache.juneau.rest.annotation.RestResource#favicon()} + <li><code><del>RestResource.favicon()</del></code> <li>{@link org.apache.juneau.rest.annotation.RestResource#staticFiles()} </ul> <li>Eliminated <code>org.apache.juneau.rest.jaxrs.JsonProvider</code> class. @@ -10248,7 +10251,7 @@ <h6 class='topic'>Core</h6> <ul class='spaced-list'> <li>{@link org.apache.juneau.ClassMeta#newInstance()} method can now create new instances of arrays. - <li>Arguments passed to {@link org.apache.juneau.dto.Link} are now serialized using {@link org.apache.juneau.urlencoding.UrlEncodingSerializer}, so arbitrary POJOs can now be passed as arguments. + <li>Arguments passed to <code><del>Link</del></code> are now serialized using {@link org.apache.juneau.urlencoding.UrlEncodingSerializer}, so arbitrary POJOs can now be passed as arguments. <li>New date filters: <code>org.apache.juneau.transforms.Datefilter.ISO8601DTZP</code> and <code>org.apache.juneau.transforms.Datefilter.SimpleP</code>. <li>New {@link org.apache.juneau.html.HtmlDocSerializerContext#HTMLDOC_nowrap} setting for {@link org.apache.juneau.html.HtmlDocSerializer} class. Adds <js>"* {white-space:nowrap}"</js> to the style header to prevent word wrapping. @@ -10469,7 +10472,7 @@ </ul> <li>Code changes to facilitate breaking up bundles: <ul> - <li><code>org.apache.juneau.rest.labels.Link</code> class moved to {@link org.apache.juneau.dto.Link}. + <li><code>org.apache.juneau.rest.labels.Link</code> class moved to <code><del>Link</del></code>. <li>References to <code>org.apache.juneau.rest.RestException</code> in {@link org.apache.juneau.encoders.Encoder} class changed to <code>IOException</code>. </ul> <li>Changed configuration names for consistency with Jazz Framework. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/926b7cf9/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/CallMethod.java ---------------------------------------------------------------------- diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/CallMethod.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/CallMethod.java index 7f31520..55ec42c 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/CallMethod.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/CallMethod.java @@ -17,7 +17,6 @@ import static org.apache.juneau.dto.swagger.SwaggerBuilder.*; import static org.apache.juneau.internal.ClassUtils.*; import static org.apache.juneau.internal.StringUtils.*; import static org.apache.juneau.internal.Utils.*; -import static org.apache.juneau.rest.RestUtils.*; import static org.apache.juneau.rest.annotation.Inherit.*; import java.lang.annotation.*; @@ -29,12 +28,9 @@ import javax.servlet.http.*; import org.apache.juneau.*; import org.apache.juneau.dto.swagger.*; import org.apache.juneau.encoders.*; -import org.apache.juneau.html.*; -import org.apache.juneau.internal.*; import org.apache.juneau.json.*; import org.apache.juneau.parser.*; import org.apache.juneau.rest.annotation.*; -import org.apache.juneau.rest.widget.*; import org.apache.juneau.serializer.*; import org.apache.juneau.svl.*; import org.apache.juneau.urlencoding.*; @@ -67,11 +63,7 @@ class CallMethod implements Comparable<CallMethod> { private final Response[] responses; private final RestContext context; private final BeanContext beanContext; - final String htmlHeader, htmlNav, htmlAside, htmlFooter, htmlStyle, htmlStylesheet, htmlScript, htmlNoResultsMessage; - final String[] htmlNavLinks, htmlHead; - final boolean htmlNoWrap; - final HtmlDocTemplate htmlTemplate; - private final Map<String,Widget> widgets; + private final HtmlDocContext htmlDocContext; CallMethod(Object servlet, java.lang.reflect.Method method, RestContext context) throws RestServletException { Builder b = new Builder(servlet, method, context); @@ -103,27 +95,11 @@ class CallMethod implements Comparable<CallMethod> { this.priority = b.priority; this.parameters = b.parameters; this.responses = b.responses; - this.htmlHeader = b.htmlHeader; - this.htmlNavLinks = b.htmlNavLinks; - this.htmlNav = b.htmlNav; - this.htmlAside = b.htmlAside; - this.htmlFooter = b.htmlFooter; - this.htmlStyle = b.htmlStyle; - this.htmlStylesheet = b.htmlStylesheet; - this.htmlScript = b.htmlScript; - this.htmlHead = b.htmlHead; - this.htmlNoWrap = b.htmlNoWrap; - this.htmlTemplate = b.htmlTemplate; - this.htmlNoResultsMessage = b.htmlNoResultsMessage; - this.widgets = Collections.unmodifiableMap(b.htmlWidgets); + this.htmlDocContext = new HtmlDocContext(method, context.getHtmlDocContext()); } private static class Builder { - private String httpMethod, defaultCharset, description, tags, summary, externalDocs, htmlNav, htmlAside, - htmlFooter, htmlStyle, htmlStylesheet, htmlScript, htmlHeader, htmlNoResultsMessage; - private String[] htmlNavLinks, htmlHead; - private boolean htmlNoWrap; - private HtmlDocTemplate htmlTemplate; + private String httpMethod, defaultCharset, description, tags, summary, externalDocs; private UrlPathPattern pathPattern; private RestParam[] params; private RestGuard[] guards; @@ -141,7 +117,6 @@ class CallMethod implements Comparable<CallMethod> { private Integer priority; private org.apache.juneau.rest.annotation.Parameter[] parameters; private Response[] responses; - private Map<String,Widget> htmlWidgets; private Builder(Object servlet, java.lang.reflect.Method method, RestContext context) throws RestServletException { String sig = method.getDeclaringClass().getName() + '.' + method.getName(); @@ -179,29 +154,6 @@ class CallMethod implements Comparable<CallMethod> { if (! m.paramFormat().isEmpty()) paramFormat = context.getVarResolver().resolve(m.paramFormat()); - HtmlDoc hd = m.htmldoc(); - htmlWidgets = new HashMap<String,Widget>(context.getHtmlWidgets()); - for (Class<? extends Widget> wc : hd.widgets()) { - Widget w = ClassUtils.newInstance(Widget.class, wc); - htmlWidgets.put(w.getName(), w); - } - - htmlHeader = resolveNewlineSeparatedAnnotation(hd.header(), context.getHtmlHeader()); - htmlNav = resolveNewlineSeparatedAnnotation(hd.nav(), context.getHtmlNav()); - htmlAside = resolveNewlineSeparatedAnnotation(hd.aside(), context.getHtmlAside()); - htmlFooter = resolveNewlineSeparatedAnnotation(hd.footer(), context.getHtmlFooter()); - htmlStyle = resolveNewlineSeparatedAnnotation(hd.style(), context.getHtmlStyle()); - htmlScript = resolveNewlineSeparatedAnnotation(hd.script(), context.getHtmlScript()); - htmlHead = resolveContent(hd.head(), context.getHtmlHead()); - htmlNavLinks = resolveLinks(hd.navlinks(), context.getHtmlNavLinks()); - htmlStylesheet = hd.stylesheet().isEmpty() ? context.getHtmlStylesheet() : hd.stylesheet(); - htmlNoWrap = hd.nowrap() ? hd.nowrap() : context.getHtmlNoWrap(); - htmlNoResultsMessage = hd.noResultsMessage().isEmpty() ? context.getHtmlNoResultsMessage() : hd.noResultsMessage(); - htmlTemplate = - hd.template() == HtmlDocTemplate.class - ? context.getHtmlTemplate() - : ClassUtils.newInstance(HtmlDocTemplate.class, hd.template()); - List<Inherit> si = Arrays.asList(m.serializersInherit()); List<Inherit> pi = Arrays.asList(m.parsersInherit()); @@ -509,6 +461,10 @@ class CallMethod implements Comparable<CallMethod> { return null; } + HtmlDocContext getHtmlDocContext() { + return htmlDocContext; + } + /** * Returns the localized Swagger tags for this Java method. */ @@ -795,7 +751,7 @@ class CallMethod implements Comparable<CallMethod> { ObjectMap requestProperties = createRequestProperties(properties, req); req.init(method, requestProperties, defaultRequestHeaders, defaultQuery, defaultFormData, defaultCharset, - serializers, parsers, urlEncodingParser, beanContext, encoders, widgets); + serializers, parsers, urlEncodingParser, beanContext, encoders, htmlDocContext.widgets, htmlDocContext); res.init(requestProperties, defaultCharset, serializers, urlEncodingSerializer, encoders); // Class-level guards http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/926b7cf9/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocBuilder.java ---------------------------------------------------------------------- diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocBuilder.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocBuilder.java new file mode 100644 index 0000000..99c6a3b --- /dev/null +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocBuilder.java @@ -0,0 +1,408 @@ +// *************************************************************************************************************************** +// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * +// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * +// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * +// * with the License. You may obtain a copy of the License at * +// * * +// * http://www.apache.org/licenses/LICENSE-2.0 * +// * * +// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * +// * specific language governing permissions and limitations under the License. * +// *************************************************************************************************************************** +package org.apache.juneau.rest; + +import static org.apache.juneau.html.HtmlDocSerializerContext.*; + +import org.apache.juneau.*; +import org.apache.juneau.html.*; +import org.apache.juneau.rest.annotation.*; +import org.apache.juneau.utils.*; + +/** + * Programmatic interface for setting properties used by the HtmlDoc serializer. + * + * <p> + * This class is instantiated by calling the {@link RestResponse#getHtmlDocBuilder()} method. + */ +public class HtmlDocBuilder { + + private final ObjectMap properties; + + HtmlDocBuilder(ObjectMap properties) { + this.properties = properties; + } + + /** + * Sets the HTML header section contents. + * + * <p> + * The format of this value is HTML. + * + * <p> + * The page header normally contains the title and description, but this value can be used to override the contents + * to be whatever you want. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no header. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#header() @HtmlDoc.header()} annotation. + * + * @param value + * The HTML header section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocBuilder header(Object value) { + return set(HTMLDOC_header, value); + } + + /** + * Sets the links in the HTML nav section. + * + * <p> + * The format of this value is a lax-JSON map of key/value pairs where the keys are the link text and the values are + * relative (to the servlet) or absolute URLs. + * + * <p> + * The page links are positioned immediately under the title and text. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This field can also use URIs of any support type in {@link UriResolver}. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#navlinks() @HtmlDoc.navlinks()} annotation. + * + * @param value + * The HTML nav section links links. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocBuilder navlinks(Object...value) { + return set(HTMLDOC_navlinks, value); + } + + /** + * Sets the HTML nav section contents. + * + * <p> + * The format of this value is HTML. + * + * <p> + * The nav section of the page contains the links. + * + * <p> + * The format of this value is HTML. + * + * <p> + * When a value is specified, the {@link #navlinks(Object[])} value will be ignored. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#nav() @HtmlDoc.nav()} annotation. + * + * @param value + * The HTML nav section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocBuilder nav(Object value) { + return set(HTMLDOC_nav, value); + } + + /** + * Sets the HTML aside section contents. + * + * <p> + * The format of this value is HTML. + * + * <p> + * The aside section typically floats on the right side of the page. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#aside() @HtmlDoc.aside()} annotation. + * + * @param value + * The HTML aside section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to waste + * string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocBuilder aside(Object value) { + return set(HTMLDOC_aside, value); + } + + /** + * Sets the HTML footer section contents. + * + * <p> + * The format of this value is HTML. + * + * <p> + * The footer section typically floats on the bottom of the page. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#footer() @HtmlDoc.footer()} annotation. + * + * @param value + * The HTML footer section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocBuilder footer(Object value) { + return set(HTMLDOC_footer, value); + } + + /** + * Sets the HTML CSS style section contents. + * + * <p> + * The format of this value is CSS. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#style() @HtmlDoc.style()} annotation. + * + * @param value + * The HTML CSS style section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocBuilder style(Object value) { + return set(HTMLDOC_style, value); + } + + /** + * Sets the CSS URL in the HTML CSS style section. + * + * <p> + * The format of this value is a comma-delimited list of URLs. + * + * <p> + * Specifies the URL to the stylesheet to add as a link in the style tag in the header. + * + * <p> + * The format of this value is CSS. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>) and can use URL protocols defined + * by {@link UriResolver}. + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#stylesheet() @HtmlDoc.stylesheet()} annotation. + * + * @param value + * The CSS URL in the HTML CSS style section. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocBuilder stylesheet(Object value) { + return set(HTMLDOC_stylesheet, value); + } + + /** + * Sets the HTML script section contents. + * + * <p> + * The format of this value is Javascript. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#script() @HtmlDoc.script()} annotation. + * + * @param value + * The HTML script section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocBuilder script(Object value) { + return set(HTMLDOC_script, value); + } + + /** + * Sets the HTML head section contents. + * + * <p> + * The format of this value is HTML. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#head() @HtmlDoc.head()} annotation. + * + * @param value + * The HTML head section contents. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocBuilder head(Object...value) { + return set(HTMLDOC_head, value); + } + + /** + * Shorthand method for forcing the rendered HTML content to be no-wrap. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#nowrap() @HtmlDoc.nowrap()} annotation. + * + * @param value The new nowrap setting. + * @return This object (for method chaining). + */ + public HtmlDocBuilder nowrap(boolean value) { + return set(HTMLDOC_nowrap, value); + } + + /** + * Specifies the text to display when serializing an empty array or collection. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#noResultsMessage() @HtmlDoc.noResultsMessage()} + * annotation. + * + * @param value The text to display when serializing an empty array or collection. + * @return This object (for method chaining). + */ + public HtmlDocBuilder noResultsMessage(Object value) { + return set(HTMLDOC_noResultsMessage, value); + } + + /** + * Specifies the template class to use for rendering the HTML page. + * + * <p> + * By default, uses {@link HtmlDocTemplateBasic} to render the contents, although you can provide your own custom + * renderer or subclasses from the basic class to have full control over how the page is rendered. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#template() @HtmlDoc.template()} annotation. + * + * @param value The HTML page template to use to render the HTML page. + * @return This object (for method chaining). + */ + public HtmlDocBuilder template(Class<? extends HtmlDocTemplate> value) { + return set(HTMLDOC_template, value); + } + + /** + * Specifies the template class to use for rendering the HTML page. + * + * <p> + * By default, uses {@link HtmlDocTemplateBasic} to render the contents, although you can provide your own custom + * renderer or subclasses from the basic class to have full control over how the page is rendered. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#template() @HtmlDoc.template()} annotation. + * + * @param value The HTML page template to use to render the HTML page. + * @return This object (for method chaining). + */ + public HtmlDocBuilder template(HtmlDocTemplate value) { + return set(HTMLDOC_template, value); + } + + private HtmlDocBuilder set(String key, Object value) { + properties.put(key, value); + return this; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/926b7cf9/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocConfig.java ---------------------------------------------------------------------- diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocConfig.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocConfig.java new file mode 100644 index 0000000..0397198 --- /dev/null +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocConfig.java @@ -0,0 +1,456 @@ +// *************************************************************************************************************************** +// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * +// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * +// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * +// * with the License. You may obtain a copy of the License at * +// * * +// * http://www.apache.org/licenses/LICENSE-2.0 * +// * * +// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * +// * specific language governing permissions and limitations under the License. * +// *************************************************************************************************************************** +package org.apache.juneau.rest; + +import static org.apache.juneau.rest.RestUtils.*; + +import java.util.*; + +import org.apache.juneau.*; +import org.apache.juneau.html.*; +import org.apache.juneau.internal.*; +import org.apache.juneau.rest.annotation.*; +import org.apache.juneau.rest.widget.*; +import org.apache.juneau.utils.*; + +/** + * Programmatic interface for setting properties used by the HtmlDoc serializer. + */ +public class HtmlDocConfig { + + String header, nav, aside, footer, style, stylesheet, script, noResultsMessage; + String[] navlinks, head; + boolean nowrap; + Object template = HtmlDocTemplateBasic.class; + List<Class<? extends Widget>> widgets = new ArrayList<Class<? extends Widget>>(); + + HtmlDocConfig process(HtmlDoc hd) { + for (Class<? extends Widget> cw : hd.widgets()) + widget(cw); + header(resolveNewlineSeparatedAnnotation(hd.header(), header)); + nav(resolveNewlineSeparatedAnnotation(hd.nav(), nav)); + aside(resolveNewlineSeparatedAnnotation(hd.aside(), aside)); + footer(resolveNewlineSeparatedAnnotation(hd.footer(), footer)); + style(resolveNewlineSeparatedAnnotation(hd.style(), style)); + script(resolveNewlineSeparatedAnnotation(hd.script(), script)); + navlinks((Object[])resolveLinks(hd.navlinks(), navlinks)); + head((Object[])resolveContent(hd.head(), head)); + + if (! hd.stylesheet().isEmpty()) + stylesheet(hd.stylesheet()); + if (! hd.noResultsMessage().isEmpty()) + noResultsMessage(hd.noResultsMessage()); + if (hd.nowrap()) + nowrap(true); + if (hd.template() != HtmlDocTemplate.class) + template(hd.template()); + + return this; + } + + /** + * Sets the HTML header section contents. + * + * <p> + * The format of this value is HTML. + * + * <p> + * The page header normally contains the title and description, but this value can be used to override the contents + * to be whatever you want. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no header. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#header() @HtmlDoc.header()} annotation. + * + * @param value + * The HTML header section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocConfig header(Object value) { + header = StringUtils.toString(value); + return this; + } + + /** + * Sets the links in the HTML nav section. + * + * <p> + * The format of this value is a lax-JSON map of key/value pairs where the keys are the link text and the values are + * relative (to the servlet) or absolute URLs. + * + * <p> + * The page links are positioned immediately under the title and text. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This field can also use URIs of any support type in {@link UriResolver}. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#navlinks() @HtmlDoc.navlinks()} annotation. + * + * @param value + * The HTML nav section links links. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocConfig navlinks(Object...value) { + navlinks = StringUtils.toStrings(value); + return this; + } + + /** + * Sets the HTML nav section contents. + * + * <p> + * The format of this value is HTML. + * + * <p> + * The nav section of the page contains the links. + * + * <p> + * The format of this value is HTML. + * + * <p> + * When a value is specified, the {@link #navlinks(Object[])} value will be ignored. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#nav() @HtmlDoc.nav()} annotation. + * + * @param value + * The HTML nav section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocConfig nav(Object value) { + this.nav = StringUtils.toString(value); + return this; + } + + /** + * Sets the HTML aside section contents. + * + * <p> + * The format of this value is HTML. + * + * <p> + * The aside section typically floats on the right side of the page. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#aside() @HtmlDoc.aside()} annotation. + * + * @param value + * The HTML aside section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to waste + * string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocConfig aside(Object value) { + this.aside = StringUtils.toString(value); + return this; + } + + /** + * Sets the HTML footer section contents. + * + * <p> + * The format of this value is HTML. + * + * <p> + * The footer section typically floats on the bottom of the page. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#footer() @HtmlDoc.footer()} annotation. + * + * @param value + * The HTML footer section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocConfig footer(Object value) { + this.footer = StringUtils.toString(value); + return this; + } + + /** + * Sets the HTML CSS style section contents. + * + * <p> + * The format of this value is CSS. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#style() @HtmlDoc.style()} annotation. + * + * @param value + * The HTML CSS style section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocConfig style(Object value) { + this.style = StringUtils.toString(value); + return this; + } + + /** + * Sets the CSS URL in the HTML CSS style section. + * + * <p> + * The format of this value is a comma-delimited list of URLs. + * + * <p> + * Specifies the URL to the stylesheet to add as a link in the style tag in the header. + * + * <p> + * The format of this value is CSS. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>) and can use URL protocols defined + * by {@link UriResolver}. + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#stylesheet() @HtmlDoc.stylesheet()} annotation. + * + * @param value + * The CSS URL in the HTML CSS style section. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocConfig stylesheet(Object value) { + this.stylesheet = StringUtils.toString(value); + return this; + } + + /** + * Sets the HTML script section contents. + * + * <p> + * The format of this value is Javascript. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#script() @HtmlDoc.script()} annotation. + * + * @param value + * The HTML script section contents. + * Object will be converted to a string using {@link Object#toString()}. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocConfig script(Object value) { + this.script = StringUtils.toString(value); + return this; + } + + /** + * Sets the HTML head section contents. + * + * <p> + * The format of this value is HTML. + * + * <p> + * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). + * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. + * + * <p> + * A value of <js>"NONE"</js> can be used to force no value. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#head() @HtmlDoc.head()} annotation. + * + * @param value + * The HTML head section contents. + * <p> + * <ul class='doctree'> + * <li class='info'> + * <b>Tip:</b> Use {@link StringMessage} to generate value with delayed serialization so as not to + * waste string concatenation cycles on non-HTML views. + * </ul> + * @return This object (for method chaining). + */ + public HtmlDocConfig head(Object...value) { + this.head = StringUtils.toStrings(value); + return this; + } + + /** + * Shorthand method for forcing the rendered HTML content to be no-wrap. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#nowrap() @HtmlDoc.nowrap()} annotation. + * + * @param value The new nowrap setting. + * @return This object (for method chaining). + */ + public HtmlDocConfig nowrap(boolean value) { + this.nowrap = value; + return this; + } + + /** + * Specifies the text to display when serializing an empty array or collection. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#noResultsMessage() @HtmlDoc.noResultsMessage()} + * annotation. + * + * @param value The text to display when serializing an empty array or collection. + * @return This object (for method chaining). + */ + public HtmlDocConfig noResultsMessage(Object value) { + this.noResultsMessage = StringUtils.toString(value); + return this; + } + + /** + * Specifies the template class to use for rendering the HTML page. + * + * <p> + * By default, uses {@link HtmlDocTemplateBasic} to render the contents, although you can provide your own custom + * renderer or subclasses from the basic class to have full control over how the page is rendered. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#template() @HtmlDoc.template()} annotation. + * + * @param value The HTML page template to use to render the HTML page. + * @return This object (for method chaining). + */ + public HtmlDocConfig template(Class<? extends HtmlDocTemplate> value) { + this.template = value; + return this; + } + + /** + * Specifies the template class to use for rendering the HTML page. + * + * <p> + * By default, uses {@link HtmlDocTemplateBasic} to render the contents, although you can provide your own custom + * renderer or subclasses from the basic class to have full control over how the page is rendered. + * + * <p> + * This is the programmatic equivalent to the {@link HtmlDoc#template() @HtmlDoc.template()} annotation. + * + * @param value The HTML page template to use to render the HTML page. + * @return This object (for method chaining). + */ + public HtmlDocConfig template(HtmlDocTemplate value) { + this.template = value; + return this; + } + + /** + * Defines widgets that can be used in conjunction with string variables of the form <js>"$W{name}"</js>to quickly + * generate arbitrary replacement text. + * + * <p> + * Widgets are inherited from parent to child, but can be overridden by reusing the widget name. + * + * @param value The widget class to add. + * @return This object (for method chaining). + */ + public HtmlDocConfig widget(Class<? extends Widget> value) { + this.widgets.add(value); + return this; + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/926b7cf9/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocContext.java ---------------------------------------------------------------------- diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocContext.java new file mode 100644 index 0000000..9f3809e --- /dev/null +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/HtmlDocContext.java @@ -0,0 +1,171 @@ +// *************************************************************************************************************************** +// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * +// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * +// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * +// * with the License. You may obtain a copy of the License at * +// * * +// * http://www.apache.org/licenses/LICENSE-2.0 * +// * * +// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * +// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * +// * specific language governing permissions and limitations under the License. * +// *************************************************************************************************************************** +package org.apache.juneau.rest; + +import static org.apache.juneau.rest.RestUtils.*; + +import java.util.*; + +import org.apache.juneau.html.*; +import org.apache.juneau.internal.*; +import org.apache.juneau.rest.annotation.*; +import org.apache.juneau.rest.widget.*; + +/** + * Programmatic interface for set properties used by the HtmlDoc serializer. + */ +public final class HtmlDocContext { + + final String header, nav, aside, style, stylesheet, script, footer, noResultsMessage; + final String[] navlinks, head; + final boolean nowrap; + final HtmlDocTemplate template; + final Map<String,Widget> widgets; + + HtmlDocContext(Object resource, RestConfig config) throws RestServletException { + try { + Builder b = new Builder(resource, config); + + this.header = b.header; + this.nav = b.nav; + this.aside = b.aside; + this.style = b.style; + this.stylesheet = b.stylesheet; + this.script = b.script; + this.footer = b.footer; + this.noResultsMessage = b.noResultsMessage; + this.navlinks = b.navlinks; + this.head = b.head; + this.nowrap = b.nowrap; + this.widgets = Collections.unmodifiableMap(b.widgets); + this.template = b.template; + } catch (RestServletException e) { + throw e; + } catch (Exception e) { + throw new RestServletException("Exception occurred while initializing resource ''{0}''", resource.getClass().getSimpleName()).initCause(e); + } + } + + HtmlDocContext(java.lang.reflect.Method method, HtmlDocContext pc) throws RestServletException { + try { + Builder b = new Builder(method, pc); + this.header = b.header; + this.nav = b.nav; + this.aside = b.aside; + this.style = b.style; + this.stylesheet = b.stylesheet; + this.script = b.script; + this.footer = b.footer; + this.noResultsMessage = b.noResultsMessage; + this.navlinks = b.navlinks; + this.head = b.head; + this.nowrap = b.nowrap; + this.widgets = Collections.unmodifiableMap(b.widgets); + this.template = b.template; + } catch (RestServletException e) { + throw e; + } catch (Exception e) { + String sig = method.getDeclaringClass().getName() + '.' + method.getName(); + throw new RestServletException("Exception occurred while initializing method ''{0}''", sig).initCause(e); + } + } + + + static class Builder { + + String header, nav, aside, style, stylesheet, script, footer, noResultsMessage; + String[] navlinks, head; + boolean nowrap; + HtmlDocTemplate template; + Map<String,Widget> widgets; + + + Builder(java.lang.reflect.Method method, HtmlDocContext pc) throws Exception { + String sig = method.getDeclaringClass().getName() + '.' + method.getName(); + + try { + RestMethod m = method.getAnnotation(RestMethod.class); + if (m == null) + throw new RestServletException("@RestMethod annotation not found on method ''{0}''", sig); + + HtmlDoc hd = m.htmldoc(); + + widgets = new HashMap<String,Widget>(pc.widgets); + for (Class<? extends Widget> wc : hd.widgets()) { + Widget w = ClassUtils.newInstance(Widget.class, wc); + widgets.put(w.getName(), w); + } + + header = resolveNewlineSeparatedAnnotation(hd.header(), pc.header); + nav = resolveNewlineSeparatedAnnotation(hd.nav(), pc.nav); + aside = resolveNewlineSeparatedAnnotation(hd.aside(), pc.aside); + footer = resolveNewlineSeparatedAnnotation(hd.footer(), pc.footer); + style = resolveNewlineSeparatedAnnotation(hd.style(), pc.style); + script = resolveNewlineSeparatedAnnotation(hd.script(), pc.script); + head = resolveContent(hd.head(), pc.head); + navlinks = resolveLinks(hd.navlinks(), pc.navlinks); + stylesheet = hd.stylesheet().isEmpty() ? pc.stylesheet : hd.stylesheet(); + nowrap = hd.nowrap() ? hd.nowrap() : pc.nowrap; + noResultsMessage = hd.noResultsMessage().isEmpty() ? pc.noResultsMessage : hd.noResultsMessage(); + template = + hd.template() == HtmlDocTemplate.class + ? pc.template + : ClassUtils.newInstance(HtmlDocTemplate.class, hd.template()); + } catch (RestServletException e) { + throw e; + } catch (Exception e) { + throw new RestServletException("Exception occurred while initializing method ''{0}''", sig).initCause(e); + } + } + + + Builder(Object resource, RestConfig sc) throws Exception { + + HtmlDocConfig hdc = sc.htmlDocConfig; + + this.widgets = new LinkedHashMap<String,Widget>(); + for (Class<? extends Widget> wc : hdc.widgets) { + Widget w = resolve(resource, Widget.class, wc); + this.widgets.put(w.getName(), w); + } + + header = hdc.header; + navlinks = hdc.navlinks; + nav = hdc.nav; + aside = hdc.aside; + style = hdc.style; + stylesheet = hdc.stylesheet; + script = hdc.script; + head = hdc.head; + footer = hdc.footer; + nowrap = hdc.nowrap; + noResultsMessage = hdc.noResultsMessage; + template = resolve(resource, HtmlDocTemplate.class, hdc.template); + } + } + + //---------------------------------------------------------------------------------------------------- + // Utility methods + //---------------------------------------------------------------------------------------------------- + + /** + * Takes in an object of type T or a Class<T> and either casts or constructs a T. + */ + private static <T> T resolve(Object outer, Class<T> c, Object o, Object...cArgs) throws RestServletException { + try { + return ClassUtils.newInstanceFromOuter(outer, c, o, cArgs); + } catch (Exception e) { + throw new RestServletException("Exception occurred while constructing class ''{0}''", c).initCause(e); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/926b7cf9/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConfig.java ---------------------------------------------------------------------- diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConfig.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConfig.java index d08bf42..ca8e558 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConfig.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestConfig.java @@ -15,7 +15,6 @@ package org.apache.juneau.rest; import static org.apache.juneau.internal.ArrayUtils.*; import static org.apache.juneau.internal.ReflectionUtils.*; import static org.apache.juneau.internal.StringUtils.*; -import static org.apache.juneau.rest.RestUtils.*; import java.lang.reflect.Method; import java.util.*; @@ -27,7 +26,6 @@ import javax.servlet.http.*; import org.apache.juneau.*; import org.apache.juneau.encoders.*; import org.apache.juneau.encoders.Encoder; -import org.apache.juneau.html.*; import org.apache.juneau.http.*; import org.apache.juneau.ini.*; import org.apache.juneau.internal.*; @@ -35,7 +33,6 @@ import org.apache.juneau.parser.*; import org.apache.juneau.rest.annotation.*; import org.apache.juneau.rest.response.*; import org.apache.juneau.rest.vars.*; -import org.apache.juneau.rest.widget.*; import org.apache.juneau.serializer.*; import org.apache.juneau.svl.*; import org.apache.juneau.svl.vars.*; @@ -113,10 +110,10 @@ public class RestConfig implements ServletConfig { List<MediaType> supportedContentTypes, supportedAcceptTypes; List<Object> staticFiles; RestContext parentContext; - String path, htmlHeader, htmlNav, htmlAside, htmlFooter, htmlStyle, htmlStylesheet, htmlScript, htmlNoResultsMessage; - String[] htmlNavLinks, htmlHead; + String path; String clientVersionHeader = "X-Client-Version"; String contextPath; + HtmlDocConfig htmlDocConfig = new HtmlDocConfig(); Object resourceResolver = RestResourceResolverSimple.class; Object logger = RestLogger.Normal.class; @@ -124,11 +121,7 @@ public class RestConfig implements ServletConfig { Object infoProvider = RestInfoProvider.class; Object allowHeaderParams, allowMethodParam, allowBodyParam, renderResponseStackTraces, useStackTraceHashes, defaultCharset, paramFormat; - boolean htmlNoWrap; - Object htmlTemplate = HtmlDocTemplateBasic.class; - Class<?> resourceClass; - List<Class<? extends Widget>> htmlWidgets = new ArrayList<Class<? extends Widget>>(); /** * Constructor for top-level servlets when using dependency injection. @@ -252,26 +245,7 @@ public class RestConfig implements ServletConfig { if (! r.paramFormat().isEmpty()) setParamFormat(vr.resolve(r.paramFormat())); - HtmlDoc hd = r.htmldoc(); - for (Class<? extends Widget> cw : hd.widgets()) - addHtmlWidget(cw); - setHtmlHeader(resolveNewlineSeparatedAnnotation(hd.header(), htmlHeader)); - setHtmlNav(resolveNewlineSeparatedAnnotation(hd.nav(), htmlNav)); - setHtmlAside(resolveNewlineSeparatedAnnotation(hd.aside(), htmlAside)); - setHtmlFooter(resolveNewlineSeparatedAnnotation(hd.footer(), htmlFooter)); - setHtmlStyle(resolveNewlineSeparatedAnnotation(hd.style(), htmlStyle)); - setHtmlScript(resolveNewlineSeparatedAnnotation(hd.script(), htmlScript)); - setHtmlNavLinks(resolveLinks(hd.navlinks(), htmlNavLinks)); - setHtmlHead(resolveContent(hd.head(), htmlHead)); - - if (! hd.stylesheet().isEmpty()) - setHtmlStylesheet(hd.stylesheet()); - if (! hd.noResultsMessage().isEmpty()) - setHtmlNoResultsMessage(hd.noResultsMessage()); - if (hd.nowrap()) - setHtmlNoWrap(true); - if (hd.template() != HtmlDocTemplate.class) - setHtmlTemplate(hd.template()); + htmlDocConfig.process(r.htmldoc()); } addResponseHandlers( @@ -1202,319 +1176,12 @@ public class RestConfig implements ServletConfig { } /** - * Sets the HTML header section contents. - * - * <p> - * The format of this value is HTML. - * - * <p> - * The page header normally contains the title and description, but this value can be used to override the contents - * to be whatever you want. - * - * <p> - * A value of <js>"NONE"</js> can be used to force no header. + * Returns the configuration settings specific to the HTML doc view. * - * <p> - * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). - * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#header() @HtmlDoc.header()} annotation. - * - * @param value The HTML header section contents. - * @return This object (for method chaining). + * @return The configuration settings specific to the HTML doc view. */ - public RestConfig setHtmlHeader(String value) { - this.htmlHeader = value; - return this; - } - - /** - * Sets the links in the HTML nav section. - * - * <p> - * The format of this value is a lax-JSON map of key/value pairs where the keys are the link text and the values are - * relative (to the servlet) or absolute URLs. - * - * <p> - * The page links are positioned immediately under the title and text. - * - * <p> - * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). - * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. - * - * <p> - * A value of <js>"NONE"</js> can be used to force no value. - * - * <p> - * This field can also use URIs of any support type in {@link UriResolver}. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#navlinks() @HtmlDoc.navlinks()} annotation. - * - * @param value The HTML nav section links links. - * @return This object (for method chaining). - */ - public RestConfig setHtmlNavLinks(String[] value) { - this.htmlNavLinks = value; - return this; - } - - /** - * Sets the HTML nav section contents. - * - * <p> - * The format of this value is HTML. - * - * <p> - * The nav section of the page contains the links. - * - * <p> - * The format of this value is HTML. - * - * <p> - * When a value is specified, the {@link #setHtmlNavLinks(String[])} value will be ignored. - * - * <p> - * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). - * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. - * - * <p> - * A value of <js>"NONE"</js> can be used to force no value. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#nav() @HtmlDoc.nav()} annotation. - * - * @param value The HTML nav section contents. - * @return This object (for method chaining). - */ - public RestConfig setHtmlNav(String value) { - this.htmlNav = value; - return this; - } - - /** - * Sets the HTML aside section contents. - * - * <p> - * The format of this value is HTML. - * - * <p> - * The aside section typically floats on the right side of the page. - * - * <p> - * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). - * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. - * - * <p> - * A value of <js>"NONE"</js> can be used to force no value. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#aside() @HtmlDoc.aside()} annotation. - * - * @param value The HTML aside section contents. - * @return This object (for method chaining). - */ - public RestConfig setHtmlAside(String value) { - this.htmlAside = value; - return this; - } - - /** - * Sets the HTML footer section contents. - * - * <p> - * The format of this value is HTML. - * - * <p> - * The footer section typically floats on the bottom of the page. - * - * <p> - * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). - * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. - * - * <p> - * A value of <js>"NONE"</js> can be used to force no value. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#footer() @HtmlDoc.footer()} annotation. - * - * @param value The HTML footer section contents. - * @return This object (for method chaining). - */ - public RestConfig setHtmlFooter(String value) { - this.htmlFooter = value; - return this; - } - - /** - * Sets the HTML CSS style section contents. - * - * <p> - * The format of this value is CSS. - * - * <p> - * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). - * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. - * - * <p> - * A value of <js>"NONE"</js> can be used to force no value. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#style() @HtmlDoc.style()} annotation. - * - * @param value The HTML CSS style section contents. - * @return This object (for method chaining). - */ - public RestConfig setHtmlStyle(String value) { - this.htmlStyle = value; - return this; - } - - /** - * Sets the CSS URL in the HTML CSS style section. - * - * <p> - * The format of this value is a URL. - * - * <p> - * Specifies the URL to the stylesheet to add as a link in the style tag in the header. - * - * <p> - * The format of this value is CSS. - * - * <p> - * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>) and can use URL protocols defined - * by {@link UriResolver}. - * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#stylesheet() @HtmlDoc.stylesheet()} annotation. - * - * @param value The CSS URL in the HTML CSS style section. - * @return This object (for method chaining). - */ - public RestConfig setHtmlStylesheet(String value) { - this.htmlStylesheet = value; - return this; - } - - /** - * Sets the HTML script section contents. - * - * <p> - * The format of this value is Javascript. - * - * <p> - * This field can contain variables (e.g. <js>"$L{my.localized.variable}"</js>). - * <br>See {@link RestContext#getVarResolver()} for the list of supported variables. - * - * <p> - * A value of <js>"NONE"</js> can be used to force no value. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#script() @HtmlDoc.script()} annotation. - * - * @param value The HTML script section contents. - * @return This object (for method chaining). - */ - public RestConfig setHtmlScript(String value) { - this.htmlScript = value; - return this; - } - - /** - * Adds to the HTML head section contents. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#head() @HtmlDoc.head()} annotation. - * - * @param value The HTML head section content. - * @return This object (for method chaining). - */ - public RestConfig setHtmlHead(String...value) { - this.htmlHead = value; - return this; - } - - /** - * Shorthand method for forcing the rendered HTML content to be no-wrap. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#nowrap() @HtmlDoc.nowrap()} annotation. - * - * @param value The new nowrap setting. - * @return This object (for method chaining). - */ - public RestConfig setHtmlNoWrap(boolean value) { - this.htmlNoWrap = value; - return this; - } - - /** - * Specifies the text to display when serializing an empty array or collection. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#noResultsMessage() @HtmlDoc.noResultsMessage()} - * annotation. - * - * @param value The text to display when serializing an empty array or collection. - * @return This object (for method chaining). - */ - public RestConfig setHtmlNoResultsMessage(String value) { - this.htmlNoResultsMessage = value; - return this; - } - - /** - * Specifies the template class to use for rendering the HTML page. - * - * <p> - * By default, uses {@link HtmlDocTemplateBasic} to render the contents, although you can provide your own custom - * renderer or subclasses from the basic class to have full control over how the page is rendered. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#template() @HtmlDoc.template()} annotation. - * - * @param value The HTML page template to use to render the HTML page. - * @return This object (for method chaining). - */ - public RestConfig setHtmlTemplate(Class<? extends HtmlDocTemplate> value) { - this.htmlTemplate = value; - return this; - } - - /** - * Specifies the template class to use for rendering the HTML page. - * - * <p> - * By default, uses {@link HtmlDocTemplateBasic} to render the contents, although you can provide your own custom - * renderer or subclasses from the basic class to have full control over how the page is rendered. - * - * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#template() @HtmlDoc.template()} annotation. - * - * @param value The HTML page template to use to render the HTML page. - * @return This object (for method chaining). - */ - public RestConfig setHtmlTemplate(HtmlDocTemplate value) { - this.htmlTemplate = value; - return this; - } - - /** - * Defines widgets that can be used in conjunction with string variables of the form <js>"$W{name}"</js>to quickly - * generate arbitrary replacement text. - * - * <p> - * Widgets are inherited from parent to child, but can be overridden by reusing the widget name. - * - * @param value The widget class to add. - * @return This object (for method chaining). - */ - public RestConfig addHtmlWidget(Class<? extends Widget> value) { - this.htmlWidgets.add(value); - return this; + public HtmlDocConfig getHtmlDocConfig() { + return htmlDocConfig; } /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/926b7cf9/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java ---------------------------------------------------------------------- diff --git a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java index d113059..ef9200b 100644 --- a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java +++ b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java @@ -33,7 +33,6 @@ import javax.servlet.http.*; import org.apache.juneau.*; import org.apache.juneau.encoders.*; -import org.apache.juneau.html.*; import org.apache.juneau.http.*; import org.apache.juneau.ini.*; import org.apache.juneau.internal.*; @@ -42,7 +41,6 @@ import org.apache.juneau.parser.*; import org.apache.juneau.rest.annotation.*; import org.apache.juneau.rest.annotation.Properties; import org.apache.juneau.rest.vars.*; -import org.apache.juneau.rest.widget.*; import org.apache.juneau.serializer.*; import org.apache.juneau.svl.*; import org.apache.juneau.svl.vars.*; @@ -69,21 +67,9 @@ public final class RestContext extends Context { paramFormat, clientVersionHeader, fullPath, - contextPath, - htmlHeader, - htmlNav, - htmlAside, - htmlStyle, - htmlStylesheet, - htmlScript, - htmlFooter, - htmlNoResultsMessage; - private final String[] - htmlNavLinks, - htmlHead; - private final boolean htmlNoWrap; - private final HtmlDocTemplate htmlTemplate; - private final Map<String,Widget> htmlWidgets; + contextPath; + + private final HtmlDocContext htmlDocContext; private final Set<String> allowMethodParams; @@ -204,20 +190,7 @@ public final class RestContext extends Context { this.logger = b.logger; this.fullPath = b.fullPath; this.contextPath = nullIfEmpty(b.contextPath); - - this.htmlWidgets = Collections.unmodifiableMap(b.htmlWidgets); - this.htmlHeader = b.htmlHeader; - this.htmlNavLinks = b.htmlNavLinks; - this.htmlNav = b.htmlNav; - this.htmlAside = b.htmlAside; - this.htmlStyle = b.htmlStyle; - this.htmlStylesheet = b.htmlStylesheet; - this.htmlScript = b.htmlScript; - this.htmlHead = b.htmlHead; - this.htmlFooter = b.htmlFooter; - this.htmlNoWrap = b.htmlNoWrap; - this.htmlNoResultsMessage = b.htmlNoResultsMessage; - this.htmlTemplate = b.htmlTemplate; + this.htmlDocContext = new HtmlDocContext(resource, config); //---------------------------------------------------------------------------------------------------- // Initialize the child resources. @@ -482,11 +455,7 @@ public final class RestContext extends Context { UrlEncodingSerializer urlEncodingSerializer; UrlEncodingParser urlEncodingParser; EncoderGroup encoders; - String clientVersionHeader = "", defaultCharset, paramFormat, htmlHeader, htmlNav, htmlAside, htmlStyle, - htmlStylesheet, htmlScript, htmlFooter, htmlNoResultsMessage; - String[] htmlNavLinks, htmlHead; - boolean htmlNoWrap; - HtmlDocTemplate htmlTemplate; + String clientVersionHeader = "", defaultCharset, paramFormat; List<MediaType> supportedContentTypes, supportedAcceptTypes; Map<String,String> defaultRequestHeaders = new TreeMap<String,String>(String.CASE_INSENSITIVE_ORDER); @@ -502,7 +471,6 @@ public final class RestContext extends Context { Set<String> allowMethodParams = new LinkedHashSet<String>(); RestLogger logger; String fullPath; - Map<String,Widget> htmlWidgets; Object resourceResolver; String contextPath; @@ -605,25 +573,6 @@ public final class RestContext extends Context { logger = sc.logger == null ? new RestLogger.NoOp() : resolve(resource, RestLogger.class, sc.logger); fullPath = (sc.parentContext == null ? "" : (sc.parentContext.fullPath + '/')) + sc.path; - - this.htmlWidgets = new LinkedHashMap<String,Widget>(); - for (Class<? extends Widget> wc : sc.htmlWidgets) { - Widget w = resolve(resource, Widget.class, wc); - this.htmlWidgets.put(w.getName(), w); - } - - htmlHeader = sc.htmlHeader; - htmlNavLinks = sc.htmlNavLinks; - htmlNav = sc.htmlNav; - htmlAside = sc.htmlAside; - htmlStyle = sc.htmlStyle; - htmlStylesheet = sc.htmlStylesheet; - htmlScript = sc.htmlScript; - htmlHead = sc.htmlHead; - htmlFooter = sc.htmlFooter; - htmlNoWrap = sc.htmlNoWrap; - htmlNoResultsMessage = sc.htmlNoResultsMessage; - htmlTemplate = resolve(resource, HtmlDocTemplate.class, sc.htmlTemplate); } } @@ -889,160 +838,12 @@ public final class RestContext extends Context { } /** - * The HTML page header contents. - * - * <p> - * Defined by the {@link HtmlDoc#header()} annotation or {@link RestConfig#setHtmlHeader(String)} method. - * - * @return The HTML page header contents. - */ - public String getHtmlHeader() { - return htmlHeader; - } - - /** - * The HTML page nav section links. - * - * <p> - * Defined by the {@link HtmlDoc#navlinks()} annotation or {@link RestConfig#setHtmlNavLinks(String[])} method. - * - * @return The HTML page nav section links. - */ - public String[] getHtmlNavLinks() { - return htmlNavLinks; - } - - /** - * The HTML page nav section contents. - * - * <p> - * Defined by the {@link HtmlDoc#nav()} annotation or {@link RestConfig#setHtmlNav(String)} method. - * - * @return The HTML page nav section contents. - */ - public String getHtmlNav() { - return htmlNav; - } - - /** - * The HTML page aside section contents. - * - * <p> - * Defined by the {@link HtmlDoc#aside()} annotation or {@link RestConfig#setHtmlAside(String)} method. - * - * @return The HTML page aside section contents. - */ - public String getHtmlAside() { - return htmlAside; - } - - /** - * The HTML page footer section contents. - * - * <p> - * Defined by the {@link HtmlDoc#footer()} annotation or {@link RestConfig#setHtmlFooter(String)} method. - * - * @return The HTML page footer section contents. - */ - public String getHtmlFooter() { - return htmlFooter; - } - - /** - * The HTML page stylesheet URL. - * - * <p> - * Defined by the {@link HtmlDoc#stylesheet()} annotation or {@link RestConfig#setHtmlStylesheet(String)} method. - * - * @return The HTML page CSS URL. - */ - public String getHtmlStylesheet() { - return htmlStylesheet; - } - - /** - * The HTML page CSS contents. - * - * <p> - * Defined by the {@link HtmlDoc#style()} annotation or {@link RestConfig#setHtmlStyle(String)} method. - * - * @return The HTML page CSS contents. - */ - public String getHtmlStyle() { - return htmlStyle; - } - - /** - * The HTML page Javascript contents. - * - * <p> - * Defined by the {@link HtmlDoc#script()} annotation or {@link RestConfig#setHtmlScript(String)} method. - * - * @return The HTML page Javascript contents. - */ - public String getHtmlScript() { - return htmlScript; - } - - /** - * The HTML page head content. - * - * <p> - * Defined by the {@link HtmlDoc#head()} annotation or {@link RestConfig#setHtmlHead(String[])} method. - * - * @return The HTML page head content. - */ - public String[] getHtmlHead() { - return htmlHead; - } - - /** - * The HTML page nowrap setting. - * - * <p> - * Defined by the {@link HtmlDoc#nowrap()} annotation or {@link RestConfig#setHtmlNoWrap(boolean)} method. - * - * @return The HTML page nowrap setting. - */ - public boolean getHtmlNoWrap() { - return htmlNoWrap; - } - - /** - * The HTML page template. - * - * <p> - * Defined by the {@link HtmlDoc#template()} annotation or {@link RestConfig#setHtmlTemplate(Class)} method. - * - * @return The HTML page template. - */ - public HtmlDocTemplate getHtmlTemplate() { - return htmlTemplate; - } - - /** - * The HTML page no-results message. - * - * <p> - * Defined by the {@link HtmlDoc#noResultsMessage()} annotation or {@link RestConfig#setHtmlNoResultsMessage(String)} - * method. - * - * @return The HTML page no-results message. - */ - public String getHtmlNoResultsMessage() { - return htmlNoResultsMessage; - } - - /** - * The widgets used for resolving <js>"$W{...}"<js> variables. - * - * <p> - * Defined by the {@link HtmlDoc#widgets()} annotation or {@link RestConfig#addHtmlWidget(Class)} method. + * Returns the context values for the HTML doc view. * - * @return The var resolver widgets as a map with keys being the name returned by {@link Widget#getName()}. + * @return The context values for the HTML doc view. */ - public Map<String,Widget> getHtmlWidgets() { - return htmlWidgets; + public HtmlDocContext getHtmlDocContext() { + return htmlDocContext; } /**