KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > beehive > netui > databinding > datagrid > api > rendering > PagerRenderer


1 /*
2  * Copyright 2004 The Apache Software Foundation.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  * $Header:$
17  */

18 package org.apache.beehive.netui.databinding.datagrid.api.rendering;
19
20 import org.apache.beehive.netui.util.internal.InternalStringBuilder;
21
22 import java.util.Map JavaDoc;
23 import java.net.URISyntaxException JavaDoc;
24 import javax.servlet.http.HttpServletRequest JavaDoc;
25
26 import org.apache.beehive.netui.databinding.datagrid.api.exceptions.CellDecoratorException;
27 import org.apache.beehive.netui.databinding.datagrid.api.pager.PagerModel;
28 import org.apache.beehive.netui.databinding.datagrid.runtime.util.JspUtil;
29 import org.apache.beehive.netui.tags.rendering.AnchorTag;
30 import org.apache.beehive.netui.tags.rendering.TagRenderingBase;
31 import org.apache.beehive.netui.tags.rendering.StringBuilderRenderAppender;
32 import org.apache.beehive.netui.tags.rendering.AbstractRenderAppender;
33 import org.apache.beehive.netui.util.logging.Logger;
34 import org.apache.beehive.netui.util.Bundle;
35
36 /**
37  * <p>
38  * This is the base class for data grid pager renderers. Subclasses can be used by the data grid to
39  * render custom pager markup overriding one or both of the {@link #internalRender()} and {@link #noDataRender()}
40  * methods. Additional methods are implemented here as a convenience and may be overriden by
41  * subclasses needing to change their behavior.
42  * </p>
43  */

