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. +