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 [EMAIL PROTECTED] SortService} and a + * [EMAIL PROTECTED] 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 /** *
