You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2017/08/03 20:23:51 UTC

incubator-juneau git commit: New dark theme.

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 <ja...@apache.org>
Authored: Thu Aug 3 16:23:46 2017 -0400
Committer: JamesBognar <ja...@apache.org>
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