webwork/src/main/webwork/util Query.java,1.22,1.23 ValueStack.java,1.53,1.54

[email protected] Sun, 16 Nov 2003 16:55:49 -0800
Newsgroups gmane.comp.java.open-symphony.cvs
Message-ID <[email protected]>
Update of /cvsroot/opensymphony/webwork/src/main/webwork/util
In directory sc8-pr-cvs1:/tmp/cvs-serv14662/src/main/webwork/util

Modified Files:
	Query.java ValueStack.java 
Log Message:
Patched from Dick. expr.jsp now passes.
ValueStackTestCase still has two failures though.


Index: Query.java
===================================================================
RCS file: /cvsroot/opensymphony/webwork/src/main/webwork/util/Query.java,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- Query.java	16 Nov 2003 23:35:02 -0000	1.22
+++ Query.java	17 Nov 2003 00:55:47 -0000	1.23
@@ -1,407 +1,406 @@
-/*
- * WebWork, Web Application Framework
- *
- * Distributable under Apache license.
- * See terms of license at opensource.org
- */
-package webwork.util;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * ValueStack Query. This class parsers the ValueStack Query string
- * and caches the parsed query.
- *
- * @author Maurice C. Parker ([email protected])
- * @version $Revision$
- */
-public class Query {
-   // Static  -------------------------------------------------------
-   protected static Map queries = new ConcurrentReaderHashMap();
-   public static final Query CURRENT = getQuery(".");
-
-   /**
-    * Create a new Query and cache it for faster processing;
-    *
-    */
-   public static Query getQuery(String queryString) {
-      //LogFactory.getLog(this.getClass()).debug( "GET_QUERY: " + queryString );
-      Query query = (Query) queries.get(queryString);
-
-      if (query == null) {
-         query = new Query(queryString);
-         queries.put(queryString, query);
-      }
-
-      return query;
-   }
-
-   // Attributes ----------------------------------------------------
-   private final static char LPAREN = '(';
-   private final static char RPAREN = ')';
-   private final static char RBRACE = '}';
-   private final static char LBRACE = '{';
-   private final static char LBRACKET = '[';
-   private final static char RBRACKET = ']';
-   private final static char PARAM = '$';
-   private final static char ATTR = '@';
-   private final static char SLASH = '/';
-   private final static char SQUOTE = '\'';
-   private final static char PERIOD = '.';
-   private final static char COMMA = ',';
-
-   private QuerySegment[] segments = new QuerySegment[5];
-   private int segmentsIdx = 0;
-   private String queryString;
-
-   // Constructor ---------------------------------------------------
-   private Query(String queryString) {
-   	// Trim the query of any surrounding whitespace
-      this.queryString = queryString.trim();
-      char[] query = this.queryString.toCharArray();
-
-      // Current value on top of stack
-      if (query[0] == PERIOD && query.length == 1) {
-         add(new QuerySegment(QuerySegment.CURRENT));
-         return;
-      }
-
-      // Root value of stack
-      if (query[0] == SLASH && query.length == 1) {
-         add(new QuerySegment(QuerySegment.ROOT));
-         return;
-      }
-
-      // Strings
-      if (query[0] == SQUOTE) {
-         if (query[query.length - 1] != SQUOTE)
-            throwIllegalArgumentException(query, "missing matching end quote");
-
-         // create the new string constant
-         String id = new String(query, 1, query.length - 2);
-         add(new QuerySegment(id, QuerySegment.STRING));
-
-         return;
-      }
-
-      // Parameters
-      if (query[0] == PARAM) {
-         String id = new String(query, 1, query.length - 1);
-         add(new QuerySegment(id, QuerySegment.PARAMETER));
-         return;
-      }
-
-      // The true keyword
-      if (query.length == 4 &&
-            query[0] == 't' && query[1] == 'r' &&
-            query[2] == 'u' && query[3] == 'e') {
-         add(new QuerySegment(QuerySegment.TRUE));
-         return;
-      }
-
-      // The false keyword
-      if (query.length == 5 &&
-            query[0] == 'f' && query[1] == 'a' &&
-            query[2] == 'l' && query[3] == 's' &&
-            query[4] == 'e') {
-         add(new QuerySegment(QuerySegment.FALSE));
-         return;
-      }
-
-      // The null keyword
-      if (query.length == 4 &&
-            query[0] == 'n' && query[1] == 'u' &&
-            query[2] == 'l' && query[3] == 'l') {
-         add(new QuerySegment(QuerySegment.NULL));
-         return;
-      }
-
-      // Integers (first check to see if the first character is a number)
-      // If it is a number starting with . then there must be at least
-      // one more character and it must be a number
-      if ((query[0] < ':' && query[0] > '/') || query[0] == '-' ||
-      	(query[0] == '.' && query.length > 1 && (query[1] < ':' && query[1] > '/'))) {
-         Object val;
-         try {
-            String s = new String(query, 0, query.length);
-            if (s.indexOf('.') >= 0) {
-               val = new Double(s);
-            } else {
-               val = new Integer(s);
-            }
-            QuerySegment qs = new QuerySegment(QuerySegment.NUMBER);
-            qs.addValue(val);
-            add(qs);
-            return;
-         } catch (NumberFormatException nfe) {
-         }
-      }
-
-      // Always leave the query index on a token
-      int queryIdx = -1;
-
-      // Attributes
-      if (query[0] == ATTR) {
-         // search for the beginning of the next name element and create the attribute name
-         for (queryIdx = 1;
-              queryIdx < query.length && query[queryIdx] != SLASH && query[queryIdx] != LBRACKET;
-              queryIdx++) {
-         }
-
-         String id = new String(query, 1, queryIdx - 1);
-         //Category.getInstance(this.getClass()).debug("getting attribute name: " + attrName);
-         add(new QuerySegment(id, QuerySegment.ATTRIBUTE));
-
-         // if we are done at this point, don't fall through the rest of the method
-         if (queryIdx == query.length)
-            return;
-
-         // if the index is sitting on a left bracket, back it off by one.  the next phase
-         // of the parser expects slashes to be skipped, but not other elements.
-         if (query[queryIdx] == LBRACKET)
-            queryIdx--;
-            
-      }
-
-      int lastExprIdx;
-      int begParenIdx;
-      int begBracketIdx;
-      int endBracketIdx;
-      int begBraceIdx;
-      int endBraceIdx;
-      int paramStart;
-      int paramEnd;
-      int[] paramIdxs = new int[10];
-      int commaNbr;
-      int parenDepth;
-      int braceDepth;
-      int bracketDepth;
-      int squoteDepth;
-
-      do  // this loop is to search through the query elements
-      {
-         lastExprIdx = queryIdx;
-         begParenIdx = -1;
-         begBracketIdx = -1;
-         endBracketIdx = -1;
-         begBraceIdx = -1;
-         endBraceIdx = -1;
-         paramIdxs[0] = -1;
-         paramIdxs[1] = -1;
-         paramIdxs[2] = -1;
-         paramIdxs[3] = -1;
-         paramIdxs[4] = -1;
-         paramIdxs[5] = -1;
-         paramIdxs[6] = -1;
-         paramIdxs[7] = -1;
-         paramIdxs[8] = -1;
-         paramIdxs[9] = -1;
-         commaNbr = 0;
-
-         parenDepth = 0;
-         braceDepth = 0;
-         bracketDepth = 0;
-         squoteDepth = 0;
-
-         while (true) {
-            queryIdx++;
-
-            if (queryIdx == query.length)
-               break;
-
-            //Category.getInstance(this.getClass()).debug("queryIdx: " + queryIdx + " query position: " + query[queryIdx] );
-            if (query[queryIdx] == SLASH) {
-               // check to make sure that this isn't an embedded slash
-               if ((parenDepth > 0) || (braceDepth > 0) || (bracketDepth > 0) || (squoteDepth > 0)) {
-                  //Category.getInstance(this.getClass()).debug("skipping embedded slash at pos: " + queryIdx );
-                  continue;
-               } else if (queryIdx == 0) {
-                  //Category.getInstance(this.getClass()).debug("root query segment found");
-                  add(new QuerySegment(QuerySegment.ROOT));
-                  lastExprIdx = 0;
-                  continue;
-               } else {
-                  //Category.getInstance(this.getClass()).debug("breaking element parse loop at pos: " + queryIdx );
-                  break;
-               }
-
-            }
-            // parens
-            else if (query[queryIdx] == LPAREN) {
-               parenDepth++;
-               if (begParenIdx < 0 && braceDepth == 0 && bracketDepth == 0 && squoteDepth == 0)
-                  begParenIdx = queryIdx;
-            } else if (query[queryIdx] == RPAREN) {
-               parenDepth--;
-               paramIdxs[commaNbr] = queryIdx;
-            }
-            // brackets
-            else if (query[queryIdx] == LBRACKET) {
-               bracketDepth++;
-               if (begBracketIdx < 0 && parenDepth == 0 && braceDepth == 0 && squoteDepth == 0)
-                  begBracketIdx = queryIdx;
-            } else if (query[queryIdx] == RBRACKET) {
-               bracketDepth--;
-               endBracketIdx = queryIdx;
-            }
-            // braces
-            else if (query[queryIdx] == LBRACE) {
-               braceDepth++;
-               if (begBraceIdx < 0 && parenDepth == 0 && bracketDepth == 0 && squoteDepth == 0)
-                  begBraceIdx = queryIdx;
-            } else if (query[queryIdx] == RBRACE) {
-               braceDepth--;
-               endBraceIdx = queryIdx;
-            }
-            // single quotes
-            else if (query[queryIdx] == SQUOTE) {
-               // we can only quote one level deep
-               if (squoteDepth < 1)
-                  squoteDepth++;
-               else
-                  squoteDepth--;
-            } else if (query[queryIdx] == COMMA) {
-               // only look for commas that are in the current method and
-               // not embedded in a quoted string
-               if (parenDepth == 1 && squoteDepth == 0) {
-                  paramIdxs[commaNbr] = queryIdx;
-                  commaNbr++;
-               }
-            }
-         }
-
-         if (squoteDepth > 0)
-            throwIllegalArgumentException(query, "missing matching end quote");
-
-         //-- Expression Expansion
-         if (begBraceIdx > -1) {
-            if (endBraceIdx < 0)
-               throwIllegalArgumentException(query, "missing matching brace");
-
-            String id = new String(query, begBraceIdx + 1, endBraceIdx - (begBraceIdx + 1));
-            Query expandQuery = getQuery(id);
-            add(new QuerySegment(id, expandQuery, QuerySegment.EXPAND));
-         }
-         //-- Method
-         else if (begParenIdx > -1) {
-            if (paramIdxs[0] < 0)
-               throwIllegalArgumentException(query, "missing matching parenthesis");
-
-            // parse out the name of the method
-            String id = new String(query, lastExprIdx + 1, begParenIdx - (lastExprIdx + 1));
-            QuerySegment qs = new QuerySegment(id, QuerySegment.METHOD);
-
-            // parse out the method parameters
-            paramStart = begParenIdx + 1;
-            commaNbr = -1;
-
-            // build the parameters for the method
-            while (paramIdxs[++commaNbr] > -1) {
-               // set the end to be one less than the token position
-               paramEnd = paramIdxs[commaNbr] - 1;
-
-               // trim it out any white space
-               while ((paramStart < paramEnd) && (query[paramStart] <= ' ')) {
-                  paramStart++;
-               }
-               while ((paramStart < paramEnd) && (query[paramEnd] <= ' ')) {
-                  paramStart--;
-               }
-
-               // create the parsed parameter and add it to the query segment
-               String parameter = new String(query, paramStart, (paramEnd - paramStart) + 1);
-               Query paramQuery = getQuery(parameter);
-               qs.addValue(paramQuery);
-
-               // bump the start one past the end token position
-               paramStart = paramIdxs[commaNbr] + 1;
-            }
-
-            add(qs);
-         }
-         //-- Parent Access
-         else if (lastExprIdx + 2 < query.length &&
-               query[lastExprIdx + 1] == PERIOD &&
-               query[lastExprIdx + 2] == PERIOD) {
-            add(new QuerySegment(QuerySegment.PARENT));
-         }
-         //-- Current Access
-         else if (lastExprIdx + 1 < query.length &&
-               query[lastExprIdx + 1] == PERIOD) {
-            add(new QuerySegment(QuerySegment.CURRENT));
-         }
-         // check to see if this will be a collection only access
-         else if (lastExprIdx + 1 != begBracketIdx) {
-            int propertyEnd;
-            if (begBracketIdx > -1)
-               propertyEnd = begBracketIdx;
-            else
-               propertyEnd = queryIdx;
-
-            // Parse out the property name
-            String id = new String(query, lastExprIdx + 1, propertyEnd - (lastExprIdx + 1));
-
-            add(new QuerySegment(id, QuerySegment.PROPERTY));
-         }
-
-         //-- Collection access
-         if (begBracketIdx > -1) {
-            if (endBracketIdx < 0)
-               throwIllegalArgumentException(query, "missing matching bracket");
-
-            // parse out the name of the key
-            String key = new String(query, begBracketIdx + 1, endBracketIdx - (begBracketIdx + 1));
-            Query queryKey = getQuery(key);
-            add(new QuerySegment(key, queryKey, QuerySegment.COLLECTION));
-         }
-
-      } while (queryIdx < query.length);
-   }
-
-   // Public --------------------------------------------------------
-   /**
-    * Returns the parsed query segments.
-    */
-   public QuerySegment[] getSegments() {
-      return segments;
-   }
-
-   /**
-    * String representation of this object.
-    */
-   public String toString() {
-      StringBuffer sb = new StringBuffer();
-      sb.append("query=\"").append(queryString).append("\"");
-
-      for (int i = 0; i < segments.length; i++) {
-         QuerySegment segment = segments[i];
-         if (segment!=null) {
-            sb.append(" {").append(segment).append("}");
-         }
-      }
-      return sb.toString();
-   }
-
-   // Private -------------------------------------------------------
-   /**
-    * Always throws IllegalArgumentException.
-    */
-   private Object throwIllegalArgumentException(char[] query, String message) {
-      throw new IllegalArgumentException(message + " for query: " + new String(query));
-   }
-
-   /**
-    * Add another segment to the segments array.
-    */
-   private void add(QuerySegment qs) {
-      if (segmentsIdx == segments.length-1) {
-         QuerySegment[] resize = new QuerySegment[segments.length + 5];
-         System.arraycopy(segments, 0, resize, 0, segments.length);
-         segments = resize;
-      }
-
-      segments[segmentsIdx++] = qs;
-   }
-
-}
+/*
+ * WebWork, Web Application Framework
+ *
+ * Distributable under Apache license.
+ * See terms of license at opensource.org
+ */
+package webwork.util;
+
+import java.util.Map;
+
+/**
+ * ValueStack Query. This class parsers the ValueStack Query string
+ * and caches the parsed query.
+ *
+ * @author Maurice C. Parker ([email protected])
+ * @version $Revision$
+ */
+public class Query {
+   // Static  -------------------------------------------------------
+   protected static Map queries = new ConcurrentReaderHashMap();
+   public static final Query CURRENT = getQuery(".");
+
+   /**
+    * Create a new Query and cache it for faster processing;
+    *
+    */
+   public static Query getQuery(String queryString) {
+      //LogFactory.getLog(this.getClass()).debug( "GET_QUERY: " + queryString );
+      Query query = (Query) queries.get(queryString);
+
+      if (query == null) {
+         query = new Query(queryString);
+         queries.put(queryString, query);
+      }
+
+      return query;
+   }
+
+   // Attributes ----------------------------------------------------
+   private final static char LPAREN = '(';
+   private final static char RPAREN = ')';
+   private final static char RBRACE = '}';
+   private final static char LBRACE = '{';
+   private final static char LBRACKET = '[';
+   private final static char RBRACKET = ']';
+   private final static char PARAM = '$';
+   private final static char ATTR = '@';
+   private final static char SLASH = '/';
+   private final static char SQUOTE = '\'';
+   private final static char PERIOD = '.';
+   private final static char COMMA = ',';
+
+   private QuerySegment[] segments = new QuerySegment[5];
+   private int segmentsIdx = 0;
+   private String queryString;
+
+   // Constructor ---------------------------------------------------
+   private Query(String queryString) {
+   	// Trim the query of any surrounding whitespace
+      this.queryString = queryString.trim();
+      char[] query = this.queryString.toCharArray();
+
+      // Current value on top of stack
+      if (query[0] == PERIOD && query.length == 1) {
+         add(new QuerySegment(QuerySegment.CURRENT));
+         return;
+      }
+
+      // Root value of stack
+      if (query[0] == SLASH && query.length == 1) {
+         add(new QuerySegment(QuerySegment.ROOT));
+         return;
+      }
+
+      // Strings
+      if (query[0] == SQUOTE) {
+         if (query[query.length - 1] != SQUOTE)
+            throwIllegalArgumentException(query, "missing matching end quote");
+
+         // create the new string constant
+         String id = new String(query, 1, query.length - 2);
+         add(new QuerySegment(id, QuerySegment.STRING));
+
+         return;
+      }
+
+      // Parameters
+      if (query[0] == PARAM) {
+         String id = new String(query, 1, query.length - 1);
+         add(new QuerySegment(id, QuerySegment.PARAMETER));
+         return;
+      }
+
+      // The true keyword
+      if (query.length == 4 &&
+            query[0] == 't' && query[1] == 'r' &&
+            query[2] == 'u' && query[3] == 'e') {
+         add(new QuerySegment(QuerySegment.TRUE));
+         return;
+      }
+
+      // The false keyword
+      if (query.length == 5 &&
+            query[0] == 'f' && query[1] == 'a' &&
+            query[2] == 'l' && query[3] == 's' &&
+            query[4] == 'e') {
+         add(new QuerySegment(QuerySegment.FALSE));
+         return;
+      }
+
+      // The null keyword
+      if (query.length == 4 &&
+            query[0] == 'n' && query[1] == 'u' &&
+            query[2] == 'l' && query[3] == 'l') {
+         add(new QuerySegment(QuerySegment.NULL));
+         return;
+      }
+
+      // Integers (first check to see if the first character is a number)
+      // If it is a number starting with . then there must be at least
+      // one more character and it must be a number
+      if ((query[0] < ':' && query[0] > '/') || query[0] == '-' ||
+      	(query[0] == '.' && query.length > 1 && (query[1] < ':' && query[1] > '/'))) {
+         Object val;
+         try {
+            String s = new String(query, 0, query.length);
+            if (s.indexOf('.') >= 0) {
+               val = new Double(s);
+            } else {
+               val = new Integer(s);
+            }
+            QuerySegment qs = new QuerySegment(QuerySegment.NUMBER);
+            qs.addValue(val);
+            add(qs);
+            return;
+         } catch (NumberFormatException nfe) {
+         }
+      }
+
+      // Always leave the query index on a token
+      int queryIdx = -1;
+
+      // Attributes
+      if (query[0] == ATTR) {
+         // search for the beginning of the next name element and create the attribute name
+         for (queryIdx = 1;
+              queryIdx < query.length && query[queryIdx] != SLASH && query[queryIdx] != LBRACKET;
+              queryIdx++) {
+         }
+
+         String id = new String(query, 1, queryIdx - 1);
+         //Category.getInstance(this.getClass()).debug("getting attribute name: " + attrName);
+         add(new QuerySegment(id, QuerySegment.ATTRIBUTE));
+
+         // if we are done at this point, don't fall through the rest of the method
+         if (queryIdx == query.length)
+            return;
+
+         // if the index is sitting on a left bracket, back it off by one.  the next phase
+         // of the parser expects slashes to be skipped, but not other elements.
+         if (query[queryIdx] == LBRACKET)
+            queryIdx--;
+
+      }
+
+      int lastExprIdx;
+      int begParenIdx;
+      int begBracketIdx;
+      int endBracketIdx;
+      int begBraceIdx;
+      int endBraceIdx;
+      int paramStart;
+      int paramEnd;
+      int[] paramIdxs = new int[10];
+      int commaNbr;
+      int parenDepth;
+      int braceDepth;
+      int bracketDepth;
+      int squoteDepth;
+
+      do  // this loop is to search through the query elements
+      {
+         lastExprIdx = queryIdx;
+         begParenIdx = -1;
+         begBracketIdx = -1;
+         endBracketIdx = -1;
+         begBraceIdx = -1;
+         endBraceIdx = -1;
+         paramIdxs[0] = -1;
+         paramIdxs[1] = -1;
+         paramIdxs[2] = -1;
+         paramIdxs[3] = -1;
+         paramIdxs[4] = -1;
+         paramIdxs[5] = -1;
+         paramIdxs[6] = -1;
+         paramIdxs[7] = -1;
+         paramIdxs[8] = -1;
+         paramIdxs[9] = -1;
+         commaNbr = 0;
+
+         parenDepth = 0;
+         braceDepth = 0;
+         bracketDepth = 0;
+         squoteDepth = 0;
+
+         while (true) {
+            queryIdx++;
+
+            if (queryIdx == query.length)
+               break;
+
+            //Category.getInstance(this.getClass()).debug("queryIdx: " + queryIdx + " query position: " + query[queryIdx] );
+            if (query[queryIdx] == SLASH) {
+               // check to make sure that this isn't an embedded slash
+               if ((parenDepth > 0) || (braceDepth > 0) || (bracketDepth > 0) || (squoteDepth > 0)) {
+                  //Category.getInstance(this.getClass()).debug("skipping embedded slash at pos: " + queryIdx );
+                  continue;
+               } else if (queryIdx == 0) {
+                  //Category.getInstance(this.getClass()).debug("root query segment found");
+                  add(new QuerySegment(QuerySegment.ROOT));
+                  lastExprIdx = 0;
+                  continue;
+               } else {
+                  //Category.getInstance(this.getClass()).debug("breaking element parse loop at pos: " + queryIdx );
+                  break;
+               }
+
+            }
+            // parens
+            else if (query[queryIdx] == LPAREN) {
+               parenDepth++;
+               if (begParenIdx < 0 && braceDepth == 0 && bracketDepth == 0 && squoteDepth == 0)
+                  begParenIdx = queryIdx;
+            } else if (query[queryIdx] == RPAREN) {
+               parenDepth--;
+               paramIdxs[commaNbr] = queryIdx;
+            }
+            // brackets
+            else if (query[queryIdx] == LBRACKET) {
+               bracketDepth++;
+               if (begBracketIdx < 0 && parenDepth == 0 && braceDepth == 0 && squoteDepth == 0)
+                  begBracketIdx = queryIdx;
+            } else if (query[queryIdx] == RBRACKET) {
+               bracketDepth--;
+               endBracketIdx = queryIdx;
+            }
+            // braces
+            else if (query[queryIdx] == LBRACE) {
+               braceDepth++;
+               if (begBraceIdx < 0 && parenDepth == 0 && bracketDepth == 0 && squoteDepth == 0)
+                  begBraceIdx = queryIdx;
+            } else if (query[queryIdx] == RBRACE) {
+               braceDepth--;
+               endBraceIdx = queryIdx;
+            }
+            // single quotes
+            else if (query[queryIdx] == SQUOTE) {
+               // we can only quote one level deep
+               if (squoteDepth < 1)
+                  squoteDepth++;
+               else
+                  squoteDepth--;
+            } else if (query[queryIdx] == COMMA) {
+               // only look for commas that are in the current method and
+               // not embedded in a quoted string
+               if (parenDepth == 1 && squoteDepth == 0) {
+                  paramIdxs[commaNbr] = queryIdx;
+                  commaNbr++;
+               }
+            }
+         }
+
+         if (squoteDepth > 0)
+            throwIllegalArgumentException(query, "missing matching end quote");
+
+         //-- Expression Expansion
+         if (begBraceIdx > -1) {
+            if (endBraceIdx < 0)
+               throwIllegalArgumentException(query, "missing matching brace");
+
+            String id = new String(query, begBraceIdx + 1, endBraceIdx - (begBraceIdx + 1));
+            Query expandQuery = getQuery(id);
+            add(new QuerySegment(id, expandQuery, QuerySegment.EXPAND));
+         }
+         //-- Method
+         else if (begParenIdx > -1) {
+            if (paramIdxs[0] < 0)
+               throwIllegalArgumentException(query, "missing matching parenthesis");
+
+            // parse out the name of the method
+            String id = new String(query, lastExprIdx + 1, begParenIdx - (lastExprIdx + 1));
+            QuerySegment qs = new QuerySegment(id, QuerySegment.METHOD);
+
+            // parse out the method parameters
+            paramStart = begParenIdx + 1;
+            commaNbr = -1;
+
+            // build the parameters for the method
+            while (paramIdxs[++commaNbr] > -1) {
+               // set the end to be one less than the token position
+               paramEnd = paramIdxs[commaNbr] - 1;
+
+               // trim it out any white space
+               while ((paramStart < paramEnd) && (query[paramStart] <= ' ')) {
+                  paramStart++;
+               }
+               while ((paramStart < paramEnd) && (query[paramEnd] <= ' ')) {
+                  paramStart--;
+               }
+
+               // create the parsed parameter and add it to the query segment
+               String parameter = new String(query, paramStart, (paramEnd - paramStart) + 1);
+//               Query paramQuery = getQuery(parameter);
+               qs.addValue(parameter);
+
+               // bump the start one past the end token position
+               paramStart = paramIdxs[commaNbr] + 1;
+            }
+
+            add(qs);
+         }
+         //-- Parent Access
+         else if (lastExprIdx + 2 < query.length &&
+               query[lastExprIdx + 1] == PERIOD &&
+               query[lastExprIdx + 2] == PERIOD) {
+            add(new QuerySegment(QuerySegment.PARENT));
+         }
+         //-- Current Access
+         else if (lastExprIdx + 1 < query.length &&
+               query[lastExprIdx + 1] == PERIOD) {
+            add(new QuerySegment(QuerySegment.CURRENT));
+         }
+         // check to see if this will be a collection only access
+         else if (lastExprIdx + 1 != begBracketIdx) {
+            int propertyEnd;
+            if (begBracketIdx > -1)
+               propertyEnd = begBracketIdx;
+            else
+               propertyEnd = queryIdx;
+
+            // Parse out the property name
+            String id = new String(query, lastExprIdx + 1, propertyEnd - (lastExprIdx + 1));
+
+            add(new QuerySegment(id, QuerySegment.PROPERTY));
+         }
+
+         //-- Collection access
+         if (begBracketIdx > -1) {
+            if (endBracketIdx < 0)
+               throwIllegalArgumentException(query, "missing matching bracket");
+
+            // parse out the name of the key
+            String key = new String(query, begBracketIdx + 1, endBracketIdx - (begBracketIdx + 1));
+            Query queryKey = getQuery(key);
+            add(new QuerySegment(key, queryKey, QuerySegment.COLLECTION));
+         }
+
+      } while (queryIdx < query.length);
+   }
+
+   // Public --------------------------------------------------------
+   /**
+    * Returns the parsed query segments.
+    */
+   public QuerySegment[] getSegments() {
+      return segments;
+   }
+
+   /**
+    * String representation of this object.
+    */
+   public String toString() {
+      StringBuffer sb = new StringBuffer();
+      sb.append("query=\"").append(queryString).append("\"");
+
+      for (int i = 0; i < segments.length; i++) {
+         QuerySegment segment = segments[i];
+         if (segment!=null) {
+            sb.append(" {").append(segment).append("}");
+         }
+      }
+      return sb.toString();
+   }
+
+   // Private -------------------------------------------------------
+   /**
+    * Always throws IllegalArgumentException.
+    */
+   private Object throwIllegalArgumentException(char[] query, String message) {
+      throw new IllegalArgumentException(message + " for query: " + new String(query));
+   }
+
+   /**
+    * Add another segment to the segments array.
+    */
+   private void add(QuerySegment qs) {
+      if (segmentsIdx == segments.length-1) {
+         QuerySegment[] resize = new QuerySegment[segments.length + 5];
+         System.arraycopy(segments, 0, resize, 0, segments.length);
+         segments = resize;
+      }
+
+      segments[segmentsIdx++] = qs;
+   }
+
+}

