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 2005/02/07 21:35:46 UTC

svn commit: r151747 - in incubator/beehive/trunk/netui: src/bootstrap/org/apache/beehive/netui/tools/ src/bootstrap/org/apache/beehive/netui/tools/tld/xdoclet/ src/javascript/tags-datagrid/ src/pageflow/org/apache/beehive/netui/script/common/ src/tags-databinding/ src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/ src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/style/ src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/ src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/filter/ src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/ test/src/junitTests/org/apache/beehive/netui/test/datagrid/

Author: ekoneil
Date: Mon Feb  7 12:35:42 2005
New Revision: 151747

URL: http://svn.apache.org/viewcvs?view=rev&rev=151747
Log:
Start of filter support in the data grid.

This checkin includes the netui-datagrid.js file, which provides JavaScript support for parsing filters from URLs, adding new filters, and building new filter URLs.

Implement support for additional filter operations on the IFilter interface; this interface needs to be reworked a little to support other query languages (XQuery, for example).  

Implement support for <function>s in JSP 2.0 TLDs.  

Add three JSP 2.0 functions to support filtering; these perform the following operations:

- lookupFilterOperations
- lookupDefaultFilterOperation
- ensureFilters

and these functions can be used to build JSP UIs that support adding / removing filter query parameters.

Tests are on their way...

BB: self
BVT: NetUI pass



Added:
    incubator/beehive/trunk/netui/src/javascript/tags-datagrid/
    incubator/beehive/trunk/netui/src/javascript/tags-datagrid/netui-datagrid.js   (with props)
    incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/FilterUtil.java   (with props)
Modified:
    incubator/beehive/trunk/netui/src/bootstrap/org/apache/beehive/netui/tools/NetUITldTagsHandler.java
    incubator/beehive/trunk/netui/src/bootstrap/org/apache/beehive/netui/tools/tld/xdoclet/tld.xdt
    incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/script/common/BundleContext.java
    incubator/beehive/trunk/netui/src/tags-databinding/build.xml
    incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/DefaultFilter.java
    incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/FilterModel.java
    incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/IFilter.java
    incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/style/StylePolicy.java
    incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/DataGridStateService.java
    incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/filter/FilterCodec.java
    incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/FilterCodecTest.java
    incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/FilterModelTest.java

Modified: incubator/beehive/trunk/netui/src/bootstrap/org/apache/beehive/netui/tools/NetUITldTagsHandler.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/bootstrap/org/apache/beehive/netui/tools/NetUITldTagsHandler.java?view=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/bootstrap/org/apache/beehive/netui/tools/NetUITldTagsHandler.java (original)
+++ incubator/beehive/trunk/netui/src/bootstrap/org/apache/beehive/netui/tools/NetUITldTagsHandler.java Mon Feb  7 12:35:42 2005
@@ -43,7 +43,6 @@
 import xjavadoc.XClass;
 import xjavadoc.XMember;
 
-
 /**
  *
  * @xdoclet.taghandler namespace="NetUITldGen"
@@ -198,9 +197,9 @@
             if(packageName != null && !currentClass.getQualifiedName().startsWith(packageName))
                 continue;
 
-//             System.out.println("currentClass=" + currentClass.getQualifiedName());
-//             System.out.println(" packageName: " + packageName);
-//             System.out.println(" startsWith: " + currentClass.getQualifiedName().startsWith(packageName));
+             //System.out.println("currentClass=" + currentClass.getQualifiedName());
+             //System.out.println(" packageName: " + packageName);
+             //System.out.println(" startsWith: " + currentClass.getQualifiedName().startsWith(packageName));
 
             setCurrentClass(currentClass);
 
@@ -214,9 +213,10 @@
             {
                 if (TypeTagsHandler.isOfType(currentClass, typeName, extent)) 
                 {
-                    logger.debug("isOfType true, generate().");
-                    
-                    if(DEBUG) logger.debug("handling type: "  + currentClass.getQualifiedName());
+                    if(DEBUG) {
+                        logger.debug("isOfType true, generate().");
+                        logger.debug("handling type: "  + currentClass.getQualifiedName());
+                    }
 
                     generate(template);
                 }
@@ -227,6 +227,62 @@
                 if(DEBUG) logger.debug("typeName=null, generate().");
                 generate(template);
             }
+        }
+    }
+
+    /**
+     * @param template              Describe what the parameter does
+     * @param attributes            Describe what the parameter does
+     * @exception XDocletException  Describe the exception
+     * @doc:tag                     type="block"
+     * @doc:tag name="tagName" optional="false" values="netui:jspfunction"
+     */
+    public void forAllMethods(String template, Properties attributes)
+        throws XDocletException {
+        String tagName = attributes.getProperty("tagName");
+
+        if(DEBUG)
+            logger.debug("Handling tagName: " + tagName);
+
+        setCurrentTagName(tagName);
+
+        try {
+            XClass currentClass = getCurrentClass();
+
+            if (currentClass == null)
+                throw new XDocletException("currentClass == null!!!");
+
+            Collection members = currentClass.getMethods(true);
+
+            List sortedMembers = new ArrayList(members);
+            Collections.sort(sortedMembers, memberComparator);
+            members = sortedMembers;
+
+            Iterator methods = members.iterator();
+            while(methods.hasNext())
+            {
+                XMethod xm = (XMethod)methods.next();
+
+                if(DEBUG)
+                    logger.debug("handle method: " + xm.getName());
+
+                XTag attribute = getFirstTag(getCurrentClass(), xm.getName(), tagName);
+
+                setCurrentMethod(xm);
+                setCurrentMethodTag(attribute);
+
+                if(getCurrentMethod() != null && attribute != null)
+                    generate(template);
+
+                setCurrentMethodTag(null);
+                setCurrentClassTag(null);
+                setCurrentMethod(null);
+            }
+            setCurrentClass(currentClass);
+        }
+        catch(Exception e) {
+            e.printStackTrace();
+            throw new XDocletException(e, "An error occurred in the forAllAttributes tag: " + e);
         }
     }
 

