This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit 6398ab9cc6895a6d91a598105f5630b6f0dcab09 Author: Alex Heneveld <[email protected]> AuthorDate: Tue Jun 28 14:49:16 2022 +0100 use proper serialiation when writing for shell environment --- .../util/core/json/ShellEnvironmentSerializer.java | 25 +++++++++++++--------- .../base/ShellEnvironmentSerializerTest.java | 6 ++++-- .../base/SoftwareProcessShellEnvironmentTest.java | 3 ++- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/org/apache/brooklyn/util/core/json/ShellEnvironmentSerializer.java b/core/src/main/java/org/apache/brooklyn/util/core/json/ShellEnvironmentSerializer.java index 9ec0881d40..c42e6dbc24 100644 --- a/core/src/main/java/org/apache/brooklyn/util/core/json/ShellEnvironmentSerializer.java +++ b/core/src/main/java/org/apache/brooklyn/util/core/json/ShellEnvironmentSerializer.java @@ -15,18 +15,17 @@ */ package org.apache.brooklyn.util.core.json; -import java.util.Map; -import java.util.Map.Entry; - -import javax.annotation.Nullable; - +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Maps; import org.apache.brooklyn.api.mgmt.ManagementContext; import org.apache.brooklyn.util.exceptions.Exceptions; +import org.apache.brooklyn.util.text.StringEscapes; import org.apache.commons.lang3.StringUtils; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Maps; +import javax.annotation.Nullable; +import java.util.Map; +import java.util.Map.Entry; public class ShellEnvironmentSerializer { private ObjectMapper mapper; @@ -40,9 +39,15 @@ public class ShellEnvironmentSerializer { if (value instanceof String) return (String)value; try { String str = mapper.writeValueAsString(value); - // Avoid dealing with unquoting and unescaping the serialized result is a string if (isJsonString(str)) { - return value.toString(); + // previously (2022-06) we would just write value.toString() in this block; but some things are serialized more nicely than toString, so prefer that format + // however if it is unambiguously a string then unwrap + // (not strictly the JSON unwrapping, but for the subset we treat unescaped it is okay) + String unescaped = StringEscapes.BashStringEscapes.unwrapBashQuotesAndEscapes(str); + if (unescaped.matches("[A-Za-z0-9 :,./*?!_+^=-]*")) { + return unescaped; + } + return str; } else { return str; } diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java index 5c45cfd652..321d1e9f8f 100644 --- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java +++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/ShellEnvironmentSerializerTest.java @@ -22,6 +22,7 @@ import java.util.Date; import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.apache.brooklyn.util.core.json.ShellEnvironmentSerializer; import org.apache.brooklyn.util.time.Duration; +import org.apache.brooklyn.util.time.Time; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -52,7 +53,8 @@ public class ShellEnvironmentSerializerTest extends BrooklynAppUnitTestSupport { assertSerialize(0.140, "0.14"); assertSerialize(Boolean.TRUE, "true"); assertSerialize(Boolean.FALSE, "false"); - assertSerialize(date, Long.toString(date.getTime())); + assertSerialize(date, Time.makeIso8601DateStringZ(date.toInstant())); + assertSerialize(date.toInstant(), Time.makeIso8601DateStringZ(date.toInstant())); assertSerialize(Duration.FIVE_MINUTES, "5m"); assertSerialize(null, null); assertSerialize(ImmutableList.of(str, 3.14, 0.14)); @@ -65,7 +67,7 @@ public class ShellEnvironmentSerializerTest extends BrooklynAppUnitTestSupport { assertSerialize(mgmt, "{\"type\":\"org.apache.brooklyn.api.mgmt.ManagementContext\"}"); // https://issues.apache.org/jira/browse/BROOKLYN-304 assertSerialize(getClass().getClassLoader(), "{\"type\":\""+getClass().getClassLoader().getClass().getCanonicalName()+"\"}"); - assertSerialize(getClass(), "class "+getClass().getName()); + assertSerialize(getClass(), getClass().getName()); } private void assertSerialize(Object actual, String expected) { diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessShellEnvironmentTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessShellEnvironmentTest.java index f7c87cd6e0..ccac93250e 100644 --- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessShellEnvironmentTest.java +++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessShellEnvironmentTest.java @@ -26,6 +26,7 @@ import org.apache.brooklyn.api.location.LocationSpec; import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.apache.brooklyn.util.time.Duration; +import org.apache.brooklyn.util.time.Time; import org.testng.annotations.Test; import com.google.common.collect.ImmutableList; @@ -77,7 +78,7 @@ public class SoftwareProcessShellEnvironmentTest extends BrooklynAppUnitTestSupp + "\"special_value\":" + escapedString + "}"); assertEquals(env.get("some_list"), "[\"idx1\",\"idx2\"," + escapedString + "]"); - assertEquals(env.get("some_time"), Long.toString(dt.getTime())); + assertEquals(env.get("some_time"), Time.makeIso8601DateStringZ(dt.toInstant())); assertEquals(env.get("some_bean"), "{\"propString\":\"bean-string\",\"propInt\":-1}"); assertEquals(env.get("self"), "{\"type\":\"org.apache.brooklyn.api.entity.Entity\",\"id\":\"" + entity.getId() + "\"}"); }