44 public abstract class PagerRenderer {
45
46     private static final Logger LOGGER = Logger.getInstance(PagerRenderer.class);
47     private static final String JavaDoc EMPTY_STRING = "";
48
49     private PagerModel _pagerModel;
50     private DataGridTagModel _gridModel;
51     private HttpServletRequest JavaDoc _request = null;
52     private TagRenderingBase _anchorTag = null;
53     private AnchorTag.State _anchorState = new AnchorTag.State();
54
55     /**
56      * <p>
57      * Set the {@link DataGridTagModel} with which this pager renderer instance is associated. Pager renderer
58      * instances should not be shared between data grids without setting a {@link DataGridTagModel} for
59      * each data grid.
60      * @param dataGridTagModel the {@link DataGridTagModel}
61      */

62     public void setDataGridTagModel(DataGridTagModel dataGridTagModel) {
63         assert dataGridTagModel != null;
64
65         _gridModel = dataGridTagModel;
66         _pagerModel = _gridModel.getState().getPagerModel();
67         _request = JspUtil.getRequest(_gridModel.getJspContext());
68         _anchorTag = TagRenderingBase.Factory.getRendering(TagRenderingBase.ANCHOR_TAG, _request);
69     }
70
71     /**
72      * <p>
73      * This method should be called when the pager is to be rendered. The result will be the String that
74      * represents the result of rendering.
75      * </p>
76      * <p>
77      * If there is no data in the data set, the method {@link #noDataRender()} will be invoked. Otherwise,
78      * the {@link #internalRender()} method will be called.
79      * </p>
80      * @return a string containing markup rendered by the pager
81      */

82     public String JavaDoc render() {
83         if(_gridModel.getDataSet().getSize() == 0)
84             return noDataRender();
85         else
86             return internalRender();
87     }
88
89     /**
90      * Get the {@link PagerModel} that contains the current pager state.
91      * @return the {@link PagerModel}
92      */

93     protected PagerModel getPagerModel() {
94         return _pagerModel;
95     }
96
97     /**
98      * Get the {@link DataGridTagModel} to which this pager is associated.
99      * @return the {@link DataGridTagModel}
100      */

101     protected DataGridTagModel getDataGridTagModel() {
102         return _gridModel;
103     }
104
105     /**
106      * Render the pager. This method is invoked when there is data available in the data set.
107      * @return a string containing markup rendered by the pager
108      */

109     protected String JavaDoc internalRender() {
110         return EMPTY_STRING;
111     }
112
113     /**
114      * Render the pager. This method is invoked when there is no data available in the data set.
115      * @return a string containing markup rendered by the pager
116      */

117     protected String JavaDoc noDataRender() {
118         return _gridModel.getMessage(IDataGridMessageKeys.DATAGRID_MSG_NODATA);
119     }
120
121     /**
122      * Build an HTML anchor that contains URL state for navigating to the first page of a data set.
123      * @return the HTML markup for anchor to the first page
124      */

125     protected String JavaDoc buildLiveFirstLink() {
126         InternalStringBuilder builder = new InternalStringBuilder();
127         AbstractRenderAppender appender = new StringBuilderRenderAppender(builder);
128
129         buildAnchor(appender, _gridModel.getUrlBuilder().getQueryParamsForFirstPage(), IDataGridMessageKeys.PAGER_MSG_FIRST);
130
131         return builder.toString();
132     }
133
134     /**
135      * Build literal text for the string displayed when there is no first page for the data set. This
136      * text is generally used when the {@link PagerModel} is already on the first page. By default, this text is
137      * obtained using the {@link IDataGridMessageKeys#PAGER_MSG_FIRST} message key.
138      * @return the text for the first page link
139      */

140     protected String JavaDoc buildDeadFirstLink() {
141         return _gridModel.getMessage(IDataGridMessageKeys.PAGER_MSG_FIRST);
142     }
143
144     /**
145      * Build an HTML anchor that contains URL state for navigating to the previous page of a data set. The
146      * previous page is calculated relative to the current location in the {@link PagerModel}
147      * @return the HTML markup for anchor to the previous page
148      */

149     protected String JavaDoc buildLivePreviousLink() {
150         InternalStringBuilder builder = new InternalStringBuilder();
151         AbstractRenderAppender appender = new StringBuilderRenderAppender(builder);
152
153         buildAnchor(appender, _gridModel.getUrlBuilder().getQueryParamsForPreviousPage(), IDataGridMessageKeys.PAGER_MSG_PREVIOUS);
154
155         return builder.toString();
156     }
157
158     /**
159      * Build literal text for the string displayed when there is no previous page for the data set. This
160      * text is generally used when the {@link PagerModel} is on the first page. By default, this text is
161      * obtained using the {@link IDataGridMessageKeys#PAGER_MSG_PREVIOUS} message key.
162      * @return the text for the previous page link
163      */

164     protected String JavaDoc buildDeadPreviousLink() {
165         return _gridModel.getMessage(IDataGridMessageKeys.PAGER_MSG_PREVIOUS);
166     }
167
168     /**
169      * Build an HTML anchor that contains URL state for navigating to the next page of a data set. The
170      * next page is calculated relative to the current location in the {@link PagerModel}
171      * @return the HTML markup for anchor to the next page
172      */

173     protected String JavaDoc buildLiveNextPageLink() {
174         InternalStringBuilder builder = new InternalStringBuilder();
175         AbstractRenderAppender appender = new StringBuilderRenderAppender(builder);
176         buildAnchor(appender, _gridModel.getUrlBuilder().getQueryParamsForNextPage(), IDataGridMessageKeys.PAGER_MSG_NEXT);
177         return builder.toString();
178     }
179
180     /**
181      * Build literal text for the string displayed when there is no next page for the data set. This
182      * text is generally used when the {@link PagerModel} is on the last page. By default, this text is
183      * obtained using the {@link IDataGridMessageKeys#PAGER_MSG_NEXT} message key.
184      * @return the text for the next page link
185      */

186     protected String JavaDoc buildDeadNextLink() {
187         return _gridModel.getMessage(IDataGridMessageKeys.PAGER_MSG_NEXT);
188     }
189
190     /**
191      * Build an HTML anchor that contains URL state for navigating to the last page of a data set.
192      * @return the HTML markup for anchor to the last page
193      */

194     protected String JavaDoc buildLiveLastLink() {
195         InternalStringBuilder builder = new InternalStringBuilder();
196         AbstractRenderAppender appender = new StringBuilderRenderAppender(builder);
197         buildAnchor(appender, _gridModel.getUrlBuilder().getQueryParamsForLastPage(), IDataGridMessageKeys.PAGER_MSG_LAST);
198         return builder.toString();
199     }
200
201     /**
202      * Build literal text for the string displayed when there is no last page for the data set. This
203      * text is generally used when the {@link PagerModel} is on the last page. By default, this text is
204      * obtained using the {@link IDataGridMessageKeys#PAGER_MSG_LAST} message key.
205      * @return the text for the last page link
206      */

207     protected String JavaDoc buildDeadLastLink() {
208         return _gridModel.getMessage(IDataGridMessageKeys.PAGER_MSG_LAST);
209     }
210
211     /**
212      * Build the anchor
213      * @param appender
214      * @param queryParams
215      * @param labelKey
216      */

217     protected final void buildAnchor(AbstractRenderAppender appender, Map JavaDoc queryParams, String JavaDoc labelKey) {
218         assert appender != null;
219         assert queryParams != null;
220         assert labelKey != null && labelKey.length() > 0;
221
222         _anchorState.href = buildPageUri(queryParams);
223         _anchorTag.doStartTag(appender, _anchorState);
224         appender.append(_gridModel.getMessage(labelKey));
225         _anchorTag.doEndTag(appender);
226         _anchorState.clear();
227     }
228
229     protected String JavaDoc buildPageUri(Map JavaDoc queryParams) {
230         String JavaDoc uri = null;
231
232         /*
233            if there isn't a defined page href, set one here.
234            note, this defaults to the curernt request URI. In the absence of
235            anything else, it's hard (impossible?) to determine if this is an
236            action, so we default to something reasonable which is a request URI.
237          */

238         String JavaDoc href = _pagerModel.getPageHref() != null ? _pagerModel.getPageHref() : _request.getRequestURI();
239
240         try {
241             uri = JspUtil.createURL(href,
242                     _pagerModel.getPageAction(),
243                     null,
244                     null,
245                     queryParams,
246                     _gridModel.getJspContext());
247         }
248         catch(URISyntaxException JavaDoc mue) {
249             String JavaDoc message = Bundle.getErrorString("Rendering_URLException", new Object JavaDoc[]{_pagerModel.getPageHref(), _pagerModel.getPageAction()});
250             LOGGER.error(message, mue);
251             throw new CellDecoratorException(message, mue);
252         }
253
254         return uri;
255     }
256
257 }
258
Popular Tags