From 41457907ab9eee33fe26e7c878f8ca1b494ab932 Mon Sep 17 00:00:00 2001 From: Ryan Brandt Date: Wed, 5 Aug 2015 12:43:43 -0600 Subject: [PATCH] Allow spaces and apostrophes in dimensions Change-Id: I0f6a00496e65eeadb946849e68107321310a1a11 --- .../alarm/AlarmSubExpressionListener.java | 22 ++++++++++++++++-- .../common/model/alarm/AlarmExpression.g4 | 4 ++-- .../model/alarm/AlarmExpressionTest.java | 23 ++++++++++++++++++- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmSubExpressionListener.java b/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmSubExpressionListener.java index 9e945819..c648bd3d 100644 --- a/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmSubExpressionListener.java +++ b/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmSubExpressionListener.java @@ -82,8 +82,26 @@ class AlarmSubExpressionListener extends AlarmExpressionBaseListener { @Override public void enterDimension(AlarmExpressionParser.DimensionContext ctx) { - String dimensionName = ctx.getChild(0).getText(); - if (dimensions.put(dimensionName, ctx.getChild(2).getText()) != null) + StringBuilder dimensionName = new StringBuilder(); + dimensionName.append(ctx.getChild(0).getText()); + int i = 1; + while (!ctx.getChild(i).getText().equals("=")) { + dimensionName.append(' '); + dimensionName.append(ctx.getChild(i).getText()); + i++; + } + // move past the '=' token + i++; + + StringBuilder dimensionValue = new StringBuilder(); + dimensionValue.append(ctx.getChild(i).getText()); + i++; + while (i < ctx.getChildCount()) { + dimensionValue.append(' '); + dimensionValue.append(ctx.getChild(i).getText()); + i++; + } + if (dimensions.put(dimensionName.toString(), dimensionValue.toString()) != null) throw new IllegalArgumentException("More than one value was given for dimension " + dimensionName); } diff --git a/java/monasca-common-model/src/main/resources/monasca/common/model/alarm/AlarmExpression.g4 b/java/monasca-common-model/src/main/resources/monasca/common/model/alarm/AlarmExpression.g4 index 3625f198..82c78934 100644 --- a/java/monasca-common-model/src/main/resources/monasca/common/model/alarm/AlarmExpression.g4 +++ b/java/monasca-common-model/src/main/resources/monasca/common/model/alarm/AlarmExpression.g4 @@ -97,7 +97,7 @@ dimensionList ; dimension - : txt '=' txt + : (txt)+ '=' (txt)+ ; keyword @@ -210,7 +210,7 @@ DECIMAL ; TXT - : ~('\'' | '}' | '{' | '&' | '|' | '>' | '<' | '=' | ',' | ')' | '(' | ' ' | '"' )+ + : ~('}' | '{' | '&' | '|' | '>' | '<' | '=' | ',' | ')' | '(' | ' ' | '"' )+ ; STRING diff --git a/java/monasca-common-model/src/test/java/monasca/common/model/alarm/AlarmExpressionTest.java b/java/monasca-common-model/src/test/java/monasca/common/model/alarm/AlarmExpressionTest.java index bc97d018..01838024 100644 --- a/java/monasca-common-model/src/test/java/monasca/common/model/alarm/AlarmExpressionTest.java +++ b/java/monasca-common-model/src/test/java/monasca/common/model/alarm/AlarmExpressionTest.java @@ -24,11 +24,12 @@ import java.util.List; import org.testng.annotations.Test; import com.google.common.collect.ImmutableMap; + import monasca.common.model.metric.MetricDefinition; @Test public class AlarmExpressionTest { - private final String restrictedChars = "(){}&|<>='\","; + private final String restrictedChars = "(){}&|<>=\","; public void shouldParseExpression() { AlarmExpression expr = new AlarmExpression( @@ -251,6 +252,26 @@ public class AlarmExpressionTest { assertEquals(alarm1.getMetricDefinition(), expected1); } + public void shouldParseDimensionsWithSpaces() { + AlarmExpression[] expr_list = { + new AlarmExpression("test_metric{this_is_a_test=this is a test} > 10"), + new AlarmExpression("test_metric{this is also a test = this_is_also_a_test} > 10") + }; + MetricDefinition[] expected_list = { + new MetricDefinition("test_metric", ImmutableMap.builder() + .put("this_is_a_test", "this is a test") + .build()), + new MetricDefinition("test_metric", ImmutableMap.builder() + .put("this is also a test", "this_is_also_a_test") + .build()) + }; + + for(int i = 0; i < expr_list.length; i++) { + AlarmSubExpression expr = expr_list[i].getSubExpressions().get(0); + assertEquals(expr.getMetricDefinition(), expected_list[i]); + } + } + public void shouldFailWithRestrictedChars() { String[] expressions = {"%cmetric{foo=bar,metric_name=mem} > 4", "me%ctric{foo=bar,metric_name=mem} > 4",