diff --git a/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmSubExpression.java b/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmSubExpression.java index 683e686d..018a232d 100644 --- a/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmSubExpression.java +++ b/java/monasca-common-model/src/main/java/monasca/common/model/alarm/AlarmSubExpression.java @@ -18,14 +18,18 @@ package monasca.common.model.alarm; import java.io.Serializable; import java.text.DecimalFormat; +import java.text.DecimalFormatSymbols; +import java.util.Locale; import com.fasterxml.jackson.annotation.JsonIgnore; + import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTreeWalker; import com.fasterxml.jackson.annotation.JsonCreator; + import monasca.common.model.alarm.AlarmExpressionLexer; import monasca.common.model.alarm.AlarmExpressionParser; import monasca.common.model.metric.MetricDefinition; @@ -46,7 +50,12 @@ public class AlarmSubExpression implements Serializable { private int periods; // Use a DecimalFormatter for threshold because the standard double format starts using scientific notation when // threshold is very large and that scientific notation can't be parsed when recreating the SubExpression - private static final DecimalFormat formatter = new DecimalFormat("0.0##############"); + private static final DecimalFormat formatter; + static { + formatter = new DecimalFormat("0.0##############"); + // Prevents situation when decimal separator for default locale is different then dot. + formatter.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.US)); + } public AlarmSubExpression(AggregateFunction function, MetricDefinition metricDefinition, AlarmOperator operator, double threshold, int period, int periods) { diff --git a/java/monasca-common-model/src/test/java/monasca/common/model/alarm/AlarmSubExpressionLocaleTest.java b/java/monasca-common-model/src/test/java/monasca/common/model/alarm/AlarmSubExpressionLocaleTest.java new file mode 100644 index 00000000..911db2d0 --- /dev/null +++ b/java/monasca-common-model/src/test/java/monasca/common/model/alarm/AlarmSubExpressionLocaleTest.java @@ -0,0 +1,64 @@ +/* + * Copyright 2015 FUJITSU LIMITED + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + */ +package monasca.common.model.alarm; + +import static org.testng.Assert.assertEquals; + +import java.util.List; +import java.util.Locale; + +import org.testng.annotations.Test; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; + +import monasca.common.model.metric.MetricDefinition; + +/** + * Checks if conversion from decimal to string is Locale independent. + * + * @author lukasz.zajaczkowski@ts.fujitsu.com + * + */ +@Test +public class AlarmSubExpressionLocaleTest { + + private static final String EXPECTED_EXPRESSION = "min(hpcs.compute{instance_id=5, metric_name=cpu, device=1}) < 1.2"; + + public void shouldBeLocaleIndependent() { + List localeList = Lists.newArrayList( + Locale.GERMAN, Locale.CHINA, Locale.FRANCE, Locale.JAPAN, Locale.CANADA, Locale.KOREA + ); + + for (Locale locale : localeList) { + Locale.setDefault(locale); + AlarmSubExpression alarmSubExpression = + new AlarmSubExpression(AggregateFunction.MIN, new MetricDefinition("hpcs.compute", ImmutableMap.builder() + .put("instance_id", "5").put("metric_name", "cpu").put("device", "1").build()), AlarmOperator.LT, 1.2, 60, 1); + + assertEquals(alarmSubExpression.getExpression(), EXPECTED_EXPRESSION, "Not correct expression for locale " + locale.getDisplayName()); + + } + } + + public void shouldWorkWithDefaultLocale() { + + Locale.setDefault(Locale.US); + AlarmSubExpression alarmSubExpression = + new AlarmSubExpression(AggregateFunction.MIN, new MetricDefinition("hpcs.compute", ImmutableMap.builder() + .put("instance_id", "5").put("metric_name", "cpu").put("device", "1").build()), AlarmOperator.LT, 1.2, 60, 1); + + assertEquals(alarmSubExpression.getExpression(), EXPECTED_EXPRESSION, "Not correct expression for default locale"); + } +}