Author: sdeboy
Date: Sun Nov  7 07:12:17 2010
New Revision: 1032218

URL: http://svn.apache.org/viewvc?rev=1032218&view=rev
Log:
Updated the expression handling logic to no longer require spaces around 
operators & operands in expressions

Modified:
    
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/rule/ExpressionRule.java
    
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/rule/InFixToPostFix.java
    
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/spi/LoggingEventFieldResolver.java

Modified: 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/rule/ExpressionRule.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/rule/ExpressionRule.java?rev=1032218&r1=1032217&r2=1032218&view=diff
==============================================================================
--- 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/rule/ExpressionRule.java
 (original)
+++ 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/rule/ExpressionRule.java
 Sun Nov  7 07:12:17 2010
@@ -17,11 +17,10 @@
 
 package org.apache.log4j.rule;
 
-import org.apache.log4j.spi.LoggingEvent;
-
 import java.util.Map;
 import java.util.Stack;
-import java.util.StringTokenizer;
+
+import org.apache.log4j.spi.LoggingEvent;
 
 
 /**
@@ -129,7 +128,7 @@ public class ExpressionRule extends Abst
       RuleFactory factory = RuleFactory.getInstance();
 
       Stack stack = new Stack();
-      StringTokenizer tokenizer = new StringTokenizer(expression);
+      InFixToPostFix.CustomTokenizer tokenizer = new 
InFixToPostFix.CustomTokenizer(expression);
 
           while (tokenizer.hasMoreTokens()) {
             //examine each token

Modified: 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/rule/InFixToPostFix.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/rule/InFixToPostFix.java?rev=1032218&r1=1032217&r2=1032218&view=diff
==============================================================================
--- 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/rule/InFixToPostFix.java
 (original)
+++ 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/rule/InFixToPostFix.java
 Sun Nov  7 07:12:17 2010
@@ -18,12 +18,15 @@
 package org.apache.log4j.rule;
 
 import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Stack;
-import java.util.StringTokenizer;
 import java.util.Vector;
 
+import org.apache.log4j.spi.LoggingEventFieldResolver;
+
 /**
  * A helper class which converts infix expressions to postfix expressions
  * Currently grouping is supported, as well as all of the
@@ -55,18 +58,14 @@ public class InFixToPostFix {
     /**
      * Precedence map.
      */
-  private final Map precedenceMap = new HashMap();
+  private static final Map precedenceMap = new HashMap();
     /**
      * Operators.
      */
-  private final List operators = new Vector();
+  private static final List operators = new Vector();
 
