You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by sd...@apache.org on 2003/09/19 08:53:05 UTC
cvs commit: jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule RuleTest.java
sdeboy 2003/09/18 23:53:05
Modified: src/java/org/apache/log4j/chainsaw/rule RuleTest.java
Log:
Modified expression evaluation to evaluate and replace inside operator - single pass, no stringbuffers..still need to change scanner to not use stringtokenizer
Revision Changes Path
1.5 +69 -89 jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/RuleTest.java
Index: RuleTest.java
===================================================================
RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/rule/RuleTest.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- RuleTest.java 17 Sep 2003 06:24:38 -0000 1.4
+++ RuleTest.java 19 Sep 2003 06:53:05 -0000 1.5
@@ -103,7 +103,7 @@
eventList.add(new LoggingEvent("org.apache.log4j.net", Logger.getLogger("logger3"), System.currentTimeMillis(), Level.DEBUG, "message3", new Exception("test3")));
eventList.add(new LoggingEvent("org.apache.log4j.chainsaw", Logger.getLogger("logger4"), System.currentTimeMillis(), Level.WARN, "message4", new Exception("test4")));
- JPanel fieldPanel = new JPanel(new GridLayout(12, 1));
+ JPanel fieldPanel = new JPanel(new GridLayout(5, 1));
fieldPanel.add(
new JLabel("Enter infix expression to convert to postfix: "));
@@ -113,6 +113,9 @@
JButton inFixButton = new JButton("Convert InFix to PostFix");
fieldPanel.add(inFixButton);
+
+ JLabel resultsLabel = new JLabel("Results:");
+ fieldPanel.add(resultsLabel);
final JTextField inFixResult = new JTextField();
fieldPanel.add(inFixResult);
@@ -125,63 +128,23 @@
}
});
- fieldPanel.add(
- new JLabel("Enter boolean postfix expression to evaluate: "));
-
- final JTextField booleanPostFixTextField =
- new JTextField(booleanPostFixExpression);
- fieldPanel.add(booleanPostFixTextField);
-
- JButton booleanPostFixButton = new JButton("Evaluate Boolean PostFix");
- fieldPanel.add(booleanPostFixButton);
-
- final JTextField booleanResult = new JTextField();
- fieldPanel.add(booleanResult);
- booleanPostFixButton.addActionListener(
- new AbstractAction() {
- public void actionPerformed(ActionEvent evt) {
- EvaluateBooleanPostFix booleanPostFixEvaluator =
- new EvaluateBooleanPostFix();
- booleanResult.setText(
- booleanPostFixEvaluator.evaluate(
- booleanPostFixTextField.getText()));
- }
- });
-
-
JPanel resultsPanel = new JPanel(new BorderLayout());
- JButton resultsButton = new JButton("Replace fields (processes expression in 'Enter boolean postfix expression to evaluate' box)");
+ JButton resultsButton = new JButton("Evaluate postfix expression against collection of events: ");
resultsPanel.add(resultsButton, BorderLayout.NORTH);
final JTextArea results = new JTextArea(5, 50);
resultsPanel.add(results, BorderLayout.CENTER);
- JPanel copyNotePanel = new JPanel(new GridLayout(2, 1));
- copyNotePanel.add(new JLabel("Copy one of the lines in the replace fields box into the "));
- copyNotePanel.add(new JLabel("'Enter boolean postfix expression to evaluate' box and re-evaluate"));
- resultsPanel.add(copyNotePanel, BorderLayout.SOUTH);
resultsButton.addActionListener(
new AbstractAction() {
public void actionPerformed(ActionEvent evt) {
results.setText("");
- String originalPostFix = booleanPostFixTextField.getText();
- System.out.println("postfix is " + originalPostFix);
Iterator iter = eventList.iterator();
+ EvaluateBooleanPostFix evaluator = new EvaluateBooleanPostFix();
while (iter.hasNext()) {
LoggingEvent event = (LoggingEvent)iter.next();
- StringTokenizer tokenizer = new StringTokenizer(originalPostFix);
- StringBuffer newPostFix = new StringBuffer();
- String nextToken = null;
- while (tokenizer.hasMoreElements()) {
- nextToken = tokenizer.nextToken();
- if (resolver.isField(nextToken)) {
- newPostFix.append(resolver.getValue(nextToken, event) + " ");
- } else {
- newPostFix.append(nextToken + " ");
- }
- }
- results.setText(results.getText() + (results.getText().length()==0?"":"\n") + newPostFix.toString());
+ results.setText(results.getText() + (results.getText().length()==0?"":"\n") + "level: " + event.getLevel() + ", logger: " + event.getLoggerName() + " - result: " + evaluator.evaluate(inFixResult.getText(), event));
}
}
});
@@ -196,8 +159,8 @@
public static void main(String[] args) {
RuleTest test =
new RuleTest(
- "level debug ~= BLAH test == logger logger1 == && ||",
- "( ( level ~= debug ) || ( BLAH == test ) ) && logger == logger1");
+ "level debug ~= BLAH test == || logger logger1 == && ",
+ "( ( level ~= debug ) || ( BLAH == test ) ) && logger == logger1");
test.pack();
test.setVisible(true);
}
@@ -211,9 +174,9 @@
try {
result = Boolean.valueOf(param).booleanValue();
+ System.out.println("convert to boolean: " + param + "..result " + result);
} catch (Exception e) {
e.printStackTrace();
-
return result;
}
@@ -221,43 +184,62 @@
}
abstract class BooleanOperator {
- abstract boolean evaluate(String firstParam, String secondParam);
+ //the evaluate method usually uses the 2nd item on the stack first
+ abstract boolean evaluate(Stack stack);
}
- class AndOperator extends BooleanOperator {
- boolean evaluate(String firstParam, String secondParam) {
- System.out.println("and op");
+ abstract class EventOperator {
+ //the evaluate method usually uses the 2nd item on the stack first
+ abstract boolean evaluate(Stack stack, LoggingEvent event);
+ }
- return (convertToBoolean(firstParam) && convertToBoolean(secondParam));
+ class AndOperator extends BooleanOperator {
+ boolean evaluate(Stack stack) {
+ String firstParam = stack.pop().toString();
+ String secondParam = stack.pop().toString();
+ System.out.println(
+ "and op " + firstParam + ".." + secondParam);
+ boolean result = (convertToBoolean(firstParam) && convertToBoolean(secondParam));
+ System.out.println("result is " + result);
+ return result;
}
}
class OrOperator extends BooleanOperator {
- boolean evaluate(String firstParam, String secondParam) {
- System.out.println("or op");
-
- return (convertToBoolean(firstParam) || convertToBoolean(secondParam));
+ boolean evaluate(Stack stack) {
+ String firstParam = stack.pop().toString();
+ String secondParam = stack.pop().toString();
+ System.out.println(
+ "or op " + firstParam + ".." + secondParam);
+ boolean result = (convertToBoolean(firstParam) || convertToBoolean(secondParam));
+ System.out.println("result is " + result);
+ return result;
}
}
- class PartialTextMatchOperator extends BooleanOperator {
- boolean evaluate(String firstParam, String secondParam) {
- System.out.println(
- "part text match op " + firstParam + ".." + secondParam);
-
- return ((secondParam != null && firstParam != null) &&
- (secondParam.toLowerCase().indexOf(firstParam.toLowerCase()) > -1));
+ class PartialTextMatchOperator extends EventOperator {
+ LoggingEventFieldResolver resolver = LoggingEventFieldResolver.getInstance();
+ boolean evaluate(Stack stack, LoggingEvent event) {
+ String firstParam = stack.pop().toString();
+ String secondParam = resolver.getValue(stack.pop().toString(), event).toString();
+ System.out.println(
+ "partial text match op " + firstParam + ".." + secondParam);
+ boolean result = ((secondParam != null && firstParam != null) &&
+ (secondParam.toLowerCase().indexOf(firstParam.toLowerCase()) > -1));
+ System.out.println("result is " + result);
+ return result;
}
}
- class TextMatchOperator extends BooleanOperator {
- boolean evaluate(String firstParam, String secondParam) {
- System.out.println("text match op " + firstParam + ".." + secondParam);
-
- //second parameter is field name
- //first parameter is value
- //fake out logic here to examine passed in parameters and value retrieval from table
- return ((secondParam != null) && secondParam.equals(firstParam));
+ class EqualsOperator extends EventOperator {
+ LoggingEventFieldResolver resolver = LoggingEventFieldResolver.getInstance();
+ boolean evaluate(Stack stack, LoggingEvent event) {
+ String firstParam = stack.pop().toString();
+ String secondParam = resolver.getValue(stack.pop().toString(), event).toString();
+ System.out.println("equals op " + firstParam + ".." + secondParam);
+ boolean result = ((secondParam != null) && secondParam.equals(firstParam));
+ System.out.println("result is " + result);
+ return result;
}
}
@@ -266,18 +248,19 @@
*
*/
class EvaluateBooleanPostFix {
- private final Map symbolMap = new HashMap();
+ private final Map booleanOperatorMap = new HashMap();
+ private final Map eventOperatorMap = new HashMap();
private final Stack stack = new Stack();
String result = null;
EvaluateBooleanPostFix() {
- symbolMap.put("&&", new AndOperator());
- symbolMap.put("||", new OrOperator());
- symbolMap.put("==", new TextMatchOperator());
- symbolMap.put("~=", new PartialTextMatchOperator());
+ booleanOperatorMap.put("&&", new AndOperator());
+ booleanOperatorMap.put("||", new OrOperator());
+ eventOperatorMap.put("==", new EqualsOperator());
+ eventOperatorMap.put("~=", new PartialTextMatchOperator());
}
- String evaluate(String expression) {
+ String evaluate(String expression, LoggingEvent event) {
String result = null;
Enumeration tokenizer = new StringTokenizer(expression);
@@ -286,17 +269,14 @@
String nextToken = ((String) tokenizer.nextElement());
//if a symbol is found, pop 2 off the stack, evaluate and push the result
- if (symbolMap.containsKey(nextToken)) {
- BooleanOperator op = (BooleanOperator) symbolMap.get(nextToken);
- Object o = stack.pop();
- Object p = stack.pop();
-
- //notice the evaluate takes the 2nd parameter as the first field
- Boolean output =
- Boolean.valueOf(op.evaluate(o.toString(), p.toString()));
- System.out.println("o, p,output is " + o + ".." + p + ".." + output);
- stack.push(output);
- } else {
+ if (booleanOperatorMap.containsKey(nextToken)) {
+ BooleanOperator op = (BooleanOperator) booleanOperatorMap.get(nextToken);
+ //the operator is responsible for popping the stack
+ stack.push(Boolean.valueOf(op.evaluate(stack)));
+ } else if (eventOperatorMap.containsKey(nextToken)) {
+ EventOperator op = (EventOperator)eventOperatorMap.get(nextToken);
+ stack.push(Boolean.valueOf(op.evaluate(stack, event)));
+ } else {
//variables or constants are pushed onto the stack
stack.push(nextToken);
}
@@ -337,7 +317,7 @@
precedenceMap.put("==", new Integer(2));
precedenceMap.put("~=", new Integer(2));
precedenceMap.put("||", new Integer(3));
- precedenceMap.put("&&", new Integer(3));
+ precedenceMap.put("&&", new Integer(4));
}
public String convert(String expression) {
---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-dev-help@jakarta.apache.org