Author: ekoneil Date: Sat Jan 29 14:55:22 2005 New Revision: 149079 URL: http://svn.apache.org/viewcvs?view=rev&rev=149079 Log: Data grid features.
Implement a generalized, overridable message / formatting provider in the data grid. The default message bundle is: org/apache/beehive/netui/databinding/datagrid/util/data-grid-default.properties This can be overridden using the "resourceBundlePath" attribute on the <netui-data:dataGrid> tag. Individual properties can further be overridden by: <netui-data:dataGrid> <netui;attribute facet="resource" name="key" value="value"/> where the value of "key" is a resource bundle key. Clients of the DataGridModel can request a plain or formatted message from the DataGridModel, which delegates these calls into the DataGridResourceProvider. This change also fixes two BVT breaks introduced in the last checkin by fixing keys referencing deleted messages in the RepeaterComponent. BB: self DRT: NetUI / datagrid pass Added: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/DataGridResourceProvider.java (contents, props changed) incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/data-grid-default.properties (contents, props changed) incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/databinding/datagrid/resources/ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/databinding/datagrid/resources/simple-test.properties (contents, props changed) incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerExplicitOverride.jsp (contents, props changed) incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerResourceOverride.xml 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/rendering/pager/FirstPreviousNextLastPagerRenderer.java incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/JspUtil.java incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractHtmlColumn.java incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Caption.java incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/HeaderCell.java incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/repeater/RepeaterComponent.java incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/HttpServletRequestHandler.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=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/model/DataGridModel.java&r2=149079 ============================================================================== --- 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 Sat Jan 29 14:55:22 2005 @@ -33,6 +33,7 @@ import org.apache.beehive.netui.databinding.datagrid.util.PagedDataSet; import org.apache.beehive.netui.databinding.datagrid.util.IDataGridMessageKeys; import org.apache.beehive.netui.databinding.datagrid.util.JspUtil; +import org.apache.beehive.netui.databinding.datagrid.util.DataGridResourceProvider; 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,14 +52,13 @@ private int _renderState = START_RENDER_STATE; private boolean _disableDefaultPagerRendering = false; private String _name = null; - private String _resourceBundlePath = null; - private StylePolicy _cssPolicy = null; + private StylePolicy _stylePolicy = null; private IPagerRenderer _pagerRenderer = null; private PagedDataSet _dataSet = null; private TableRenderer _tableRenderer = null; - private ResourceBundle _resourceBundle = null; private DataGridStateService _dgss = null; + private DataGridResourceProvider _resourceProvider = null; private JspContext _jspContext = null; private HttpServletRequest _request = null; @@ -72,6 +72,8 @@ _dgss = DataGridStateService.getInstance(jspContext); _request = JspUtil.getRequest(_jspContext); + + _resourceProvider = DataGridResourceProvider.getInstance(jspContext); } public String getName() { @@ -126,12 +128,12 @@ _tableRenderer = tableRenderer; } - public StylePolicy getCssPolicy() { - return _cssPolicy; + public StylePolicy getStylePolicy() { + return _stylePolicy; } - public void setCssPolicy(StylePolicy cssPolicy) { - _cssPolicy = cssPolicy; + public void setStylePolicy(StylePolicy cssPolicy) { + _stylePolicy = cssPolicy; } public String getResourcePath() { @@ -140,35 +142,23 @@ } public String getResourceBundlePath() { - return _resourceBundlePath; + return _resourceProvider.getResourceBundlePath(); } public void setResourceBundlePath(String resourceBundlePath) { - _resourceBundlePath = resourceBundlePath; + _resourceProvider.setResourceBundlePath(resourceBundlePath); } public String getMessage(String key) { - if(_resourceBundlePath == null) - return Bundle.getString(key); - else { - if(_resourceBundle == null) - _resourceBundle = ResourceBundle.getBundle(_resourceBundlePath); - - return _resourceBundle.getString(key); - } + return _resourceProvider.getMessage(key); } - public String getMessage(String key, Object[] args) { - if(_resourceBundlePath == null) - return Bundle.getString(key, args); - else { - if(_resourceBundle == null) - _resourceBundle = ResourceBundle.getBundle(_resourceBundlePath); + public String formatMessage(String key, Object[] args) { + return _resourceProvider.formatMessage(key, args); + } - /* todo: consider caching these MessageFormat objects given the message key */ - MessageFormat format = new MessageFormat(_resourceBundle.getString(key)); - return format.format(args).toString(); - } + public void addResourceOverride(String key, String value) { + _resourceProvider.addResourceOverride(key, value); } public String getSortImagePath(SortDirection sortDirection) { @@ -190,6 +180,7 @@ assert getPagerRenderer() != null : "Received a null PagerRenderer"; appender.append(getPagerRenderer().render()); } + public Map buildSortQueryParamsMap() { return _dgss.buildSortQueryParamsMap(_name); Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java?view=diff&rev=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java&r2=149079 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/FirstPreviousNextLastPagerRenderer.java Sat Jan 29 14:55:22 2005 @@ -38,9 +38,9 @@ int lastPage = pagerModel.getLastPage(); /* Page # of # First / Previous Next / Last */ - buf.append(getDataGridModel().getMessage(IDataGridMessageKeys.PAGER_FMT_BANNER, + buf.append(getDataGridModel().formatMessage(IDataGridMessageKeys.PAGER_FMT_BANNER, new Integer[]{currentPage + 1, pagerModel.getLastPage() + 1})); - + buf.append(" "); if(currentPage > pagerModel.getFirstPage()) buf.append(buildLiveFirstLink()); Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java?view=diff&rev=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java&r2=149079 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/rendering/pager/PreviousNextPagerRenderer.java Sat Jan 29 14:55:22 2005 @@ -34,7 +34,7 @@ int currentPage = pagerModel.getPage(); int lastPage = pagerModel.getLastPage(); - buf.append(getDataGridModel().getMessage(IDataGridMessageKeys.PAGER_FMT_BANNER, + buf.append(getDataGridModel().formatMessage(IDataGridMessageKeys.PAGER_FMT_BANNER, new Integer[]{currentPage + 1, pagerModel.getLastPage() + 1})); buf.append(" "); if(pagerModel.getPreviousPage() >= 0) Added: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/DataGridResourceProvider.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/DataGridResourceProvider.java?view=auto&rev=149079 ============================================================================== --- (empty file) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/DataGridResourceProvider.java Sat Jan 29 14:55:22 2005 @@ -0,0 +1,150 @@ +/* + * Copyright 2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * $Header:$ + */ +package org.apache.beehive.netui.databinding.datagrid.util; + +import java.text.MessageFormat; +import java.util.ResourceBundle; +import java.util.Locale; +import java.util.Map; +import java.util.HashMap; +import java.util.Collections; +import java.util.Enumeration; +import javax.servlet.jsp.JspContext; + +/** + * + */ +public class DataGridResourceProvider { + + private String DEFAULT_RESOURCE_BUNDLE = "org.apache.beehive.netui.databinding.datagrid.util.data-grid-default"; + private static final Object VALUE_PLACEHOLDER = new Object(); + + private boolean _enableChaining = false; + private String _resourceBundlePath = null; + + private ResourceBundle _defaultResourceBundle = null; + private ResourceBundle _resourceBundle = null; + private HashMap<String, String> _resourceOverrides = null; + private HashMap _resourceBundleKeys = null; + private Locale _locale = null; + + public static final DataGridResourceProvider getInstance(JspContext jspContext) { + DataGridResourceProvider rp = new DataGridResourceProvider(); + rp.setLocale(JspUtil.getLocale(jspContext)); + return rp; + } + + private DataGridResourceProvider() { + } + + public boolean isEnableChaining() { + return _enableChaining; + } + + public void setEnableChaining(boolean enableChaining) { + _enableChaining = enableChaining; + } + + public void setLocale(Locale locale) { + _locale = locale; + } + + public Locale getLocale() { + return _locale; + } + + public void setResourceBundlePath(String resourceBundlePath) { + _resourceBundlePath = resourceBundlePath; + } + + public String getResourceBundlePath() { + return _resourceBundlePath; + } + + public void addResourceOverride(String key, String value) { + assert key != null; + assert value != null; + + if(_resourceOverrides == null) + _resourceOverrides = new HashMap<String, String>(); + + /* todo: could consider asserting that this key is known by the data grid framework */ + _resourceOverrides.put(key, value); + } + + public Map getResourceOverrides() { + return Collections.unmodifiableMap(_resourceOverrides); + } + + public String getMessage(String key) { + assert key != null; + + return internalGetMessage(key); + } + + public String formatMessage(String key, Object[] args) { + assert key != null; + + String msg = internalFormatMessage(getMessage(key), args); + return msg; + } + + private final String internalGetMessage(String key) { + if(_resourceBundlePath == null) + return getDefaultMessage(key); + else { + /* ensure that the correct resource bundles are created */ + if(_resourceBundle == null) { + _resourceBundle = createResourceBundle(_resourceBundlePath); + } + + if(_enableChaining && _resourceBundleKeys == null) { + Enumeration e = _resourceBundle.getKeys(); + while(e.hasMoreElements()) + _resourceBundleKeys.put(e.nextElement(), VALUE_PLACEHOLDER); + } + + /* todo: implement chaining here */ + if(_resourceOverrides != null && _resourceOverrides.containsKey(key)) + return _resourceOverrides.get(key); + else { + if(!_enableChaining || _resourceBundleKeys.containsKey(key)) + return _resourceBundle.getString(key); + else + return _defaultResourceBundle.getString(key); + } + } + } + + private String getDefaultMessage(String key) { + if(_defaultResourceBundle == null) + _defaultResourceBundle = createResourceBundle(DEFAULT_RESOURCE_BUNDLE); + return _defaultResourceBundle.getString(key); + } + + private final String internalFormatMessage(String pattern, Object[] args) { + MessageFormat format = new MessageFormat(pattern); + String msg = format.format(args).toString(); + return msg; + } + + private ResourceBundle createResourceBundle(String path) { + ResourceBundle rb = ResourceBundle.getBundle(path, _locale, Thread.currentThread().getContextClassLoader()); + return rb; + } +} Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/JspUtil.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/JspUtil.java?view=diff&rev=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/JspUtil.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/JspUtil.java&r2=149079 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/JspUtil.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/JspUtil.java Sat Jan 29 14:55:22 2005 @@ -20,10 +20,13 @@ import java.net.URISyntaxException; import java.util.HashMap; import java.util.Map; +import java.util.Locale; import javax.servlet.jsp.JspContext; import javax.servlet.jsp.PageContext; import javax.servlet.http.HttpServletRequest; +import org.apache.struts.Globals; + import org.apache.beehive.netui.core.urls.MutableURI; import org.apache.beehive.netui.pageflow.scoping.ScopedServletUtils; import org.apache.beehive.netui.tags.internal.PageFlowTagUtils; @@ -75,5 +78,14 @@ return uri.toXMLString(); else return uri.toString(); + } + + /* todo: need to combine this with the getLocale(...) call in AbstractClassicTag */ + public static final Locale getLocale(JspContext jspContext) { + PageContext pageContext = getPageContext(jspContext); + Locale userLocale = (Locale) pageContext.getAttribute(Globals.LOCALE_KEY, PageContext.SESSION_SCOPE); + if (userLocale == null) + return pageContext.getRequest().getLocale(); + else return userLocale; } } Added: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/data-grid-default.properties Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/data-grid-default.properties?view=auto&rev=149079 ============================================================================== --- (empty file) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/databinding/datagrid/util/data-grid-default.properties Sat Jan 29 14:55:22 2005 @@ -0,0 +1,17 @@ +# +# DataGrid strings. These message keys violate the default key pattern +# because they are exposed to the developer and are expected to be overridden +# in a developer's webapp to customize the look / feel / messages of the grid +# +datagrid.resource.path=resources/images +datagrid.msg.nodata=No data to display + +sort.asc.img=/sortdown.gif +sort.desc.img=/sortup.gif +sort.none.img=/sortable.gif + +pager.msg.first=First +pager.msg.previous=Previous +pager.msg.next=Next +pager.msg.last=Last +pager.fmt.banner=Page {0} of {1} \ No newline at end of file Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractHtmlColumn.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractHtmlColumn.java?view=diff&rev=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractHtmlColumn.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractHtmlColumn.java&r2=149079 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractHtmlColumn.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/AbstractHtmlColumn.java Sat Jan 29 14:55:22 2005 @@ -285,13 +285,13 @@ ArrayList<String> styleClasses = new ArrayList<String>(); SortModel sortModel = dataGridModel.getSortModel(); if(sortModel.isSorted(_sortExpression)) - styleClasses.add(dataGridModel.getCssPolicy().getDataCellSortedClass()); + styleClasses.add(dataGridModel.getStylePolicy().getDataCellSortedClass()); if(_tdState.styleClass == null) - styleClasses.add(dataGridModel.getCssPolicy().getDataCellClass()); + styleClasses.add(dataGridModel.getStylePolicy().getDataCellClass()); else styleClasses.add(_tdState.styleClass); - _tdState.styleClass = dataGridModel.getCssPolicy().buildStyleClassValue(styleClasses); + _tdState.styleClass = dataGridModel.getStylePolicy().buildStyleClassValue(styleClasses); /* todo: this needs to run in order to cause the nested parameter / attribute / etc tags to do their work */ JspFragment fragment = getJspBody(); Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Caption.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Caption.java?view=diff&rev=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Caption.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Caption.java&r2=149079 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Caption.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Caption.java Sat Jan 29 14:55:22 2005 @@ -242,7 +242,7 @@ if(fragment != null) { StringWriter sw = new StringWriter(); TableRenderer tableRenderer = dgm.getTableRenderer(); - StylePolicy stylePolicy = dgm.getCssPolicy(); + StylePolicy stylePolicy = dgm.getStylePolicy(); AbstractRenderAppender appender = new WriteRenderAppender(getJspContext()); if(_captionTag.styleClass == null) 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=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGrid.java&r2=149079 ============================================================================== --- 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 Sat Jan 29 14:55:22 2005 @@ -18,6 +18,7 @@ package org.apache.beehive.netui.tags.databinding.datagrid; import java.util.Iterator; +import java.util.HashMap; import java.io.IOException; import java.io.StringWriter; import javax.servlet.jsp.JspException; @@ -37,10 +38,12 @@ import org.apache.beehive.netui.script.common.DataAccessProviderStack; import org.apache.beehive.netui.tags.ExpressionHandling; import org.apache.beehive.netui.tags.AbstractSimpleTag; +import org.apache.beehive.netui.tags.IAttributeConsumer; import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender; import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender; import org.apache.beehive.netui.tags.rendering.TableTag; import org.apache.beehive.netui.util.iterator.IteratorFactory; +import org.apache.beehive.netui.util.Bundle; /** * @netui:tag name="dataGrid" description="Renders an HTML table containing a data set" body-content="scriptless" @@ -48,7 +51,9 @@ */ public class DataGrid extends AbstractSimpleTag - implements IDataAccessProvider { + implements IDataAccessProvider, IAttributeConsumer { + + private static final String FACET_RESOURCE = "resource"; private static final StylePolicy DEFAULT_STYLE_POLICY = new DefaultStylePolicy("datagrid"); private static final StylePolicy EMPTY_STYLE_POLICY = new EmptyStylePolicy(); @@ -102,6 +107,25 @@ _stylePolicyName = stylePolicy; } + /** + * + * @param name + * @param value + * @param facet + * @throws JspException + */ + public void setAttribute(String name, String value, String facet) + throws JspException { + + if(facet.equals(FACET_RESOURCE)) { + _gridModel.addResourceOverride(name, value); + } + else { + String s = Bundle.getString("Tags_AttributeFacetNotSupported", new Object[]{facet}); + throw new JspException(s); + } + } + /* todo: should this be wrapped in try / finally so that the PageContext gets cleaned up correctly? */ public void doTag() throws JspException, IOException { @@ -129,7 +153,7 @@ stylePolicy = EMPTY_STYLE_POLICY; _gridModel = new DataGridModel(getJspContext(), _name, dataSet); - _gridModel.setCssPolicy(stylePolicy); + _gridModel.setStylePolicy(stylePolicy); _gridModel.setTableRenderer(tableRenderer); _gridModel.setResourceBundlePath(_resourceBundlePath); Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java?view=diff&rev=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java&r2=149079 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Footer.java Sat Jan 29 14:55:22 2005 @@ -247,7 +247,7 @@ if(fragment != null) { StringWriter sw = new StringWriter(); TableRenderer tableRenderer = dgm.getTableRenderer(); - StylePolicy stylePolicy = dgm.getCssPolicy(); + StylePolicy stylePolicy = dgm.getStylePolicy(); AbstractRenderAppender appender = new WriteRenderAppender(getJspContext()); TrTag.State trState = new TrTag.State(); Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java?view=diff&rev=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java&r2=149079 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Header.java Sat Jan 29 14:55:22 2005 @@ -247,7 +247,7 @@ StringBuilder content = new StringBuilder(); AbstractRenderAppender appender = new StringBuilderRenderAppender(content); - StylePolicy stylePolicy = dataGridModel.getCssPolicy(); + StylePolicy stylePolicy = dataGridModel.getStylePolicy(); assert stylePolicy != null; TableRenderer tableRenderer = dataGridModel.getTableRenderer(); Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/HeaderCell.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/HeaderCell.java?view=diff&rev=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/HeaderCell.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/HeaderCell.java&r2=149079 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/HeaderCell.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/HeaderCell.java Sat Jan 29 14:55:22 2005 @@ -370,16 +370,16 @@ ArrayList<String> styleClasses = new ArrayList<String>(); SortModel sortModel = dataGridModel.getSortModel(); if(sortModel.isSorted(_headerCellModel.getSortExpression())) - styleClasses.add(dataGridModel.getCssPolicy().getHeaderCellSortedClass()); + styleClasses.add(dataGridModel.getStylePolicy().getHeaderCellSortedClass()); if(_headerCellModel.isSortable()) - styleClasses.add(dataGridModel.getCssPolicy().getHeaderCellSortableClass()); + styleClasses.add(dataGridModel.getStylePolicy().getHeaderCellSortableClass()); if(_thState.styleClass == null) - styleClasses.add(dataGridModel.getCssPolicy().getHeaderCellClass()); + styleClasses.add(dataGridModel.getStylePolicy().getHeaderCellClass()); else styleClasses.add(_thState.styleClass); - _thState.styleClass = dataGridModel.getCssPolicy().buildStyleClassValue(styleClasses); + _thState.styleClass = dataGridModel.getStylePolicy().buildStyleClassValue(styleClasses); tableRenderer.openHeaderCell(_thState, appender); renderHeaderCellContents(appender); Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java?view=diff&rev=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java&r2=149079 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/Rows.java Sat Jan 29 14:55:22 2005 @@ -51,7 +51,7 @@ assert dataGridModel != null; if(dataGridModel.getRenderState() == DataGridModel.GRID_RENDER_STATE) { - StylePolicy stylePolicy = dataGridModel.getCssPolicy(); + StylePolicy stylePolicy = dataGridModel.getStylePolicy(); assert stylePolicy != null; TableRenderer tableRenderer = dataGridModel.getTableRenderer(); Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/repeater/RepeaterComponent.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/repeater/RepeaterComponent.java?view=diff&rev=149079&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/repeater/RepeaterComponent.java&r1=149078&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/repeater/RepeaterComponent.java&r2=149079 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/repeater/RepeaterComponent.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/repeater/RepeaterComponent.java Sat Jan 29 14:55:22 2005 @@ -71,7 +71,7 @@ LOGGER.error("A tag of type \"" + getClass().getName() + "\" must be nested within a tag of type \"" + Repeater.class.getName() + "\""); } - String msg = Bundle.getString("Tags_StructuredBaseTag_invalidParent", new Object[]{getClass().getName(), Repeater.class.getName()}); + String msg = Bundle.getString("Tags_RepeaterComponent_invalidParent", new Object[]{getClass().getName(), Repeater.class.getName()}); registerTagError(msg, null); } @@ -102,7 +102,7 @@ ret = EVAL_BODY_BUFFERED; else ret = SKIP_BODY; } catch(Exception e) { - String msg = Bundle.getString("Tags_StructuredBaseTag_startTagError", new Object[]{getTagName(), e}); + String msg = Bundle.getString("Tags_RepeaterComponent_startTagError", new Object[]{getTagName(), e}); if(LOGGER.isErrorEnabled()) LOGGER.error("An error occurred rendering the startTag of the tag \"" + getTagName() + "\". Cause: " + e, e); @@ -151,7 +151,7 @@ int state = _repeater.getRenderState(); ret = renderEndTag(state); } catch(Exception e) { - String msg = Bundle.getString("Tags_StructuredBaseTag_endTagError", new Object[]{getTagName(), e.toString()}); + String msg = Bundle.getString("Tags_RepeaterComponent_endTagError", new Object[]{getTagName(), e.toString()}); registerTagError(msg, e); reportErrors(); ret = EVAL_PAGE; Modified: incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties?view=diff&rev=149079&p1=incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties&r1=149078&p2=incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties&r2=149079 ============================================================================== --- incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties (original) +++ incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties Sat Jan 29 14:55:22 2005 @@ -652,22 +652,4 @@ TypeUtils_javaUtilDateConvertError=Caugnt an error converting a String to a DateFormat.SHORT formatted Date: {0} TypeUtils_javaSqlDateConvertError=Caught an error converting a String to a java.sql.Date: {0} TypeUtils_javaSqlTimestampConvertError=Caught an error converting a String to a java.sql.Timestamp: {0} -TypeUtils_javaSqlTimeConvertError=Caught an error converting a String to a java.sql.Time: {0} - -# -# DataGrid strings. These message keys violate the default key pattern -# because they are exposed to the developer and are expected to be overridden -# in a developer's webapp to customize the look / feel / messages of the grid -# -datagrid.resource.path=resources/images -datagrid.msg.nodata=No data to display - -sort.asc.img=/sortdown.gif -sort.desc.img=/sortup.gif -sort.none.img=/sortable.gif - -pager.msg.first=First -pager.msg.previous=Previous -pager.msg.next=Next -pager.msg.last=Last -pager.fmt.banner=Page {0} of {1} \ No newline at end of file +TypeUtils_javaSqlTimeConvertError=Caught an error converting a String to a java.sql.Time: {0} \ No newline at end of file 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=149079&p1=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/HttpServletRequestHandler.java&r1=149078&p2=incubator/beehive/trunk/netui/test/src/junitTests/org/apache/beehive/netui/test/servlet/HttpServletRequestHandler.java&r2=149079 ============================================================================== --- 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 Sat Jan 29 14:55:22 2005 @@ -24,6 +24,7 @@ import java.util.HashMap; import java.util.Hashtable; import java.util.List; +import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; @@ -153,6 +154,9 @@ return "/netuiFauxTestWeb"; else if(method.getName().equals("getServletPath")) return "/netuiFauxTestWeb/fauxServlet"; + else if(method.getName().equals("getLocale")) + /* default to the US Locale just for simplicity in testing */ + return Locale.US; else return super.invoke(proxy, method, args); } Added: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/databinding/datagrid/resources/simple-test.properties Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/databinding/datagrid/resources/simple-test.properties?view=auto&rev=149079 ============================================================================== --- (empty file) +++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/databinding/datagrid/resources/simple-test.properties Sat Jan 29 14:55:22 2005 @@ -0,0 +1,17 @@ +# +# +# Simple resource bundle used to ensure that resource overrides +# work correctly in the data grid. +# +datagrid.resource.path=resources/images +datagrid.msg.nodata=No data to display + +sort.asc.img=/sortdown.gif +sort.desc.img=/sortup.gif +sort.none.img=/sortable.gif + +pager.msg.first=<| +pager.msg.previous=<< +pager.msg.next=>> +pager.msg.last=|> +pager.fmt.banner=Viewing page {0} of {1} total pages \ No newline at end of file Added: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerExplicitOverride.jsp Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerExplicitOverride.jsp?view=auto&rev=149079 ============================================================================== --- (empty file) +++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerExplicitOverride.jsp Sat Jan 29 14:55:22 2005 @@ -0,0 +1,37 @@ +<%@ page language="java" contentType="text/html;charset=UTF-8"%> +<%@ taglib uri="beehive-netui-tags-html.tld" prefix="netui"%> +<%@ taglib uri="beehive-netui-tags-databinding.tld" prefix="netui-data"%> +<%@ taglib uri="beehive-netui-tags-template.tld" prefix="netui-template"%> +<%@ taglib prefix="datagrid" tagdir="/WEB-INF/tags/org/apache/beehive/netui/test/databinding/tagfiles" %> +<netui-template:template templatePage="../site/template.jsp"> + <netui-template:setAttribute name="title" value="Basic Data Grid"/> + <netui-template:section name="body"> + <p> + <datagrid:portfolioXmlBean/> + <br/> + <netui-data:dataGrid dataSource="pageScope.stocks" name="portfolio" resourceBundlePath="databinding.datagrid.resources.simple-test"> + <netui:attribute facet="resource" name="pager.msg.next" value="Next Page (JSP)"/> + <netui:attribute facet="resource" name="pager.msg.previous" value="Previous Page (JSP)"/> + <netui:attribute facet="resource" name="pager.fmt.banner" value="The JSP thinks that you''re looking at page {0} of {1}"/> + + <netui-data:configurePager pageSize="2"/> + <netui-data:header> + <netui-data:headerCell headerText="Symbol"/> + <netui-data:headerCell headerText="Price"/> + <netui-data:headerCell headerText="Web"/> + </netui-data:header> + <netui-data:rows> + <netui-data:spanCell value="${container.item.symbol}"/> + <netui-data:spanCell value="${container.item.price}"/> + <netui-data:anchorCell value="${container.item.name}" href="${container.item.web}"> + <netui:parameter name="rowid" value="${container.index}"/> + <netui:parameter name="symbol" value="${container.item.symbol}"/> + </netui-data:anchorCell> + </netui-data:rows> + </netui-data:dataGrid> + <br/> + <netui:anchor href="index.jsp">Reset</netui:anchor> + <br/> + </p> + </netui-template:section> +</netui-template:template> \ No newline at end of file Added: incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerResourceOverride.xml Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerResourceOverride.xml?view=auto&rev=149079 ============================================================================== --- (empty file) +++ incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerResourceOverride.xml Sat Jan 29 14:55:22 2005 @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ses:recorderSession xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session"> + <ses:sessionName>DataGridPagerResourceOverride</ses:sessionName> + <ses:tester>ekoneil</ses:tester> + <ses:startDate>29 Jan 2005, 03:27:00.023 PM MST</ses:startDate> + <ses:description>Test that overrides resource bundle properties with explicit values set from the JSP page.</ses:description> + <ses:tests> + <ses:test> + <ses:testNumber>1</ses:testNumber> + <ses:request> + <ses:protocol>HTTP</ses:protocol> + <ses:protocolVersion>1.1</ses:protocolVersion> + <ses:host>localhost</ses:host> + <ses:port>8080</ses:port> + <ses:uri>/coreWeb/databinding/datagrid/misc/pagerExplicitOverride.jsp</ses:uri> + <ses:method>GET</ses:method> + <ses:parameters/> + <ses:cookies> + <ses:cookie> + <ses:name>JSESSIONID</ses:name> + <ses:value>EECE8D02B51A798CAE450F7395DD50BA</ses:value> + </ses:cookie> + </ses:cookies> + <ses:headers> + <ses:header> + <ses:name>accept</ses:name> + <ses:value>text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5</ses:value> + </ses:header> + <ses:header> + <ses:name>accept-charset</ses:name> + <ses:value>ISO-8859-1,utf-8;q=0.7,*;q=0.7</ses:value> + </ses:header> + <ses:header> + <ses:name>accept-encoding</ses:name> + <ses:value>gzip,deflate</ses:value> + </ses:header> + <ses:header> + <ses:name>accept-language</ses:name> + <ses:value>en-us,en;q=0.5</ses:value> + </ses:header> + <ses:header> + <ses:name>connection</ses:name> + <ses:value>keep-alive</ses:value> + </ses:header> + <ses:header> + <ses:name>cookie</ses:name> + <ses:value>JSESSIONID=EECE8D02B51A798CAE450F7395DD50BA</ses:value> + </ses:header> + <ses:header> + <ses:name>host</ses:name> + <ses:value>localhost:8080</ses:value> + </ses:header> + <ses:header> + <ses:name>keep-alive</ses:name> + <ses:value>300</ses:value> + </ses:header> + <ses:header> + <ses:name>user-agent</ses:name> + <ses:value>Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0</ses:value> + </ses:header> + </ses:headers> + </ses:request> + <ses:response> + <ses:statusCode>200</ses:statusCode> + <ses:reason/> + <ses:responseBody><![CDATA[<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> +<html lang="en"> + + <head> + <title>NetUI Data Grid Samples</title> + <link rel="stylesheet" href="/coreWeb/databinding/datagrid/site/css/default.css" type="text/css"/> + </head> + <base href="http://localhost:8080/coreWeb/databinding/datagrid/misc/pagerExplicitOverride.jsp"> + <body> + <p> + <b>Basic Data Grid</b> + <table width="100%"> + <tr><td></td></tr> + <tr><td> + + <p> + + + + + + + <br/> + The JSP thinks that you're looking at page 1 of 3 Previous Page (JSP) <a href="/coreWeb/databinding/datagrid/misc/pagerExplicitOverride.jsp?netui_row=portfolio%7E2">Next Page (JSP)</a> +<table class="datagrid"> + + + + + + + +<thead class="datagrid"> +<tr class="datagrid-header"> + <th class="datagrid">Symbol</th> + + + <th class="datagrid">Price</th> + + + <th class="datagrid">Web</th> + + + +</tr></thead> + + +<tr class="datagrid-even"> + <td class="datagrid"><span>BEAS</span></td> + + <td class="datagrid"><span>14.35</span></td> + + <td class="datagrid"><a href="http://www.bea.com?rowid=1&symbol=BEAS"><span>BEA Systems</span></a></td> + + +</tr> +<tr class="datagrid-odd"> + <td class="datagrid"><span>CSCO</span></td> + + <td class="datagrid"><span>19.42</span></td> + + <td class="datagrid"><a href="http://www.cisco.com?rowid=2&symbol=CSCO"><span>Cisco Systems</span></a></td> + + +</tr> + </table> + + + <br/> + <a href="/coreWeb/databinding/datagrid/misc/index.jsp">Reset</a> + <br/> + </p> + + </td></tr> + </p> + <table> + <tr><td><a href="/netuiDRT/databinding/datagrid/basic/index.jsp">Home</a></td></tr> + </table> + </p> + </body> + +</html>]]></ses:responseBody> + </ses:response> + </ses:test> + </ses:tests> + <ses:endDate>29 Jan 2005, 03:27:03.919 PM MST</ses:endDate> + <ses:testCount>1</ses:testCount> +</ses:recorderSession> \ No newline at end of file
