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/07/14 10:19:18 UTC

[brooklyn-server] branch master updated: Support arrays in string constraint parser

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


The following commit(s) were added to refs/heads/master by this push:
     new bc2b8e2f12 Support arrays in string constraint parser
     new 98e04b606c Merge remote-tracking branch 'algairim/enhancements/string-constraint-parser'
bc2b8e2f12 is described below

commit bc2b8e2f124ebf0183f0bb13b0d766b9a033dd59
Author: Mykola Mandra <my...@cloudsoft.io>
AuthorDate: Thu Jul 14 11:13:30 2022 +0100

    Support arrays in string constraint parser
    
    Signed-off-by: Mykola Mandra <my...@cloudsoft.io>
---
 .../core/objs/ConstraintSerialization.java         | 55 ++++++++++++----------
 .../core/objs/ConstraintSerializationTest.java     | 22 ++++++---
 2 files changed, 46 insertions(+), 31 deletions(-)

diff --git a/core/src/main/java/org/apache/brooklyn/core/objs/ConstraintSerialization.java b/core/src/main/java/org/apache/brooklyn/core/objs/ConstraintSerialization.java
index 2cb8ea0298..1959fe3ac8 100644
--- a/core/src/main/java/org/apache/brooklyn/core/objs/ConstraintSerialization.java
+++ b/core/src/main/java/org/apache/brooklyn/core/objs/ConstraintSerialization.java
@@ -18,18 +18,12 @@
  */
 package org.apache.brooklyn.core.objs;
 
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Function;
-import java.util.function.Supplier;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
+import com.google.common.annotations.Beta;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
 import org.apache.brooklyn.config.ConfigKey;
 import org.apache.brooklyn.core.config.ConfigConstraints;
 import org.apache.brooklyn.util.collections.MutableList;
@@ -42,12 +36,12 @@ import org.apache.brooklyn.util.text.StringEscapes.JavaStringEscapes;
 import org.apache.brooklyn.util.text.StringPredicates;
 import org.apache.brooklyn.util.text.Strings;
 
-import com.google.common.annotations.Beta;
-import com.google.common.base.Preconditions;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
+import java.util.*;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 @Beta
 public class ConstraintSerialization {
@@ -163,10 +157,12 @@ public class ConstraintSerialization {
     
     private static String DOUBLE_QUOTED_STRING = "\""+GROUP(ZERO_OR_MORE(OR_GROUP(NOT_CHARSET("\\", "\""), "\\.")))+"\"";
     private static String SINGLE_QUOTED_STRING = "\'"+GROUP(ZERO_OR_MORE(OR_GROUP(NOT_CHARSET("\\", "\'"), "\\.")))+"\'";
-    
+    private static String SQUARE_BRACKETS = "\\["+GROUP(ZERO_OR_MORE(OR_GROUP(NOT_CHARSET("\\", "["), "\\.")))+"\\]";
+
     private static String PREDICATE = "[A-Za-z0-9_\\-\\.]+";
     
     private static Pattern PATTERN_START_WITH_QUOTED_STRING = Pattern.compile("^"+OR_GROUP(DOUBLE_QUOTED_STRING, SINGLE_QUOTED_STRING));
+    private static Pattern PATTERN_START_WITH_ARRAY = Pattern.compile("^"+OR_GROUP(SQUARE_BRACKETS));
     private static Pattern PATTERN_START_WITH_PREDICATE = Pattern.compile("^"+GROUP(PREDICATE));
 
     {
@@ -266,11 +262,19 @@ public class ConstraintSerialization {
                 }
                 // and allow strings
                 m = PATTERN_START_WITH_QUOTED_STRING.matcher(remaining);
-                if (!m.find()) {
-                    return false;
+                if (m.find()) {
+                    result = JavaStringEscapes.unwrapJavaString(m.group());
+                    remaining = remaining.substring(m.end());
+                } else {
+                    // and allow arrays
+                    m = PATTERN_START_WITH_ARRAY.matcher(remaining);
+                    if (m.find()) {
+                        result = m.group().substring(1, m.group().length() - 1);
+                        remaining = remaining.substring(m.end());
+                    } else {
+                        return false;
+                    }
                 }
-                result = JavaStringEscapes.unwrapJavaString(m.group());
-                remaining = remaining.substring(m.end());
             } else {
                 String p1 = m.group(1);
                 String p2 = serialization.predicateToStringToPreferredName.get(p1);
@@ -333,7 +337,10 @@ public class ConstraintSerialization {
             if (key.indexOf("(")>=0) {
                 // it wasn't json; delegate to the parser again
                 StringConstraintParser parser = StringConstraintParser.forConstraint(this, key);
-                if (!parser.parse()) throw new IllegalStateException("cannot match: "+key);
+                if (!parser.parse()) {
+                    Object a = parser.result;
+                    throw new IllegalStateException("cannot match: "+key);
+                }
                 return toPredicateFromJson(parser.result);
             }
             args = MutableList.of();
diff --git a/core/src/test/java/org/apache/brooklyn/core/objs/ConstraintSerializationTest.java b/core/src/test/java/org/apache/brooklyn/core/objs/ConstraintSerializationTest.java
index 66747ac5b8..c2599fdac5 100644
--- a/core/src/test/java/org/apache/brooklyn/core/objs/ConstraintSerializationTest.java
+++ b/core/src/test/java/org/apache/brooklyn/core/objs/ConstraintSerializationTest.java
@@ -18,8 +18,10 @@
  */
 package org.apache.brooklyn.core.objs;
 
-import java.util.List;
-
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
+import com.google.gson.Gson;
 import org.apache.brooklyn.core.config.ConfigConstraints;
 import org.apache.brooklyn.core.test.BrooklynMgmtUnitTestSupport;
 import org.apache.brooklyn.util.collections.MutableList;
@@ -29,10 +31,7 @@ import org.apache.brooklyn.util.text.StringPredicates;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.collect.ImmutableList;
-import com.google.gson.Gson;
+import java.util.List;
 
 public class ConstraintSerializationTest extends BrooklynMgmtUnitTestSupport {
 
@@ -145,7 +144,16 @@ public class ConstraintSerializationTest extends BrooklynMgmtUnitTestSupport {
         Predicate<String> p = StringPredicates.matchesGlob("???*");
         assertSamePredicate(ConstraintSerialization.INSTANCE.toPredicateFromJson("matchesGlob(\"???*\")"), p);
     }
-    
+
+    @Test
+    public void testAcceptsArray() {
+        Predicate<String> p1 = StringPredicates.matchesGlob("???*");
+        assertSamePredicate(ConstraintSerialization.INSTANCE.toPredicateFromJson("matchesGlob([???*])"), p1);
+
+        Predicate<String> p2 = StringPredicates.matchesGlob("???*, b, 1");
+        assertSamePredicate(ConstraintSerialization.INSTANCE.toPredicateFromJson("matchesGlob([???*, b, 1])"), p2);
+    }
+
     @Test
     public void testAltPred() {
         Predicate<?> p = StringPredicates.isNonBlank();