Author: ekoneil
Date: Fri Jan 21 14:26:34 2005
New Revision: 125974
URL: http://svn.apache.org/viewcvs?view=rev&rev=125974
Log:
Data grid state management might be closer to right now. :)
Now, there's a Codec that handles encode / decode of the URL parameters. This
is used by a DataGridStateService, which parses the URL once for all grids and
is stored in the request. This can then return a SortModel which provides an
API for dealing with sorts for a specific grid.
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/sort/SortCodec.java
(contents, props changed)
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortCodecTest.java
- copied, changed from r125927,
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortServiceTest.java
Removed:
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridState.java
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/sort/SortFactory.java
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/sort/SortService.java
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortServiceTest.java
Modified:
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/sort/SortModel.java
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/DefaultSortTest.java
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortModelTest.java
Modified:
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java
Url:
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java?view=diff&rev=125974&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java&r1=125973&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java&r2=125974
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java
Fri Jan 21 14:26:34 2005
@@ -18,15 +18,18 @@
package org.apache.beehive.netui.databinding.datagrid.model;
import java.util.ResourceBundle;
+import java.util.Map;
import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.PageContext;
import org.apache.beehive.netui.databinding.datagrid.model.style.StylePolicy;
import
org.apache.beehive.netui.databinding.datagrid.model.sort.ISort.SortDirection;
+import org.apache.beehive.netui.databinding.datagrid.model.sort.SortModel;
import
org.apache.beehive.netui.databinding.datagrid.rendering.table.TableRenderer;
import
org.apache.beehive.netui.databinding.datagrid.rendering.pager.IPagerRenderer;
import
org.apache.beehive.netui.databinding.datagrid.rendering.pager.PreviousNextPagerRenderer;
import org.apache.beehive.netui.databinding.datagrid.util.PagedDataSet;
+import
org.apache.beehive.netui.databinding.datagrid.services.DataGridStateService;
import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
import org.apache.beehive.netui.util.Bundle;
@@ -51,8 +54,8 @@
private PagerModel _pagerModel = null;
private PagedDataSet _dataSet = null;
private TableRenderer _tableRenderer = null;
- private DataGridState _dataGridState = null;
private ResourceBundle _resourceBundle = null;
+ private DataGridStateService _dgss = null;
private JspContext _jspContext = null;
@@ -63,6 +66,7 @@
_jspContext = jspContext;
_dataSet = dataSet;
_pagerModel = new PagerModel(this);
+ _dgss = DataGridStateService.getInstance(jspContext);
}
public String getName() {
@@ -140,7 +144,7 @@
public void setResourceBundlePath(String resourceBundlePath) {
_resourceBundlePath = resourceBundlePath;
}
-
+/*
public DataGridState getDataGridState() {
if(_dataGridState == null)
_dataGridState =
DataGridState.createInstance(((PageContext)_jspContext).getRequest(),
getName());
@@ -151,7 +155,7 @@
public void setDataGridState(DataGridState dataGridState) {
_dataGridState = dataGridState;
}
-
+*/
public String getString(String key) {
if(_resourceBundlePath == null)
return Bundle.getString(key);
@@ -189,13 +193,35 @@
public String getDefaultSortImagePath(String contextPath) {
/* todo: need to allow external configuration of this image path */
return contextPath + "/resources/images/sortable.gif";
- }
+ }
public void renderPager(AbstractRenderAppender appender) {
assert getPagerRenderer() != null : "Received a null PagerRenderer";
appender.append(getPagerRenderer().render());
}
+ public Map buildSortQueryParamsMap() {
+ return _dgss.buildSortQueryParamsMap(_name);
+ }
+
+ public Map<String, String[]> getSortQueryParamsMap(String sortExpression) {
+ SortModel sortModel = _dgss.getSortModel(_name);
+ SortDirection sortDirection =
sortModel.getSortDirection(sortExpression);
+
+ if(sortDirection == SortDirection.NONE)
+ return buildSortQueryParamsMap(sortExpression,
SortDirection.ASCENDING);
+ else if(sortDirection == SortDirection.ASCENDING)
+ return buildSortQueryParamsMap(sortExpression,
SortDirection.DESCENDING);
+ else if(sortDirection == SortDirection.DESCENDING)
+ return buildSortQueryParamsMap(sortExpression, SortDirection.NONE);
+ else throw new IllegalStateException("Received invalid sort direction
\"" + sortDirection + "\"");
+ }
+
+ public SortModel getSortModel() {
+ return _dgss.getSortModel(_name);
+ }
+
+ /* these should go away in favor of calling them on the PagedDataSet */
public int getCurrentIndex() {
return _dataSet.getCurrentIndex();
}
@@ -214,5 +240,9 @@
public boolean hasNextDataItem() {
return _dataSet.hasNext();
+ }
+
+ private Map buildSortQueryParamsMap(String sortExpression, SortDirection
sortDirection) {
+ return _dgss.buildSortQueryParamsMap(_name, sortExpression,
sortDirection);
}
}
Deleted:
/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridState.java
Url:
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridState.java?view=auto&rev=125973
==============================================================================
Modified:
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/sort/SortModel.java
Url:
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/sort/SortModel.java?view=diff&rev=125974&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/sort/SortModel.java&r1=125973&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/sort/SortModel.java&r2=125974
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/sort/SortModel.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/sort/SortModel.java
Fri Jan 21 14:26:34 2005
@@ -17,144 +17,28 @@
*/
package org.apache.beehive.netui.databinding.datagrid.model.sort;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
-import javax.servlet.ServletRequest;
+import java.util.Collections;
import
org.apache.beehive.netui.databinding.datagrid.model.sort.ISort.SortDirection;
-import org.apache.beehive.netui.databinding.datagrid.services.sort.SortService;
-import org.apache.beehive.netui.databinding.datagrid.util.ParameterUtil;
/**
*
*/
public class SortModel {
- /* Default sort syntax: netui_sort=<gridNamespace>~[+|-]<expr> */
-
private String _name = null;
- private String _sortParamKey = null;
private List<ISort> _sorts = null;
- private Map _existingParams = null;
- public SortModel(String name) {
+ public SortModel(String name, List<ISort> sorts) {
_name = name;
- }
-
- public void handleRequest(ServletRequest request) {
- SortService sortService = SortService.getInstance(request);
-
- _sorts = sortService.getSorts(_name);
- _existingParams = ParameterUtil.getParameters(request,
getSortParamKey());
-
- /* todo: this is going to be problematic when generating URLs that
- could contain sort information for grids where that
- data has been programatically altered
- */
-/*
- List<ISort> sorts = sortService.getOtherSorts(_name);
- if(sorts != null && sorts.size() > 0)
- _existingParams.put(getSortParamKey(), buildSortParams(sorts));
-*/
+ _sorts = sorts;
}
public List<ISort> getSorts() {
- return _sorts;
- }
-
- public String getSortParamKey() {
- if(_sortParamKey != null)
- return _sortParamKey;
- else
- return ISort.SORT_PARAM_KEY;
- }
-
- public Map buildSortQueryParamsMap() {
- List<ISort> sorts = getSorts();
- if(sorts == null)
- return _existingParams;
-
- String sortParamValue = buildSortParamValue(sorts, null, null);
-
- HashMap map = new HashMap(_existingParams.size() + 1);
- map.putAll(_existingParams);
- if(sortParamValue != null)
- map.put(getSortParamKey(), new String[] {sortParamValue});
- return map;
- }
-
- private String buildSortParamValue(List<ISort> sorts, String
sortExpression, SortDirection sortDirection) {
- StringBuilder sb = new StringBuilder();
- sb.append(_name);
- sb.append("~");
-
- boolean hasTerms = false;
- for(int i = 0; i < sorts.size(); i++) {
- ISort sort = sorts.get(i);
-
- if(sortExpression != null &&
sortExpression.equals(sort.getSortExpression())) {
- if(sortDirection != SortDirection.NONE) {
- if(hasTerms)
- sb.append(",");
- else hasTerms = true;
-
- if(sortDirection == SortDirection.DESCENDING)
- sb.append("-");
- sb.append(sortExpression);
- hasTerms = true;
- }
- }
- else {
- if(hasTerms)
- sb.append(",");
- else hasTerms = true;
-
- if(sort.getDirection() == SortDirection.DESCENDING)
- sb.append("-");
- sb.append(sort.getSortExpression());
- }
- }
-
- /* any new sorts are added at the end of the current sorts. */
- if(sortExpression != null && sortDirection != SortDirection.NONE &&
!isSorted(sortExpression)) {
- if(hasTerms)
- sb.append(",");
- if(sortDirection == SortDirection.DESCENDING)
- sb.append("-");
- sb.append(sortExpression);
- }
-
- if(!hasTerms)
- return null;
-
- return sb.toString();
- }
-
- public Map buildSortQueryParamsMap(String sortExpression, SortDirection
sortDirection) {
- assert sortExpression != null;
- assert sortDirection != null;
-
- List<ISort> sorts = getSorts();
- String sortParamValue = null;
- if(sorts != null) {
- sortParamValue = buildSortParamValue(sorts, sortExpression,
sortDirection);
- }
- else if(sortDirection != SortDirection.NONE &&
!isSorted(sortExpression)) {
- StringBuilder sb = new StringBuilder();
- sb.append(_name);
- sb.append("~");
- if(sortDirection == SortDirection.DESCENDING)
- sb.append("-");
- sb.append(sortExpression);
- sortParamValue = sb.toString();
- }
-
- HashMap map = new HashMap(_existingParams.size() + 1);
- map.putAll(_existingParams);
- if(sortParamValue != null)
- map.put(getSortParamKey(), new String[] {sortParamValue});
- return map;
+ if(_sorts != null)
+ return Collections.unmodifiableList(_sorts);
+ else return null;
}
public boolean isPrimarySort(String sortExpression) {
Modified:
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java
Url:
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java?view=diff&rev=125974&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java&r1=125973&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java&r2=125974
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/cell/SortedCellDecorator.java
Fri Jan 21 14:26:34 2005
@@ -35,7 +35,6 @@
import
org.apache.beehive.netui.databinding.datagrid.model.sort.ISort.SortDirection;
import org.apache.beehive.netui.databinding.datagrid.model.sort.SortModel;
import org.apache.beehive.netui.databinding.datagrid.util.JspUtil;
-import org.apache.beehive.netui.databinding.datagrid.model.DataGridState;
import org.apache.beehive.netui.util.logging.Logger;
/**
@@ -73,8 +72,7 @@
DataGridModel dgm = cellModel.getDataGridModel();
assert dgm != null;
- DataGridState dgss = dgm.getDataGridState();
- SortModel sortModel = dgss.getSortModel();
+ SortModel sortModel = dgm.getSortModel();
StringBuilder builder = new StringBuilder();
AbstractRenderAppender appender = new
StringBuilderRenderAppender(builder);
@@ -95,7 +93,7 @@
imgTag.registerAttribute(AbstractHtmlState.ATTR_GENERAL,
HtmlConstants.BORDER, "false");
- Map queryParams =
dgss.getSortQueryParamsMap(cellModel.getSortExpression());
+ Map queryParams =
dgm.getSortQueryParamsMap(cellModel.getSortExpression());
String href = null;
try {
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=125974
==============================================================================
--- (empty file)
+++
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/DataGridStateService.java
Fri Jan 21 14:26:34 2005
@@ -0,0 +1,154 @@
+/*
+ * 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.List;
+import java.util.HashMap;
+import java.util.ArrayList;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.jsp.JspContext;
+import javax.servlet.jsp.PageContext;
+
+import org.apache.beehive.netui.databinding.datagrid.model.sort.ISort;
+import org.apache.beehive.netui.databinding.datagrid.model.sort.SortModel;
+import
org.apache.beehive.netui.databinding.datagrid.model.sort.ISort.SortDirection;
+import org.apache.beehive.netui.databinding.datagrid.services.sort.SortCodec;
+
+/**
+ * A DataGridStateService is an object that is shared between all data grids
+ * and stores state information that is parsed off of the URL. This
+ * provides a single parsing location, which improves performance, and
+ * a single place to track sort, filter, and other grid state that impacts
+ * URLs generated by all data grids.
+ * <p/>
+ * The DataGridStateService is scoped to a single ServletRequest and is
+ * able to cache the ServletRequest object itself.
+ */
+public class DataGridStateService {
+
+ private static final String KEY = DataGridStateService.class.getName() +
"REQUEST_KEY";
+
+ public static DataGridStateService getInstance(JspContext jspContext) {
+ assert jspContext instanceof PageContext;
+
+ return getInstance(((PageContext)jspContext).getRequest());
+ }
+
+ public static DataGridStateService getInstance(ServletRequest request) {
+ Object obj = request.getAttribute(KEY);
+ if(obj != null) {
+ assert obj instanceof DataGridStateService;
+
+ return (DataGridStateService)obj;
+ } else {
+ DataGridStateService dgss = new DataGridStateService(request);
+ request.setAttribute(KEY, dgss);
+ return dgss;
+ }
+ }
+
+ private SortCodec _sortCodec = null;
+ private Map<String, List<ISort>> _sorts = null;
+ private Map _urlParams = null;
+
+ private DataGridStateService(ServletRequest request) {
+ _sortCodec = new SortCodec();
+ String[] sortParams =
request.getParameterValues(_sortCodec.getQueryParamKey());
+ _sorts = _sortCodec.decode(sortParams);
+ _urlParams = request.getParameterMap();
+ }
+
+ public SortModel getSortModel(String namespace) {
+ /* todo: caching */
+ return new SortModel(namespace, getSorts(namespace));
+ }
+
+ private List<ISort> getSorts(String namespace) {
+ if(_sorts != null)
+ return _sorts.get(namespace);
+ else
+ return null;
+ }
+
+ public Map buildSortQueryParamsMap(String namespace) {
+ List<ISort> sorts = getSorts(namespace);
+
+ if(sorts == null)
+ return buildQueryParamMap(null, null);
+ else {
+ String sortParamValue = _sortCodec.encode(namespace, sorts, null,
null, false);
+ return buildQueryParamMap(namespace, sortParamValue);
+ }
+ }
+
+ public Map buildSortQueryParamsMap(String namespace, String
sortExpression, SortDirection sortDirection) {
+ assert sortExpression != null;
+ assert sortDirection != null;
+
+ List<ISort> sorts = getSorts(namespace);
+ String sortParamValue = null;
+ boolean isSorted = getSortModel(namespace).isSorted(sortExpression);
+ if(sorts != null) {
+ sortParamValue = _sortCodec.encode(namespace, sorts,
sortExpression, sortDirection, isSorted);
+ } else if(sortDirection != SortDirection.NONE && !isSorted) {
+ /* todo: move to SortCodec */
+ StringBuilder sb = new StringBuilder();
+ sb.append(namespace);
+ sb.append("~");
+ if(sortDirection == SortDirection.DESCENDING)
+ sb.append("-");
+ sb.append(sortExpression);
+ sortParamValue = sb.toString();
+ }
+
+ return buildQueryParamMap(namespace, sortParamValue);
+ }
+
+ private Map buildQueryParamMap(String namespace, String paramValue) {
+ Map params = new HashMap();
+
+ for(Object key : _urlParams.keySet()) {
+ if(key.equals(_sortCodec.getQueryParamKey()))
+ continue;
+ else
+ params.put(key, _urlParams.get(key));
+ }
+
+ if(_sorts != null) {
+ ArrayList<String> paramValues = new ArrayList<String>();
+ for(Object key : _sorts.keySet()) {
+ if(namespace != null && key.equals(namespace)) {
+ if(paramValue != null)
+ paramValues.add(paramValue);
+ }
+ /* todo: performance. need to cache here */
+ else
+ paramValues.add(_sortCodec.encode((String)key,
_sorts.get(key), null, null, false));
+ }
+
+ if(paramValues.size() > 0)
+ params.put(_sortCodec.getQueryParamKey(),
paramValues.toArray(new String[0]));
+ }
+ else if(paramValue != null)
+ params.put(_sortCodec.getQueryParamKey(), new String[]
{paramValue});
+
+ return params;
+ }
+}
Added:
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/sort/SortCodec.java
Url:
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/sort/SortCodec.java?view=auto&rev=125974
==============================================================================
--- (empty file)
+++
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/sort/SortCodec.java
Fri Jan 21 14:26:34 2005
@@ -0,0 +1,137 @@
+/*
+ * 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.sort;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Collections;
+
+import org.apache.beehive.netui.databinding.datagrid.model.sort.ISort;
+import org.apache.beehive.netui.databinding.datagrid.model.sort.DefaultSort;
+import
org.apache.beehive.netui.databinding.datagrid.model.sort.ISort.SortDirection;
+
+/**
+ *
+ */
+public class SortCodec {
+
+ /* Default sort syntax: netui_sort=<gridNamespace>~[+|-]<expr> */
+
+ private static final String SORT_DELIM = "~";
+ private static final String SORT_TERM_DELIM = ",";
+
+ public String getQueryParamKey() {
+ return ISort.SORT_PARAM_KEY;
+ }
+
+ public Map<String, List<ISort>> decode(String[] queryParams) {
+
+ if(queryParams == null)
+ return null;
+
+ Map<String, List<ISort>> map = new HashMap<String, List<ISort>>();
+
+ for(String sortParam : queryParams) {
+ String[] terms = sortParam.split(SORT_DELIM);
+ assert terms != null && terms.length == 2;
+
+ String namespace = terms[0];
+
+ // find the list of sorted columns
+ // two columns of the bugs grid would be sorted as:
+ //
+ // netui_sort=bugs~id,-priority
+ ArrayList<ISort> sorts = new ArrayList<ISort>();
+ String[] cols = terms[1].split(SORT_TERM_DELIM);
+ for(String sortExpr : cols) {
+ SortDirection sortDirection = SortDirection.NONE;
+ if(sortExpr.startsWith("-"))
+ sortDirection = SortDirection.DESCENDING;
+ else sortDirection = SortDirection.ASCENDING;
+ String sortExpression = (sortDirection ==
SortDirection.DESCENDING ? sortExpr.substring(1) : sortExpr);
+
+ /* todo: pluggability */
+ ISort sort = new DefaultSort(sortExpression, sortDirection);
+
+ sorts.add(sort);
+ }
+
+ if(sorts.size() > 0)
+ map.put(namespace, sorts);
+ }
+
+ return map;
+ }
+
+ public String encode(String namespace, List<ISort> sorts) {
+ return buildSortParamValue(namespace, sorts, null, null, false);
+ }
+
+ public String encode(String namespace, List<ISort> sorts, String
sortExpression, SortDirection sortDirection, boolean isSorted) {
+ return buildSortParamValue(namespace, sorts, sortExpression,
sortDirection, isSorted);
+ }
+
+ private String buildSortParamValue(String namespace, List<ISort> sorts,
String sortExpression, SortDirection sortDirection, boolean isSorted) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(namespace);
+ sb.append("~");
+
+ boolean hasTerms = false;
+ for(int i = 0; i < sorts.size(); i++) {
+ ISort sort = sorts.get(i);
+
+ if(sortExpression != null &&
sortExpression.equals(sort.getSortExpression())) {
+ if(sortDirection != SortDirection.NONE) {
+ if(hasTerms)
+ sb.append(",");
+ else hasTerms = true;
+
+ if(sortDirection == SortDirection.DESCENDING)
+ sb.append("-");
+ sb.append(sortExpression);
+ hasTerms = true;
+ }
+ }
+ else {
+ if(hasTerms)
+ sb.append(",");
+ else hasTerms = true;
+
+ if(sort.getDirection() == SortDirection.DESCENDING)
+ sb.append("-");
+ sb.append(sort.getSortExpression());
+ }
+ }
+
+ /* any new sorts are added at the end of the current sorts. */
+ if(sortExpression != null && sortDirection != SortDirection.NONE &&
!isSorted) {
+ if(hasTerms)
+ sb.append(",");
+ if(sortDirection == SortDirection.DESCENDING)
+ sb.append("-");
+ sb.append(sortExpression);
+ }
+
+ if(!hasTerms)
+ return null;
+
+ return sb.toString();
+ }
+}
Deleted:
/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/sort/SortFactory.java
Url:
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/sort/SortFactory.java?view=auto&rev=125973
==============================================================================
Deleted:
/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/sort/SortService.java
Url:
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/services/sort/SortService.java?view=auto&rev=125973
==============================================================================
Modified:
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java
Url:
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java?view=diff&rev=125974&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java&r1=125973&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java&r2=125974
==============================================================================
---
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java
(original)
+++
incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java
Fri Jan 21 14:26:34 2005
@@ -33,7 +33,6 @@
import
org.apache.beehive.netui.databinding.datagrid.model.style.EmptyStylePolicy;
import org.apache.beehive.netui.databinding.datagrid.util.PagedDataSet;
import
org.apache.beehive.netui.databinding.datagrid.rendering.table.TableRenderer;
-import org.apache.beehive.netui.databinding.datagrid.model.DataGridState;
import org.apache.beehive.netui.script.common.IDataAccessProvider;
import org.apache.beehive.netui.script.common.DataAccessProviderStack;
import org.apache.beehive.netui.tags.ExpressionHandling;
@@ -64,7 +63,6 @@
private String _dataSource = null;
private String _resourceBundlePath = null;
private DataGridModel _gridModel = null;
- private DataGridState _dataGridState = null;
public String getTagName() {
return "DataGrid";
@@ -135,13 +133,6 @@
_gridModel.setCssPolicy(stylePolicy);
_gridModel.setTableRenderer(tableRenderer);
_gridModel.setResourceBundlePath(_resourceBundlePath);
-
- if(_dataGridState != null) {
- if(_name != null)
- throw new JspException("The data grid's \"name\" attribute
should not be set when using a DataGridState");
-
- _gridModel.setDataGridState(_dataGridState);
- }
JspFragment fragment = getJspBody();
if(fragment != null) {
Modified:
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=diff&rev=125974&p1=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/DefaultSortTest.java&r1=125973&p2=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/DefaultSortTest.java&r2=125974
==============================================================================
---
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/DefaultSortTest.java
(original)
+++
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/DefaultSortTest.java
Fri Jan 21 14:26:34 2005
@@ -20,7 +20,6 @@
import org.apache.beehive.netui.databinding.datagrid.model.sort.ISort;
import org.apache.beehive.netui.databinding.datagrid.model.sort.DefaultSort;
import
org.apache.beehive.netui.databinding.datagrid.model.sort.ISort.SortDirection;
-import org.apache.beehive.netui.databinding.datagrid.services.sort.SortFactory;
import junit.framework.Test;
import junit.framework.TestCase;
@@ -33,7 +32,7 @@
extends TestCase {
private ISort createSort() {
- return SortFactory.getInstance();
+ return new DefaultSort();
}
public void testChangeSortDirection() {
Copied:
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortCodecTest.java
(from r125927,
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/SortCodecTest.java?view=diff&rev=125974&p1=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortServiceTest.java&r1=125927&p2=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortCodecTest.java&r2=125974
==============================================================================
---
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortServiceTest.java
(original)
+++
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortCodecTest.java
Fri Jan 21 14:26:34 2005
@@ -17,16 +17,15 @@
*/
package org.apache.beehive.netui.test.datagrid;
-import java.lang.reflect.Proxy;
import java.util.List;
+import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
-import org.apache.beehive.netui.databinding.datagrid.services.sort.SortService;
+import org.apache.beehive.netui.databinding.datagrid.services.sort.SortCodec;
import org.apache.beehive.netui.databinding.datagrid.model.sort.ISort;
import
org.apache.beehive.netui.databinding.datagrid.model.sort.ISort.SortDirection;
import org.apache.beehive.netui.test.servlet.ServletFactory;
-import org.apache.beehive.netui.test.servlet.HttpServletRequestHandler;
import junit.framework.Test;
import junit.framework.TestCase;
@@ -35,7 +34,7 @@
/**
*
*/
-public class SortServiceTest
+public class SortCodecTest
extends TestCase {
private HttpServletRequest _request = null;
@@ -46,16 +45,18 @@
}
public void testEmptySortService() {
- SortService svc = SortService.getInstance(getRequest());
- assert svc.getSorts(_namespace) == null;
+ SortCodec codec = new SortCodec();
+ Map<String, List<ISort>> allSorts =
codec.decode(_request.getParameterValues(codec.getQueryParamKey()));
+ assert allSorts == null;
}
public void testSingleAscendingSort() {
DataGridTestUtil.initQueryString(_request, "netui_sort=" + _namespace
+ "~CUSTOMERNAME");
- SortService svc = SortService.getInstance(getRequest());
- List<ISort> sorts = svc.getSorts(_namespace);
+ SortCodec codec = new SortCodec();
+ Map<String, List<ISort>> allSorts =
codec.decode(_request.getParameterValues(codec.getQueryParamKey()));
- assert svc.getSorts(_namespace) != null;
+ List<ISort> sorts = allSorts.get(_namespace);
+ assert sorts != null;
assert sorts.size() == 1;
assert sorts.get(0).getDirection() == SortDirection.ASCENDING;
assert sorts.get(0).getSortExpression().equals("CUSTOMERNAME");
@@ -65,30 +66,31 @@
DataGridTestUtil.initQueryString(_request, "?" +
"netui_sort=" + _namespace + "~CUSTOMERNAME,-UNITPRICE" +
"&netui_sort=productGrid~QUANTITY");
- SortService svc = SortService.getInstance(getRequest());
- List<ISort> sorts = svc.getSorts(_namespace);
+ SortCodec codec = new SortCodec();
+ Map<String, List<ISort>> allSorts =
codec.decode(_request.getParameterValues(codec.getQueryParamKey()));
+ List<ISort> sorts = allSorts.get(_namespace);
- assert svc.getSorts(_namespace) != null;
+ assert sorts != null;
assert sorts.size() == 2;
assert sorts.get(0).getDirection() == SortDirection.ASCENDING;
assert sorts.get(0).getSortExpression().equals("CUSTOMERNAME");
assert sorts.get(1).getDirection() == SortDirection.DESCENDING;
assert sorts.get(1).getSortExpression().equals("UNITPRICE");
- SortService productSvc = SortService.getInstance(getRequest());
- assert productSvc.getSorts("productGrid") != null;
- assert productSvc.getSorts("productGrid").size() == 1;
- sorts = productSvc.getSorts("productGrid");
+ sorts = allSorts.get("productGrid");
+ assert sorts != null;
+ assert sorts.size() == 1;
assert sorts.get(0).getDirection() == SortDirection.ASCENDING;
assert sorts.get(0).getSortExpression().equals("QUANTITY");
}
public void testSingleDescendingSort() {
DataGridTestUtil.initQueryString(_request, "netui_sort=" + _namespace
+ "~-CUSTOMERNAME");
- SortService svc = SortService.getInstance(getRequest());
- List<ISort> sorts = svc.getSorts(_namespace);
+ SortCodec codec = new SortCodec();
+ Map<String, List<ISort>> allSorts =
codec.decode(_request.getParameterValues(codec.getQueryParamKey()));
+ List<ISort> sorts = allSorts.get(_namespace);
- assert svc.getSorts(_namespace) != null;
+ assert sorts != null;
assert sorts.size() == 1;
assert sorts.get(0).getDirection() == SortDirection.DESCENDING;
assert sorts.get(0).getSortExpression().equals("CUSTOMERNAME");
@@ -96,10 +98,11 @@
public void testTwoDescendingSorts() {
DataGridTestUtil.initQueryString(_request, "netui_sort=" + _namespace
+ "~-CUSTOMERNAME,-CUSTOMERID");
- SortService svc = SortService.getInstance(getRequest());
- List<ISort> sorts = svc.getSorts(_namespace);
+ SortCodec codec = new SortCodec();
+ Map<String, List<ISort>> allSorts =
codec.decode(_request.getParameterValues(codec.getQueryParamKey()));
+ List<ISort> sorts = allSorts.get(_namespace);
- assert svc.getSorts(_namespace) != null;
+ assert sorts != null;
assert sorts.size() == 2;
assert sorts.get(0).getDirection() == SortDirection.DESCENDING;
assert sorts.get(0).getSortExpression().equals("CUSTOMERNAME");
@@ -115,12 +118,12 @@
_request = null;
}
- public SortServiceTest(String name) {
+ public SortCodecTest(String name) {
super(name);
}
public static Test suite() {
- return new TestSuite(SortServiceTest.class);
+ return new TestSuite(SortCodecTest.class);
}
public static void main(String[] args) {
Modified:
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortModelTest.java
Url:
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortModelTest.java?view=diff&rev=125974&p1=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortModelTest.java&r1=125973&p2=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortModelTest.java&r2=125974
==============================================================================
---
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortModelTest.java
(original)
+++
incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/datagrid/SortModelTest.java
Fri Jan 21 14:26:34 2005
@@ -28,6 +28,7 @@
import org.apache.beehive.netui.databinding.datagrid.model.sort.SortModel;
import org.apache.beehive.netui.databinding.datagrid.model.sort.ISort;
import
org.apache.beehive.netui.databinding.datagrid.model.sort.ISort.SortDirection;
+import
org.apache.beehive.netui.databinding.datagrid.services.DataGridStateService;
import org.apache.beehive.netui.test.servlet.ServletFactory;
/**
@@ -41,8 +42,8 @@
private HttpServletRequest _servletRequest;
public void testSortModelSimple() {
- SortModel sortModel = new SortModel(GRID_NAME);
- sortModel.handleRequest(_servletRequest);
+ DataGridStateService dgss =
DataGridStateService.getInstance(_servletRequest);
+ SortModel sortModel = dgss.getSortModel(GRID_NAME);
List<ISort> sorts = sortModel.getSorts();
assert sorts == null;
@@ -50,13 +51,13 @@
public void testSortModelSimple2() {
DataGridTestUtil.initQueryString(_servletRequest, "foo=bar");
- SortModel sortModel = new SortModel(GRID_NAME);
- sortModel.handleRequest(_servletRequest);
+ DataGridStateService dgss =
DataGridStateService.getInstance(_servletRequest);
+ SortModel sortModel = dgss.getSortModel(GRID_NAME);
List<ISort> sorts = sortModel.getSorts();
assert sorts == null;
- Map queryParams = sortModel.buildSortQueryParamsMap();
+ Map queryParams = dgss.buildSortQueryParamsMap(GRID_NAME);
assert queryParams.size() == 1;
String[] values = (String[])queryParams.get("foo");
assert values.length == 1;
@@ -65,8 +66,8 @@
public void testSortModelSimple3() {
DataGridTestUtil.initQueryString(_servletRequest,
"foo=bar&netui_sort=bugs~id");
- SortModel sortModel = new SortModel(GRID_NAME);
- sortModel.handleRequest(_servletRequest);
+ DataGridStateService dgss =
DataGridStateService.getInstance(_servletRequest);
+ SortModel sortModel = dgss.getSortModel(GRID_NAME);
List<ISort> sorts = sortModel.getSorts();
assert sorts != null;
@@ -74,7 +75,7 @@
assert sorts.get(0).getDirection() == SortDirection.ASCENDING;
assert sorts.get(0).getSortExpression().equals("id");
- Map queryParams = sortModel.buildSortQueryParamsMap();
+ Map queryParams = dgss.buildSortQueryParamsMap(GRID_NAME);
assert queryParams.size() == 2;
String[] values = (String[])queryParams.get("foo");
assert values.length == 1;
@@ -87,8 +88,8 @@
public void testSortModelSimple4() {
DataGridTestUtil.initQueryString(_servletRequest,
"foo=bar&netui_sort=bugs~id,-name");
- SortModel sortModel = new SortModel(GRID_NAME);
- sortModel.handleRequest(_servletRequest);
+ DataGridStateService dgss =
DataGridStateService.getInstance(_servletRequest);
+ SortModel sortModel = dgss.getSortModel(GRID_NAME);
List<ISort> sorts = sortModel.getSorts();
assert sorts != null;
@@ -98,7 +99,7 @@
assert sorts.get(1).getDirection() == SortDirection.DESCENDING;
assert sorts.get(1).getSortExpression().equals("name");
- Map queryParams = sortModel.buildSortQueryParamsMap();
+ Map queryParams = dgss.buildSortQueryParamsMap(GRID_NAME);
assert queryParams.size() == 2;
String[] values = (String[])queryParams.get("foo");
assert values.length == 1;
@@ -111,8 +112,8 @@
public void testSortModelSimple5() {
DataGridTestUtil.initQueryString(_servletRequest,
"foo=bar&netui_sort=bugs~id,-name");
- SortModel sortModel = new SortModel(GRID_NAME);
- sortModel.handleRequest(_servletRequest);
+ DataGridStateService dgss =
DataGridStateService.getInstance(_servletRequest);
+ SortModel sortModel = dgss.getSortModel(GRID_NAME);
List<ISort> sorts = sortModel.getSorts();
assert sorts != null;
@@ -122,7 +123,7 @@
assert sorts.get(1).getDirection() == SortDirection.DESCENDING;
assert sorts.get(1).getSortExpression().equals("name");
- Map queryParams = sortModel.buildSortQueryParamsMap();
+ Map queryParams = dgss.buildSortQueryParamsMap(GRID_NAME);
assert queryParams.size() == 2;
String[] values = (String[])queryParams.get("foo");
assert values.length == 1;
@@ -133,7 +134,7 @@
assert values[0].equals("bugs~id,-name");
/* now, for the "id" expression, change the direction */
- queryParams = sortModel.buildSortQueryParamsMap("id",
SortDirection.DESCENDING);
+ queryParams = dgss.buildSortQueryParamsMap(GRID_NAME, "id",
SortDirection.DESCENDING);
assert queryParams.size() == 2;
values = (String[])queryParams.get("foo");
assert values.length == 1;
@@ -144,7 +145,7 @@
assert values[0].equals("bugs~-id,-name");
/* now, for the "id" expression, change the direction */
- queryParams = sortModel.buildSortQueryParamsMap("id",
SortDirection.NONE);
+ queryParams = dgss.buildSortQueryParamsMap(GRID_NAME, "id",
SortDirection.NONE);
assert queryParams.size() == 2;
values = (String[])queryParams.get("foo");
assert values.length == 1;
@@ -155,7 +156,7 @@
assert values[0].equals("bugs~-name");
/* now, for the "id" expression, change the direction */
- queryParams = sortModel.buildSortQueryParamsMap("id",
SortDirection.ASCENDING);
+ queryParams = dgss.buildSortQueryParamsMap(GRID_NAME, "id",
SortDirection.ASCENDING);
assert queryParams.size() == 2;
values = (String[])queryParams.get("foo");
assert values.length == 1;
@@ -166,7 +167,7 @@
assert values[0].equals("bugs~id,-name");
/* now, add a new column "newcolumn" and explicitly set its direction
*/
- queryParams = sortModel.buildSortQueryParamsMap("newcolumn",
SortDirection.DESCENDING);
+ queryParams = dgss.buildSortQueryParamsMap(GRID_NAME, "newcolumn",
SortDirection.DESCENDING);
assert queryParams.size() == 2;
values = (String[])queryParams.get("foo");
assert values.length == 1;
@@ -177,7 +178,7 @@
assert values[0].equals("bugs~id,-name,-newcolumn");
/* now, add a new column "newcolumn" and explicitly set its direction
*/
- queryParams = sortModel.buildSortQueryParamsMap("name",
SortDirection.NONE);
+ queryParams = dgss.buildSortQueryParamsMap(GRID_NAME, "name",
SortDirection.NONE);
assert queryParams.size() == 2;
values = (String[])queryParams.get("foo");
assert values.length == 1;
@@ -190,11 +191,11 @@
public void testSortModelSimple6() {
DataGridTestUtil.initQueryString(_servletRequest,
"foo=bar&netui_sort=bugs~-id,-name");
- SortModel sortModel = new SortModel(GRID_NAME);
- sortModel.handleRequest(_servletRequest);
+ DataGridStateService dgss =
DataGridStateService.getInstance(_servletRequest);
+ SortModel sortModel = dgss.getSortModel(GRID_NAME);
/* now, add a new column "newcolumn" and explicitly set its direction
*/
- Map queryParams = sortModel.buildSortQueryParamsMap("id",
SortDirection.NONE);
+ Map queryParams = dgss.buildSortQueryParamsMap(GRID_NAME, "id",
SortDirection.NONE);
assert queryParams.size() == 2;
String[] values = (String[])queryParams.get("foo");
assert values.length == 1;
@@ -207,11 +208,11 @@
public void testSortModelSimple7() {
DataGridTestUtil.initQueryString(_servletRequest,
"foo=bar&netui_sort=bugs~-id");
- SortModel sortModel = new SortModel(GRID_NAME);
- sortModel.handleRequest(_servletRequest);
+ DataGridStateService dgss =
DataGridStateService.getInstance(_servletRequest);
+ SortModel sortModel = dgss.getSortModel(GRID_NAME);
/* now, add a new column "newcolumn" and explicitly set its direction
*/
- Map queryParams = sortModel.buildSortQueryParamsMap("id",
SortDirection.NONE);
+ Map queryParams = dgss.buildSortQueryParamsMap(GRID_NAME, "id",
SortDirection.NONE);
assert queryParams.size() == 1;
String[] values = (String[])queryParams.get("foo");
assert values.length == 1;
@@ -219,11 +220,10 @@
}
/* this is a test of sorts for two grids on the same URL */
- /*
- public void testSortModelSimple6() {
+ public void testSortModelSimple8() {
DataGridTestUtil.initQueryString(_servletRequest,
"foo=bar&netui_sort=bugs~id,-name&netui_sort=developers~bugcount,-milestone");
- SortModel sortModel = new SortModel(GRID_NAME);
- sortModel.handleRequest(_servletRequest);
+ DataGridStateService dgss =
DataGridStateService.getInstance(_servletRequest);
+ SortModel sortModel = dgss.getSortModel(GRID_NAME);
List<ISort> sorts = sortModel.getSorts();
assert sorts != null;
@@ -233,21 +233,18 @@
assert sorts.get(1).getDirection() == SortDirection.DESCENDING;
assert sorts.get(1).getSortExpression().equals("name");
- Map queryParams = sortModel.buildSortQueryParamsMap();
- assert queryParams.size() == 3;
+ Map queryParams = dgss.buildSortQueryParamsMap(GRID_NAME);
+ assert queryParams.size() == 2;
String[] values = (String[])queryParams.get("foo");
assert values.length == 1;
assert values[0].equals("bar");
values = (String[])queryParams.get("netui_sort");
- assert values.length == 1;
- assert values[0].equals("bugs~id,-name");
-
- values = (String[])queryParams.get("netui_sort");
- assert values.length == 1;
+ assert values.length == 2;
assert values[0].equals("developers~bugcount,-milestone");
+ assert values[1].equals("bugs~id,-name");
}
-*/
+
protected void setUp() {
_servletRequest = ServletFactory.getServletRequest();
}
Deleted:
/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=125973
==============================================================================