Index: ValueStack.java
===================================================================
RCS file: /cvsroot/opensymphony/webwork/src/main/webwork/util/ValueStack.java,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -d -r1.53 -r1.54
--- ValueStack.java	16 Nov 2003 23:39:15 -0000	1.53
+++ ValueStack.java	17 Nov 2003 00:55:47 -0000	1.54
@@ -184,8 +184,8 @@
 
       // The current stack pointer, and the current object,
       int stackIdx = 0;
-      Object value = null;
-      
+      Object value;
+
       /////////////////////////////////////////////////////////////////////////
       // evaluate the first element of the expression to see where to
       // get the requested value.  These should be quick and easy objects
@@ -382,7 +382,8 @@
                         params = new Object[vsize];
                         for(int i=0; i < vsize; i++)
                         {
-                           Object param = findValue((Query) pValueList.get(i));
+//                           Object param = findValue((Query) pValueList.get(i));
+                           Object param = findValue((String) pValueList.get(i));
                            params[i] = param;
                         }
 
@@ -673,7 +674,7 @@
 
                // Save method in map
                MethodInfo[] current = (MethodInfo[]) methods.get(methodName);
-               MethodInfo[] newlist = null;
+               MethodInfo[] newlist;
                if (current == null) {
                   newlist = new MethodInfo[]{new MethodInfo(method)};
                } else {




-------------------------------------------------------
This SF. Net email is sponsored by: GoToMyPC
GoToMyPC is the fast, easy and secure way to access your computer from
any Web browser or wireless device. Click here to Try it Free!
https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl