You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beehive.apache.org by ek...@apache.org on 2004/12/07 19:17:41 UTC

svn commit: r110131 - in incubator/beehive/trunk/netui: src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services test/src/junitTests/org/apache/beehive/netui/test/datagrid test/src/junitTests/org/apache/beehive/netui/test/script test/src/junitTests/org/apache/beehive/netui/test/servlet

Author: ekoneil
Date: Tue Dec  7 10:17:40 2004
New Revision: 110131

URL: http://svn.apache.org/viewcvs?view=rev&rev=110131
Log:
Start work on the sort / filter support in the data grid.

The grid will have column header cells that allow for sorting (asc / desc / none) the data in a column.  The SortService will be a stateful store of ISort objects that represent a "current" set of sorts in the data grid.  

The DataGridStateService then wraps a set of state management services and can be stored in a JPF and bound to a data grid in order to render a grid with the sort / filter / page / selection state.

BB: self
DRT: NetUI pass 


Added:
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/DataGridStateService.java   (contents, props changed)
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/SortFactory.java   (contents, props changed)
   incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/
   incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/DefaultSortTest.java   (contents, props changed)
   incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortServiceTest.java   (contents, props changed)
Modified:
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultFilter.java
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultSort.java
   incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/SortService.java
   incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/script/AbstractExpressionTest.java
   incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/HttpServletRequestHandler.java
   incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/ServletFactory.java

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultFilter.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultFilter.java?view=diff&rev=110131&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultFilter.java&r1=110130&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultFilter.java&r2=110131
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultFilter.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultFilter.java	Tue Dec  7 10:17:40 2004
@@ -27,86 +27,99 @@
  *
  */
 public class DefaultFilter
