From c40a14012a69876c28670391d5db1abcc331f2d9 Mon Sep 17 00:00:00 2001 From: Adrian Cole Date: Fri, 23 Jul 2010 15:50:56 -0700 Subject: [PATCH] enhanced to make jsonball store primitives better --- .../java/org/jclouds/domain/JsonBall.java | 11 +++- .../main/java/org/jclouds/util/Patterns.java | 2 + .../java/org/jclouds/domain/JsonBallTest.java | 36 ++++++++++++- .../java/org/jclouds/util/PatternsTest.java | 51 +++++++++++++++++-- 4 files changed, 95 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/jclouds/domain/JsonBall.java b/core/src/main/java/org/jclouds/domain/JsonBall.java index 40838e3b21..cef6bad2ea 100644 --- a/core/src/main/java/org/jclouds/domain/JsonBall.java +++ b/core/src/main/java/org/jclouds/domain/JsonBall.java @@ -20,6 +20,8 @@ package org.jclouds.domain; import static com.google.common.base.Preconditions.checkNotNull; +import org.jclouds.util.Patterns; + /** * * As String is final, using a different marker to imply this is a json object @@ -62,7 +64,14 @@ public class JsonBall implements java.io.Serializable, Comparable, CharS } public JsonBall(String value) { - this.value = checkNotNull(value, "value"); + this.value = quoteStringIfNotNumber(checkNotNull(value, "value")); + } + + static String quoteStringIfNotNumber(String in) { + if (Patterns.JSON_STRING_PATTERN.matcher(in).find() && !Patterns.JSON_NUMBER_PATTERN.matcher(in).find()) { + return "\"" + in + "\""; + } + return in; } @Override diff --git a/core/src/main/java/org/jclouds/util/Patterns.java b/core/src/main/java/org/jclouds/util/Patterns.java index faa9eec4ae..5221edb5e5 100644 --- a/core/src/main/java/org/jclouds/util/Patterns.java +++ b/core/src/main/java/org/jclouds/util/Patterns.java @@ -37,6 +37,8 @@ public class Patterns { public static final Pattern URL_ENCODED_PATTERN = Pattern.compile(".*%[a-fA-F0-9][a-fA-F0-9].*"); public static final Pattern URI_PATTERN = Pattern.compile("([a-z0-9]+)://([^:]*):(.*)@(.*)"); public static final Pattern PATTERN_THAT_BREAKS_URI = Pattern.compile("[a-z0-9]+://.*/.*@.*"); + public static final Pattern JSON_STRING_PATTERN = Pattern.compile("^[^\"\\{\\[].*[^\\{\\[\"]$"); + public static final Pattern JSON_NUMBER_PATTERN = Pattern.compile("^[0-9]*\\.?[0-9]*$"); public static final Pattern PLUS_PATTERN = Pattern.compile("\\+"); public static final Pattern STAR_PATTERN = Pattern.compile("\\*"); public static final Pattern _7E_PATTERN = Pattern.compile("%7E"); diff --git a/core/src/test/java/org/jclouds/domain/JsonBallTest.java b/core/src/test/java/org/jclouds/domain/JsonBallTest.java index dd4f2ca059..129f13643a 100644 --- a/core/src/test/java/org/jclouds/domain/JsonBallTest.java +++ b/core/src/test/java/org/jclouds/domain/JsonBallTest.java @@ -54,7 +54,7 @@ public class JsonBallTest { } - public void test() { + public void testHash() { String json = "{\"tomcat6\":{\"ssl_port\":8433}}"; Map map = ImmutableMap. of("tomcat6", new JsonBall("{\"ssl_port\":8433}")); @@ -65,4 +65,38 @@ public class JsonBallTest { } + + public void testList() { + String json = "{\"list\":[8431,8433]}"; + + Map map = ImmutableMap. of("list", new JsonBall("[8431,8433]")); + + assertEquals(handler.apply(new HttpResponse(200, "ok", Payloads + .newStringPayload(json))), map); + assertEquals(mapper.toJson(map), json); + + } + + public void testString() { + String json = "{\"name\":\"fooy\"}"; + + Map map = ImmutableMap. of("name", new JsonBall("fooy")); + + assertEquals(handler.apply(new HttpResponse(200, "ok", Payloads + .newStringPayload(json))), map); + assertEquals(mapper.toJson(map), json); + + } + + + public void testNumber() { + String json = "{\"number\":1}"; + + Map map = ImmutableMap. of("number", new JsonBall("1")); + + assertEquals(handler.apply(new HttpResponse(200, "ok", Payloads + .newStringPayload(json))), map); + assertEquals(mapper.toJson(map), json); + + } } diff --git a/core/src/test/java/org/jclouds/util/PatternsTest.java b/core/src/test/java/org/jclouds/util/PatternsTest.java index 840b7a005f..345ad110c8 100644 --- a/core/src/test/java/org/jclouds/util/PatternsTest.java +++ b/core/src/test/java/org/jclouds/util/PatternsTest.java @@ -30,19 +30,64 @@ import org.testng.annotations.Test; @Test(groups = "unit", testName = "jclouds.PatternsTest") public class PatternsTest { + public void testJSON_STRING_PATTERN1() { + Matcher matcher = Patterns.JSON_STRING_PATTERN.matcher("hello"); + assert (matcher.find()); + } + + public void testJSON_STRING_PATTERN2() { + Matcher matcher = Patterns.JSON_STRING_PATTERN.matcher("hello world!"); + assert (matcher.find()); + } + + public void testJSON_STRING_PATTERN3() { + Matcher matcher = Patterns.JSON_STRING_PATTERN.matcher("\"hello world!\""); + assert (!matcher.find()); + } + + public void testJSON_STRING_PATTERN4() { + Matcher matcher = Patterns.JSON_STRING_PATTERN.matcher("[hello world!]"); + assert (!matcher.find()); + } + + public void testJSON_STRING_PATTERN5() { + Matcher matcher = Patterns.JSON_STRING_PATTERN.matcher("{hello world!}"); + assert (!matcher.find()); + } + + public void testJSON_NUMBER_PATTERN1() { + Matcher matcher = Patterns.JSON_NUMBER_PATTERN.matcher("1"); + assert (matcher.find()); + } + + public void testJSON_NUMBER_PATTERN2() { + Matcher matcher = Patterns.JSON_NUMBER_PATTERN.matcher("1.1"); + assert (matcher.find()); + } + + public void testJSON_NUMBER_PATTERN3() { + Matcher matcher = Patterns.JSON_NUMBER_PATTERN.matcher("\"1.1\""); + assert (!matcher.find()); + } + + public void testJSON_NUMBER_PATTERN4() { + Matcher matcher = Patterns.JSON_NUMBER_PATTERN.matcher("\"1\""); + assert (!matcher.find()); + } + public void testREST_CONTEXT_BUILDER() { Matcher matcher = Patterns.REST_CONTEXT_BUILDER - .matcher("org.jclouds.rest.RestContextBuilder"); + .matcher("org.jclouds.rest.RestContextBuilder"); assert (matcher.find()); assertEquals(matcher.group(1), "org.jclouds.rest.RestContextBuilder"); assertEquals(matcher.group(2), "java.lang.String"); assertEquals(matcher.group(3), "java.lang.Integer"); } - + public void testREST_CONTEXT_BUILDERwithSpace() { Matcher matcher = Patterns.REST_CONTEXT_BUILDER - .matcher("org.jclouds.rest.RestContextBuilder"); + .matcher("org.jclouds.rest.RestContextBuilder"); assert (matcher.find()); assertEquals(matcher.group(1), "org.jclouds.rest.RestContextBuilder"); assertEquals(matcher.group(2), "java.lang.String");