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 2023/08/28 15:48:57 UTC

[juneau] branch master updated: JUNEAU-249 UI does not resolve variables anymore

This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 2b1641f3f JUNEAU-249 UI does not resolve variables anymore
2b1641f3f is described below

commit 2b1641f3f153725aca750ab59a60cf1d127240f7
Author: JamesBognar <ja...@salesforce.com>
AuthorDate: Mon Aug 28 11:46:07 2023 -0400

    JUNEAU-249 UI does not resolve variables anymore
---
 .../apache/juneau/html/BasicHtmlDocTemplate.java   |  9 ++++++
 .../org/apache/juneau/html/HtmlDocSerializer.java  | 32 ++++++++++++++++++++--
 .../juneau/html/HtmlDocSerializerSession.java      | 11 ++++++++
 .../java/org/apache/juneau/html/HtmlWriter.java    |  8 ++++++
 .../juneau/html/annotation/HtmlDocConfig.java      | 21 ++++++++++++++
 .../html/annotation/HtmlDocConfigAnnotation.java   |  1 +
 .../apache/juneau/serializer/SerializerWriter.java | 14 ++++++++++
 .../main/java/org/apache/juneau/xml/XmlWriter.java | 11 ++++++++
 .../a/rttests/RoundTripAddClassAttrsTest.java      |  2 +-
 9 files changed, 106 insertions(+), 3 deletions(-)

diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java
index 4261aab0a..4071405fd 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/BasicHtmlDocTemplate.java
@@ -13,6 +13,7 @@
 package org.apache.juneau.html;
 
 import static org.apache.juneau.html.AsideFloat.*;
+import static org.apache.juneau.common.internal.StringUtils.*;
 
 import org.apache.juneau.internal.*;
 