-    /**
-     * Create new instance.
-     */
-  public InFixToPostFix() {
-     super();
-    //boolean operators
+
+  static {
     operators.add("!");
     operators.add("!=");
     operators.add("==");
@@ -96,14 +95,13 @@ public class InFixToPostFix {
     precedenceMap.put("||", new Integer(2));
     precedenceMap.put("&&", new Integer(2));
   }
-
     /**
      * Convert in-fix expression to post-fix.
      * @param expression in-fix expression.
      * @return post-fix expression.
      */
   public String convert(final String expression) {
-    return infixToPostFix(new StringTokenizer(expression));
+    return infixToPostFix(new CustomTokenizer(expression));
   }
 
     /**
@@ -111,7 +109,7 @@ public class InFixToPostFix {
      * @param s symbol.
      * @return true if operand.
      */
-  boolean isOperand(final String s) {
+  public static boolean isOperand(final String s) {
     String symbol = s.toLowerCase();
     return (!operators.contains(symbol));
   }
@@ -147,7 +145,7 @@ public class InFixToPostFix {
      * @param tokenizer tokenizer.
      * @return post-fix expression.
      */
-  String infixToPostFix(final StringTokenizer tokenizer) {
+  String infixToPostFix(final CustomTokenizer tokenizer) {
     final String space = " ";
     StringBuffer postfix = new StringBuffer();
 
@@ -221,4 +219,158 @@ public class InFixToPostFix {
 
     return postfix.toString();
   }
+
+  public static class CustomTokenizer {
+    private LinkedList linkedList = new LinkedList();
+    public CustomTokenizer(String input) {
+      int index = 0;
+//      System.out.println("parsing: " + input);
+      boolean inString = false;
+      StringBuffer temp = new StringBuffer();
+      while (index < input.length()) {
+        String thisChar = input.substring(index, index + 1);
+        if (inString) {
+          if (thisChar.equals("'")) {
+//            System.out.println("ending a delimited string");
+            //end delimited string, add to linkedlist & continue
+            inString = false;
+            temp.append(thisChar);
+            linkedList.add(temp.toString());
+//            System.out.println("adding delimited string: " + 
temp.toString());
+            temp.setLength(0);
+          } else {
+            temp.append(thisChar);
+          }
+        } else {
+          if (thisChar.equals("'")) {
+            //starting a delimited string
+            inString = true;
+            temp.append(thisChar);
+//            System.out.println("starting a delimited string");
+          } else {
+            if (thisChar.equals(" ")) {
+              //no need to add the space - just add the linked list
+              if (!temp.toString().trim().equals("")) {
+//                System.out.println("found space - adding string: " + 
temp.toString());
+                linkedList.add(temp.toString());
+              }
+              temp.setLength(0);
+            } else {
+              //not a string delimited by single ticks or a space
+              //collect values until keyword is matched or operator is 
encountered
+              temp.append(thisChar);
+              String tempString = temp.toString();
+              //all fields except PROP. field can be added if present
+              if (LoggingEventFieldResolver.getInstance().isField(tempString) 
&&
+                  
!tempString.toUpperCase().startsWith(LoggingEventFieldResolver.PROP_FIELD)) {
+                linkedList.add(tempString);
+//                System.out.println("adding non-prop field: " + tempString);
+                temp.setLength(0);
+              } else {
+                //if building a property field, go until an operator are 
encountered
+                if 
(tempString.toUpperCase().startsWith(LoggingEventFieldResolver.PROP_FIELD)) {
+                  for (Iterator iter = operators.iterator();iter.hasNext();) {
+                    String thisOperator = (String)iter.next();
+                    if (tempString.endsWith(thisOperator)) {
+                      String property = tempString.substring(0, 
tempString.indexOf(thisOperator));
+                      if (!property.trim().equals("")) {
+                        linkedList.add(property);
+//                        System.out.println("adding property: " + property);
+                      }
+                      linkedList.add(thisOperator);
+//                      System.out.println("adding operator: " + thisOperator);
+
+                      temp.setLength(0);
+                    }
+                  }
+                  if (tempString.endsWith("(")) {
+                    String property = tempString.substring(0, 
tempString.indexOf("("));
+//                    System.out.println("adding property: " + property + " 
and left paren");
+
+                    if (!property.trim().equals("")) {
+                      linkedList.add(property);
+//                      System.out.println("adding property: " + property);
+                    }
+//                    System.out.println("adding (");
+                    linkedList.add("(");
+                    temp.setLength(0);
+                  }
+                  if (tempString.endsWith(")")) {
+                    String property = tempString.substring(0, 
tempString.indexOf(")"));
+                    if (!property.trim().equals("")) {
+//                      System.out.println("adding property: " + property);
+                      linkedList.add(property);
+                    }
+//                    System.out.println("adding )");
+                    linkedList.add(")");
+                    temp.setLength(0);
+                  }
+                } else {
+                  for (Iterator iter = operators.iterator();iter.hasNext();) {
+                    String thisOperator = (String)iter.next();
+                    //handling operator equality below
+                    if (!tempString.equals(thisOperator) && 
tempString.endsWith(thisOperator)) {
+                      String firstPart = tempString.substring(0, 
tempString.indexOf(thisOperator));
+                      if (!firstPart.trim().equals("")) {
+                        linkedList.add(firstPart);
+//                        System.out.println("adding first part: " + 
firstPart);
+                      }
+                      linkedList.add(thisOperator);
+//                      System.out.println("adding operator: " + thisOperator);
+
+                      temp.setLength(0);
+                    }
+                  }
+
+                  for (Iterator iter = operators.iterator();iter.hasNext();) {
+                    String thisOperator = (String)iter.next();
+                    if (tempString.equals(thisOperator)) {
+                      linkedList.add(thisOperator);
+                      temp.setLength(0);
+//                      System.out.println("adding operator: " + thisOperator);
+                    }
+                  }
+                  if (tempString.endsWith("(")) {
+                    String firstPart = tempString.substring(0, 
tempString.indexOf("("));
+                    if (!firstPart.trim().equals("")) {
+                      linkedList.add(firstPart);
+//                      System.out.println("adding first part: " + firstPart);
+                    }
+                    linkedList.add("(");
+//                    System.out.println("adding (");
+                    temp.setLength(0);
+                  }
+                  if (tempString.endsWith(")")) {
+                    String firstPart = tempString.substring(0, 
tempString.indexOf(")"));
+                    if (!firstPart.trim().equals("")) {
+//                      System.out.println("adding first part: " + firstPart);
+                      linkedList.add(firstPart);
+                    }
+                    linkedList.add(")");
+//                    System.out.println("adding  )");
+                    temp.setLength(0);
+                  }
+                }
+              }
+            }
+          }
+        }
+        index++;
+      }
+      if (temp.length() > 0) {
+//        System.out.println("adding remaining text: " + temp.toString());
+        linkedList.add(temp.toString());
+        temp.setLength(0);
+      }
+//      System.out.println("linked list: " + linkedList);
+    }
+
+    public boolean hasMoreTokens() {
+      return linkedList.size() > 0;
+    }
+
+    public String nextToken() {
+      return linkedList.remove().toString();
+    }
+  }
 }

Modified: 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/spi/LoggingEventFieldResolver.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/spi/LoggingEventFieldResolver.java?rev=1032218&r1=1032217&r2=1032218&view=diff
==============================================================================
--- 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/spi/LoggingEventFieldResolver.java
 (original)
+++ 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/spi/LoggingEventFieldResolver.java
 Sun Nov  7 07:12:17 2010
@@ -22,9 +22,10 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.StringTokenizer;
 import java.util.Locale;
 
+import org.apache.log4j.rule.InFixToPostFix;
+
 
 /**
  * A singleton helper utility which accepts a field name
@@ -157,7 +158,7 @@ public final class LoggingEventFieldReso
       if (replaceText == null) {
         return null;
       }
-      StringTokenizer tokenizer = new StringTokenizer(replaceText);
+      InFixToPostFix.CustomTokenizer tokenizer = new 
InFixToPostFix.CustomTokenizer(replaceText);
       StringBuffer result = new StringBuffer();
       boolean found = false;
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to