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
/**
*