Repository: incubator-juneau Updated Branches: refs/heads/master 8825af8ad -> f0db7c99d
Add 'light' style and STYLES links to examples. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/f0db7c99 Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/f0db7c99 Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/f0db7c99 Branch: refs/heads/master Commit: f0db7c99d4c769de084b29f35c4a922d36050694 Parents: 8825af8 Author: JamesBognar <[email protected]> Authored: Tue Jul 4 12:54:09 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Tue Jul 4 12:54:09 2017 -0400 ---------------------------------------------------------------------- .../juneau/html/HtmlDocSerializerContext.java | 16 +- .../juneau/html/HtmlDocSerializerSession.java | 14 +- .../juneau/html/HtmlDocTemplateBasic.java | 8 +- .../doc-files/ReleaseNotes_631_DevopsStyle.png | Bin 0 -> 173865 bytes .../doc-files/ReleaseNotes_631_LightStyle.png | Bin 0 -> 187319 bytes .../ReleaseNotes_631_StyleMenuItem.png | Bin 0 -> 66839 bytes juneau-core/src/main/javadoc/overview.html | 36 +++- .../juneau/examples/rest/AtomFeedResource.java | 6 +- .../juneau/examples/rest/DirectoryResource.java | 5 +- .../examples/rest/JsonSchemaResource.java | 5 +- .../juneau/examples/rest/PetStoreResource.java | 6 +- .../examples/rest/RequestEchoResource.java | 5 +- .../juneau/examples/rest/RootResources.java | 4 +- .../examples/rest/SystemPropertiesResource.java | 4 +- .../juneau/examples/rest/TempDirResource.java | 5 +- .../rest/addressbook/AddressBookResource.java | 5 +- .../apache/juneau/microservice/Resource.java | 2 +- .../juneau/microservice/ResourceGroup.java | 2 +- .../juneau/microservice/ResourceJena.java | 2 +- .../juneau/microservice/ResourceJenaGroup.java | 2 +- .../java/org/apache/juneau/rest/CallMethod.java | 17 +- .../java/org/apache/juneau/rest/RestConfig.java | 12 +- .../org/apache/juneau/rest/RestContext.java | 14 +- .../org/apache/juneau/rest/RestRequest.java | 13 +- .../org/apache/juneau/rest/RestResponse.java | 6 +- .../apache/juneau/rest/RestServletDefault.java | 8 +- .../apache/juneau/rest/annotation/HtmlDoc.java | 6 +- .../rest/jena/RestServletJenaDefault.java | 2 +- .../java/org/apache/juneau/rest/package.html | 4 +- .../juneau/rest/widget/StyleMenuItem.java | 76 +++++++ .../org/apache/juneau/rest/styles/light.css | 211 +++++++++++++++++++ 31 files changed, 414 insertions(+), 82 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java index fa5070a..0fba6e3 100644 --- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java +++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerContext.java @@ -453,7 +453,7 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * <b>Configuration property:</b> Stylesheet import URLs. * * <ul> - * <li><b>Name:</b> <js>"HtmlDocSerializer.styleImport"</js> + * <li><b>Name:</b> <js>"HtmlDocSerializer.stylesheet"</js> * <li><b>Data type:</b> <code>List<String></code> * <li><b>Default:</b> empty list * <li><b>Session-overridable:</b> <jk>true</jk> @@ -463,17 +463,17 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { * Adds a link to the specified stylesheet URL. * * <p> - * Note that this stylesheet is controlled by the <code><ja>@RestResource</ja>.styleImport()</code> annotation. + * Note that this stylesheet is controlled by the <code><ja>@RestResource</ja>.stylesheet()</code> annotation. * * <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_styleImport = "HtmlDocSerializer.styleImport"; + public static final String HTMLDOC_stylesheet = "HtmlDocSerializer.stylesheet"; /** - * <b>Configuration property:</b> Add to the {@link #HTMLDOC_styleImport} property. + * <b>Configuration property:</b> Add to the {@link #HTMLDOC_stylesheet} property. */ - public static final String HTMLDOC_styleImport_add = "HtmlDocSerializer.styleImport.list.add"; + public static final String HTMLDOC_stylesheet_add = "HtmlDocSerializer.stylesheet.list.add"; /** * <b>Configuration property:</b> CSS style code. @@ -584,7 +584,7 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { public static final String HTMLDOC_template = "HtmlDocSerializer.template"; - final String[] style, styleImport, script; + final String[] style, stylesheet, script; final Map<String,Object> links; final String title, description, branding, header, nav, aside, footer, noResultsMessage; final boolean nowrap; @@ -601,7 +601,7 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { public HtmlDocSerializerContext(PropertyStore ps) { super(ps); style = ps.getProperty(HTMLDOC_style, String[].class, new String[0]); - styleImport = ps.getProperty(HTMLDOC_styleImport, String[].class, new String[0]); + stylesheet = ps.getProperty(HTMLDOC_stylesheet, String[].class, new String[0]); script = ps.getProperty(HTMLDOC_script, String[].class, new String[0]); title = ps.getProperty(HTMLDOC_title, String.class, null); description = ps.getProperty(HTMLDOC_description, String.class, null); @@ -629,7 +629,7 @@ public final class HtmlDocSerializerContext extends HtmlSerializerContext { .append("aside", aside) .append("footer", footer) .append("style", style) - .append("styleImport", styleImport) + .append("stylesheet", stylesheet) .append("nowrap", nowrap) .append("template", template) .append("noResultsMessage", noResultsMessage) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java index 19a3661..66dbe25 100644 --- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java @@ -35,7 +35,7 @@ import org.apache.juneau.serializer.*; public final class HtmlDocSerializerSession extends HtmlSerializerSession { private final String title, description, branding, header, nav, aside, footer, noResultsMessage; - private final String[] style, styleImport, script; + private final String[] style, stylesheet, script; private final Map<String,Object> links; private final boolean nowrap; private final HtmlDocTemplate template; @@ -78,7 +78,7 @@ public final class HtmlDocSerializerSession extends HtmlSerializerSession { footer = ctx.footer; links = ctx.links; style = ctx.style; - styleImport = ctx.styleImport; + stylesheet = ctx.stylesheet; script = ctx.script; nowrap = ctx.nowrap; noResultsMessage = ctx.noResultsMessage; @@ -94,7 +94,7 @@ public final class HtmlDocSerializerSession extends HtmlSerializerSession { Map m = op.getMap(HTMLDOC_links, ctx.links); links = ObjectUtils.isEmpty(m) ? null : new LinkedHashMap(m); style = op.getStringArray(HTMLDOC_style, ctx.style); - styleImport = op.getStringArray(HTMLDOC_styleImport, ctx.styleImport); + stylesheet = op.getStringArray(HTMLDOC_stylesheet, ctx.stylesheet); script = op.getStringArray(HTMLDOC_script, ctx.script); nowrap = op.getBoolean(HTMLDOC_nowrap, ctx.nowrap); noResultsMessage = op.getString(HTMLDOC_noResultsMessage, ctx.noResultsMessage); @@ -115,15 +115,15 @@ public final class HtmlDocSerializerSession extends HtmlSerializerSession { } /** - * Returns the {@link HtmlDocSerializerContext#HTMLDOC_styleImport} setting value in this context. + * Returns the {@link HtmlDocSerializerContext#HTMLDOC_stylesheet} setting value in this context. * * @return - * The {@link HtmlDocSerializerContext#HTMLDOC_styleImport} setting value in this context. + * The {@link HtmlDocSerializerContext#HTMLDOC_stylesheet} setting value in this context. * An empty array if not specified. * Never <jk>null</jk>. */ - public final String[] getStyleImport() { - return styleImport; + public final String[] getStylesheet() { + return stylesheet; } /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java index 326973f..4f21bb3 100644 --- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java +++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlDocTemplateBasic.java @@ -41,10 +41,10 @@ public class HtmlDocTemplateBasic implements HtmlDocTemplate { @Override /* HtmlDocTemplate */ public void style(HtmlDocSerializerSession session, HtmlWriter w, HtmlDocSerializer s, Object o) throws Exception { - String[] styleImport = session.getStyleImport(); - if (! ArrayUtils.contains("NONE", styleImport)) - for (String si : styleImport) - w.append(2, "@import ").q().append(session.resolveUri(si)).q().appendln("; "); + String[] stylesheet = session.getStylesheet(); + if (! ArrayUtils.contains("NONE", stylesheet)) + for (String ss : stylesheet) + w.append(2, "@import ").q().append(session.resolveUri(ss)).q().appendln("; "); if (session.isNoWrap()) w.appendln("div.data * {white-space:nowrap;} "); http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_DevopsStyle.png ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_DevopsStyle.png b/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_DevopsStyle.png new file mode 100644 index 0000000..9675ac8 Binary files /dev/null and b/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_DevopsStyle.png differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_LightStyle.png ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_LightStyle.png b/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_LightStyle.png new file mode 100644 index 0000000..600ee47 Binary files /dev/null and b/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_LightStyle.png differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_StyleMenuItem.png ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_StyleMenuItem.png b/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_StyleMenuItem.png new file mode 100644 index 0000000..8d216f4 Binary files /dev/null and b/juneau-core/src/main/javadoc/doc-files/ReleaseNotes_631_StyleMenuItem.png differ http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-core/src/main/javadoc/overview.html ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/javadoc/overview.html b/juneau-core/src/main/javadoc/overview.html index a8acd02..1a98047 100644 --- a/juneau-core/src/main/javadoc/overview.html +++ b/juneau-core/src/main/javadoc/overview.html @@ -574,10 +574,16 @@ {@link org.apache.juneau.ObjectList#serializeTo(java.io.Writer)} methods. <li> Passing them to one of the {@link org.apache.juneau.serializer.Serializer} serialize methods. + <li> + Simply calling the {@link org.apache.juneau.ObjectMap#toString()} or {@link org.apache.juneau.ObjectList#toString()} + methods which will serialize it as Simplified JSON. </ol> <p> Any valid JSON can be parsed into an unstructured model consisting of generic - {@link org.apache.juneau.ObjectMap} and {@link org.apache.juneau.ObjectList} objects. + {@link org.apache.juneau.ObjectMap} and {@link org.apache.juneau.ObjectList} objects. + <br> + (In theory, any valid XML can also be parsed into an unstructured model, although this has not been + officially 'tested') </p> <p class='bcode'> <jc>// Parse an arbitrary JSON document into an unstructered data model @@ -594,6 +600,9 @@ <jc>// Or convert it to XML.</jc> String xml = XmlSerializer.<jsf>DEFAULT</jsf>.serialize(m); + + <jc>// Or just use toString().</jc> + json = m.toString(); </p> <ul class='doctree'> <li class='info'> @@ -2185,7 +2194,7 @@ <jsm>link</jsm>(<js>"alternate"</js>, <js>"text/html"</js>, <js>"http://juneau.apache.org"</js>).hreflang(<js>"en"</js>), <jsm>link</jsm>(<js>"self"</js>, <js>"application/atom+xml"</js>, <js>"http://juneau.apache.org/feed.atom"</js>) ) - .rights(<js>"Copyright (c) 2016, Apache Foundation"</js>) + .rights(<js>"Copyright (c) ..."</js>) .generator( <jsm>generator</jsm>(<js>"Juneau"</js>).uri(<js>"http://juneau.apache.org/"</js>).version(<js>"1.0"</js>) ) @@ -2234,7 +2243,7 @@ <xt><link</xt> <xa>href</xa>=<xs>'http://juneau.apache.org/feed.atom'</xs> <xa>rel</xa>=<xs>'self'</xs> <xa>type</xa>=<xs>'application/atom+xml'</xs>/<xt>></xt> <xt><rights></xt> - Copyright (c) 2016, Apache Foundation + Copyright (c) ... <xt></rights></xt> <xt><title</xt> <xa>type</xa>=<xs>'text'</xs>></xt> Juneau ATOM specification @@ -2479,7 +2488,7 @@ }, <jc>// Our stylesheet for the HTML rendition.</jc> - styleImport=<js>"styles/devops.css"</js>, + stylesheet=<js>"styles/devops.css"</js>, <jc>// Support GZIP encoding on Accept-Encoding header.</jc> encoders=GzipEncoder.<jk>class</jk>, @@ -4681,7 +4690,7 @@ }, <jc>// Our stylesheet for the HTML rendition.</jc> - styleImport=<js>"styles/devops.css"</js>, + stylesheet=<js>"styles/devops.css"</js>, <jc>// Support GZIP encoding on Accept-Encoding header.</jc> encoders=GzipEncoder.<jk>class</jk>, @@ -5504,7 +5513,7 @@ <ja>@Property</ja>(name=<js>"DirectoryResource.allowDeletes"</js>, value=<js>"true"</js>), <ja>@Property</ja>(name=<js>"DirectoryResource.allowPuts"</js>, value=<js>"false"</js>) }, - styleImport=<js>"styles/devops.css"</js> + stylesheet=<js>"styles/devops.css"</js> ) <jk>public class</jk> TempDirResource <jk>extends</jk> DirectoryResource { <jk>private static final long</jk> <jsf>serialVersionUID</jsf> = 1L; @@ -5650,7 +5659,7 @@ <jk>new</jk> Link(<js>"alternate"</js>, <js>"text/html"</js>, <js>"http://juneau.apache.org/"</js>).setHreflang(<js>"en"</js>), <jk>new</jk> Link(<js>"self"</js>, <js>"application/atom+xml"</js>, <js>"http://juneau.apache.org/feed.atom"</js>) ) - .setRights(<jk>new</jk> Text(<js>"Copyright (c) 2016, Apache Foundation"</js>)) + .setRights(<jk>new</jk> Text(<js>"Copyright (c) ..."</js>)) .setGenerator(<jk>new</jk> Generator(<js>"Juneau"</js>).setUri(<jk>new</jk> URI(<js>"http://juneau.apache.org/"</js>)).setVersion(<js>"1.0"</js>)) .addEntries( <jk>new</jk> Entry() @@ -6842,7 +6851,7 @@ <ul> <li>{@link org.apache.juneau.html.HtmlDocSerializerContext#HTMLDOC_script HTMLDOC_script} <li>{@link org.apache.juneau.html.HtmlDocSerializerContext#HTMLDOC_style HTMLDOC_style} - Was <jsf>HTMLDOC_css</jsf>. - <li>{@link org.apache.juneau.html.HtmlDocSerializerContext#HTMLDOC_styleImport HTMLDOC_styleImport} - Was <jsf>HTMLDOC_cssUrl</jsf>. Now an array. + <li>{@link org.apache.juneau.html.HtmlDocSerializerContext#HTMLDOC_stylesheet HTMLDOC_stylesheet} - Was <jsf>HTMLDOC_cssUrl</jsf>. Now an array. </ul> <li> New {@link org.apache.juneau.utils.ResourceFinder} utility class. @@ -6853,6 +6862,11 @@ <h6 class='topic'>org.apache.juneau.rest</h6> <ul class='spaced-list'> <li> + New 'light' stylesheet: + <br><img src='doc-files/ReleaseNotes_631_LightStyle.png'> + <br>Compared with previous 'devops': + <br><img src='doc-files/ReleaseNotes_631_DevopsStyle.png'> + <li> Improvements made to the {@link org.apache.juneau.rest.widget.Widget} API. <ul> <li> @@ -6874,12 +6888,16 @@ of a search/view/order-by/page form: <br><img src='doc-files/ReleaseNotes_631_QueryMenuItem.png'> <br>Fields are now pre-filled with current query parameters. + <li> + New {@link org.apache.juneau.rest.widget.StyleMenuItem} widget that provides a pull-down menu + with hyperlinks to show the content in the default stylesheets: + <br><img src='doc-files/ReleaseNotes_631_StyleMenuItem.png'> </ul> <li> New/modified annotations on {@link org.apache.juneau.rest.annotation.HtmlDoc @HtmlDoc}: <ul> <li>{@link org.apache.juneau.rest.annotation.HtmlDoc#style() style()} - Renamed from <code>css()</code>. - <li>{@link org.apache.juneau.rest.annotation.HtmlDoc#styleImport() styleImport()} - Renamed from <code>cssUrl()</code>. + <li>{@link org.apache.juneau.rest.annotation.HtmlDoc#stylesheet() stylesheet()} - Renamed from <code>cssUrl()</code>. <br>Can now be a comma-delimited list of URLs. <li>{@link org.apache.juneau.rest.annotation.HtmlDoc#script() script()} - Add arbitrary Javascript to page header. </ul> http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java ---------------------------------------------------------------------- diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java index ad72535..ca25161 100644 --- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java +++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/AtomFeedResource.java @@ -33,10 +33,11 @@ import org.apache.juneau.rest.widget.*; title="Sample ATOM feed resource", description="Sample resource that shows how to render ATOM feeds", widgets={ - ContentTypeMenuItem.class + ContentTypeMenuItem.class, + StyleMenuItem.class }, htmldoc=@HtmlDoc( - links="{up:'request:/..',options:'servlet:/?method=OPTIONS',contentTypes:'$W{contentTypeMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/AtomFeedResource.java'}" + links="{up:'request:/..',options:'servlet:/?method=OPTIONS',contentTypes:'$W{contentTypeMenuItem}',styles:'$W{styleMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/AtomFeedResource.java'}" ), properties={ @Property(name=SERIALIZER_quoteChar, value="'"), @@ -61,7 +62,6 @@ public class AtomFeedResource extends ResourceJena { link("alternate", "text/html", "http://www.sample.com/").hreflang("en"), link("self", "application/atom+xml", "http://www.sample.com/feed.atom") ) - .rights("Copyright (c) 2016, Apache Foundation") .generator( generator("Juneau").uri("http://juneau.apache.org/").version("1.0") ) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java ---------------------------------------------------------------------- diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java index 86b8101..78123f9 100644 --- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java +++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/DirectoryResource.java @@ -37,10 +37,11 @@ import org.apache.juneau.utils.*; @RestResource( messages="nls/DirectoryResource", widgets={ - ContentTypeMenuItem.class + ContentTypeMenuItem.class, + StyleMenuItem.class }, htmldoc=@HtmlDoc( - links="{up:'request:/..',options:'servlet:/?method=OPTIONS',contentTypes:'$W{contentTypeMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/DirectoryResource.java'}" + links="{up:'request:/..',options:'servlet:/?method=OPTIONS',contentTypes:'$W{contentTypeMenuItem}',styles:'$W{styleMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/DirectoryResource.java'}" ), properties={ @Property(name=HTML_uriAnchorText, value=PROPERTY_NAME), http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java ---------------------------------------------------------------------- diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java index 62e7d5b..4120e22 100644 --- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java +++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/JsonSchemaResource.java @@ -26,10 +26,11 @@ import org.apache.juneau.rest.widget.*; title="Sample JSON-Schema document", description="Sample resource that shows how to generate JSON-Schema documents", widgets={ - ContentTypeMenuItem.class + ContentTypeMenuItem.class, + StyleMenuItem.class }, htmldoc=@HtmlDoc( - links="{up:'request:/..',options:'servlet:/?method=OPTIONS',contentTypes:'$W{contentTypeMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/JsonSchemaResource.java'}", + links="{up:'request:/..',options:'servlet:/?method=OPTIONS',contentTypes:'$W{contentTypeMenuItem}',styles:'$W{styleMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/JsonSchemaResource.java'}", aside="" + "<div style='min-width:200px' class='text'>" + " <p>Shows how to produce JSON-Schema documents in a variety of languages using the JSON-Schema DTOs.</p>" http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java ---------------------------------------------------------------------- diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java index 4144caf..26b2f03 100644 --- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java +++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/PetStoreResource.java @@ -36,10 +36,11 @@ import org.apache.juneau.transforms.*; description="An example of a typical REST resource where beans are rendered in summary and details views.", path="/petstore", widgets={ - ContentTypeMenuItem.class + ContentTypeMenuItem.class, + StyleMenuItem.class }, htmldoc=@HtmlDoc( - links="{up:'request:/..',options:'servlet:/?method=OPTIONS',contentTypes:'$W{contentTypeMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/PetStoreResource.java'}", + links="{up:'request:/..',options:'servlet:/?method=OPTIONS',contentTypes:'$W{contentTypeMenuItem}',styles:'$W{styleMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/PetStoreResource.java'}", aside="" + "<div style='max-width:400px' class='text'>" + " <p>This page shows a standard REST resource that renders bean summaries and details.</p>" @@ -85,6 +86,7 @@ public class PetStoreResource extends ResourceJena { + "options:'servlet:/?method=OPTIONS'," + "query:'$W{queryMenuItem}'," + "contentTypes:'$W{contentTypeMenuItem}'," + + "styles:'$W{styleMenuItem}'," + "source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/PetStoreResource.java'" + "}" ) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java ---------------------------------------------------------------------- diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java index 2df7a68..21e6118 100644 --- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java +++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RequestEchoResource.java @@ -33,10 +33,11 @@ import org.apache.juneau.transforms.*; title="Request echo service", description="Echos the current HttpServletRequest object back to the browser.", widgets={ - ContentTypeMenuItem.class + ContentTypeMenuItem.class, + StyleMenuItem.class }, htmldoc=@HtmlDoc( - links="{up:'request:/..',options:'servlet:/?method=OPTIONS',contentTypes:'$W{contentTypeMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/RequestEchoResource.java'}", + links="{up:'request:/..',options:'servlet:/?method=OPTIONS',contentTypes:'$W{contentTypeMenuItem}',styles:'$W{styleMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/RequestEchoResource.java'}", aside="" + "<div style='max-width:400px;min-width:200px' class='text'>" + " <p>Shows how even arbitrary POJOs such as <code>HttpServletRequest</code> can be serialized by the framework.</p>" http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java ---------------------------------------------------------------------- diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java index e16db4a..24d3c4b 100644 --- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java +++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/RootResources.java @@ -27,12 +27,14 @@ import org.apache.juneau.rest.widget.*; description="Example of a router resource page.", widgets={ PoweredByApacheWidget.class, - ContentTypeMenuItem.class + ContentTypeMenuItem.class, + StyleMenuItem.class }, htmldoc=@HtmlDoc( links="{" + "options:'?method=OPTIONS'," + "contentTypes:'$W{contentTypeMenuItem}'," + + "styles:'$W{styleMenuItem}'," + "source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/RootResources.java'" + "}", aside="" http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java ---------------------------------------------------------------------- diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java index e61ee9b..1976de4 100644 --- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java +++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/SystemPropertiesResource.java @@ -36,7 +36,8 @@ import org.apache.juneau.rest.widget.*; // Widget used for content-type pull-down menu. widgets={ - ContentTypeMenuItem.class + ContentTypeMenuItem.class, + StyleMenuItem.class }, // Links on the HTML rendition page. @@ -51,6 +52,7 @@ import org.apache.juneau.rest.widget.*; + "options:'servlet:/?method=OPTIONS'," + "form:'servlet:/formPage'," + "contentTypes:'$W{contentTypeMenuItem}'," + + "styles:'$W{styleMenuItem}'," + "source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/SystemPropertiesResource.java'" +"}", http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TempDirResource.java ---------------------------------------------------------------------- diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TempDirResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TempDirResource.java index 6529474..04732de 100644 --- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TempDirResource.java +++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/TempDirResource.java @@ -32,10 +32,11 @@ import org.apache.juneau.utils.*; title="Temp Directory View Service", description="View and download files in the '$S{java.io.tmpdir}' directory.", widgets={ - ContentTypeMenuItem.class + ContentTypeMenuItem.class, + StyleMenuItem.class }, htmldoc=@HtmlDoc( - links="{up:'request:/..',options:'servlet:/?method=OPTIONS',upload:'servlet:/upload',contentTypes:'$W{contentTypeMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/TempDirResource.java'}", + links="{up:'request:/..',options:'servlet:/?method=OPTIONS',upload:'servlet:/upload',contentTypes:'$W{contentTypeMenuItem}',styles:'$W{styleMenuItem}',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/TempDirResource.java'}", aside="" + "<div style='max-width:400px' class='text'>" + " <p>Shows how to use the predefined DirectoryResource class.</p>" http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java ---------------------------------------------------------------------- diff --git a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java index bcbe585..e6e4327 100644 --- a/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java +++ b/juneau-examples-rest/src/main/java/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java @@ -46,7 +46,8 @@ import org.apache.juneau.utils.*; // Widgets for $W variables above. widgets={ PoweredByJuneauWidget.class, - ContentTypeMenuItem.class + ContentTypeMenuItem.class, + StyleMenuItem.class }, // Links on the HTML rendition page. @@ -54,7 +55,7 @@ import org.apache.juneau.utils.*; // "servlet:/..." URIs are relative to the servlet URI. // "$C{...}" variables are pulled from the config file. htmldoc=@HtmlDoc( - links="{up:'request:/..',options:'servlet:/?method=OPTIONS',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java',contentTypes:'$W{contentTypeMenuItem}'}", + links="{up:'request:/..',options:'servlet:/?method=OPTIONS',source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java',contentTypes:'$W{contentTypeMenuItem}',styles:'$W{styleMenuItem}'}", aside="" + "<div style='max-width:400px;min-width:200px'>" + " <p>Proof-of-concept resource that shows off the capabilities of working with POJO resources.</p>" http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-microservice/src/main/java/org/apache/juneau/microservice/Resource.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/Resource.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/Resource.java index ec634e1..292eee8 100755 --- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/Resource.java +++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/Resource.java @@ -44,7 +44,7 @@ import org.apache.juneau.svl.vars.*; @RestResource( htmldoc=@HtmlDoc( links="{up:'request:/..',options:'servlet:/?method=OPTIONS'}", - styleImport="$C{REST/stylesheet,servlet:/styles/devops.css}" + stylesheet="$C{REST/stylesheet,servlet:/styles/devops.css}" ), config="$S{juneau.configFile}" ) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceGroup.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceGroup.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceGroup.java index d476bf2..5681ec3 100755 --- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceGroup.java +++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceGroup.java @@ -45,7 +45,7 @@ import org.apache.juneau.svl.vars.*; @RestResource( htmldoc=@HtmlDoc( links="{up:'request:/..',options:'servlet:/?method=OPTIONS'}", - styleImport="$C{REST/stylesheet,servlet:/styles/devops.css}" + stylesheet="$C{REST/stylesheet,servlet:/styles/devops.css}" ), config="$S{juneau.configFile}" ) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceJena.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceJena.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceJena.java index 458f858..4a319f1 100755 --- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceJena.java +++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceJena.java @@ -22,7 +22,7 @@ import org.apache.juneau.rest.jena.*; @RestResource( htmldoc=@HtmlDoc( links="{up:'request:/..',options:'servlet:/?method=OPTIONS'}", - styleImport="$C{REST/stylesheet,servlet:/styles/devops.css}" + stylesheet="$C{REST/stylesheet,servlet:/styles/devops.css}" ), config="$S{juneau.configFile}" ) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java index f9e1b96..719a4cd 100644 --- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java +++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/ResourceJenaGroup.java @@ -46,7 +46,7 @@ import org.apache.juneau.svl.vars.*; @RestResource( htmldoc=@HtmlDoc( links="{up:'request:/..',options:'servlet:/?method=OPTIONS'}", - styleImport="$C{REST/stylesheet,servlet:/styles/devops.css}" + stylesheet="$C{REST/stylesheet,servlet:/styles/devops.css}" ), config="$S{juneau.configFile}" ) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java b/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java index 04d60a2..2d3774c 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/CallMethod.java @@ -69,7 +69,7 @@ class CallMethod implements Comparable<CallMethod> { private final RestContext context; private final BeanContext beanContext; private final String htmlTitle, htmlDescription, htmlBranding, htmlHeader, htmlLinks, htmlNav, htmlAside, - htmlFooter, htmlStyle, htmlStyleImport, htmlScript, htmlNoResultsMessage; + htmlFooter, htmlStyle, htmlStylesheet, htmlScript, htmlNoResultsMessage; private final boolean htmlNoWrap; private final HtmlDocTemplate htmlTemplate; private final Map<String,Widget> widgets; @@ -113,7 +113,7 @@ class CallMethod implements Comparable<CallMethod> { this.htmlAside = b.htmlAside; this.htmlFooter = b.htmlFooter; this.htmlStyle = b.htmlStyle; - this.htmlStyleImport = b.htmlStyleImport; + this.htmlStylesheet = b.htmlStylesheet; this.htmlScript = b.htmlScript; this.htmlNoWrap = b.htmlNoWrap; this.htmlTemplate = b.htmlTemplate; @@ -123,7 +123,7 @@ class CallMethod implements Comparable<CallMethod> { private static class Builder { private String httpMethod, defaultCharset, description, tags, summary, externalDocs, htmlTitle, htmlDescription, - htmlBranding, htmlLinks, htmlNav, htmlAside, htmlFooter, htmlStyle, htmlStyleImport, htmlScript, htmlHeader, htmlNoResultsMessage; + htmlBranding, htmlLinks, htmlNav, htmlAside, htmlFooter, htmlStyle, htmlStylesheet, htmlScript, htmlHeader, htmlNoResultsMessage; private boolean htmlNoWrap; private HtmlDocTemplate htmlTemplate; private UrlPathPattern pathPattern; @@ -190,7 +190,7 @@ class CallMethod implements Comparable<CallMethod> { htmlAside = hd.aside().isEmpty() ? context.getHtmlAside() : hd.aside(); htmlFooter = hd.footer().isEmpty() ? context.getHtmlFooter() : hd.footer(); htmlStyle = hd.style().isEmpty() ? context.getHtmlStyle() : hd.style(); - htmlStyleImport = hd.styleImport().isEmpty() ? context.getHtmlStyleImport() : hd.styleImport(); + htmlStylesheet = hd.stylesheet().isEmpty() ? context.getHtmlStylesheet() : hd.stylesheet(); htmlScript = hd.script().isEmpty() ? context.getHtmlScript() : hd.script(); htmlNoWrap = hd.nowrap() ? hd.nowrap() : context.getHtmlNoWrap(); htmlNoResultsMessage = hd.noResultsMessage().isEmpty() ? context.getHtmlNoResultsMessage() : hd.header(); @@ -969,8 +969,13 @@ class CallMethod implements Comparable<CallMethod> { } return l; } - if (k.equals(HTMLDOC_styleImport)) - return htmlStyleImport == null ? null : req.resolveVars(htmlStyleImport); + if (k.equals(HTMLDOC_stylesheet)) { + String s = req.getStylesheet(); + // Exclude absolute URIs to stylesheets for security reasons. + if (s == null || isAbsoluteUri(s)) + s = htmlStylesheet; + return s == null ? null : req.resolveVars(s); + } if (k.equals(HTMLDOC_template)) return htmlTemplate; if (k.equals(HTMLDOC_nowrap)) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-rest/src/main/java/org/apache/juneau/rest/RestConfig.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestConfig.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestConfig.java index 3c43a8a..691136b 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestConfig.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestConfig.java @@ -113,7 +113,7 @@ public class RestConfig implements ServletConfig { List<Object> staticFiles; RestContext parentContext; String path, htmlTitle, htmlDescription, htmlBranding, htmlLinks, htmlHeader, htmlNav, htmlAside, htmlFooter, - htmlStyle, htmlStyleImport, htmlScript, htmlNoResultsMessage; + htmlStyle, htmlStylesheet, htmlScript, htmlNoResultsMessage; String clientVersionHeader = "X-Client-Version"; Object resourceResolver = RestResourceResolver.class; @@ -241,8 +241,8 @@ public class RestConfig implements ServletConfig { setHtmlFooter(hd.footer()); if (! hd.style().isEmpty()) setHtmlStyle(hd.style()); - if (! hd.styleImport().isEmpty()) - setHtmlStyleImport(hd.styleImport()); + if (! hd.stylesheet().isEmpty()) + setHtmlStylesheet(hd.stylesheet()); if (! hd.noResultsMessage().isEmpty()) setHtmlNoResultsMessage(hd.noResultsMessage()); if (hd.nowrap()) @@ -1399,13 +1399,13 @@ public class RestConfig implements ServletConfig { * by {@link UriResolver}. * * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#styleImport() @HtmlDoc.styleImport()} annotation. + * 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 setHtmlStyleImport(String value) { - this.htmlStyleImport = value; + public RestConfig setHtmlStylesheet(String value) { + this.htmlStylesheet = value; return this; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java index cd41c80..10bbc6a 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestContext.java @@ -358,7 +358,7 @@ public final class RestContext extends Context { htmlNav, htmlAside, htmlStyle, - htmlStyleImport, + htmlStylesheet, htmlScript, htmlFooter, htmlNoResultsMessage; @@ -473,7 +473,7 @@ public final class RestContext extends Context { this.htmlNav = b.htmlNav; this.htmlAside = b.htmlAside; this.htmlStyle = b.htmlStyle; - this.htmlStyleImport = b.htmlStyleImport; + this.htmlStylesheet = b.htmlStylesheet; this.htmlScript = b.htmlScript; this.htmlFooter = b.htmlFooter; this.htmlNoWrap = b.htmlNoWrap; @@ -653,7 +653,7 @@ public final class RestContext extends Context { UrlEncodingParser urlEncodingParser; EncoderGroup encoders; String clientVersionHeader = "", defaultCharset, paramFormat, htmlTitle, htmlDescription, htmlBranding, - htmlHeader, htmlLinks, htmlNav, htmlAside, htmlStyle, htmlStyleImport, htmlScript, htmlFooter, htmlNoResultsMessage; + htmlHeader, htmlLinks, htmlNav, htmlAside, htmlStyle, htmlStylesheet, htmlScript, htmlFooter, htmlNoResultsMessage; boolean htmlNoWrap; HtmlDocTemplate htmlTemplate; @@ -794,7 +794,7 @@ public final class RestContext extends Context { htmlNav = sc.htmlNav; htmlAside = sc.htmlAside; htmlStyle = sc.htmlStyle; - htmlStyleImport = sc.htmlStyleImport; + htmlStylesheet = sc.htmlStylesheet; htmlScript = sc.htmlScript; htmlFooter = sc.htmlFooter; htmlNoWrap = sc.htmlNoWrap; @@ -1100,12 +1100,12 @@ public final class RestContext extends Context { * The HTML page stylesheet URL. * * <p> - * Defined by the {@link HtmlDoc#styleImport()} annotation or {@link RestConfig#setHtmlStyleImport(String)} method. + * Defined by the {@link HtmlDoc#stylesheet()} annotation or {@link RestConfig#setHtmlStylesheet(String)} method. * * @return The HTML page CSS URL. */ - public String getHtmlStyleImport() { - return htmlStyleImport; + public String getHtmlStylesheet() { + return htmlStylesheet; } /** http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/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 161c578..cb58d86 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 @@ -69,7 +69,7 @@ public final class RestRequest extends HttpServletRequestWrapper { private final RestContext context; - private final String method; + private final String method, stylesheet; private RequestBody body; private Method javaMethod; private ObjectMap properties; @@ -120,6 +120,8 @@ public final class RestRequest extends HttpServletRequestWrapper { method = _method; + stylesheet = getQuery().getString("stylesheet"); + headers = new RequestHeaders(); for (Enumeration<String> e = getHeaderNames(); e.hasMoreElements();) { String name = e.nextElement(); @@ -597,6 +599,15 @@ public final class RestRequest extends HttpServletRequestWrapper { //-------------------------------------------------------------------------------- /** + * Returns the value of the <jk>"stylesheet"</js> parameter. + * + * @return The value of the <jk>"stylesheet"</js> parameter, or <jk>null</jk> if it wasn't specified. + */ + protected String getStylesheet() { + return stylesheet; + } + + /** * Returns the serializers associated with this request. * * @return The serializers associated with this request. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java index 9aa6672..f52f2c1 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestResponse.java @@ -802,7 +802,7 @@ public final class RestResponse extends HttpServletResponseWrapper { * by {@link UriResolver}. * * <p> - * This is the programmatic equivalent to the {@link HtmlDoc#styleImport() @HtmlDoc.styleImport()} annotation. + * This is the programmatic equivalent to the {@link HtmlDoc#stylesheet() @HtmlDoc.stylesheet()} annotation. * * @param value * The CSS URL in the HTML CSS style section. @@ -815,8 +815,8 @@ public final class RestResponse extends HttpServletResponseWrapper { * </ul> * @return This object (for method chaining). */ - public RestResponse setHtmlStyleImport(Object value) { - properties.put(HtmlDocSerializerContext.HTMLDOC_styleImport, value); + public RestResponse setHtmlStylesheet(Object value) { + properties.put(HtmlDocSerializerContext.HTMLDOC_stylesheet, value); return this; } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java index 32f2b18..0cbb5aa 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/RestServletDefault.java @@ -148,7 +148,7 @@ import org.apache.juneau.xml.*; * <h6 class='topic'>Other Notes</h6> * <ul class='spaced-list'> * <li> - * Provides a default HTML stylesheet by setting {@link HtmlDoc#styleImport() @HtmlDoc.styleImport()} + * Provides a default HTML stylesheet by setting {@link HtmlDoc#stylesheet() @HtmlDoc.stylesheet()} * to <js>"styles/juneau.css"</js>. * <li> * Provides a default favicon by setting {@link RestResource#favicon() @RestResource.favicon()} to @@ -191,12 +191,12 @@ import org.apache.juneau.xml.*; }, htmldoc=@HtmlDoc( branding="<a href='http://juneau.apache.org'><img src='$U{servlet:/htdocs/juneau.png}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'></a>", - styleImport="servlet:/styles/devops.css" + stylesheet="servlet:/styles/devops.css" ), - + // The location on the classpath or file system of the fav-icon. favicon="htdocs/juneau.png", - + // These are static files that are served up by the servlet under the specified sub-paths. staticFiles="{htdocs:'htdocs',styles:'styles'}" ) http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java index fe1a5de..d43fac8 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/annotation/HtmlDoc.java @@ -393,7 +393,7 @@ public @interface HtmlDoc { * <p class='bcode'> * <ja>@RestResource</ja>( * htmldoc=<ja>@HtmlDoc</ja>( - * cssUrl=<js>"http://someOtherHost/stealTheir.css"</js> + * stylesheet=<js>"http://someOtherHost/stealTheir.css"</js> * ) * ) * </p> @@ -404,9 +404,9 @@ public @interface HtmlDoc { * * <p> * The programmatic equivalent to this annotation are the - * {@link RestConfig#setHtmlStyleImport(String)}/{@link RestResponse#setHtmlStyleImport(Object)} methods. + * {@link RestConfig#setHtmlStylesheet(String)}/{@link RestResponse#setHtmlStylesheet(Object)} methods. */ - String styleImport() default ""; + String stylesheet() default ""; /** * Sets the HTML script section contents. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/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 2f9e420..327d6d1 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 @@ -246,7 +246,7 @@ import org.apache.juneau.xml.*; }, htmldoc=@HtmlDoc( branding="<a href='http://juneau.apache.org'><img src='$U{servlet:/htdocs/juneau.png}' style='position:absolute;top:5;right:5;background-color:transparent;height:30px'></a>", - styleImport="servlet:/styles/devops.css" + stylesheet="servlet:/styles/devops.css" ), favicon="htdocs/juneau.png", staticFiles="{htdocs:'htdocs',styles:'styles'}" http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/juneau-rest/src/main/java/org/apache/juneau/rest/package.html ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/package.html b/juneau-rest/src/main/java/org/apache/juneau/rest/package.html index c2a7328..65e611a 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/package.html +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/package.html @@ -2718,7 +2718,7 @@ <ja>@RestResource</ja>( <jc>// Get stylesheet from myconfig.cfg, but default to devops.css if it's not specified</jc> htmldoc=<ja>@HtmlDoc</ja>( - styleImport=<js>"$C{MyServlet/stylesheet,servlet:/styles/devops.css}"</js>, + stylesheet=<js>"$C{MyServlet/stylesheet,servlet:/styles/devops.css}"</js>, ) ... ) @@ -3439,7 +3439,7 @@ links=<js>"{up:'request:/..', options:'servlet:/?method=OPTIONS', source:'$C{Source/gitHub}/org/apache/juneau/examples/rest/addressbook/AddressBookResource.java'}"</js> <jc>// Our stylesheet for the HTML rendition.</jc> - styleImport=<js>"servlet:/styles/devops.css"</js>, + stylesheet=<js>"servlet:/styles/devops.css"</js>, ), <jc>// Properties that get applied to all serializers and parsers.</jc> http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/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 new file mode 100644 index 0000000..92af31f --- /dev/null +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java @@ -0,0 +1,76 @@ +// *************************************************************************************************************************** +// * 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.widget; + +import org.apache.juneau.*; +import org.apache.juneau.rest.*; + +/** + * Widget that returns back a list of hyperlinks for rendering the contents of a page in the various default styles. + * + * <p> + * The variable it resolves is <js>"$W{styleMenuItem}"</js>. + * + * <p> + * An example of this widget can be found in the <code>PetStoreResource</code> in the examples that provides + * a drop-down menu item for rendering all other supported content types in plain text: + * <p class='bcode'> + * <ja>@RestMethod</ja>( + * name=<js>"GET"</js>, + * path=<js>"/"</js>, + * widgets={ + * StyleMenuItem.<jk>class</jk>, + * }, + * htmldoc=<ja>@HtmlDoc</ja>( + * links=<js>"{up:'...',options:'...',query:'...',contentTypes:'...',style='$W{styleMenuItem}',source:'...'}"</js> + * ) + * ) + * <jk>public</jk> Collection<Pet> getPets() { + * </p> + */ +public class StyleMenuItem extends MenuItemWidget { + + private static final String[] BUILT_IN_STYLES = {"devops", "light"}; + + /** + * Returns <js>"styleMenuItem"</js>. + */ + @Override /* Widget */ + public String getName() { + return "styleMenuItem"; + } + + /** + * Looks at the supported media types from the request and constructs a list of hyperlinks to render the data + * as plain-text. + */ + @Override /* Widget */ + public String getHtml(RestRequest req) throws Exception { + UriResolver r = req.getUriResolver(); + StringBuilder sb = new StringBuilder(); + sb.append("" + + "<div class='menu-item'>" + + "\n\t<a class='link' onclick='menuClick(this)'>styles</a>" + + "\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>"); + } + sb.append("" + + "\n\t</div>" + + "\n</div>" + ); + return sb.toString(); + } +} http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/f0db7c99/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 new file mode 100644 index 0000000..f261cf7 --- /dev/null +++ b/juneau-rest/src/main/resources/org/apache/juneau/rest/styles/light.css @@ -0,0 +1,211 @@ +/*************************************************************************************************************************** + * 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. * + ***************************************************************************************************************************/ + +/**********************************************************************************************************************/ +/** Sections **/ +/**********************************************************************************************************************/ +html { +} +body { + background-color: white; + margin: 0px; + font-size: 11pt; + font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif; + color: #2c4557; + height: 100%; +} +header { + background-color: #e8ebef; + font-size: 14pt; + 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; + white-space: nowrap; +} +header * { + color: #af2222;; + font-weight: lighter; +} +nav { + margin: 10px; + padding: 5px; + box-shadow: 5px 5px 2px #999999; + color: #2c4557; + background-color: #eef3f7; + font-size: 1.0em; + font-weight: lighter; +} +section { + display: table; + width: 100%; +} +article { + display: table-cell; +} +aside { + display: table-cell; + vertical-align: top; + padding: 20px 20px; +} +footer { + padding: 10px; + width: 100%; + bottom: 0; + position: fixed; + background-color: #e8ebef; +} + +/**********************************************************************************************************************/ +/** Page elements **/ +/**********************************************************************************************************************/ + +/* Hyperlinks */ +.link { + font-size: 10pt; + color: #2c4557; + text-decoration: none; + margin: 0px 10px; + text-transform: uppercase; + cursor: pointer; +} +.link:active, .link:hover { + text-decoration: none; + color: #94a3ab; +} + +/* Title */ +h3.title { +} +h3.title, h3.title * { + margin: 0px; + padding: 0px; +} + +/* Description */ +h5.description { +} +h5.description, h5.description * { + margin: 0px; + padding: 0px; +} + +/************************************************************************************/ +/** Pop-ups **/ +/************************************************************************************/ + +.popup-content { + display: none; + position: absolute; + background-color: #eef3f7; + white-space: nowrap; + padding: 5px; + box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5); + z-index: 1; + margin-top: 10px; + border-radius: 4px; +} + +.popup-content * { + color: black; + font-size: 10pt; +} + +.popup-content a:hover { + color: #94A3AB; +} + + +.popup-show {display:block;} + + +/************************************************************************************/ +/** Data section **/ +/************************************************************************************/ +div.outerdata { + width: 100%; + height: 100%; +} + +div.data { + padding:10px; + border-radius: 4px; + margin: 15px 30px; + display: inline-block; + overflow-x: auto; + color:#26343F; +} +div.data * { + font-size: 9pt; + color: #26343F; +} +div.data td { + vertical-align: top; + border-bottom:1px solid #d9dcde; + border-right:1px solid #d9dcde; + padding:0.2em 0.5em; +} + + +/************************************************************************************/ +/** Other **/ +/************************************************************************************/ + +table { + border: none; +} + +div.data a { + color: #416e8e; + text-decoration: none; +} + +div.data a:hover { + text-decoration: underline; +} + +div.data th, .header { + padding: 4px 8px; + font-weight: bold; + text-align:center; + background-color: #eef3f7; + box-shadow: 1px 1px 2px #999999; +} + +div.data ul { + margin:0px; + padding-left:20px; +} + +div.data textarea, pre { + -moz-tab-size:3; + -o-tab-size:3; + -webkit-tab-size:3; + tab-size:3; +} + +.table { + display:table; +} +.row {display:table-row;} +.cell {display:table-cell;} +.monospace {font-family:monospace;} + +iframe.output { + background-color: #F6F7F9; + border: 1px solid gray; + padding: 0px; + overflow: hidden; + width:100%; + min-height:400px; +} \ No newline at end of file
