From 624226e2df0bbb45b84906c885a4c47f63d19545 Mon Sep 17 00:00:00 2001 From: John Keith Date: Thu, 6 Sep 2018 20:06:41 -0400 Subject: [PATCH 1/2] Fixes #30 --- .../hibernate/usertype/HstoreParser.java | 28 ++++++-- .../usertype/HstoreParserSpec.groovy | 64 +++++++++++++++++++ 2 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 src/test/groovy/net/kaleidos/hibernate/usertype/HstoreParserSpec.groovy diff --git a/src/main/groovy/net/kaleidos/hibernate/usertype/HstoreParser.java b/src/main/groovy/net/kaleidos/hibernate/usertype/HstoreParser.java index 12f5825..ace631c 100644 --- a/src/main/groovy/net/kaleidos/hibernate/usertype/HstoreParser.java +++ b/src/main/groovy/net/kaleidos/hibernate/usertype/HstoreParser.java @@ -18,17 +18,29 @@ public class HstoreParser extends PGobject implements Iterable asMap() { @@ -36,7 +48,7 @@ public Map asMap() { try { for (final HStoreIterator iterator = new HStoreIterator(); iterator.hasNext(); ) { final HStoreEntry entry = iterator.rawNext(); - r.put(entry.key, entry.value); + r.put(replaceEscapePlaceholders(entry.key), replaceEscapePlaceholders(entry.value)); } } catch (HstoreParseException e) { throw new IllegalStateException(e); @@ -44,6 +56,12 @@ public Map asMap() { return r; } + private String replaceEscapePlaceholders(String text) { + return text == null ? null : text + .replaceAll(BACKSLASH_PLACEHOLDER, REGEX_BACKSLASH) + .replaceAll(DOUBLE_QUOTE_PLACEHOLDER, REGEX_DOUBLE_QUOTE); + } + private static class HStoreEntry implements Entry { private String key; private String value; diff --git a/src/test/groovy/net/kaleidos/hibernate/usertype/HstoreParserSpec.groovy b/src/test/groovy/net/kaleidos/hibernate/usertype/HstoreParserSpec.groovy new file mode 100644 index 0000000..6705cf8 --- /dev/null +++ b/src/test/groovy/net/kaleidos/hibernate/usertype/HstoreParserSpec.groovy @@ -0,0 +1,64 @@ +package net.kaleidos.hibernate.usertype + +import spock.lang.Specification +import spock.lang.Unroll + +class HstoreParserSpec extends Specification { + @Unroll + void "AsMap with value populated by constructor"() { + expect: + HstoreParser parser = new HstoreParser(input) + def map = parser.asMap() + map[expected_key] == expected_value + + where: + example << escapedCharactersExamples() + input = example.input + expected_key = example.expected_key + expected_value = example.expected_value + } + + @Unroll + void "AsMap with value populated by setValue"() { + expect: + HstoreParser parser = new HstoreParser('') + parser.setValue(input) + def map = parser.asMap() + map[expected_key] == expected_value + + where: + example << escapedCharactersExamples() + input = example.input + expected_key = example.expected_key + expected_value = example.expected_value + } + + def escapedCharactersExamples() { + return [ + // insert into test(hs) values(hstore(ARRAY['key','"value"'])); + [ + input : /"key"=>"\"value\""/, + expected_key : /key/, + expected_value: /"value"/ + ], + // insert into test(hs) values(hstore(ARRAY['\key','value'])); + [ + input : /"\\key"=>"value"/, + expected_key : /\key/, + expected_value: /value/ + ], + // insert into test(hs) values(hstore(ARRAY['''key'''','value'])) + [ + input : /"'key'"=>"value"/, + expected_key : /'key'/, + expected_value: /value/ + ], + // nested hstore + [ + input : /"key"=>"\"nested_key\"=>\"1.1\""/, + expected_key : /key/, + expected_value: /"nested_key"=>"1.1"/ + ] + ] + } +} From 02766cc0301aaea6acb360f114f3f3422223cdb7 Mon Sep 17 00:00:00 2001 From: John Keith Date: Wed, 19 Sep 2018 10:21:03 -0400 Subject: [PATCH 2/2] Fixes #30. Eliminate use of RegEx based on code review feedback. --- .../kaleidos/hibernate/usertype/HstoreParser.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/groovy/net/kaleidos/hibernate/usertype/HstoreParser.java b/src/main/groovy/net/kaleidos/hibernate/usertype/HstoreParser.java index ace631c..8d62d63 100644 --- a/src/main/groovy/net/kaleidos/hibernate/usertype/HstoreParser.java +++ b/src/main/groovy/net/kaleidos/hibernate/usertype/HstoreParser.java @@ -18,8 +18,8 @@ public class HstoreParser extends PGobject implements Iterable asMap() { private String replaceEscapePlaceholders(String text) { return text == null ? null : text - .replaceAll(BACKSLASH_PLACEHOLDER, REGEX_BACKSLASH) - .replaceAll(DOUBLE_QUOTE_PLACEHOLDER, REGEX_DOUBLE_QUOTE); + .replace(BACKSLASH_PLACEHOLDER, BACKSLASH) + .replace(DOUBLE_QUOTE_PLACEHOLDER, DOUBLE_QUOTE); } private static class HStoreEntry implements Entry {