-    implements IFilter
-{
+        implements IFilter {
+
     private static final Logger _logger = Logger.getInstance(DefaultFilter.class);
-    private static final HashMap _stringToInt;
-    private static final HashMap _intToString;
 
+    private static final HashMap STRING_TO_INT;
+    private static final HashMap INT_TO_STRING;
     private static final String FILTER_DELIM = "~";
 
-    static
-    {
-        _stringToInt = new HashMap();
-        _stringToInt.put("eq", new Integer(IFilter.EQUALS));
-        _stringToInt.put("ne", new Integer(IFilter.NOT_EQUAL));
-
-        _intToString = new HashMap();
-        _intToString.put(new Integer(IFilter.EQUALS), "eq");
-        _intToString.put(new Integer(IFilter.NOT_EQUAL), "ne");
+    /* todo: support the rest of the operations! */
+    static {
+        STRING_TO_INT = new HashMap();
+        STRING_TO_INT.put("eq", new Integer(IFilter.EQUALS));
+        STRING_TO_INT.put("ne", new Integer(IFilter.NOT_EQUAL));
+
+        INT_TO_STRING = new HashMap();
+        INT_TO_STRING.put(new Integer(IFilter.EQUALS), "eq");
+        INT_TO_STRING.put(new Integer(IFilter.NOT_EQUAL), "ne");
     }
 
     private String _filterExpr;
     private int _op;
     private Object _value;
 
-    public DefaultFilter() {}
+    public DefaultFilter() {
+    }
 
-    public DefaultFilter(String filterExpression, String operation, Object value)
-    {
+    public DefaultFilter(String filterExpression, String operation, Object value) {
         this(filterExpression, mapStringToInt(operation), value);
     }
 
-    public DefaultFilter(String filterExpression, int operation, Object value)
-    {
+    public DefaultFilter(String filterExpression, int operation, Object value) {
+        this();
+
+        _filterExpr = filterExpression;
+        _op = operation;
+        _value = value;
+    }
+
+    public void setFilterExpression(String filterExpression) {
         _filterExpr = filterExpression;
+    }
+
+    public String getFilterExpression() {
+        return _filterExpr;
+    }
+
+    public void setOperation(int operation) {
         _op = operation;
+    }
+
+    public int getOperation() {
+        return _op;
+    }
+
+    public void setValue(Object value) {
         _value = value;
     }
 
-    public void setFilterExpression(String filterExpression) {_filterExpr = filterExpression;}
-    public String getFilterExpression() {return _filterExpr;}
-    
-    public void setOperation(int operation) {_op = operation;}
-    public int getOperation() {return _op;}
-    
-    public void setValue(Object value) {_value = value;}
-    public Object getValue() {return _value;}
+    public Object getValue() {
+        return _value;
+    }
 
-    public String getOperationText() {return mapIntToString(_op);}
+    public String getOperationText() {
+        return mapIntToString(_op);
+    }
+
+    public static final IFilter parse(String namespace, String filter) {
 
-    public static final IFilter parse(String namespace, String filter)
-    {
         // @todo: need to figure out how to handle this case...
-        if(!filter.startsWith(namespace))
+        if (!filter.startsWith(namespace))
             return null;
 
         // crack filter terms here
         String[] terms = filter.split(FILTER_DELIM);
         
         // @todo: what did this mean?
-        if(terms.length == 3 && terms[2].equals("*"))
+        if (terms.length == 3 && terms[2].equals("*"))
             return null;
-        else if(terms.length == 4)
-        {
-            try
-            {
+        else if (terms.length == 4) {
+            try {
                 // the namespace is ignored here since all filter terms are scoped into a namespace already
                 DefaultFilter f = new DefaultFilter(terms[1], terms[2], terms[3]);
                 return f;
-            }
-            catch(NumberFormatException nfe)
-            {
-                if(_logger.isErrorEnabled())  
+            } catch (NumberFormatException nfe) {
+                if (_logger.isErrorEnabled())
                     _logger.error("An error occurred parsing a URL filter with syntax \"" + filter + "\".");
                 throw new IllegalFilterException("An exception occurred parsing the filter \"" + filter + "\".  Cause: " + nfe, nfe);
             }
-        }
-        else throw new IllegalFilterException("The syntax of the filter \"" + filter + "\" is illegal.");
+        } else
+            throw new IllegalFilterException("The syntax of the filter \"" + filter + "\" is illegal.");
     }
 
-    public String write(String namespace)
-    {
+    public String write(String namespace) {
         assert namespace != null;
         StringBuilder buf = new StringBuilder();
         buf.append(namespace);
@@ -119,14 +132,12 @@
         return buf.toString();
     }
 
-    private static final int mapStringToInt(String operation)
-    {
-        Integer i = (Integer)_stringToInt.get(operation);
+    private static final int mapStringToInt(String operation) {
+        Integer i = (Integer) STRING_TO_INT.get(operation);
         return i.intValue();
     }
 
-    private static final String mapIntToString(int operation)
-    {
-        return (String)_intToString.get(new Integer(operation));
+    private static final String mapIntToString(int operation) {
+        return (String) INT_TO_STRING.get(new Integer(operation));
     }
 }

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultSort.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultSort.java?view=diff&rev=110131&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultSort.java&r1=110130&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultSort.java&r2=110131
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultSort.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/impl/DefaultSort.java	Tue Dec  7 10:17:40 2004
@@ -20,64 +20,99 @@
 import org.apache.beehive.netui.databinding.datagrid.model.ISort;
 import org.apache.beehive.netui.util.logging.Logger;
 
+/*
+ * Default sort syntax: netui_sort=<gridNamespace>~[+|-]<expr>
+ */
 /**
  *
  */
 public class DefaultSort
-    implements ISort
-{
-    private static final Logger _logger = Logger.getInstance(DefaultSort.class);
-    
+    implements ISort {
+
+    private static final Logger LOGGER = Logger.getInstance(DefaultSort.class);
+
     private String _expr;
     private int _dir;
 
-    public DefaultSort(String expression, int direction)
-    {
+    public DefaultSort() {
+        super();
+    }
+
+    public DefaultSort(String expression, int direction) {
+        this();
         _expr = expression;
         _dir = direction;
     }
 
-    public String getSortExpression() {return _expr;}
-    public void setSortExpression(String expression) {_expr = expression;}
+    public String getSortExpression() {
+        return _expr;
+    }
 
-    public int getDirection() {return _dir;}
-    public void setDirection(int direction) {_dir = direction;}
+    public void setSortExpression(String expression) {
+        assert expression != null;
+        assert !expression.equals("");
+        
+        _expr = expression;
+    }
 
-    public String write(String namespace)
-    {
-        return write(namespace, false);
+    public int getDirection() {
+        return _dir;
     }
 
-    public String write(String namespace, boolean flipDirection)
-    {
-        int direction = _dir;
-        if(flipDirection)
-            direction = flipSortDirection(direction);
+    public void setDirection(int direction) {
+        assert direction == ISort.ASCENDING || direction == ISort.DESCENDING;
 
-        StringBuilder buf = new StringBuilder();
-        buf.append(namespace);
-        buf.append("~");
-        if(direction == ISort.DESCENDING)
-            buf.append("-");
-        buf.append(_expr);
-        return buf.toString();
+        _dir = direction;
     }
-    
-    public String toString()
-    {
+
+    public String write(String namespace) {
+        return writeSortParam(namespace, false);
+    }
+
+    public String write(String namespace, boolean flipDirection) {
+        return writeSortParam(namespace, flipDirection);
+    }
+
+    public void changeSortDirection() {
+        _dir = flipSortDirection(_dir);
+    }
+
+    public String toString() {
         StringBuilder buf = new StringBuilder();
-        buf.append("\nexpr: " + _expr + "\n");
-        buf.append("dir: " + _dir + "\n");
+        buf.append("\n");
+        buf.append("expr: ");
+        buf.append(_expr);
+        buf.append("\n");
+        buf.append("dir: ");
+        buf.append(_dir);
+        buf.append("\n");
         return buf.toString();
     }
 
-    private static final int flipSortDirection(int direction)
-    {
-        switch(direction)
-        {
-        case ISort.ASCENDING: return ISort.DESCENDING;
-        case ISort.DESCENDING: return ISort.ASCENDING;
-        default: return ISort.ASCENDING;
+    private static final int flipSortDirection(int direction) {
+        switch (direction) {
+            case ISort.ASCENDING:
+                return ISort.DESCENDING;
+            case ISort.DESCENDING:
+                return ISort.ASCENDING;
+            default:
+                return ISort.ASCENDING;
         }
+    }
+
+    private String writeSortParam(String namespace, boolean flipDirection) {
+        StringBuilder builder = new StringBuilder();
+
+        int direction = _dir;
+        if (flipDirection)
+            /* todo: break this dependency.  switch ISort to AbstractSort with utility methods */
+            direction = flipSortDirection(direction);
+
+        builder.append(namespace);
+        builder.append("~");
+        if (direction == ISort.DESCENDING)
+            builder.append("-");
+        builder.append(_expr);
+        return builder.toString();
     }
 }

Added: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/DataGridStateService.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/DataGridStateService.java?view=auto&rev=110131
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/DataGridStateService.java	Tue Dec  7 10:17:40 2004
@@ -0,0 +1,110 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.databinding.datagrid.services;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Collections;
+import java.util.ArrayList;
+import javax.servlet.ServletRequest;
+
+import org.apache.beehive.netui.util.logging.Logger;
+import org.apache.beehive.netui.databinding.datagrid.model.ISort;
+
+/**
+ * todo: need to support registering URL prefixes that have state service handlers
+ * and should be omitted from regular URL construction.
+ */
+public class DataGridStateService {
+
+    private static final Logger LOGGER = Logger.getInstance(DataGridStateService.class);
+
+    private String _namespace = null;
+    private SortService _sortService = null;
+
+    public static final DataGridStateService createInstance(ServletRequest request, String namespace) {
+        assert request != null;
+        assert namespace != null && !namespace.equals("");
+
+        DataGridStateService dgss = new DataGridStateService(namespace);
+        dgss.handleRequest(request);
+
+        return dgss;
+    }
+
+    /* todo: need a factory for creating these state services */
+    /**
+     * Default constructor that builds a DataGridStateService with the default
+     * configuration including support for a {@link SortService} and a
+     * {@link FilterService}.
+     */
+    private DataGridStateService(String namespace) {
+        super();
+
+        _namespace = namespace;
+    }
+
+    /**
+     * Initialize the DataGridStateService.
+     * <p/>
+     * This method should be called once the services for the grid have been
+     * registered.  Then, they will be initialized here.
+     *
+     * @param request The current servlet request.
+     */
+    public void handleRequest(ServletRequest request) {
+        _sortService = ensureSortService(request, _namespace);
+    }
+
+    public SortService getSortService() {
+        return _sortService;
+    }
+
+    public String getNamespace() {
+        return _namespace;
+    }
+
+    public Map getSortQueryParamsMap() {
+        ISort[] sorts = _sortService.getSorts();
+
+        if(sorts == null)
+            return Collections.EMPTY_MAP;
+
+        ArrayList valueList = new ArrayList(5);
+        for(int i = 0; i < sorts.length; i++)
+            valueList.add(sorts[i].write(_namespace));
+
+        String[] values = (String[])valueList.toArray(new String[0]);
+        HashMap map = new HashMap(values.length);
+        map.put(_sortService.getKey(), values);
+
+        return map;
+    }
+    
+    public Map getSortParamsMap() {
+        throw new UnsupportedOperationException("NYI");
+    }
+
+    public String getSortParamsString(String sortExpression) {
+        throw new UnsupportedOperationException("NYI");
+    }
+
+    private static final SortService ensureSortService(ServletRequest request, String namespace) {
+        return SortService.getInstance(request, namespace);
+    }
+}
\ No newline at end of file

Added: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/SortFactory.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/SortFactory.java?view=auto&rev=110131
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/SortFactory.java	Tue Dec  7 10:17:40 2004
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.databinding.datagrid.services;
+
+import org.apache.beehive.netui.databinding.datagrid.model.ISort;
+import org.apache.beehive.netui.databinding.datagrid.model.impl.DefaultSort;
+
+/**
+ *
+ */
+public class SortFactory {
+
+    public static final ISort getInstance(String expression, int direction) {
+        return new DefaultSort(expression, direction);
+    }
+
+    public static final ISort getInstance() {
+        return new DefaultSort();
+    }
+
+    /* do not construct */
+    private SortFactory() {}
+}

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/SortService.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/SortService.java?view=diff&rev=110131&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/SortService.java&r1=110130&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/SortService.java&r2=110131
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/SortService.java	(original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/SortService.java	Tue Dec  7 10:17:40 2004
@@ -18,334 +18,121 @@
 package org.apache.beehive.netui.databinding.datagrid.services;
 
 import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
-import java.util.LinkedHashMap;
-import java.util.Map;
 import javax.servlet.ServletRequest;
-import javax.servlet.jsp.PageContext;
-import javax.servlet.jsp.JspContext;
 
 import org.apache.beehive.netui.databinding.datagrid.model.ISort;
 import org.apache.beehive.netui.databinding.datagrid.model.impl.DefaultSort;
 import org.apache.beehive.netui.util.logging.Logger;
 
 /**
- * Beehive: netui_sort=<namespace>~[+|-]<expr>
- *
- * todo: would be great to move the namespace name into the key for faster lookups
- * todo: figure out the back-compat story (a sad, long, and sordid one to be sure)
  */
-public class SortService
-{
-    private static final Logger _logger = Logger.getInstance(SortService.class);
+public class SortService {
+    private static final Logger LOGGER = Logger.getInstance(SortService.class);
 
-    private static final String EMPTY = "";
     private static final String SORT_DELIM = "~";
     private static final String SORT_TERM_DELIM = ",";
-    private static final int DEFAULT_SORT_DIRECTION = ISort.ASCENDING;
 
-    public static final SortService getInstance(JspContext jspContext, String namespace)
-    {
-        if(jspContext instanceof PageContext)
-        {
-            ServletRequest request = ((PageContext)jspContext).getRequest();
-            SortService svc = new SortService(request, namespace);
-            return svc;
-        }
-        else throw new IllegalArgumentException("Can not create a SortService from a JspContext of type " +
-                                                (jspContext != null ? jspContext.getClass().getName() : "null"));
+    public static final SortService getInstance(ServletRequest request, String namespace) {
+        assert request != null;
+        assert namespace != null && !namespace.equals("");
+        SortService svc = new SortService(namespace);
+        svc.handleRequest(request);
+        return svc;
     }
 
-    private ServletRequest _request = null;
     private String _namespace = null;
     private ISort[] _sorts = null;
-    private Map _altParams = null;
 
-    private SortService(ServletRequest request, String namespace)
-    {
+    private SortService(String namespace) {
         super();
-        _request = request;
         _namespace = namespace;
     }
-    
-    public ISort[] getSorts()
-    {
-        ensureSortList();
 
+    public ISort[] getSorts() {
         return _sorts;
     }
 
-    public boolean isPrimarySort(String sortExpression)
-    {
-        ensureSortList();
-        
-        ISort term = findTerm(sortExpression);
-        if(term == null || term != _sorts[0])
-            return false;
-        else return true;
+    public String getKey() {
+        return ISort.SORT_PARAM_KEY;
     }
 
-    public boolean isSorted(String sortExpression)
-    {
-        ensureSortList();
+    public void handleRequest(ServletRequest request) {
+        _sorts = parseTerms(request, _namespace);
+    }
 
-        ISort term = findTerm(sortExpression);
-        if(term == null || term.getDirection() == ISort.NONE)
+    public boolean isPrimarySort(String sortExpression) {
+        /* optimize for the case where the sortExpression *is* the primary sort */
+        if (_sorts != null &&
+                _sorts.length > 0 &&
+                _sorts[0].getSortExpression().equals(sortExpression))
+            return true;
+        else
             return false;
-        else return true;
     }
 
-    public int getSortDirection(String sortExpression)
-    {
-        ensureSortList();
-        
+    public boolean isSorted(String sortExpression) {
         ISort term = findTerm(sortExpression);
-        if(term == null)
-            return ISort.NONE;
-        else return term.getDirection();
-    }
-
-    public String getSortParamsString()
-    {
-        ensureSortList();
-        
-        StringBuilder buf = new StringBuilder();
-        if(_sorts != null)
-        {
-            for(int i = 0; i < _sorts.length; i++)
-            {
-                if(i > 0)
-                    buf.append("&");
-                
-                ISort s = _sorts[i];
-                buf.append("netui_sort=");
-                buf.append(s.write(_namespace));
-            }
-        }
-
-        if(_altParams != null && _altParams.size() > 0)
-        {
-            Iterator iterator = _altParams.keySet().iterator();
-            while(iterator.hasNext())
-            {
-                String key = (String)iterator.next();
-                String[] values = (String[])_altParams.get(key);
-
-                _logger.debug("values.length: " + values.length);
-                for(int i = 0; i < values.length; i++)
-                {
-                    _logger.debug("query: " + buf.toString());
-
-                    buf.append("&");
-                    buf.append(key);
-                    buf.append("=");
-                    buf.append(values[i]);
-                }
-            }
-        }
-
-        return buf.toString();
+        if (term == null || term.getDirection() == ISort.NONE)
+            return false;
+        else
+            return true;
     }
-    
-    public Map getSortParamsMap()
-    {
-        ensureSortList();
-        
-        if(_sorts == null) return null;
-        
-        String[] sortParams = new String[_sorts.length];
-        Map map = new LinkedHashMap();
-        for(int i = 0; i < _sorts.length; i++)
-        {
-            sortParams[i] = _sorts[i].write(_namespace);
-        }
-        map.put("netui_sort", sortParams);
-        
-        if(_altParams != null)
-        {
-            Iterator iterator = _altParams.keySet().iterator();
-            while(iterator.hasNext())
-            {
-                String key = (String)iterator.next();
-                assert key != null;
 
-                String[] values = (String[])_altParams.get(key);
-                assert values != null;
-
-                map.put(key, values);
-            }
-        }
-
-        return map;
+    public int getSortDirection(String sortExpression) {
+        ISort term = findTerm(sortExpression);
+        return term == null ? ISort.NONE : term.getDirection();
     }
-    
-    public String getSortParamsString(String sortExpression)
-    {
-        ensureSortList();
-
-        assert sortExpression != null;
-
-        int direction = DEFAULT_SORT_DIRECTION;
-        StringBuilder buf = new StringBuilder();
-        ISort had = findTerm(sortExpression);
-        if(had == null)
-        {
-            if(_logger.isDebugEnabled()) _logger.debug("didn't find sort with expression: " + sortExpression);
-
-            buf.append("netui_sort=");
-            buf.append(writeSortParam(_namespace, sortExpression, direction));                
-
-            if(_sorts != null)
-            {
-                for(int i = 0; i < _sorts.length; i++)
-                {
-                    buf.append("&");
-                    
-                    ISort s = _sorts[i];
-                    buf.append("netui_sort=");
-                    buf.append(s.write(_namespace));
-                }
-            }
-        }
-        else
-        {
-            // if resorting the first sorted column, filp its direction and remove other sorts
-            if(indexOf(had) == 0)
-            {            
-                if(_logger.isDebugEnabled()) _logger.debug("found sort at index 0 with expression: " + sortExpression);
-                buf.append("netui_sort=");
-                buf.append(had.write(_namespace, true)); 
-            }
-            else
-            {
-                if(_logger.isDebugEnabled()) _logger.debug("found sort not at 0 with expression: " + sortExpression);
-
-                // most recent click goes first, others bump down
-                buf.append("netui_sort=");
-                had.setDirection(direction);
-                buf.append(had.write(_namespace));
-
-                for(int i = 0; i < _sorts.length; i++)
-                {
-                    ISort s = _sorts[i];
-                    
-                    // skip 
-                    if(had == s)
-                        continue;
-                    else 
-                    {
-                        buf.append("&");
-                        buf.append("netui_sort=");
-                        buf.append(s.write(_namespace)); 
-                    }
-                }
-            }
-        }
-
-        if(_altParams != null && _altParams.size() > 0)
-        {
-            Iterator iterator = _altParams.keySet().iterator();
-            while(iterator.hasNext())
-            {
-                String key = (String)iterator.next();
-                String[] values = (String[])_altParams.get(key);
-                
-                for(int i = 0; i < values.length; i++)
-                {
-                    buf.append("&");
-                    buf.append(key);
-                    buf.append("=");
-                    buf.append(values[i]);
-                }
-            }
-        }
 
-        return buf.toString();
+    public boolean removeSort(String sortExpression) {
+        throw new UnsupportedOperationException("NYI");
     }
 
-    private int indexOf(ISort sort)
-    {
-        for(int i = 0; i < _sorts.length; i++)
-        {
-            if(_sorts[i] == sort) return i;
-        }
-        
-        return -1;
-    }
-    
-    public boolean removeSort(String sortExpression)
-    {
-        return false;
+    public boolean addSort(String sortExpression, int direction) {
+        assert direction == ISort.NONE || direction == ISort.ASCENDING || direction == ISort.DESCENDING;
+        throw new UnsupportedOperationException("NYI");
     }
 
-    public boolean addSort(String sortExpression, int direction)
-    {
+    public boolean replaceSort(String sortExpression, int direction) {
         assert direction == ISort.NONE || direction == ISort.ASCENDING || direction == ISort.DESCENDING;
-
-        return false;
+        throw new UnsupportedOperationException("NYI");
     }
-    
-    public boolean replaceSort(String sortExpression, int direction)
-    {
-        assert direction == ISort.NONE || direction == ISort.ASCENDING || direction == ISort.DESCENDING;
 
-        return false;
+    public String toString() {
+        throw new UnsupportedOperationException("NYI");
     }
 
-    public String toString()
-    {
-        StringBuilder buf = new StringBuilder(256);
-        return buf.toString();
-    }
+    private ISort findTerm(String sortExpression) {
+        if (_sorts == null) return null;
 
-    private ISort findTerm(String sortExpression)
-    {
-        if(_sorts == null) return null;
-        
-        for(int i = 0; i < _sorts.length; i++)
-        {
+        for (int i = 0; i < _sorts.length; i++) {
             ISort s = _sorts[i];
-            if(s.getSortExpression().equals(sortExpression))
+            if (s.getSortExpression().equals(sortExpression))
                 return s;
         }
-        
-        return null;
-    }
 
-    private void ensureSortList()
-    {
-        if(_sorts != null)
-            return;
-
-        _sorts = parseTerms(_request, _namespace);
-    }
-     
-    private static final String writeSortParam(String namespace, String sortExpression, int direction)
-    {
-        // @todo: delegate to factory to fetch default implementation
-        ISort sort = new DefaultSort(sortExpression, direction);
-        return sort.write(namespace);
+        return null;
     }
 
-    private final ISort[] parseTerms(ServletRequest request, String namespace)
-    {
+    /* todo: handle this incrementally */
+    private final ISort[] parseTerms(ServletRequest request, String namespace) {
         String[] params = request.getParameterValues(ISort.SORT_PARAM_KEY);
 
-        if(params == null) return null;
+        if (params == null)
+            return null;
+
         String namespacePrefix = namespace + SORT_DELIM;
-        
+
         List sorts = new ArrayList();
-        for(int i = 0; i < params.length; i++)
-        {
-            if(params[i].startsWith(namespacePrefix))
-            {
-                // crack sort terms here
-                String[] terms = params[i].split(SORT_DELIM);
+        for (int i = 0; i < params.length; i++) {
+            String param = params[i];
+            if (param.startsWith(namespacePrefix)) {
+                String[] terms = param.split(SORT_DELIM);
+                assert terms != null && terms.length == 2;
+
                 String[] cols = terms[1].split(SORT_TERM_DELIM);
-                for(int j = 0; j < cols.length; j++)
-                {
+
+                for (int j = 0; j < cols.length; j++) {
                     String t = cols[j];
                     int dir = (cols[j].startsWith("-") == true ? ISort.DESCENDING : ISort.ASCENDING);
                     String expr = (dir == ISort.DESCENDING ? cols[j].substring(1) : cols[j]);
@@ -355,89 +142,6 @@
             }
         }
 
-        _altParams = findAltParams(_request, namespace);
-
-        if(_logger.isDebugEnabled()) _logger.debug("alt params map: " + mapToString(_altParams));
-        
-        ISort[] ret = new ISort[sorts.size()];
-        for(int i = 0; i < ret.length; i++) 
-        {
-            ret[i] = (ISort)sorts.get(i);
-            if(_logger.isDebugEnabled()) _logger.debug("sort: " + ret[i].toString());
-        }
-
-        return ret;
-    }
-
-    private static Map findAltParams(ServletRequest _request, String namespace)
-    {
-        HashMap map = new HashMap();
-
-        Map paramMap = _request.getParameterMap();
-        if(paramMap == null) return null;
-
-        Iterator keys = paramMap.keySet().iterator();
-        while(keys.hasNext())
-        {
-            String key = (String)keys.next();
-            String[] values = _request.getParameterValues(key);
-            if(key.equals(ISort.SORT_PARAM_KEY))
-            {
-                ArrayList list = new ArrayList();
-                for(int i = 0; i < values.length; i++)
-                {
-                    if(values[i].startsWith(namespace + "~"))
-                        continue;
-                    else list.add(values[i]);
-                }
-                
-                values = new String[list.size()];
-                for(int i = 0; i < list.size(); i++)
-                    values[i] = (String)list.get(i);
-            }
-
-            map.put(key, values);
-        }
-        
-        return map;
-    }
-
-    private static final String mapToString(Map map)
-    {
-        if(map == null)
-            return "Map is null";
-        if(map.size() == 0)
-            return "Map is empty";
-
-        StringBuilder buf = new StringBuilder();
-        buf.append("Map:::::\n");
-
-        Iterator iterator = map.keySet().iterator();
-        while(iterator.hasNext())
-        {
-            String key = (String)iterator.next();
-            buf.append("key: " + key + "\n");
-            Object value = map.get(key);
-            if(value instanceof List)
-            {
-                List l = (List)value;
-                for(int i = 0; i < l.size(); i++)
-                {
-                    buf.append("  value[" + i + "]: " + l.get(i) + "\n");
-                }
-            }
-            else if(value instanceof String[])
-            {
-                String[] ary = (String[])value;
-                for(int i = 0; i < ary.length; i++)
-                {
-                    buf.append("  value[" + i + "]: " + ary[i] + "\n");
-                }
-            }
-        }
-
-        buf.append(":::::\n");
-
-        return buf.toString();
+        return (ISort[]) sorts.toArray(new ISort[0]);
     }
 }

Added: incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/DefaultSortTest.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/DefaultSortTest.java?view=auto&rev=110131
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/DefaultSortTest.java	Tue Dec  7 10:17:40 2004
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.test.datagrid;
+
+import org.apache.beehive.netui.databinding.datagrid.model.ISort;
+import org.apache.beehive.netui.databinding.datagrid.model.impl.DefaultSort;
+import org.apache.beehive.netui.databinding.datagrid.services.SortFactory;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ *
+ */
+public class DefaultSortTest
+    extends TestCase {
+
+    private ISort createSort() {
+        return SortFactory.getInstance();
+    }
+
+    public void testSortToString() {
+        String gridName = "testgrid";
+
+        ISort sort = createSort();
+        sort.setSortExpression("customername");
+
+        sort.setDirection(ISort.ASCENDING);
+        String str = sort.write(gridName);
+        assertTrue("testgrid~customername".equals(str));
+
+        sort.setDirection(ISort.DESCENDING);
+        str = sort.write(gridName);
+        assertTrue("testgrid~-customername".equals(str));
+    }
+
+    public void testChangeSortDirection() {
+        ISort sort = createSort();
+
+        sort.setDirection(ISort.ASCENDING);
+        sort.setSortExpression("customername");
+        assertTrue(sort.getDirection() == ISort.ASCENDING);
+
+        ((DefaultSort)sort).changeSortDirection();
+        assertTrue(sort.getDirection() == ISort.DESCENDING);
+
+        ((DefaultSort)sort).changeSortDirection();
+        assertTrue(sort.getDirection() == ISort.ASCENDING);
+    }
+
+    public void testInvalidSortDirection() {
+        try
+        {
+            ISort sort = createSort();
+            sort.setSortExpression("customername");
+            sort.setDirection(5);
+        }
+        catch(AssertionError ae) {
+            /* ignore */
+            return;
+        }
+
+        assertTrue("Didn't catch assertion as expected", false);
+    }
+
+    public void testInvalidSortExpression() {
+        try
+        {
+            ISort sort = createSort();
+            sort.setSortExpression("customername");
+            sort.setDirection(5);
+        }
+        catch(AssertionError ae) {
+            /* ignore */
+            return;
+        }
+
+        assertTrue("Didn't catch assertion as expected", false);
+    }
+
+    protected void setUp() {
+    }
+
+    protected void tearDown() {
+    }
+
+    public DefaultSortTest(String name) {
+        super(name);
+    }
+
+    public static Test suite() {
+        return new TestSuite(DefaultSortTest.class);
+    }
+
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run(suite());
+    }
+}
\ No newline at end of file

Added: incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortServiceTest.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortServiceTest.java?view=auto&rev=110131
==============================================================================
--- (empty file)
+++ incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortServiceTest.java	Tue Dec  7 10:17:40 2004
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * $Header:$
+ */
+package org.apache.beehive.netui.test.datagrid;
+
+import java.lang.reflect.Proxy;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.beehive.netui.databinding.datagrid.services.SortService;
+import org.apache.beehive.netui.databinding.datagrid.model.ISort;
+import org.apache.beehive.netui.test.servlet.ServletFactory;
+import org.apache.beehive.netui.test.servlet.HttpServletRequestHandler;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ *
+ */
+public class SortServiceTest
+    extends TestCase {
+
+    private HttpServletRequest _request = null;
+    private String _namespace = "customerGrid";
+
+    private ServletRequest getRequest() {
+        return _request;
+    }
+
+    private void initQueryString(String queryString) {
+        assert Proxy.getInvocationHandler(_request) instanceof HttpServletRequestHandler;
+
+        HttpServletRequestHandler handler = (HttpServletRequestHandler)Proxy.getInvocationHandler(_request);
+        handler.setQueryString(queryString);
+    }
+
+    public void testSingleAscendingSort() {
+        SortService svc = SortService.getInstance(getRequest(), _namespace);
+        assert svc.getSorts() == null;
+
+        initQueryString("netui_sort=" + _namespace + "~CUSTOMERNAME");
+        svc.handleRequest(getRequest());
+        ISort[] sorts = svc.getSorts();
+
+        assert svc.getSorts() != null;
+        assert sorts.length == 1;
+        assert sorts[0].getDirection() == ISort.ASCENDING;
+        assert sorts[0].getSortExpression().equals("CUSTOMERNAME");
+    }
+
+    public void testMultipleSort() {
+        SortService svc = SortService.getInstance(getRequest(), _namespace);
+        assert svc.getSorts() == null;
+
+        initQueryString("?netui_sort=" + _namespace + "~CUSTOMERNAME" +
+                        "&netui_sort=" + _namespace + "~-UNITPRICE&" +
+                        "&netui_sort=productGrid~QUANTITY");
+        svc.handleRequest(getRequest());
+        ISort[] sorts = svc.getSorts();
+
+        assert svc.getSorts() != null;
+        assert sorts.length == 2;
+        assert sorts[0].getDirection() == ISort.ASCENDING;
+        assert sorts[0].getSortExpression().equals("CUSTOMERNAME");
+        assert sorts[1].getDirection() == ISort.DESCENDING;
+        assert sorts[1].getSortExpression().equals("UNITPRICE");
+
+        SortService productSvc = SortService.getInstance(getRequest(), "productGrid");
+        assert productSvc.getSorts() != null;
+        assert productSvc.getSorts().length == 1;
+        sorts = productSvc.getSorts();
+        assert sorts[0].getDirection() == ISort.ASCENDING;
+        assert sorts[0].getSortExpression().equals("QUANTITY");
+    }
+
+    public void testSingleDescendingSort() {
+        SortService svc = SortService.getInstance(getRequest(), _namespace);
+        assert svc.getSorts() == null;
+
+        initQueryString("netui_sort=" + _namespace + "~-CUSTOMERNAME");
+        svc.handleRequest(getRequest());
+        ISort[] sorts = svc.getSorts();
+
+        assert svc.getSorts() != null;
+        assert sorts.length == 1;
+        assert sorts[0].getDirection() == ISort.DESCENDING;
+        assert sorts[0].getSortExpression().equals("CUSTOMERNAME");
+    }
+
+    protected void setUp() {
+        _request = ServletFactory.getServletRequest();
+    }
+
+    protected void tearDown() {
+        _request = null;
+    }
+
+    public SortServiceTest(String name) {
+        super(name);
+    }
+
+    public static Test suite() {
+        return new TestSuite(SortServiceTest.class);
+    }
+
+    public static void main(String[] args) {
+        junit.textui.TestRunner.run(suite());
+    }
+}
\ No newline at end of file

Modified: incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/script/AbstractExpressionTest.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/script/AbstractExpressionTest.java?view=diff&rev=110131&p1=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/script/AbstractExpressionTest.java&r1=110130&p2=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/script/AbstractExpressionTest.java&r2=110131
==============================================================================
--- incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/script/AbstractExpressionTest.java	(original)
+++ incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/script/AbstractExpressionTest.java	Tue Dec  7 10:17:40 2004
@@ -37,12 +37,8 @@
 import org.apache.struts.action.ActionForm;
 import org.apache.struts.taglib.html.Constants;
 
-/**
- * Test hierarchy:
- */
 public abstract class AbstractExpressionTest
-    extends TestCase
-{
+    extends TestCase {
     protected static final int COMPLEX_FORM = 1;
     protected static final int SIMPLE_FORM = 2;
 
@@ -52,18 +48,15 @@
     private SimpleTypeActionForm _simpleActionForm = null;
     private ComplexTypeActionForm _complexActionForm = null;
 
-    public AbstractExpressionTest(String name)
-    {
+    public AbstractExpressionTest(String name) {
         super(name);
     }
 
-    public static Test suite()
-    {
+    public static Test suite() {
         return new TestSuite(AbstractExpressionTest.class);
     }
 
-    public static void main(String[] args)
-    {
+    public static void main(String[] args) {
         junit.textui.TestRunner.run(suite());
     }
 
@@ -82,22 +75,19 @@
     protected abstract ExpressionEvaluator getExpressionEvaluator();
 
     protected final Object evaluateExpression(String expression, PageContext pc)
-        throws Exception
-    {
+        throws Exception {
         return getExpressionEvaluator().evaluateStrict(expression, ImplicitObjectUtil.getReadVariableResolver(pc));
     }
 
     protected final void evaluateUpdateExpression(String expression, Object value, ServletRequest request, ServletResponse response, ActionForm form)
-        throws Exception
-    {
+        throws Exception {
         evaluateUpdateExpression(expression, value, request, response, form, true);
     }
 
     protected final void evaluateUpdateExpression(String expression, Object value, ServletRequest request, ServletResponse response, ActionForm form, boolean requestParameter)
-        throws Exception
-    {
+        throws Exception {
         Object theForm = form;
-        if(theForm == null)
+        if (theForm == null)
             theForm = request.getAttribute(org.apache.struts.taglib.html.Constants.BEAN_KEY);
 
         VariableResolver vr = ImplicitObjectUtil.getUpdateVariableResolver(theForm, request, response, requestParameter);
@@ -105,8 +95,7 @@
         getExpressionEvaluator().update(expression, value, vr, requestParameter);
     }
 
-    protected void setUp()
-    {
+    protected void setUp() {
         _fauxPageContext = ServletFactory.getPageContext();
         _fauxRequest = getPageContext().getRequest();
         _fauxResponse = getPageContext().getResponse();
@@ -122,34 +111,30 @@
         org.apache.beehive.netui.util.config.ConfigUtil.loadDefault();
     }
 
-    protected void tearDown()
-    {
+    protected void tearDown() {
         _fauxPageContext = null;
         _fauxRequest = null;
         _fauxResponse = null;
     }
 
-    protected void useForm(int formId)
-    {
+    protected void useForm(int formId) {
         Object form = null;
-        HttpServletRequest request = (HttpServletRequest)getPageContext().getRequest();
-        if(formId == SIMPLE_FORM)
+        HttpServletRequest request = (HttpServletRequest) getPageContext().getRequest();
+        if (formId == SIMPLE_FORM)
             form = request.getAttribute("simpleBean");
-        else if(formId == COMPLEX_FORM)
+        else if (formId == COMPLEX_FORM)
             form = request.getAttribute("complexBean");
 
         useForm(form);
     }
 
-    protected void useForm(Object actionForm)
-    {
+    protected void useForm(Object actionForm) {
         getPageContext().getRequest().setAttribute(Constants.BEAN_KEY, actionForm);
         getPageContext().setAttribute("actionForm", actionForm);
     }
 
-    protected ActionForm getActionForm()
-    {
-        HttpServletRequest request = (HttpServletRequest)getPageContext().getRequest();
-        return (ActionForm)request.getAttribute(Constants.BEAN_KEY);
+    protected ActionForm getActionForm() {
+        HttpServletRequest request = (HttpServletRequest) getPageContext().getRequest();
+        return (ActionForm) request.getAttribute(Constants.BEAN_KEY);
     }
 }

Modified: incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/HttpServletRequestHandler.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/HttpServletRequestHandler.java?view=diff&rev=110131&p1=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/HttpServletRequestHandler.java&r1=110130&p2=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/HttpServletRequestHandler.java&r2=110131
==============================================================================
--- incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/HttpServletRequestHandler.java	(original)
+++ incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/HttpServletRequestHandler.java	Tue Dec  7 10:17:40 2004
@@ -17,23 +17,16 @@
  */
 package org.apache.beehive.netui.test.servlet;
 
-// java imports
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
-
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
-// internal imports
-
-// external imports
-
 /**
  *
  */
@@ -75,9 +68,13 @@
     public void setQueryString(String queryString)
     {
         _queryString = queryString;
+        _params = null;
 
         if(queryString == null)
             return;
+
+        if(queryString.startsWith("?"))
+            queryString = queryString.substring(1);
 
         _params = new Hashtable();
 

Modified: incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/ServletFactory.java
Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/ServletFactory.java?view=diff&rev=110131&p1=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/ServletFactory.java&r1=110130&p2=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/ServletFactory.java&r2=110131
==============================================================================
--- incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/ServletFactory.java	(original)
+++ incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/ServletFactory.java	Tue Dec  7 10:17:40 2004
@@ -17,20 +17,13 @@
  */
 package org.apache.beehive.netui.test.servlet;
 
-// java imports
 import java.lang.reflect.Proxy;
 import java.lang.reflect.InvocationHandler;
-
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 import javax.servlet.http.HttpServletResponse;
-
 import javax.servlet.jsp.PageContext;
-
-// internal imports
-
-// external imports
 
 /**
  *