You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2022/06/28 13:54:18 UTC

[brooklyn-server] 02/03: use proper serialiation when writing for shell environment

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 <al...@cloudsoft.io>
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() + "\"}");
     }