Skip to content

Commit

Permalink
ongoing work on var substitution
Browse files Browse the repository at this point in the history
  • Loading branch information
ceki committed Aug 22, 2012
1 parent 7eb54b5 commit 209db1e
Show file tree
Hide file tree
Showing 8 changed files with 132 additions and 47 deletions.
Expand Up @@ -151,5 +151,6 @@ public class CoreConstants {

public static final String UNDEFINED_PROPERTY_SUFFIX = "_IS_UNDEFINED";

public static final String LEFT_ACCOLADE = new String(new char[] {CURLY_LEFT});
public static final String RIGHT_ACCOLADE = new String(new char[] {CURLY_RIGHT});
}
52 changes: 38 additions & 14 deletions logback-core/src/main/java/ch/qos/logback/core/subst/Parser.java
Expand Up @@ -4,13 +4,12 @@
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.spi.ScanException;

import java.util.ArrayList;
import java.util.List;

// E = TE|T
// = T(E|~)
// E = TEopt where Eopt = E|~
// T = LITERAL | '}' | '${' V '}'
// T = LITERAL | { E } |'${' V '}'
// V = (E|E :- E)
// = E(':-'E|~)
public class Parser {
Expand Down Expand Up @@ -57,32 +56,50 @@ private Node T() throws ScanException {
case LITERAL:
advanceTokenPointer();
return new Node(Node.Type.LITERAL, t.payload);
case CURLY_LEFT:
advanceTokenPointer();
Node inner = E();
Token right = getCurentToken();
expectCurlyRight(right);
advanceTokenPointer();
Node curlyLeft = new Node(Node.Type.LITERAL, CoreConstants.LEFT_ACCOLADE);
curlyLeft.next = inner;
Node curlyRightNode = new Node(Node.Type.LITERAL, CoreConstants.RIGHT_ACCOLADE);
if(inner == null)
curlyLeft.next = curlyRightNode;
else
appendNode(inner, curlyRightNode);
return curlyLeft;
case START:
advanceTokenPointer();
Node v = V();
Token w = getCurentToken();
expectNotNull(w, "}");
if (w.type == Token.Type.STOP) {
advanceTokenPointer();
return v;
} else {
throw new ScanException("Expecting }");
}
//case STOP:
// advanceTokenPointer();
// return new Node(Node.Type.LITERAL, CoreConstants.RIGHT_ACCOLADE);
expectCurlyRight(w);
advanceTokenPointer();
return v;
default:
return null;
}
}

private void appendNode(Node inner, Node additionalNode) {
Node n = inner;
while(true) {
if(n.next == null) {
n.next = additionalNode;
return;
}
n = n.next;
}
}