@@ -262,6 +263,14 @@ public class BasicHtmlDocTemplate implements HtmlDocTemplate {
 		} else {
 			session.indent = 6;
 			w.flush();
+			if (session.isResolveBodyVars()) {
+				w = new HtmlWriter(w) {
+					@Override
+					public HtmlWriter text(Object value, boolean preserveWhitespace) {
+						return super.text(session.resolve(stringify(value)), preserveWhitespace);
+					}
+				};
+			}
 			session.parentSerialize(w, o);
 		}
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
index 8415e217e..190d9832f 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializer.java
@@ -112,7 +112,7 @@ public class HtmlDocSerializer extends HtmlStrippedDocSerializer {
 		List<String> aside, footer, head, header, nav, navlinks, script, style, stylesheet;
 		AsideFloat asideFloat;
 		String noResultsMessage;
-		boolean nowrap;
+		boolean nowrap, resolveBodyVars;
 		Class<? extends HtmlDocTemplate> template;
 		List<Class<? extends HtmlWidget>> widgets;
 
@@ -146,6 +146,7 @@ public class HtmlDocSerializer extends HtmlStrippedDocSerializer {
 			asideFloat = copyFrom.asideFloat;
 			noResultsMessage = copyFrom.noResultsMessage;
 			nowrap = copyFrom.nowrap;
+			resolveBodyVars = copyFrom.resolveBodyVars;
 			template = copyFrom.template;
 			widgets = copy(copyFrom.widgets);
 		}
@@ -169,6 +170,7 @@ public class HtmlDocSerializer extends HtmlStrippedDocSerializer {
 			asideFloat = copyFrom.asideFloat;
 			noResultsMessage = copyFrom.noResultsMessage;
 			nowrap = copyFrom.nowrap;
+			resolveBodyVars = copyFrom.resolveBodyVars;
 			template = copyFrom.template;
 			widgets = copy(copyFrom.widgets);
 		}
@@ -199,6 +201,7 @@ public class HtmlDocSerializer extends HtmlStrippedDocSerializer {
 				asideFloat,
 				noResultsMessage,
 				nowrap,
+				resolveBodyVars,
 				template,
 				widgets
 			);
@@ -599,6 +602,30 @@ public class HtmlDocSerializer extends HtmlStrippedDocSerializer {
 			return this;
 		}
 
+		/**
+		 * Resolve $ variables in serialized POJO.
+		 *
+		 * @return This object.
+		 */
+		@FluentSetter
+		public Builder resolveBodyVars() {
+			return resolveBodyVars(true);
+		}
+
+		/**
+		 * Same as {@link #resolveBodyVars()} but allows you to explicitly specify the boolean value.
+		 *
+		 * @param value
+		 * 	The new value for this property.
+		 * @return This object.
+		 * @see #nowrap()
+		 */
+		@FluentSetter
+		public Builder resolveBodyVars(boolean value) {
+			resolveBodyVars = value;
+			return this;
+		}
+
 		/**
 		 * Adds the specified Javascript code to the HTML page.
 		 *
@@ -1631,7 +1658,7 @@ public class HtmlDocSerializer extends HtmlStrippedDocSerializer {
 	final String[] style, stylesheet, script, navlinks, head, header, nav, aside, footer;
 	final AsideFloat asideFloat;
 	final String noResultsMessage;
-	final boolean nowrap;
+	final boolean nowrap, resolveBodyVars;
 	final Class<? extends HtmlDocTemplate> template;
 	final List<Class<? extends HtmlWidget>> widgets;
 
@@ -1660,6 +1687,7 @@ public class HtmlDocSerializer extends HtmlStrippedDocSerializer {
 		asideFloat = builder.asideFloat;
 		noResultsMessage = builder.noResultsMessage;
 		nowrap = builder.nowrap;
+		resolveBodyVars = builder.resolveBodyVars;
 		template = builder.template;
 		widgets = builder.widgets == null ? emptyList() : copyOf(builder.widgets);
 
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
index 5aabd54b2..05a77260d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlDocSerializerSession.java
@@ -367,6 +367,17 @@ public class HtmlDocSerializerSession extends HtmlStrippedDocSerializerSession {
 		return ctx.nowrap;
 	}
 
+	/**
+	 * Resolve $ variables in serialized POJO.
+	 *
+	 * @see HtmlDocSerializer.Builder#resolveBodyVars()
+	 * @return
+	 * 	<jk>true</jk> if $ variables in serialized POJO should be resolved.
+	 */
+	protected final boolean isResolveBodyVars() {
+		return ctx.resolveBodyVars;
+	}
+
 	/**
 	 * Javascript code.
 	 *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWriter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWriter.java
index bc24cc709..89ded89e5 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWriter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlWriter.java
@@ -43,6 +43,14 @@ public class HtmlWriter extends XmlWriter {
 		super(out, useWhitespace, maxIndent, trimStrings, quoteChar, uriResolver, false, null);
 	}
 
+	/**
+	 * Copy constructor.
+	 *
+	 * @param w Writer being copied.
+	 */
+	public HtmlWriter(HtmlWriter w) {
+		super(w);
+	}
 
 	//-----------------------------------------------------------------------------------------------------------------
 	// Overridden methods
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java
index 2e8894818..9c87a0791 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfig.java
@@ -430,6 +430,27 @@ public @interface HtmlDocConfig {
 	 */
 	String nowrap() default "";
 
+	/**
+	 * Resolve $ variables in serialized pojo.
+	 *
+	 * <ul class='values'>
+	 * 	<li><js>"true"</js>
+	 * 	<li><js>"false"</js> (default)
+	 * </ul>
+	 *
+	 * <h5 class='section'>Notes:</h5><ul>
+	 * 	<li class='note'>
+	 * 		Supports <a class="doclink" href="../../../../../index.html#jrs.SvlVariables">SVL Variables</a> (e.g. <js>"$L{my.localized.variable}"</js>).
+	 * </ul>
+	 *
+	 * <h5 class='section'>See Also:</h5><ul>
+	 * 	<li class='jm'>{@link org.apache.juneau.html.HtmlDocSerializer.Builder#resolveBodyVars()}
+	 * </ul>
+	 *
+	 * @return The annotation value.
+	 */
+	String resolveBodyVars() default "";
+
 	/**
 	 * Javascript code.
 	 *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfigAnnotation.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfigAnnotation.java
index 79474ce75..e532d4b10 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfigAnnotation.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/annotation/HtmlDocConfigAnnotation.java
@@ -57,6 +57,7 @@ public class HtmlDocConfigAnnotation {
 			string(a.asideFloat()).filter(x -> ! "DEFAULT".equalsIgnoreCase(x)).map(AsideFloat::valueOf).ifPresent(x -> b.asideFloat(x));
 			string(a.noResultsMessage()).ifPresent(x -> b.noResultsMessage(x));
 			bool(a.nowrap()).ifPresent(x -> b.nowrap(x));
+			bool(a.resolveBodyVars()).ifPresent(x -> b.resolveBodyVars(x));
 			type(a.template()).ifPresent(x -> b.template(x));
 			classes(a.widgets()).ifPresent(x -> b.widgets((Class<? extends HtmlWidget>[]) x));
 		}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerWriter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerWriter.java
index 5da7c415c..3844def06 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerWriter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerWriter.java
@@ -74,6 +74,20 @@ public class SerializerWriter extends Writer {
 		this.uriResolver = uriResolver;
 	}
 
+	/**
+	 * Copy Constructor
+	 *
+	 * @param w Writer being copied.
+	 */
+	public SerializerWriter(SerializerWriter w) {
+		this.out = w.out;
+		this.useWhitespace = w.useWhitespace;
+		this.maxIndent = w.maxIndent;
+		this.trimStrings = w.trimStrings;
+		this.quoteChar = w.quoteChar;
+		this.uriResolver = w.uriResolver;
+	}
+
 	/**
 	 * Performs a carriage return.
 	 *
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlWriter.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlWriter.java
index 6766f24a3..cf3daf450 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlWriter.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlWriter.java
@@ -55,6 +55,17 @@ public class XmlWriter extends SerializerWriter {
 		this.defaultNsPrefix = defaultNamespace == null ? null : defaultNamespace.name;
 	}
 
+	/**
+	 * Copy constructor.
+	 *
+	 * @param w Writer being copied.
+	 */
+	public XmlWriter(XmlWriter w) {
+		super(w);
+		this.enableNs = w.enableNs;
+		this.defaultNsPrefix = w.defaultNsPrefix;
+	}
+
 	/**
 	 * Writes an opening tag to the output:  <code><xt>&lt;ns:name</xt></code>
 	 *
diff --git a/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripAddClassAttrsTest.java b/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripAddClassAttrsTest.java
index 1aa1b87f7..9a7499c8c 100755
--- a/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripAddClassAttrsTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/a/rttests/RoundTripAddClassAttrsTest.java
@@ -37,7 +37,7 @@ import org.junit.runners.*;
 @FixMethodOrder(NAME_ASCENDING)
 public class RoundTripAddClassAttrsTest extends RoundTripTest {
 
-	@Parameterized.Parameters
+	@Parameterized.Parameters(name="{0}")
 	public static Collection<Object[]> getPairs() {
 		return Arrays.asList(new Object[][] {
 			{ /* 0 */