diff --git a/logback-core/src/main/java/ch/qos/logback/core/subst/Tokenizer.java b/logback-core/src/main/java/ch/qos/logback/core/subst/Tokenizer.java
index a60c96079a..1f31dc3a95 100644
--- a/logback-core/src/main/java/ch/qos/logback/core/subst/Tokenizer.java
+++ b/logback-core/src/main/java/ch/qos/logback/core/subst/Tokenizer.java
@@ -67,7 +67,7 @@ List tokenize() throws ScanException {
addLiteralToken(tokenList, buf);
break;
case START_STATE:
- // trailing $. see also LOGBACK-1149
+ // trailing $. see also LOGBACK-1149
buf.append(CoreConstants.DOLLAR);
addLiteralToken(tokenList, buf);
break;
@@ -86,6 +86,14 @@ private void handleDefaultValueState(char c, List tokenList, StringBuilde
addLiteralToken(tokenList, stringBuilder);
stringBuilder.setLength(0);
state = TokenizerState.START_STATE;
+ break;
+ case CoreConstants.CURLY_LEFT:
+ stringBuilder.append(CoreConstants.COLON_CHAR);
+ addLiteralToken(tokenList, stringBuilder);
+ stringBuilder.setLength(0);
+ tokenList.add(Token.CURLY_LEFT_TOKEN);
+ state = TokenizerState.LITERAL_STATE;
+
break;
default:
stringBuilder.append(CoreConstants.COLON_CHAR).append(c);
@@ -104,23 +112,28 @@ private void handleStartState(char c, List tokenList, StringBuilder strin
}
private void handleLiteralState(char c, List tokenList, StringBuilder stringBuilder) {
- if (c == CoreConstants.DOLLAR) {
+ switch (c) {
+ case CoreConstants.DOLLAR:
addLiteralToken(tokenList, stringBuilder);
stringBuilder.setLength(0);
state = TokenizerState.START_STATE;
- } else if (c == CoreConstants.COLON_CHAR) {
+ break;
+ case CoreConstants.COLON_CHAR:
addLiteralToken(tokenList, stringBuilder);
stringBuilder.setLength(0);
state = TokenizerState.DEFAULT_VAL_STATE;
- } else if (c == CoreConstants.CURLY_LEFT) {
+ break;
+ case CoreConstants.CURLY_LEFT:
addLiteralToken(tokenList, stringBuilder);
tokenList.add(Token.CURLY_LEFT_TOKEN);
stringBuilder.setLength(0);
- } else if (c == CoreConstants.CURLY_RIGHT) {
+ break;
+ case CoreConstants.CURLY_RIGHT:
addLiteralToken(tokenList, stringBuilder);
tokenList.add(Token.CURLY_RIGHT_TOKEN);
stringBuilder.setLength(0);
- } else {
+ break;
+ default:
stringBuilder.append(c);
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/subst/NodeToStringTransformerTest.java b/logback-core/src/test/java/ch/qos/logback/core/subst/NodeToStringTransformerTest.java
index 9090357eca..9b293097b9 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/subst/NodeToStringTransformerTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/subst/NodeToStringTransformerTest.java
@@ -129,4 +129,11 @@ public void defaultValueNestedAsVar() throws ScanException {
assertEquals("axv0c", nodeToStringTransformer.transform());
}
+ @Test
+ public void LOGBACK_1101() throws ScanException {
+ String input = "a: {y}";
+ Node node = makeNode(input);
+ NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
+ assertEquals("a: {y}", nodeToStringTransformer.transform());
+ }
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/subst/TokenizerTest.java b/logback-core/src/test/java/ch/qos/logback/core/subst/TokenizerTest.java
index 1a0185d8a3..dcabacd652 100644
--- a/logback-core/src/test/java/ch/qos/logback/core/subst/TokenizerTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/subst/TokenizerTest.java
@@ -171,4 +171,20 @@ public void literalEndingWithDollar_LOGBACK_1149() throws ScanException {
witnessList.add(new Token(Token.Type.LITERAL, "$"));
assertEquals(witnessList, tokenList);
}
+
+ @Test
+ public void LOGBACK_1101() throws ScanException {
+ String input = "a:{y}";
+ Tokenizer tokenizer = new Tokenizer(input);
+ List tokenList = tokenizer.tokenize();
+ witnessList.add(new Token(Token.Type.LITERAL, "a"));
+
+ witnessList.add(new Token(Token.Type.LITERAL, ":"));
+ witnessList.add(Token.CURLY_LEFT_TOKEN);
+ witnessList.add(new Token(Token.Type.LITERAL, "y"));
+
+ witnessList.add(Token.CURLY_RIGHT_TOKEN);
+ assertEquals(witnessList, tokenList);
+ }
+
}
diff --git a/logback-core/src/test/java/ch/qos/logback/core/util/OptionHelperTest.java b/logback-core/src/test/java/ch/qos/logback/core/util/OptionHelperTest.java
index ace0c3c635..7a87e97af5 100755
--- a/logback-core/src/test/java/ch/qos/logback/core/util/OptionHelperTest.java
+++ b/logback-core/src/test/java/ch/qos/logback/core/util/OptionHelperTest.java
@@ -255,8 +255,41 @@ public void trailingColon_LOGBACK_1140() {
String prefix = "c:";
String suffix = "/tmp";
context.putProperty("var", prefix);
- String r = OptionHelper.substVars("${var}"+suffix, context);
- assertEquals(prefix+suffix, r);
+ String r = OptionHelper.substVars("${var}" + suffix, context);
+ assertEquals(prefix + suffix, r);
+ }
+
+ @Test
+ public void curlyBraces_LOGBACK_1101() {
+ {
+ String input = "foo{bar}";
+ String r = OptionHelper.substVars(input, context);
+ assertEquals(input, r);
+ }
+ {
+ String input = "{foo{\"bar\"}}";
+ String r = OptionHelper.substVars(input, context);
+ assertEquals(input, r);
+ }
+ {
+ String input = "a:{y}";
+ String r = OptionHelper.substVars(input, context);
+ assertEquals(input, r);
+ }
+ {
+ String input = "{world:{yay}}";
+ String r = OptionHelper.substVars(input, context);
+ assertEquals(input, r);
+ }
+ {
+ String input = "{hello:{world:yay}}";
+ String r = OptionHelper.substVars(input, context);
+ assertEquals(input, r);
+ }
+ {
+ String input = "{\"hello\":{\"world\":\"yay\"}}";
+ String r = OptionHelper.substVars(input, context);
+ assertEquals(input, r);
+ }
}
-
}
diff --git a/logback-site/src/site/pages/news.html b/logback-site/src/site/pages/news.html
index caa66b5eba..b7536474de 100755
--- a/logback-site/src/site/pages/news.html
+++ b/logback-site/src/site/pages/news.html
@@ -30,6 +30,14 @@ Logback News
the QOS.ch
announce mailing list.
+
+
+ February , 2018, Release of version 1.3.0-beta0
+
+ Fix issue with properties containing JSON strings as reported
+ in LOGBACK-1101.
+