Modified: incubator/beehive/trunk/netui/src/bootstrap/org/apache/beehive/netui/tools/tld/xdoclet/tld.xdt
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/bootstrap/org/apache/beehive/netui/tools/tld/xdoclet/tld.xdt?view=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/bootstrap/org/apache/beehive/netui/tools/tld/xdoclet/tld.xdt (original)
+++ incubator/beehive/trunk/netui/src/bootstrap/org/apache/beehive/netui/tools/tld/xdoclet/tld.xdt Mon Feb  7 12:35:42 2005
@@ -75,5 +75,17 @@
     </tag>
   </XDtClass:ifHasClassTag>
   </XDtNetUITldGen:forAllClasses>
+
+  <XDtNetUITldGen:forAllClasses type="java.lang.Object" abstract="false" extent="hierarchy">
+    <XDtClass:ifHasClassTag tagName="netui:jspfunctions">
+        <XDtNetUITldGen:forAllMethods tagName="netui:jspfunction">
+    <function>
+        <name><XDtNetUITldGen:paramValue paramName="name"/></name>
+        <function-class><XDtClass:fullClassName/></function-class>
+        <function-signature><XDtNetUITldGen:paramValue paramName="signature"/></function-signature>
+    </function>
+        </XDtNetUITldGen:forAllMethods>
+    </XDtClass:ifHasClassTag>
+  </XDtNetUITldGen:forAllClasses>
 </taglib>
 

Added: incubator/beehive/trunk/netui/src/javascript/tags-datagrid/netui-datagrid.js
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/javascript/tags-datagrid/netui-datagrid.js?view=auto&rev=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/javascript/tags-datagrid/netui-datagrid.js (added)
+++ incubator/beehive/trunk/netui/src/javascript/tags-datagrid/netui-datagrid.js Mon Feb  7 12:35:42 2005
@@ -0,0 +1,295 @@
+/*
+ * 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:$
+ */
+
+/* ==========================================================
+ *
+ *
+ *
+ * ==========================================================
+ */
+function NetUIFilterURL() {
+  this._urlParams = new Array();
+  this._filters = new Array();
+}
+
+/* return void */
+NetUIFilterURL.prototype.init = function(search) {
+  /* todo: parse the URL into its component key/value pairs */
+  var qIndex = search.indexOf('?') + 1;
+  var paramsArray = search.substring(qIndex).split('&');
+  var array = new Array();
+  for(var i = 0; i < paramsArray.length; i++) {
+    var eIndex = paramsArray[i].indexOf('=');
+    var key = paramsArray[i].substring(0,eIndex);
+    var value = paramsArray[i].substring(eIndex+1);
+   
+    if(key == NetUIFilterList.FILTER_KEY) {
+      alert('add filter: ' + value);
+      var filter = NetUIFilterList.parse(value);
+      this._filters[this._filters.length] = filter;
+    }
+    else {
+      //alert('add URL param: ' + value);
+      var param = new NetUIUrlParam(key,value);
+      this._urlParams[this._urlParams.length] = param;
+    }
+  }
+}
+
+/* todo: remove this method in favor of processing by the caller */
+NetUIFilterURL.prototype.removeUrlParam = function(key) {
+  for(var i = 0; i < this._urlParams.length; i++) {
+    if(this._urlParams[i].getKey() == key) {
+      /*
+        this is a hack to simulate removing an element from the array
+        todo: need to implement real delete here
+       */
+      this._urlParams[i].setKey('');
+    }
+  }
+}
+
+/* return NetUIFilterList */
+NetUIFilterURL.prototype.lookupFiltersForDataGrid = function(dataGridName) {
+  
+  for(var i = 0; i < this._filters.length; i++) {
+    //alert('check filter: ' + this._filters[i].toUrlParam());
+    if(this._filters[i].getDataGridName() == dataGridName) 
+      return this._filters[i];
+  }
+
+  return null;
+}
+
+NetUIFilterURL.prototype.hasFiltersForDataGrid = function(dataGridName) {
+  var filters = this.lookupFiltersForDataGrid(dataGridName);
+  return (filters != null ? true : false);
+}
+
+/* return String */
+NetUIFilterURL.prototype.toQueryString = function() {
+  
+  qs = '?';
+  for(var i = 0; i < this._urlParams.length; i++) {
+    var p = this._urlParams[i].toUrlParam();
+    if(p == null)
+      continue;
+
+    if(i > 0)
+      qs += '&';
+    qs += this._urlParams[i].toUrlParam();
+  }
+
+  for(var i = 0; i < this._filters.length; i++) {
+    /* allow parameters to return null to indicate that there's no parameter to add */
+    var p = this._filters[i].toUrlParam();
+    if(p == null)
+      continue;
+
+    if(i > 0)
+      qs += '&';
+    //alert('NetUIFilterURL::toQueryString:filter:\"' + p + '\"');
+    qs += p;
+  }
+
+  return qs;
+}
+
+NetUIFilterURL.prototype.addFilterList = function(netuiFilterList) {
+  this._filters[this._filters.length] = netuiFilterList;
+}
+
+/* ==========================================================
+ *
+ *
+ *
+ * ==========================================================
+ */
+function NetUIUrlParam(key,value) {
+  this._key = key;
+  this._value = value;
+}
+
+NetUIUrlParam.prototype.getKey = function() {
+  return this._key;
+}
+
+NetUIUrlParam.prototype.setKey = function(key) {
+  this._key = key;
+}
+
+NetUIUrlParam.prototype.getValue = function() {
+  return this._value;
+}
+
+NetUIParam.prototype.setValue = function(value) {
+  this._value = value;
+}
+
+NetUIUrlParam.prototype.toUrlParam = function() {
+  if(this._key == null || this._key == '')
+    return null;
+  else return this._key + '=' + this._value;
+}
+
+/* ==========================================================
+ *
+ *
+ *
+ * ==========================================================
+ */
+function NetUIFilterList(dataGridName) {
+  this._dataGridName = dataGridName;
+  this._filters = new Array();
+}
+
+function NetUIFilterList_parse(value) {
+  var scIndex = value.indexOf(';');
+  var dataGridName = value.substring(0, scIndex);
+  var filter = new NetUIFilterList(dataGridName);
+
+  var filterArray = value.substring(scIndex+1).split(',');
+  for(var i = 0; i < filterArray.length; i++) {
+    var parts = filterArray[i].split('~');
+    filter.addFilter(parts[0],parts[1],parts[2]);
+  }
+
+  return filter;
+}
+
+NetUIFilterList.parse = NetUIFilterList_parse;
+NetUIFilterList.FILTER_KEY = "netui_filter";
+
+NetUIFilterList.prototype.getDataGridName = function() {
+  return this._dataGridName;
+}
+
+/* return void */
+NetUIFilterList.prototype.addFilter = function(fExpr,fOp,fVal) {
+  this._filters[this._filters.length] = new NetUIFilter(fExpr,fOp,fVal);
+}
+
+NetUIFilterList.prototype.replaceFilters = function(netuiFilterArray) {
+  this._filters = netuiFilterArray;
+}
+
+/* return String */
+NetUIFilterList.prototype.toUrlParam = function() {
+  if(this._filters == null || this._filters.length == 0)
+    return null;
+
+  var paramValue = '';
+  var foundFilter = false;
+
+  paramValue += this._dataGridName;
+  paramValue += ';';
+  for(var i = 0; i < this._filters.length; i++) {
+    var p = this._filters[i].toUrlParam();
+    if(p == null)
+      continue;
+
+    if(i > 0)
+      paramValue += ',';
+    paramValue += p;
+    foundFilter = true;
+  }
+
+  if(!foundFilter)
+    return null;
+  else return NetUIFilterList.FILTER_KEY + '=' + paramValue;
+}
+
+/* return NetUIFilterList */
+NetUIFilterList.prototype.lookupFiltersForFilterExpression = function(filterExpression) {
+  var filters = new Array();
+  for(var i = 0; i < this._filters.length; i++) {
+    if(this._filters[i].getFilterExpression() == filterExpression)
+      filters[filters.length] = this._filters[i];
+  }
+
+  return filters;
+}
+
+/* ==========================================================
+ *
+ *
+ *
+ * ==========================================================
+ */
+function NetUIFilter(fExpr,fOp,fVal) {
+  this._fExpr = fExpr;
+  this._fOp = fOp;
+  this._fVal = fVal;
+}
+
+NetUIFilter.prototype.getFilterExpression = function() {
+ return this._fExpr;
+}
+
+NetUIFilter.prototype.getFilterOperation = function() {
+ return this._fOp;
+}
+
+NetUIFilter.prototype.getFilterValue = function() {
+ return this._fVal;
+}
+
+NetUIFilter.prototype.toUrlParam = function() {
+  if(this._fVal == null || this._fVal == '' ||
+     this._fOp == null || this._fOp == '' ||
+     this._fExpr == null || this._fExpr == '')
+    return null;
+
+  var val = this._fVal;
+  if(this._fOp == 'isempty' || this._fOp == 'isnotempty')
+    val = '*';
+
+  var op = (this._fOp != null ? this._fOp : '');
+
+  var filter = this._fExpr + '~' + op + '~' + val
+
+  return filter;
+}
+
+/* ==========================================================
+ *
+ *
+ *
+ * ==========================================================
+ */
+ /*
+   todo: switch over to using this URL method once the urlParams / filters have
+         been merged in the NetUIFilterUrl class
+  */
+function buildURL(params) {
+  if(params == null || params.length == 0)
+    return '';
+
+  var qs = '?';
+  for(var i = 0; i < params.length; i++) {
+    var p = params[i].toUrlParam();
+    if(p == null)
+      continue;
+
+    if(i > 0)
+      qs += '&';
+    qs += params[i].toUrlParam();
+  }
+
+  return qs;
+}
\ No newline at end of file

