Repository: incubator-juneau Updated Branches: refs/heads/master 3f929b0a1 -> 4b4da6d83
New dark theme. Project: http://git-wip-us.apache.org/repos/asf/incubator-juneau/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-juneau/commit/4b4da6d8 Tree: http://git-wip-us.apache.org/repos/asf/incubator-juneau/tree/4b4da6d8 Diff: http://git-wip-us.apache.org/repos/asf/incubator-juneau/diff/4b4da6d8 Branch: refs/heads/master Commit: 4b4da6d83913dfaa975c2acc8bf913266c03bd37 Parents: 3f929b0 Author: JamesBognar <[email protected]> Authored: Thu Aug 3 16:23:46 2017 -0400 Committer: JamesBognar <[email protected]> Committed: Thu Aug 3 16:23:46 2017 -0400 ---------------------------------------------------------------------- .../juneau/html/HtmlBeanPropertyMeta.java | 19 +- .../juneau/html/HtmlSerializerSession.java | 31 ++- .../org/apache/juneau/html/annotation/Html.java | 20 ++ .../org/apache/juneau/internal/StringUtils.java | 3 + juneau-core/src/main/javadoc/overview.html | 7 +- .../juneau/microservice/RestMicroservice.java | 7 +- .../apache/juneau/rest/RestServletDefault.java | 2 +- .../rest/jena/RestServletJenaDefault.java | 2 +- .../juneau/rest/widget/StyleMenuItem.java | 2 +- .../org/apache/juneau/rest/styles/dark.css | 265 +++++++++++++++++++ 10 files changed, 346 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4b4da6d8/juneau-core/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java index 15e6ae4..2bceb2a 100644 --- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java +++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java @@ -25,7 +25,7 @@ public final class HtmlBeanPropertyMeta extends BeanPropertyMetaExtended { private final boolean asXml, noTables, noTableHeaders, asPlainText; private final HtmlRender render; - private final String link; + private final String link, anchorText; /** * Constructor. @@ -49,12 +49,13 @@ public final class HtmlBeanPropertyMeta extends BeanPropertyMetaExtended { this.asPlainText = b.asPlainText; this.render = ClassUtils.newInstance(HtmlRender.class, b.render); this.link = b.link; + this.anchorText = b.anchorText; } private static class Builder { boolean asXml, noTables, noTableHeaders, asPlainText; Class<? extends HtmlRender> render = HtmlRender.class; - String link; + String link, anchorText; void findHtmlInfo(Html html) { if (html == null) @@ -71,6 +72,8 @@ public final class HtmlBeanPropertyMeta extends BeanPropertyMetaExtended { render = html.render(); if (! html.link().isEmpty()) link = html.link(); + if (! html.anchorText().isEmpty()) + anchorText = html.anchorText(); } } @@ -139,4 +142,16 @@ public final class HtmlBeanPropertyMeta extends BeanPropertyMetaExtended { public String getLink() { return link; } + + /** + * Specifies the anchor text for this property. + * + * <p> + * This value is specified via the {@link Html#anchorText()} annotation. + * + * @return The link string, or <jk>null</jk> if not specified. + */ + public String getAnchorText() { + return anchorText; + } } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4b4da6d8/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java index 7ec11d6..8d38885 100644 --- a/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java +++ b/juneau-core/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java @@ -438,6 +438,7 @@ public class HtmlSerializerSession extends XmlSerializerSession { out.ie(i).eTag("table").nl(i); } + @SuppressWarnings("hiding") private void serializeBeanMap(HtmlWriter out, BeanMap<?> m, ClassMeta<?> eType, BeanPropertyMeta ppMeta) throws Exception { int i = indent; @@ -470,7 +471,14 @@ public class HtmlSerializerSession extends XmlSerializerSession { if (canIgnoreValue(cMeta, key, value)) continue; - String link = cMeta.isCollectionOrArray() ? null : getLink(pMeta); + String link = null, anchorText = null; + if (! cMeta.isCollectionOrArray()) { + link = m.resolveVars(getLink(pMeta)); + anchorText = m.resolveVars(getAnchorText(pMeta)); + } + + if (anchorText != null) + value = anchorText; out.sTag(i+1, "tr").nl(i+1); out.sTag(i+2, "td").text(key).eTag("td").nl(i+2); @@ -482,7 +490,7 @@ public class HtmlSerializerSession extends XmlSerializerSession { try { if (link != null) - out.oTag(i+3, "a").attrUri("href", m.resolveVars(link)).cTag(); + out.oTag(i+3, "a").attrUri("href", link).cTag(); ContentResult cr = serializeAnything(out, value, cMeta, key, 2, pMeta, false); if (cr == CR_NORMAL) out.i(i+2); @@ -502,7 +510,7 @@ public class HtmlSerializerSession extends XmlSerializerSession { out.ie(i).eTag("table").nl(i); } - @SuppressWarnings({ "rawtypes", "unchecked" }) + @SuppressWarnings({ "rawtypes", "unchecked", "hiding" }) private void serializeCollection(HtmlWriter out, Object in, ClassMeta<?> sType, ClassMeta<?> eType, String name, BeanPropertyMeta ppMeta) throws Exception { @@ -586,15 +594,24 @@ public class HtmlSerializerSession extends XmlSerializerSession { for (Object k : th) { BeanMapEntry p = m2.getProperty(toString(k)); BeanPropertyMeta pMeta = p.getMeta(); - String link = pMeta.getClassMeta().isCollectionOrArray() ? null : getLink(pMeta); Object value = p.getValue(); + + String link = null, anchorText = null; + if (! pMeta.getClassMeta().isCollectionOrArray()) { + link = m2.resolveVars(getLink(pMeta)); + anchorText = m2.resolveVars(getAnchorText(pMeta)); + } + + if (anchorText != null) + value = anchorText; + String style = getStyle(this, pMeta, value); out.oTag(i+2, "td"); if (style != null) out.attr("style", style); out.cTag(); if (link != null) - out.oTag("a").attrUri("href", m2.resolveVars(link)).cTag(); + out.oTag("a").attrUri("href", link).cTag(); ContentResult cr = serializeAnything(out, value, pMeta.getClassMeta(), p.getKey().toString(), 2, pMeta, false); if (cr == CR_NORMAL) out.i(i+2); @@ -654,6 +671,10 @@ public class HtmlSerializerSession extends XmlSerializerSession { return pMeta == null ? null : pMeta.getExtendedMeta(HtmlBeanPropertyMeta.class).getLink(); } + private static String getAnchorText(BeanPropertyMeta pMeta) { + return pMeta == null ? null : pMeta.getExtendedMeta(HtmlBeanPropertyMeta.class).getAnchorText(); + } + /* * Returns the table column headers for the specified collection of objects. * Returns null if collection should not be serialized as a 2-dimensional table. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4b4da6d8/juneau-core/src/main/java/org/apache/juneau/html/annotation/Html.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/html/annotation/Html.java b/juneau-core/src/main/java/org/apache/juneau/html/annotation/Html.java index b385ac7..f87dfef 100644 --- a/juneau-core/src/main/java/org/apache/juneau/html/annotation/Html.java +++ b/juneau-core/src/main/java/org/apache/juneau/html/annotation/Html.java @@ -98,4 +98,24 @@ public @interface Html { * </p> */ String link() default ""; + + /** + * Use the specified anchor text when serializing a URI. + * + * <p> + * The text can contain any bean property values resolved through variables of the form <js>"{property-name}"</js>. + * + * <h6 class='figure'>Example:</h6> + * <p class='bcode'> + * <jk>public class</jk> FileSpace { + * + * <ja>@Html</ja>(anchorText=<js>"drive/{drive}"</js>) + * <jk>public</jk> String getDrive() { + * ...; + * } + * } + * </p> + */ + String anchorText() default ""; + } http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4b4da6d8/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java ---------------------------------------------------------------------- diff --git a/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java b/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java index 72ffcc8..00cbd6f 100644 --- a/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java +++ b/juneau-core/src/main/java/org/apache/juneau/internal/StringUtils.java @@ -1010,6 +1010,9 @@ public final class StringUtils { */ public static String replaceVars(String s, Map<String,Object> m) { + if (s == null) + return null; + if (s.indexOf('{') == -1) return s; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4b4da6d8/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 cbe82f4..0d9af96 100644 --- a/juneau-core/src/main/javadoc/overview.html +++ b/juneau-core/src/main/javadoc/overview.html @@ -6920,6 +6920,8 @@ <li> New {@link org.apache.juneau.utils.CalendarUtils} class that encapsulates serialization/parsing logic from {@link org.apache.juneau.transforms.CalendarSwap} and {@link org.apache.juneau.transforms.DateSwap}. + <li> + New annotation {@link org.apache.juneau.html.Html#anchorText}. </ul> <h6 class='topic'>org.apache.juneau.rest</h6> @@ -6952,6 +6954,9 @@ </ul> <li> New tooltip template: {@link org.apache.juneau.rest.widget.Tooltip} + <li> + New dark theme: + <br><img src='doc-files/ReleaseNotes_632_DarkStyle.png'> </ul> <h6 class='topic'>org.apache.juneau.rest.microservice</h6> @@ -6977,7 +6982,7 @@ <!-- ======================================================================================================== --> <a id="6.3.1"></a> - <h3 class='topic' onclick='toggle(this)'>6.3.1 (TBD)</h3> + <h3 class='topic' onclick='toggle(this)'>6.3.1 (Aug 1, 2017)</h3> <div class='topic'> <p> Juneau 6.3.1 is a minor release. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4b4da6d8/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java ---------------------------------------------------------------------- diff --git a/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java b/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java index cea6e5a..cc566f6 100755 --- a/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java +++ b/juneau-microservice/src/main/java/org/apache/juneau/microservice/RestMicroservice.java @@ -115,7 +115,12 @@ public class RestMicroservice extends Microservice { @Override /* Microservice */ public RestMicroservice start() throws Exception { super.start(); - initLogging(); + try { + initLogging(); + } catch (Exception e) { + // If logging fails, just log a stack trace. + e.printStackTrace(); + } createServer(); startServer(); return this; http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4b4da6d8/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 926b277..a189aff 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 @@ -195,7 +195,7 @@ import org.apache.juneau.xml.*; "<h2>$R{methodSummary,$R{servletDescription}}</h2>", "<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>" }, - stylesheet="servlet:/styles/devops.css" + stylesheet="servlet:/styles/light.css" ), // The location on the classpath or file system of the fav-icon. http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4b4da6d8/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 8780662..1affec4 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 @@ -250,7 +250,7 @@ import org.apache.juneau.xml.*; "<h2>$R{methodSummary,$R{servletDescription}}</h2>", "<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>" }, - stylesheet="servlet:/styles/devops.css" + stylesheet="servlet:/styles/light.css" ), favicon="htdocs/juneau.png", staticFiles="{htdocs:'htdocs',styles:'styles'}" http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4b4da6d8/juneau-rest/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java b/juneau-rest/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java index 7ba89d0..de6e7f6 100644 --- a/juneau-rest/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java +++ b/juneau-rest/src/main/java/org/apache/juneau/rest/widget/StyleMenuItem.java @@ -50,7 +50,7 @@ import org.apache.juneau.utils.*; */ public class StyleMenuItem extends MenuItemWidget { - private static final String[] BUILT_IN_STYLES = {"devops", "light", "original"}; + private static final String[] BUILT_IN_STYLES = {"devops", "light", "original", "dark"}; @Override /* MenuItemWidget */ public String getLabel(RestRequest req) { http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/4b4da6d8/juneau-rest/src/main/resources/org/apache/juneau/rest/styles/dark.css ---------------------------------------------------------------------- diff --git a/juneau-rest/src/main/resources/org/apache/juneau/rest/styles/dark.css b/juneau-rest/src/main/resources/org/apache/juneau/rest/styles/dark.css new file mode 100644 index 0000000..5237dc2 --- /dev/null +++ b/juneau-rest/src/main/resources/org/apache/juneau/rest/styles/dark.css @@ -0,0 +1,265 @@ +/*************************************************************************************************************************** + * 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. * + ***************************************************************************************************************************/ + +/**********************************************************************************************************************/ +/** Body **/ +/**********************************************************************************************************************/ + +body { + background-color: #212121 ; + margin: 0px; + font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif; + color: #EEE; + height: 100%; +} + +body { + font-size: 14px; +} + +body textarea, body pre { + -moz-tab-size: 3; + -o-tab-size: 3; + -webkit-tab-size: 3; + tab-size: 3; +} + +/**********************************************************************************************************************/ +/** Header **/ +/**********************************************************************************************************************/ + +header { + background-color: #373a3c; +} + +header * { + font-size: 14px; + color: #B3B3B3; + margin: 0px; + text-decoration: none; + font-weight: normal; +} + +header h1 { + padding: 10px 20px; + font-size: 16px; + border-bottom: 2px solid #000000; + color: white; +} + +header h2 { + padding: 10px 20px; + font-size: 14px; + border-bottom: 2px solid #000000; +} + +/**********************************************************************************************************************/ +/** Nav **/ +/**********************************************************************************************************************/ + +nav { + margin: 10px 20px 10px 20px; + color: #94A3AB; +} + +nav>ol { + list-style-type: none; + margin: 0px 10px; + padding: 0px; +} + +nav>ol>li { + display: inline; +} + +nav li:not(:first-child):before { + content: " - "; +} + +nav a { + font-size: 10pt; + color: #94A3AB; + text-decoration: none; + margin: 0px 15px; + text-transform: uppercase; + cursor: pointer; +} + +nav a:active, nav a:hover { + color: white; + text-decoration: underline; +} + +/**********************************************************************************************************************/ +/** Content **/ +/**********************************************************************************************************************/ + +section { + display: table; + width: 100%; + margin-bottom: 50px; +} + +article { + display: table-cell; +} + +article * { + font-size: 9pt; + color: #EEE; +} + +article div.data { + padding: 10px; + background-color: #373a3c; + border-radius: 4px; + margin: 20px; + display: inline-block; + box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5); + font-family: sans-serif; + color: #26343F; +} + +article table { + border: none; +} + +article th { + padding: 4px 8px; + font-weight: normal; + text-align: center; + background-color: #0275d8; +} + +article td { + vertical-align: top; + border-bottom: 1px solid #000000; + border-right: 1px solid #000000; + padding: 2px 5px; +} + +article ul { + margin: 0px; + padding-left: 20px; +} + +article a { + color: #3d8bb5; + text-decoration: none; +} + +article a:hover { + text-decoration: underline; +} + +article iframe { + background-color: #F6F7F9; + border: 1px solid gray; + padding: 0px; + overflow: hidden; + width: 100%; + min-height: 400px; +} + +aside { + display: table-cell; + vertical-align: top; + padding: 20px 20px; +} + +/**********************************************************************************************************************/ +/** Footer **/ +/**********************************************************************************************************************/ + +footer { + padding: 10px; + width: 100%; + bottom: 0; + position: fixed; + background-color: #373a3c; +} + +/**********************************************************************************************************************/ +/** Popup windows **/ +/**********************************************************************************************************************/ + +.popup-content { + display: none; + position: absolute; + background-color: #f4f6f9; + 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: 11px; +} + +.popup-content a:hover { + color: #94A3AB; +} + +.popup-show { + display:block; +} + +/**********************************************************************************************************************/ +/** Tooltips **/ +/**********************************************************************************************************************/ + +.tooltip { + position: relative; + display: inline-block; +} + +.tooltip .tooltiptext { + visibility: hidden; + background-color: #FEF9E7; + color: black; + padding: 5px; + border-radius: 6px; + position: absolute; + z-index: 1; + top: 0; + left: 0; + margin-left: 30px; + box-shadow: 2px 3px 3px 0px rgba(0, 0, 0, 0.5); + opacity: 0; + transition: opacity 0.5s; + font-weight: normal; +} + +.tooltip:hover .tooltiptext { + visibility: visible; + opacity: 1; +} + +.tooltiptext { + white-space: nowrap; + float: left; + border: 1px solid black; +} + +/**********************************************************************************************************************/ +/** Other classes **/ +/**********************************************************************************************************************/ + +.table {display:table;} +.row {display:table-row;} +.cell {display:table-cell;} +.monospace {font-family:monospace;} \ No newline at end of file
