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() + "\"}");
}