Propchange: incubator/beehive/trunk/netui/src/javascript/tags-datagrid/netui-datagrid.js
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/script/common/BundleContext.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/script/common/BundleContext.java?view=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/script/common/BundleContext.java (original)
+++ incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/script/common/BundleContext.java Mon Feb  7 12:35:42 2005
@@ -24,6 +24,7 @@
 import java.util.Map;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
+import java.util.Collections;
 
 import org.apache.beehive.netui.util.logging.Logger;
 
@@ -84,7 +85,7 @@
 
     public Iterator getBundleNames() {
         if(bundles == null)
-            return org.apache.beehive.netui.util.iterator.IteratorFactory.EMPTY_ITERATOR;
+            return Collections.EMPTY_LIST.iterator();
         else
             return bundles.keySet().iterator();
     }

Modified: incubator/beehive/trunk/netui/src/tags-databinding/build.xml
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/build.xml?view=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/build.xml (original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/build.xml Mon Feb  7 12:35:42 2005
@@ -58,16 +58,15 @@
             <netuitldgen 
                  xmlencoding="UTF-8"
                  taglibversion="1.0"
-                 jspversion="1.2" 
+                 jspversion="1.2"
                  shortname="netui-data" 
                  uri="http://beehive.apache.org/netui/tags-databinding-1.0"
                  description="NetUI Databinding Tag Library."
                  filename="${netui-tags-databinding.tld.name}"
                  destdir="${build.lib.dir}"
                  validateXml="true"
-                 packageName="org.apache.beehive.netui.tags.databinding"
+                 packageName="org.apache.beehive.netui"
             />
- 
             <netuitldxgen
                      xmlencoding="UTF-8"
                      paletteGenerator="workshop.netui.jspdesigner.generators.NetuiDatabindingPaletteGenerator"

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/DefaultFilter.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/DefaultFilter.java?view=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/DefaultFilter.java (original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/DefaultFilter.java Mon Feb  7 12:35:42 2005
@@ -17,7 +17,7 @@
  */
 package org.apache.beehive.netui.databinding.datagrid.model.filter;
 
-import java.util.HashMap;
+import org.apache.beehive.netui.databinding.datagrid.exceptions.IllegalFilterException;
 
 /**
  *
@@ -25,20 +25,6 @@
 public class DefaultFilter
     implements IFilter {
 
-    private static final HashMap<String, FilterOperation> STRING_TO_FILTER;
-    private static final HashMap<FilterOperation, String> FILTER_TO_STRING;
-
-    /* todo: additional operations */
-    static {
-        STRING_TO_FILTER = new HashMap<String, FilterOperation>();
-        STRING_TO_FILTER.put("eq", FilterOperation.EQUAL);
-        STRING_TO_FILTER.put("ne", FilterOperation.NOT_EQUAL);
-
-        FILTER_TO_STRING = new HashMap<FilterOperation, String>();
-        FILTER_TO_STRING.put(FilterOperation.EQUAL, "eq");
-        FILTER_TO_STRING.put(FilterOperation.NOT_EQUAL, "ne");
-    }
-
     private String _filterExpression;
     private FilterOperation _filterOperation;
     private Object _value;
@@ -83,15 +69,15 @@
     }
 
     public String getOperationString() {
-        return FILTER_TO_STRING.get(_filterOperation);
+        return _filterOperation.getAbbreviation();
     }
 
     private static final FilterOperation mapStringToInt(String operation) {
-        assert STRING_TO_FILTER.get(operation) != null : "Found a null FilterOperation in the filter operation map.";
-        return STRING_TO_FILTER.get(operation);
-    }
+        for(FilterOperation fOp : FilterOperation.values()) {
+            if(fOp.getAbbreviation().equals(operation))
+                return fOp;
+        }
 
-    private static final String mapIntToString(FilterOperation operation) {
-        return FILTER_TO_STRING.get(operation.getId());
+        throw new IllegalFilterException("Can not map the operation name \"" + operation + "\" to a filter operation");
     }
 }

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/FilterModel.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/FilterModel.java?view=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/FilterModel.java (original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/FilterModel.java Mon Feb  7 12:35:42 2005
@@ -21,6 +21,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.HashMap;
+import java.util.Collections;
 import javax.servlet.ServletRequest;
 
 import org.apache.beehive.netui.databinding.datagrid.services.filter.FilterCodec;
@@ -31,25 +32,30 @@
 public class FilterModel {
 
     private String _namespace = null;
-    private Map<String, List<IFilter>> _filters = null;
+    private List<IFilter> _filters = null;
 
-    public FilterModel(String name, Map<String, List<IFilter>> filters) {
+    public FilterModel(String name, List<IFilter> filters) {
         _namespace = name;
         _filters = filters;
     }
 
-    public List<IFilter> getFilters(String filterExpression) {
+    public List<IFilter> getFilters() {
         if(_filters == null)
             return null;
+        else return Collections.unmodifiableList(_filters);
+    }
 
-        return lookupFilters(filterExpression);
+    public List<IFilter> getFilters(String filterExpression) {
+        if(_filters == null)
+            return null;
+        else return Collections.unmodifiableList(lookupFilters(filterExpression));
     }
 
     public boolean isFiltered(String filterExpression) {
         if(_filters == null)
             return false;
 
-        if(_filters.containsKey(filterExpression) && lookupFilters(filterExpression).size() > 0)
+        if(lookupFilters(filterExpression).size() > 0)
             return true;
         else return false;
     }
@@ -58,7 +64,13 @@
         assert filterExpression != null;
         assert !filterExpression.equals("");
 
-        List<IFilter> filters = _filters.get(filterExpression);
+        /* todo: perf.  need to do this with FilterModelArrayList */
+        ArrayList<IFilter> filters = new ArrayList<IFilter>();
+        for(IFilter filter : _filters) {
+            if(filter.getFilterExpression().equals(filterExpression))
+                filters.add(filter);
+        }
+
         return filters;
     }
 }

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/IFilter.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/IFilter.java?view=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/IFilter.java (original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/filter/IFilter.java Mon Feb  7 12:35:42 2005
@@ -22,21 +22,34 @@
  */
 public interface IFilter {
 
-    String FILTER_PARAM_KEY = "netui_filter";
-
     enum FilterOperation {
-
-        EQUAL(1),
-        NOT_EQUAL(2);
+        NONE(0, "*"),
+        EQUAL(1, "eq"),
+        NOT_EQUAL(2, "ne"),
+        GREATER_THAN(3, "gt"),
+        LESS_THAN(4, "lt"),
+        GREATER_THAN_OR_EQUAL(5, "ge"),
+        LESS_THAN_OR_EQUAL(6, "le"),
+        IS_ONE_OF(7, "in"),
+        STARTS_WITH(8, "startswith"),
+        CONTAINS(9, "contains"),
+        IS_EMPTY(10, "isempty"),
+        IS_NOT_EMPTY(11, "isnotempty");
 
         private int _id;
+        private String _abbrev;
 
-        FilterOperation(int id) {
+        FilterOperation(int id, String abbrev) {
             _id = id;
+            _abbrev = abbrev;
         }
 
         public int getId() {
             return _id;
+        }
+
+        public String getAbbreviation() {
+            return _abbrev;
         }
     }
 

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/style/StylePolicy.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/style/StylePolicy.java?view=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/style/StylePolicy.java (original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/style/StylePolicy.java Mon Feb  7 12:35:42 2005
@@ -24,18 +24,6 @@
  */
 public abstract class StylePolicy {
 
-/*
-    public static final int TABLE_CLASS = 1;
-    public static final int HEADER_ROW_CLASS = 2;
-    public static final int FOOTER_ROW_CLASS = 3;
-    public static final int ROW_CLASS = 4;
-    public static final int ALT_ROW_CLASS = 5;
-    public static final int HEADER_CELL_CLASS = 6;
-    public static final int DATA_CELL_CLASS = 7;
-    public static final int FOOTER_CELL_CLASS = 8;
-    public static final int HEADER_CELL_SORTED_CLASS = 9;
-*/
-
     private static final String DELIM = "-";
 
     private String _stylePrefix = null;

Modified: 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=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/DataGridStateService.java (original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/DataGridStateService.java Mon Feb  7 12:35:42 2005
@@ -81,7 +81,7 @@
     private Map<String, PagerModel> _pagers = null;
 
     private FilterCodec _filterCodec = null;
-    private Map<String, Map<String, List<IFilter>>> _filters = null;
+    private Map<String, List<IFilter>> _filters = null;
 
     private DataGridStateService(ServletRequest request) {
         _urlParams = request.getParameterMap();
@@ -96,6 +96,10 @@
         _filters = _filterCodec.decode(_urlParams);
     }
 
+    public String getPagerRowQueryParamKey() {
+        return _pagerCodec.getRowQueryParamKey();
+    }
+
     public PagerModel getPagerModel(String namespace) {
         PagerModel pm = _pagers.get(namespace);
         if(pm == null) {
@@ -116,6 +120,11 @@
         return new FilterModel(namespace, getFilters(namespace));
     }
 
+    /* --------------------------------------------------
+
+       Sort Methods
+
+       -------------------------------------------------- */
     public Map buildSortQueryParamsMap(String namespace) {
         List<ISort> sorts = getSorts(namespace);
 
@@ -150,8 +159,12 @@
         return buildQueryParamMap_sort(namespace, sortParamValue);
     }
 
+    /* --------------------------------------------------
+
+       Pager Methods
+
+       -------------------------------------------------- */
     public Map getQueryParamsForFirstPage(String namespace) {
-        PagerModel pagerModel = getPagerModel(namespace);
         return buildQueryParamMap_pager(namespace, FIRST_PAGE);
     }
 
@@ -184,10 +197,78 @@
         return params;
     }
 
-    public String getPagerRowQueryParamKey() {
-        return _pagerCodec.getRowQueryParamKey();
+    /* --------------------------------------------------
+
+       Filter Methods
+
+       -------------------------------------------------- */
+    /**
+     * Get a query parameter map but omit the filters for the
+     * given namespace with the given filter expression.
+     *
+     * @param namespace
+     * @param filterExpression
+     * @return
+     */
+    public Map getQueryParamsOmitFilter(String namespace, String filterExpression) {
+        Map params = new HashMap();
+
+        for(Object key : _urlParams.keySet()) {
+            if(key.equals(_filterCodec.getQueryParamKey()))
+                continue;
+            else params.put(key, _urlParams.get(key));
+        }
+
+        if(_filters != null) {
+            ArrayList filterList = new ArrayList();
+            for(String curNamespace : _filters.keySet()) {
+                List<IFilter> filters = _filters.get(curNamespace);
+
+                 filterList.add(_filterCodec.encode(curNamespace, filters, filterExpression));
+            }
+
+            params.put(_filterCodec.getQueryParamKey(), (String[])filterList.toArray(new String[0]));
+        }
+
+        return params;
+    }
+
+    /**
+     *
+     * @param namespace
+     * @return
+     */
+    public Map getQueryParamsOmitAllFilters(String namespace) {
+        Map params = new HashMap();
+
+        for(Object key : _urlParams.keySet()) {
+            if(key.equals(_filterCodec.getQueryParamKey()))
+                continue;
+            else params.put(key, _urlParams.get(key));
+        }
+
+        if(_filters != null) {
+            ArrayList filterList = new ArrayList();
+            for(String curNamespace : _filters.keySet()) {
+                if(curNamespace.equals(namespace))
+                    continue;
+
+                List<IFilter> filters = _filters.get(curNamespace);
+                String filterParamValue = _filterCodec.encode(curNamespace, filters);
+                filterList.add(filterParamValue);
+            }
+            params.put(_filterCodec.getQueryParamKey(), (String[])filterList.toArray(new String[0]));
+        }
+
+        return params;
     }
 
+    /* --------------------------------------------------
+
+       Implementation details
+
+       -------------------------------------------------- */
+
     private List<ISort> getSorts(String namespace) {
         if(_sorts != null)
             return _sorts.get(namespace);
@@ -195,12 +276,12 @@
             return null;
     }
 
-    private Map<String, List<IFilter>> getFilters(String namespace) {
+    private List<IFilter> getFilters(String namespace) {
         if(_filters != null)
             return _filters.get(namespace);
         else return null;
     }
-    
+
     private Map buildQueryParamMap_pager(String namespace, int page) {
         PagerModel pagerModel = getPagerModel(namespace);
         Map params = new HashMap();
@@ -217,7 +298,9 @@
         /* handle pager URL parameters */
         if(_pagers != null) {
             ArrayList<String> rowValues = new ArrayList<String>();
+/*
             ArrayList<String> pageSizes = new ArrayList<String>();
+*/
             for(String n : _pagers.keySet()) {
                 if(n.equals(namespace)) {
                     if(newRowParamValue != null && newRow != 0)

Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/filter/FilterCodec.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/filter/FilterCodec.java?view=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/filter/FilterCodec.java (original)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/filter/FilterCodec.java Mon Feb  7 12:35:42 2005
@@ -22,12 +22,13 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Collections;
+import java.util.LinkedHashMap;
 
 import org.apache.beehive.netui.databinding.datagrid.model.filter.IFilter;
 import org.apache.beehive.netui.databinding.datagrid.model.filter.DefaultFilter;
 import org.apache.beehive.netui.util.logging.Logger;
 
-/* Beehive filter format: netui_filter=<namespace>~<filterExpr>~<op>~<value> */
+/* Beehive filter format: netui_filter=<namespace>;<fExpr>~<fOp>~<fVal>,<fExpr>~<fOp>~<fVal> */
 
 /**
  *
@@ -35,97 +36,92 @@
 public final class FilterCodec {
 
     private static final Logger LOGGER = Logger.getInstance(FilterCodec.class);
-    private static final String DELIM = "~";
+    private static final String GRID_NAME_DELIM = ";";
+    private static final String FILTER_DELIM = ",";
+    private static final String FILTER_TERM_DELIM = "~";
 
     public String getQueryParamKey() {
-        return IFilter.FILTER_PARAM_KEY;
+        return "netui_filter";
     }
 
-    public Map<String, Map<String, List<IFilter>>> decode(Map params) {
+    public Map<String, List<IFilter>> decode(Map params) {
         String[] queryParams = (String[])params.get(getQueryParamKey());
 
         if(queryParams == null)
             return null;
 
-        Map<String, Map<String, List<IFilter>>> map = new HashMap<String, Map<String, List<IFilter>>>();
+        LinkedHashMap<String, List<IFilter>> map = new LinkedHashMap<String, List<IFilter>>();
 
         for(String filterParam : queryParams) {
+            String[] nameAndFilters = filterParam.split(GRID_NAME_DELIM);
 
-            String namespace = null;
-            IFilter filter = null;
+            assert nameAndFilters.length == 2;
 
-            String[] terms = filterParam.split(DELIM);
+            String namespace = nameAndFilters[0];
+            String[] filters = nameAndFilters[1].split(FILTER_DELIM);
 
-            namespace = terms[0];
+            ArrayList<IFilter> gridFilters = new ArrayList<IFilter>();
+            for(int i = 0; i < filters.length; i++) {
+                String[] terms = filters[i].split(FILTER_TERM_DELIM);
+                IFilter filter = null;
 
-            /* todo: what did this mean? */
-            if(terms.length == 3 && terms[2].equals("*"))
-                return null;
-            else if(terms.length == 4) {
-                try {
-                    // the namespace is ignored here since all filter terms are scoped into a namespace already
-                    filter = new DefaultFilter(terms[1], terms[2], terms[3]);
-                } catch(NumberFormatException nfe) {
+                if(terms.length == 2 && terms[1].equals("*"))
+                    continue;
+                else if(terms.length == 3) {
+                    try {
+                        // the namespace is ignored here since all filter terms are scoped into a namespace already
+                        filter = new DefaultFilter(terms[0], terms[1], terms[2]);
+                    } catch(NumberFormatException nfe) {
+                        if(LOGGER.isErrorEnabled())
+                            LOGGER.error("An error occurred parsing a URL filter with syntax \"" + filter + "\".");
+                        continue;
+                    }
+                } else {
+                    String msg = "The syntax of the filter \"" + filter + "\" is illegal.";
                     if(LOGGER.isErrorEnabled())
-                        LOGGER.error("An error occurred parsing a URL filter with syntax \"" + filter + "\".");
+                        LOGGER.error(msg);
                     continue;
                 }
-            } else {
-                String msg = "The syntax of the filter \"" + filter + "\" is illegal.";
-                if(LOGGER.isErrorEnabled())
-                    LOGGER.error(msg);
-                continue;
-            }
 
-            assert filter != null;
-
-            Map<String, List<IFilter>> allFilters = map.get(namespace);
-            if(allFilters == null) {
-                allFilters = new HashMap<String, List<IFilter>>();
-                map.put(namespace, allFilters);
-            }
+                assert filter != null;
 
-            List<IFilter> filters = allFilters.get(filter.getFilterExpression());
-            if(filters == null) {
-                filters = new ArrayList<IFilter>();
-                allFilters.put(filter.getFilterExpression(), filters);
+                gridFilters.add(filter);
             }
-
-            filters.add(filter);
+            map.put(namespace, gridFilters);
         }
         return map;
     }
 
-    public Map<String, String[]> encode(String namespace, Map<String, List<IFilter>> allFilters) {
-        if(allFilters == null || allFilters.size() == 0)
-            return Collections.EMPTY_MAP;
-
-        ArrayList<String> filterStrings = new ArrayList<String>();
-        for(String filterExpr : allFilters.keySet()) {
-            List<IFilter> filters = allFilters.get(filterExpr);
-            for(int i = 0; i < filters.size(); i++) {
-                StringBuilder builder = new StringBuilder();
-                IFilter filter = filters.get(i);
-                filterStrings.add(write(builder, namespace, filter));
-            }
-        }
-
-        HashMap<String, String[]> map = new HashMap<String, String[]>();
-        map.put(getQueryParamKey(), (String[])filterStrings.toArray(new String[0]));
-        return map;
+    public String encode(String namespace, List<IFilter> filters) {
+        return encode(namespace, filters, null);
     }
 
-    private String write(StringBuilder sb, String namespace, IFilter filter) {
-        assert namespace != null;
-        assert filter != null;
+    public String encode(String namespace, List<IFilter> filters, String omitFilterExpression) {
+
+        if(filters == null || filters.size() == 0)
+            return null;
 
+        boolean filterWritten = false;
+        StringBuilder sb = new StringBuilder();
         sb.append(namespace);
-        sb.append(DELIM);
-        sb.append(filter.getFilterExpression());
-        sb.append(DELIM);
-        sb.append(filter.getOperationString());
-        sb.append(DELIM);
-        sb.append(filter.getValue());
+        sb.append(GRID_NAME_DELIM);
+        for(int i = 0; i < filters.size(); i++) {
+            IFilter filter = filters.get(i);
+            if(omitFilterExpression != null && filter.getFilterExpression().equals(omitFilterExpression))
+                continue;
+
+            if(filterWritten)
+                sb.append(FILTER_DELIM);
+
+            sb.append(filter.getFilterExpression());
+            sb.append(FILTER_TERM_DELIM);
+            sb.append(filter.getOperationString());
+            sb.append(FILTER_TERM_DELIM);
+            sb.append(filter.getValue());
+
+            filterWritten = true;
+        }
+
         return sb.toString();
     }
 }

Added: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/FilterUtil.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/FilterUtil.java?view=auto&rev=151747
==============================================================================
--- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/FilterUtil.java (added)
+++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/FilterUtil.java Mon Feb  7 12:35:42 2005
@@ -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.databinding.datagrid.util;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.LinkedHashMap;
+import javax.servlet.jsp.JspContext;
+
+import org.apache.beehive.netui.databinding.datagrid.model.filter.IFilter;
+import org.apache.beehive.netui.databinding.datagrid.model.filter.DefaultFilter;
+import org.apache.beehive.netui.databinding.datagrid.model.filter.IFilter.FilterOperation;
+
+/**
+ * @netui:jspfunctions
+ */
+public class FilterUtil {
+
+    private static final List<IFilter> DEFAULT_FILTER_LIST;
+    private static final IFilter DEFAULT_FILTER = new DefaultFilter();
+
+    private static final String TYPE_HINT_STRING = "string";
+    private static final String TYPE_HINT_DATE = "date";
+
+    private static final FilterOperation STRING_FILTER_OPERATION = FilterOperation.CONTAINS;
+    private static final FilterOperation OTHER_FILTER_OPERATION = FilterOperation.EQUAL;
+
+    static {
+        DEFAULT_FILTER_LIST = new ArrayList<IFilter>();
+        DEFAULT_FILTER_LIST.add(DEFAULT_FILTER);
+        DEFAULT_FILTER_LIST.add(DEFAULT_FILTER);
+    }
+
+    private FilterUtil() {}
+
+    /**
+     * @param typeHint
+     * @return
+     * @netui:jspfunction name="lookupFilterOperations"
+     *                    signature="java.util.Map lookupFilterOperations(java.lang.String)"
+     */
+    public static Map lookupFilterOperations(String typeHint) {
+        LinkedHashMap ops = new LinkedHashMap<String, String>();
+
+        /* todo: i18n */
+        ops.put(FilterOperation.NOT_EQUAL.getAbbreviation(), "No Filter");
+        ops.put(FilterOperation.EQUAL.getAbbreviation(), "Equals");
+        ops.put(FilterOperation.NOT_EQUAL.getAbbreviation(), "Not Equal");
+        ops.put(FilterOperation.GREATER_THAN.getAbbreviation(), "Greater Than");
+        ops.put(FilterOperation.LESS_THAN.getAbbreviation(), "Less Than");
+        ops.put(FilterOperation.GREATER_THAN_OR_EQUAL.getAbbreviation(), "Is Greater Than or Equal To");
+        ops.put(FilterOperation.LESS_THAN_OR_EQUAL.getAbbreviation(), "Is Less Than or Equal To");
+
+        if(!typeHint.equals(TYPE_HINT_DATE)) {
+            ops.put(FilterOperation.IS_ONE_OF.getAbbreviation(), "Is One Of (eg: 1;2;3)");
+        }
+
+        if(typeHint == null || typeHint.equals(TYPE_HINT_STRING)) {
+            ops.put(FilterOperation.STARTS_WITH.getAbbreviation(), "Starts With");
+            ops.put(FilterOperation.CONTAINS.getAbbreviation(), "Contains");
+            ops.put(FilterOperation.IS_EMPTY.getAbbreviation(), "Is Empty");
+            ops.put(FilterOperation.IS_NOT_EMPTY.getAbbreviation(), "Is Not Empty");
+        }
+
+        return ops;
+    }
+
+    /**
+     * @param typeHint
+     * @return
+     * @netui:jspfunction name="lookupDefaultFilterOperation"
+     *                    signature="java.lang.String lookupDefaultFilterOperations(java.lang.String)"
+     */
+    public static String lookupDefaultFilterOperation(String typeHint) {
+        FilterOperation fOp = OTHER_FILTER_OPERATION;
+        if(typeHint == null || typeHint.equals(TYPE_HINT_STRING))
+            fOp = STRING_FILTER_OPERATION;
+
+        return fOp.getAbbreviation();
+    }
+
+    /**
+     * Function that normalizes the data set that is used to render the
+     * filter window UI.  This function is needed because the NetUI
+     * tags require that dataSource expressions evaluate to live values
+     * and can't be null.
+     *
+     * @param jspContext
+     * @param attrName
+     * @netui:jspfunction name="ensureFilters"
+     *                    signature="void ensureFilters(javax.servlet.jsp.JspContext java.lang.String)"
+     */
+    public static void ensureFilters(JspContext jspContext, String attrName) {
+        List<IFilter> filters = (List<IFilter>)jspContext.getAttribute("filters");
+        List<IFilter> pcFilters = new ArrayList<IFilter>();
+
+        if(filters == null || filters.size() == 0)
+            pcFilters = DEFAULT_FILTER_LIST;
+        else if(filters.size() == 1) {
+            pcFilters.add(filters.get(0));
+            pcFilters.add(DEFAULT_FILTER);
+        }
+        else pcFilters = filters;
+
+        assert pcFilters.size() == 2;
+
+        jspContext.setAttribute(attrName, pcFilters);
+    }
+}

Propchange: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/FilterUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/FilterCodecTest.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/FilterCodecTest.java?view=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/FilterCodecTest.java (original)
+++ incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/FilterCodecTest.java Mon Feb  7 12:35:42 2005
@@ -27,6 +27,7 @@
 import junit.framework.TestSuite;
 
 import org.apache.beehive.netui.databinding.datagrid.services.filter.FilterCodec;
+import org.apache.beehive.netui.databinding.datagrid.services.DataGridStateService;
 import org.apache.beehive.netui.databinding.datagrid.model.filter.IFilter;
 import org.apache.beehive.netui.test.servlet.ServletFactory;
 
@@ -40,12 +41,11 @@
     private ServletRequest _request;
 
     public void testSimpleDecode() {
-        DataGridTestUtil.initQueryString(_request, "netui_filter=" + _namespace + "~CUSTOMERNAME~eq~homer");
+        DataGridTestUtil.initQueryString(_request, "netui_filter=" + _namespace + ";CUSTOMERNAME~eq~homer");
         FilterCodec codec = new FilterCodec();
 
-        Map<String, Map<String, List<IFilter>>> allFilters = codec.decode(_request.getParameterMap());
-        Map<String, List<IFilter>> gridFilters = allFilters.get(_namespace);
-        List<IFilter> filters = gridFilters.get("CUSTOMERNAME");
+        Map<String, List<IFilter>> allFilters = codec.decode(_request.getParameterMap());
+        List<IFilter> filters = allFilters.get(_namespace);
 
         assertTrue(filters != null);
         assertEquals(1, filters.size());
@@ -55,12 +55,11 @@
     }
 
     public void testDecode1() {
-        DataGridTestUtil.initQueryString(_request, "netui_filter=" + _namespace + "~CUSTOMERNAME~eq~homer&netui_filter=products~ID~ne~1234");
+        DataGridTestUtil.initQueryString(_request, "netui_filter=" + _namespace + ";CUSTOMERNAME~eq~homer&netui_filter=products;ID~ne~1234");
         FilterCodec codec = new FilterCodec();
 
-        Map<String, Map<String, List<IFilter>>> allFilters = codec.decode(_request.getParameterMap());
-        Map<String, List<IFilter>> gridFilters = allFilters.get(_namespace);
-        List<IFilter> filters = gridFilters.get("CUSTOMERNAME");
+        Map<String, List<IFilter>> allFilters = codec.decode(_request.getParameterMap());
+        List<IFilter> filters = allFilters.get(_namespace);
 
         assertTrue(filters != null);
         assertEquals(1, filters.size());
@@ -68,8 +67,7 @@
         assertEquals("homer", filters.get(0).getValue());
         assertEquals("CUSTOMERNAME", filters.get(0).getFilterExpression());
 
-        gridFilters = allFilters.get("products");
-        filters = gridFilters.get("ID");
+        filters = allFilters.get("products");
         assertTrue(filters != null);
         assertEquals(1, filters.size());
         assertEquals(IFilter.FilterOperation.NOT_EQUAL, filters.get(0).getOperation());
@@ -77,25 +75,60 @@
         assertEquals("ID", filters.get(0).getFilterExpression());
     }
 
+    public void testDataGridStateService1() {
+        DataGridTestUtil.initQueryString(_request,
+            "netui_filter=" + _namespace + ";ZIP~eq~12345,CUSTOMERNAME~eq~homer&netui_filter=products;ID~ne~1234");
+        DataGridStateService dgss = DataGridStateService.getInstance(_request);
+
+        Map queryParams = null;
+        String[] qp = null;
+
+        queryParams = dgss.getQueryParamsOmitAllFilters(_namespace);
+        assertEquals(1, queryParams.keySet().size());
+        assertNotNull(queryParams.get("netui_filter"));
+        qp = (String[])queryParams.get("netui_filter");
+        assertEquals("products;ID~ne~1234", qp[0]);
+
+        queryParams = dgss.getQueryParamsOmitFilter(_namespace, "CUSTOMERNAME");
+        assertEquals(1, queryParams.keySet().size());
+        qp = (String[])queryParams.get("netui_filter");
+        assertEquals(2, qp.length);
+    }
+
+    public void testDataGridStateService2() {
+        DataGridTestUtil.initQueryString(_request,
+            "netui_filter=" + _namespace + ";ZIP~eq~12345,CUSTOMERNAME~eq~homer&netui_filter=products;ID~ne~1234");
+        DataGridStateService dgss = DataGridStateService.getInstance(_request);
+
+        Map queryParams = null;
+        String[] qp = null;
+
+        queryParams = dgss.getQueryParamsOmitAllFilters(_namespace);
+        assertEquals(1, queryParams.keySet().size());
+        assertNotNull(queryParams.get("netui_filter"));
+        qp = (String[])queryParams.get("netui_filter");
+        assertEquals("products;ID~ne~1234", qp[0]);
+
+        queryParams = dgss.getQueryParamsOmitFilter(_namespace, "CUSTOMERNAME");
+        assertEquals(1, queryParams.keySet().size());
+        qp = (String[])queryParams.get("netui_filter");
+        assertEquals(2, qp.length);
+        assertEquals(_namespace + ";ZIP~eq~12345", qp[0]);
+        assertEquals("products;ID~ne~1234", qp[1]);
+    }
+
     public void testEncode1() {
-        String customerNameParam = _namespace + "~CUSTOMERNAME~eq~homer";
-        DataGridTestUtil.initQueryString(_request, "netui_filter=" + customerNameParam + "&netui_filter=products~ID~ne~1234");
+        String customerNameParam = _namespace + ";CUSTOMERNAME~eq~homer";
+        DataGridTestUtil.initQueryString(_request, "netui_filter=" + customerNameParam + "&netui_filter=products;ID~ne~1234");
         FilterCodec codec = new FilterCodec();
 
-        Map<String, Map<String, List<IFilter>>> allFilters = codec.decode(_request.getParameterMap());
-        Map<String, List<IFilter>> gridFilters = allFilters.get(_namespace);
-
-        Map<String, String[]> queryParams = codec.encode(_namespace, gridFilters);
-        String[] params = queryParams.get(codec.getQueryParamKey());
+        Map<String, List<IFilter>> allFilters = codec.decode(_request.getParameterMap());
+        List<IFilter> gridFilters = allFilters.get(_namespace);
 
-        assertNotNull(queryParams);
-        assertNotNull(queryParams.get(codec.getQueryParamKey()));
-        assertEquals(1, params.length);
-        assertEquals(customerNameParam, params[0]);
-    }
+        String filterQueryValue = codec.encode(_namespace, gridFilters);
 
-    private ServletRequest getRequest() {
-        return _request;
+        assertNotNull(filterQueryValue);
+        assertEquals(customerNameParam, filterQueryValue);
     }
 
     protected void setUp() {

Modified: incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/FilterModelTest.java
URL: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/FilterModelTest.java?view=diff&r1=151746&r2=151747
==============================================================================
--- incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/FilterModelTest.java (original)
+++ incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/FilterModelTest.java Mon Feb  7 12:35:42 2005
@@ -43,7 +43,7 @@
     private String _namespace = "bugs";
 
     public void testSortModelSimple() {
-        DataGridTestUtil.initQueryString(_request, "netui_filter=" + _namespace + "~CUSTOMERNAME~eq~homer&netui_filter=products~ID~ne~1234");
+        DataGridTestUtil.initQueryString(_request, "netui_filter=" + _namespace + ";CUSTOMERNAME~eq~homer&netui_filter=products;ID~ne~1234");
         DataGridStateService dgss = DataGridStateService.getInstance(_request);
         FilterModel fm = dgss.getFilterModel(_namespace);