Author: ekoneil Date: Sat Jan 29 15:55:13 2005 New Revision: 149080 URL: http://svn.apache.org/viewcvs?view=rev&rev=149080 Log: Data grid features.
Implement pluggable pager renderers. Pagers are some of the most often replaced / customized parts of grids; the pluggable pager renderer allows a developer to plug-in Java code to implement pager rendering. Includes a simple test of this (since simple is all that's possible right now...). The IPagerRenderer is pretty much useless and will be replaced with an abstract base class in a subsequent checkin; this will allow for access to the DataGridModel and request / jsp context state. BB: self DRT: NetUI / datagrid pass Added: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/databinding/datagrid/renderer/ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/databinding/datagrid/renderer/HelloWorldPagerRenderer.java (contents, props changed) incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerPluggedRenderer.jsp (contents, props changed) incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerRendererSmoke.xml Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ConfigurePager.java incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ConfigurePager.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ConfigurePager.java?view=diff&rev=149080&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ConfigurePager.java&r1=149079&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ConfigurePager.java&r2=149080 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ConfigurePager.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/ConfigurePager.java Sat Jan 29 15:55:13 2005 @@ -26,6 +26,7 @@ import org.apache.beehive.netui.databinding.datagrid.rendering.pager.FirstPreviousNextLastPagerRenderer; import org.apache.beehive.netui.databinding.datagrid.rendering.pager.PreviousNextPagerRenderer; import org.apache.beehive.netui.databinding.datagrid.util.JspUtil; +import org.apache.beehive.netui.databinding.datagrid.exceptions.DataGridExtensionException; import org.apache.beehive.netui.tags.AbstractSimpleTag; import org.apache.beehive.netui.util.logging.Logger; @@ -46,6 +47,7 @@ private String _pagerFormat = null; private String _pageHref = null; private String _pageAction = null; + private String _pagerRendererClass = null; public String getTagName() { return "Pager"; @@ -99,6 +101,13 @@ _disableDefaultPager = disableDefaultPager; } + /** + * @netui:attribute required="false" rtexprvalue="true" + */ + public void setPagerRendererClass(String pagerRendererClass) { + _pagerRendererClass = pagerRendererClass; + } + public void doTag() throws JspException { @@ -111,18 +120,31 @@ IPagerRenderer pagerRenderer = null; dgm.setDisableDefaultPagerRendering(_disableDefaultPager); + if(_pageSize != null) pm.setPageSize(_pageSize); - /* todo: support pluggable pager renderers */ - if(_pagerFormat != null) { + if(_pagerRendererClass != null) { + try { + pagerRenderer = (IPagerRenderer)DataGridUtil.instantiateClass(_pagerRendererClass, IPagerRenderer.class); + + assert pagerRenderer != null : "Expected a non-null pager renderer of type \"" + _pagerRendererClass + "\""; + } + catch(DataGridExtensionException e) { + throw new JspException(e); + } + } + else if(_pagerFormat != null) { if(_pagerFormat.equals(FIRST_LAST_PREV_NEXT)) pagerRenderer = new FirstPreviousNextLastPagerRenderer(dgm); else if(_pagerFormat.equals(PREV_NEXT)) pagerRenderer = new PreviousNextPagerRenderer(dgm); - else - throw new JspException("The pagerFormat \"" + _pagerFormat + "\" is not supported"); + else throw new JspException("The pagerFormat \"" + _pagerFormat + "\" is not supported"); + } + if(pagerRenderer != null) { + /* todo: need to provide pager renderers some context here */ + // pagerRenderer.setDataGridModel(pagerRenderer); dgm.setPagerRenderer(pagerRenderer); } @@ -141,3 +163,4 @@ return; } } + Modified: incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java?view=diff&rev=149080&p1=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java&r1=149079&p2=incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java&r2=149080 ============================================================================== --- incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java (original) +++ incubator/beehive/trunk/netui/src/tags-databinding/org/apache/beehive/netui/tags/databinding/datagrid/DataGridUtil.java Sat Jan 29 15:55:13 2005 @@ -40,7 +40,8 @@ private static final String CELL_MODEL_KEY = "cell"; /* do not construct */ - private DataGridUtil() {} + private DataGridUtil() { + } public static final DataGridModel getDataGridModel(JspContext jspContext) { Object model = jspContext.getAttribute(DATA_GRID_MODEL_KEY); @@ -79,15 +80,23 @@ * @return an instance of the given class * @throws DataGridExtensionException when an error occurs creating an instance of the class */ - static final Object instantiateClass(String className) { + static final Object instantiateClass(String className, Class assignableFrom) { + assert className != null; + try { Class clazz = Class.forName(className, true, Thread.currentThread().getContextClassLoader()); Object obj = clazz.newInstance(); - return obj; - } catch(Exception e) { - assert e instanceof IllegalAccessException || - e instanceof InstantiationException || - e instanceof ClassNotFoundException : "Caught exception of unexpected type " + e.getClass().getName(); + + if(assignableFrom == null || assignableFrom.isAssignableFrom(clazz)) + return obj; + else throw new DataGridExtensionException("Invalid data grid extension. The class \"" + className + "\" is not a subclass or sub interface of \"" + assignableFrom + "\""); + } + catch(Exception e) { + assert + e instanceof DataGridExtensionException || + e instanceof IllegalAccessException || + e instanceof InstantiationException || + e instanceof ClassNotFoundException : "Caught exception of unexpected type " + e.getClass().getName(); String msg = "Unable to extend data grid. Can't instantiate extension class. Cause: " + e.getMessage(); if(LOGGER.isErrorEnabled()) Added: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/databinding/datagrid/renderer/HelloWorldPagerRenderer.java Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/databinding/datagrid/renderer/HelloWorldPagerRenderer.java?view=auto&rev=149080 ============================================================================== --- (empty file) +++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/WEB-INF/src/databinding/datagrid/renderer/HelloWorldPagerRenderer.java Sat Jan 29 15:55:13 2005 @@ -0,0 +1,33 @@ +/* + * 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 databinding.datagrid.renderer; + +import org.apache.beehive.netui.databinding.datagrid.rendering.pager.IPagerRenderer; + +/** + * Simple implementation of the IPagerRenderer interface. This API is + * currently totally useless as it's impossible for a PagerRenderer implementation + * to obtain any information about its environment. + */ +public class HelloWorldPagerRenderer + implements IPagerRenderer { + + public String render() { + return "Hey, this codepath works! Oh, yeah -- Hello World!"; + } +} \ No newline at end of file Added: incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerPluggedRenderer.jsp Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerPluggedRenderer.jsp?view=auto&rev=149080 ============================================================================== --- (empty file) +++ incubator/beehive/trunk/netui/test/webapps/drt/coreWeb/databinding/datagrid/misc/pagerPluggedRenderer.jsp Sat Jan 29 15:55:13 2005 @@ -0,0 +1,33 @@ +<%@ 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-data:configurePager pagerRendererClass="databinding.datagrid.renderer.HelloWorldPagerRenderer"/> + <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 Modified: incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml?view=diff&rev=149080&p1=incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml&r1=149079&p2=incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml&r2=149080 ============================================================================== --- incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml (original) +++ incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/config/testRecorder-tests.xml Sat Jan 29 15:55:13 2005 @@ -2855,6 +2855,21 @@ </features> </test> <test> + <name>DataGridPagerRendererSmoke</name> + <description>DataGridPagerRendererSmoke</description> + <webapp>coreWeb</webapp> + <categories> + <category>bvt</category> + <category>bvt.struts11</category> + <category>databinding</category> + <category>datagrid</category> + </categories> + <features> + <feature>Databinding</feature> + <feature>Data Grid</feature> + </features> + </test> + <test> <name>DataGridPagerStickyParam</name> <description>DataGridStickyParam</description> <webapp>coreWeb</webapp> Added: incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerRendererSmoke.xml Url: http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerRendererSmoke.xml?view=auto&rev=149080 ============================================================================== --- (empty file) +++ incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/DataGridPagerRendererSmoke.xml Sat Jan 29 15:55:13 2005 @@ -0,0 +1,177 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ses:recorderSession xmlns:ses="http://beehive.apache.org/netui/tools/testrecorder/2004/session"> + <ses:sessionName>DataGridPagerRendererSmoke</ses:sessionName> + <ses:tester>ekoneil</ses:tester> + <ses:startDate>29 Jan 2005, 04:44:46.573 PM MST</ses:startDate> + <ses:description>Test of the codepath to plug-in a custom pager renderer.</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/pagerPluggedRenderer.jsp</ses:uri> + <ses:method>GET</ses:method> + <ses:parameters/> + <ses:cookies> + <ses:cookie> + <ses:name>JSESSIONID</ses:name> + <ses:value>6B5E6F29D5F8A9E63E8B8A10FE44BE3C</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=6B5E6F29D5F8A9E63E8B8A10FE44BE3C</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/pagerPluggedRenderer.jsp"> + <body> + <p> + <b>Basic Data Grid</b> + <table width="100%"> + <tr><td></td></tr> + <tr><td> + + <p> + + + + + + + <br/> + Hey, this codepath works! Oh, yeah -- Hello World! +<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> +<tr class="datagrid-even"> + <td class="datagrid"><span>GE</span></td> + + <td class="datagrid"><span>59.42</span></td> + + <td class="datagrid"><a href="http://www.ge.com?rowid=3&symbol=GE"><span>General Electric</span></a></td> + + +</tr> +<tr class="datagrid-odd"> + <td class="datagrid"><span>RHAT</span></td> + + <td class="datagrid"><span>18.2</span></td> + + <td class="datagrid"><a href="http://www.redhat.com?rowid=4&symbol=RHAT"><span>RedHat Systems</span></a></td> + + +</tr> +<tr class="datagrid-even"> + <td class="datagrid"><span>YHOO</span></td> + + <td class="datagrid"><span>48.16</span></td> + + <td class="datagrid"><a href="http://www.yahoo.com?rowid=5&symbol=YHOO"><span>Yahoo Inc</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, 04:44:51.350 PM MST</ses:endDate> + <ses:testCount>1</ses:testCount> +</ses:recorderSession> \ No newline at end of file