// V = E(':='E|~)
private Node V() throws ScanException {
Node e = E();
Node variable = new Node(Node.Type.VARIABLE, e);
Token t = getCurentToken();
if(t != null && t.type == Token.Type.DEFAULT) {
if (t != null && t.type == Token.Type.DEFAULT) {
advanceTokenPointer();
Node def = E();
variable.defaultPart = def;
Expand All @@ -98,7 +115,14 @@ void advanceTokenPointer() {
void expectNotNull(Token t, String expected) {
if (t == null) {
throw new IllegalArgumentException("All tokens consumed but was expecting \""
+ expected+"\"");
+ expected + "\"");
}
}

void expectCurlyRight(Token t) throws ScanException {
expectNotNull(t, "}");
if (t.type != Token.Type.CURLY_RIGHT) {
throw new ScanException("Expecting }");
}
}

Expand Down
Expand Up @@ -3,10 +3,11 @@
public class Token {

static public Token START_TOKEN = new Token(Type.START, null);
static public Token STOP_TOKEN = new Token(Type.STOP, null);
static public Token CURLY_LEFT_TOKEN = new Token(Type.CURLY_LEFT, null);
static public Token CURLY_RIGHT_TOKEN = new Token(Type.CURLY_RIGHT, null);
static public Token DEFAULT_SEP_TOKEN = new Token(Type.DEFAULT, null);

public enum Type {LITERAL, START, STOP, DEFAULT}
public enum Type {LITERAL, START, CURLY_LEFT, CURLY_RIGHT, DEFAULT}

Type type;
String payload;
Expand Down
Expand Up @@ -92,9 +92,13 @@ private void handleLiteralState(char c, List<Token> tokenList, StringBuilder str
addLiteralToken(tokenList, stringBuilder);
stringBuilder.setLength(0);
state = TokenizerState.DEFAULT_VAL_STATE;
} else if (c == CoreConstants.CURLY_RIGHT) {
} else if (c == CoreConstants.CURLY_LEFT) {
addLiteralToken(tokenList, stringBuilder);
tokenList.add(Token.STOP_TOKEN);
tokenList.add(Token.CURLY_LEFT_TOKEN);
stringBuilder.setLength(0);
} else if (c == CoreConstants.CURLY_RIGHT) {
addLiteralToken(tokenList, stringBuilder);
tokenList.add(Token.CURLY_RIGHT_TOKEN);
stringBuilder.setLength(0);
} else {
stringBuilder.append(c);
Expand Down
24 changes: 13 additions & 11 deletions logback-core/src/test/java/ch/qos/logback/core/AllCoreTest.java
Expand Up @@ -19,16 +19,18 @@

@RunWith(Suite.class)
@SuiteClasses({BasicStatusManagerTest.class,
ch.qos.logback.core.util.PackageTest.class,
ch.qos.logback.core.helpers.PackageTest.class,
ch.qos.logback.core.pattern.PackageTest.class,
ch.qos.logback.core.PackageTest.class,
ch.qos.logback.core.joran.PackageTest.class,
ch.qos.logback.core.appender.PackageTest.class,
ch.qos.logback.core.spi.PackageTest.class,
ch.qos.logback.core.rolling.PackageTest.class,
ch.qos.logback.core.sift.PackageTest.class,
ch.qos.logback.core.encoder.PackageTest.class,
ch.qos.logback.core.recovery.PackageTest.class})
ch.qos.logback.core.status.PackageTest.class,
ch.qos.logback.core.util.PackageTest.class,
ch.qos.logback.core.helpers.PackageTest.class,
ch.qos.logback.core.subst.PackageTest.class,
ch.qos.logback.core.pattern.PackageTest.class,
ch.qos.logback.core.PackageTest.class,
ch.qos.logback.core.joran.PackageTest.class,
ch.qos.logback.core.appender.PackageTest.class,
ch.qos.logback.core.spi.PackageTest.class,
ch.qos.logback.core.rolling.PackageTest.class,
ch.qos.logback.core.sift.PackageTest.class,
ch.qos.logback.core.encoder.PackageTest.class,
ch.qos.logback.core.recovery.PackageTest.class})
public class AllCoreTest {
}
Expand Up @@ -37,17 +37,20 @@ public void literal() throws ScanException {
assertEquals(input, nodeToStringTransformer.transform());
}

@Test
public void literalWithAccolades() throws ScanException {
String input = "%logger{35}";

void checkInputEqualsOutput(String input) throws ScanException {
Node node = makeNode(input);
System.out.println(node);
NodeToStringTransformer nodeToStringTransformer = new NodeToStringTransformer(node, propertyContainer0);
assertEquals(input, nodeToStringTransformer.transform());
}


// %-4relative [%thread] %-5level %logger{35} - %msg%n
@Test
public void literalWithNestedAccolades() throws ScanException {
checkInputEqualsOutput("%logger{35}");
checkInputEqualsOutput("%a{35} %b{35} c");
checkInputEqualsOutput("%replace(%msg){'\\d{14,16}', 'XXXX'}");
checkInputEqualsOutput("TEST %d{HHmmssSSS} [%thread] %-5level %logger{36} - %msg%n");
}

@Test
public void variable() throws ScanException {
Expand Down
Expand Up @@ -38,15 +38,61 @@ public void literal() throws ScanException {
}

@Test
public void literalWithAccolade() throws ScanException {
Tokenizer tokenizer = new Tokenizer("}");
public void literalWithAccolade0() throws ScanException {
Tokenizer tokenizer = new Tokenizer("{}");
Parser parser = new Parser(tokenizer.tokenize());
Node node = parser.parse();
Node witness = new Node(Node.Type.LITERAL, "{b");
Node witness = new Node(Node.Type.LITERAL, "{");
witness.next = new Node(Node.Type.LITERAL, "}");
assertEquals(witness, node);
}

@Test
public void literalWithAccolade1() throws ScanException {
Tokenizer tokenizer = new Tokenizer("%x{a}");
Parser parser = new Parser(tokenizer.tokenize());
Node node = parser.parse();
Node witness = new Node(Node.Type.LITERAL, "%x");
Node t = witness.next = new Node(Node.Type.LITERAL, "{");
t.next = new Node(Node.Type.LITERAL, "a");
t = t.next;
t.next = new Node(Node.Type.LITERAL, "}");
assertEquals(witness, node);
}

@Test
public void literalWithTwoAccolades() throws ScanException {
Tokenizer tokenizer = new Tokenizer("%x{y} %a{b} c");

Parser parser = new Parser(tokenizer.tokenize());
Node node = parser.parse();
Node witness = new Node(Node.Type.LITERAL, "%x");

Node t = witness.next = new Node(Node.Type.LITERAL, "{");
t.next = new Node(Node.Type.LITERAL, "y");
t = t.next;

t.next = new Node(Node.Type.LITERAL, "}");
t = t.next;

t.next = new Node(Node.Type.LITERAL, " %a");
t = t.next;

t.next = new Node(Node.Type.LITERAL, "{");
t = t.next;

t.next = new Node(Node.Type.LITERAL, "b");
t = t.next;

t.next = new Node(Node.Type.LITERAL, "}");
t = t.next;

t.next = new Node(Node.Type.LITERAL, " c");

System.out.println("x"+node);
assertEquals(witness, node);
}

@Test
public void variable() throws ScanException {
Tokenizer tokenizer = new Tokenizer("${abc}");
Expand Down
Expand Up @@ -36,14 +36,18 @@ public void literalOnly() throws ScanException {

@Test
public void literalWithAccolades() throws ScanException {
String input0 = "%logger{24";
String input1 = " - %m";
String input = input0+"}"+input1;
String input0 = "%logger";
String input1 = "24";
String input2 = " - %m";
String input = input0+"{"+input1+"}"+input2;
Tokenizer tokenizer = new Tokenizer(input);
List<Token> tokenList = tokenizer.tokenize();
witnessList.add(new Token(Token.Type.LITERAL, input0));
witnessList.add(Token.STOP_TOKEN);
witnessList.add(Token.CURLY_LEFT_TOKEN);
witnessList.add(new Token(Token.Type.LITERAL, input1));

witnessList.add(Token.CURLY_RIGHT_TOKEN);
witnessList.add(new Token(Token.Type.LITERAL, input2));
assertEquals(witnessList, tokenList);
}

Expand All @@ -55,7 +59,7 @@ public void simleVariable() throws ScanException {
List<Token> tokenList = tokenizer.tokenize();
witnessList.add(Token.START_TOKEN);
witnessList.add(new Token(Token.Type.LITERAL, "abc"));
witnessList.add(Token.STOP_TOKEN);
witnessList.add(Token.CURLY_RIGHT_TOKEN);
assertEquals(witnessList, tokenList);
}

Expand All @@ -67,7 +71,7 @@ public void mix() throws ScanException {
witnessList.add(new Token(Token.Type.LITERAL, "a"));
witnessList.add(Token.START_TOKEN);
witnessList.add(new Token(Token.Type.LITERAL, "b"));
witnessList.add(Token.STOP_TOKEN);
witnessList.add(Token.CURLY_RIGHT_TOKEN);
witnessList.add(new Token(Token.Type.LITERAL, "c"));
assertEquals(witnessList, tokenList);
}
Expand All @@ -82,8 +86,8 @@ public void nested() throws ScanException {
witnessList.add(new Token(Token.Type.LITERAL, "b"));
witnessList.add(Token.START_TOKEN);
witnessList.add(new Token(Token.Type.LITERAL, "c"));
witnessList.add(Token.STOP_TOKEN);
witnessList.add(Token.STOP_TOKEN);
witnessList.add(Token.CURLY_RIGHT_TOKEN);
witnessList.add(Token.CURLY_RIGHT_TOKEN);
assertEquals(witnessList, tokenList);
}

Expand All @@ -97,7 +101,7 @@ public void basicDefaultSeparator() throws ScanException {
witnessList.add(new Token(Token.Type.LITERAL, "a"));
witnessList.add(Token.DEFAULT_SEP_TOKEN);
witnessList.add(new Token(Token.Type.LITERAL, "b"));
witnessList.add(Token.STOP_TOKEN);
witnessList.add(Token.CURLY_RIGHT_TOKEN);
assertEquals(witnessList, tokenList);
}

Expand Down

0 comments on commit 209db1e

Please sign in to comment.