KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jaspersoft > jasperserver > war > tags > PaginationTag


1 /*
2  * Copyright (C) 2006 JasperSoft http://www.jaspersoft.com
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed WITHOUT ANY WARRANTY; and without the
10  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  * See the GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
15  * or write to:
16  *
17  * Free Software Foundation, Inc.,
18  * 59 Temple Place - Suite 330,
19  * Boston, MA USA 02111-1307
20  */

21 package com.jaspersoft.jasperserver.war.tags;
22
23 import java.io.*;
24 import java.util.*;
25
26 import javax.servlet.ServletContext JavaDoc;
27 import javax.servlet.jsp.JspException JavaDoc;
28 import javax.servlet.jsp.PageContext JavaDoc;
29 import javax.servlet.jsp.tagext.TagSupport JavaDoc;
30 import javax.servlet.http.HttpServletRequest JavaDoc;
31
32 import org.apache.commons.logging.Log;
33 import org.apache.commons.logging.LogFactory;
34 import org.springframework.web.context.WebApplicationContext;
35 import org.springframework.web.context.support.WebApplicationContextUtils;
36
37 import com.jaspersoft.jasperserver.war.common.JasperServerConst;
38 import com.jaspersoft.jasperserver.war.common.JasperServerConstImpl;
39 import com.jaspersoft.jasperserver.api.metadata.common.service.RepositoryService;
40 import com.jaspersoft.jasperserver.api.metadata.user.service.ObjectPermissionService;
41 import com.jaspersoft.jasperserver.api.common.domain.ExecutionContext;
42 import com.jaspersoft.jasperserver.api.common.domain.impl.ExecutionContextImpl;
43
44 import com.jaspersoft.jasperserver.api.metadata.user.domain.User;
45 import com.jaspersoft.jasperserver.api.metadata.user.domain.Role;
46 import com.jaspersoft.jasperserver.api.metadata.user.domain.ObjectPermission;
47
48 /**
49  * JSP Tag Handler class
50  *
51  * @jsp.tag name = "Pagination"
52  * display-name = "Pagination Tag"
53  * description = "Tag user for implementing Pagination Functionality"
54  * body-content = "empty"
55  */

56 public class PaginationTag extends TagSupport JavaDoc {
57
58     private String JavaDoc retrvPerm = null;
59     private String JavaDoc htmlOP = null;
60     private List objectList = null;
61     private String JavaDoc resPerPage = null;
62
63     private static final Log log = LogFactory.getLog(PaginationTag.class);
64
65     /*
66      * method to get the list object
67      * @param
68      * @return java.util.List
69      */

70      public List getObjectList() {
71          return objectList;
72      }
73
74     /*
75      * method to get the list object
76      * @param java.util.List
77      * @return
78      */

79      public void setObjectList(List objectList) {
80          this.objectList = objectList;
81      }
82
83
84     /*
85      * method to get the html output string
86      * @param
87      * @return
88      */

89      public String JavaDoc getHtmlOP() {
90          return htmlOP;
91      }
92
93     /*
94      * method to set the html output string
95      * @param
96      * @return
97      */

98      public void setHtmlOP(String JavaDoc str) {
99          this.htmlOP = str;
100      }
101
102     /*
103      * method to get permission retrieval
104      * @param
105      * @return
106      */

107      public String JavaDoc getRetrvPerm() {
108          return retrvPerm;
109      }
110
111     /*
112      * method to set permission retrieval
113      * @param
114      * @return
115      */

116      public void setRetrvPerm(String JavaDoc str) {
117          this.retrvPerm = str;
118      }
119
120     /*
121      * method to get results per page
122      * @param
123      * @return
124      */

125      public String JavaDoc getResPerPage() {
126          return resPerPage;
127      }
128
129     /*
130      * method to set results per page
131      * @param
132      * @return
133      */

134      public void setResPerPage(String JavaDoc str) {
135          this.resPerPage = str;
136      }
137
138     /*
139      * Lifecycle method overridden
140      * @see javax.servlet.jsp.tagext.Tag#doStartTag()
141      */

142     public int doStartTag() throws JspException JavaDoc {
143
144         HttpServletRequest JavaDoc req = (HttpServletRequest JavaDoc) pageContext.getRequest();
145         List displayList = null;
146         int resultsPerPage = -1;
147
148         if(resPerPage != null && resPerPage.trim().length() != 0)
149             resultsPerPage = Integer.parseInt(resPerPage);
150
151         if(resultsPerPage <= 0)
152             resultsPerPage = Integer.parseInt(JasperServerConst.RESULTS_PER_PAGE);
153
154         if(objectList == null || objectList.size() == 0) {
155             log.info(" *** Search result object is NULL *** ");
156             return SKIP_BODY;
157         }
158
159         //CODE for PAGE-SET
160
int currentPageSet = -1;
161         String JavaDoc strCurrPageSet = req.getParameter("currentpageset");
162         if(strCurrPageSet == null || strCurrPageSet.trim().length() == 0 || strCurrPageSet.trim().equals("null")) {
163             currentPageSet = 1;
164         } else {
165             currentPageSet = Integer.parseInt(strCurrPageSet);
166         }
167
168         boolean dispNextSet = false;
169         int totObjects = objectList.size();
170         int objListStIndex = -1, objListEndIndex = -1;
171         List objListCopy = new ArrayList(objectList);
172         int totalPageSets = getFirstLastSetDisplay(objectList.size(), resultsPerPage);
173
174         if(totObjects > currentPageSet*JasperServerConst.PAGE_SET_COUNT*resultsPerPage) {
175             dispNextSet = true;
176             objListStIndex = (currentPageSet-1)*JasperServerConst.PAGE_SET_COUNT*resultsPerPage;
177             objListEndIndex = currentPageSet*JasperServerConst.PAGE_SET_COUNT*resultsPerPage - 1;
178             objectList = objectList.subList(objListStIndex, objListEndIndex+1);
179             totObjects = objectList.size();
180         } else {
181             objListStIndex = (currentPageSet-1)*JasperServerConst.PAGE_SET_COUNT*resultsPerPage;
182             objListEndIndex = totObjects - 1;
183             objectList = objectList.subList(objListStIndex, objListEndIndex+1);
184             totObjects = objectList.size();
185         }
186
187         int totPages = totObjects/resultsPerPage;
188         if(totObjects%resultsPerPage != 0)
189             totPages += 1;
190
191         int pagenumber = -1, startIndex = -1, endIndex = -1, hrefPageNo = -1;
192         String JavaDoc pageNo = req.getParameter("currentpageno");
193
194         if(pageNo == null || pageNo.trim().length() == 0 || pageNo.trim().equals("null")) {
195             pagenumber = 1;
196         } else {
197             pagenumber = Integer.parseInt(pageNo);
198         }
199
200         //works for only first page set i.e pages 1 - 5. Need to handle user deletion across pageSets.
201
if(currentPageSet == 1) {
202             if(totObjects <= (pagenumber-1)*(resultsPerPage)) {
203                 pagenumber = pagenumber - 1;
204             }
205         } else {
206             if(totObjects <= ((pagenumber%((currentPageSet-1)*(JasperServerConst.PAGE_SET_COUNT)))-1)*(resultsPerPage)) {
207                 pagenumber = pagenumber - 1;
208             }
209         }
210
211         StringBuffer JavaDoc sbf = new StringBuffer JavaDoc();
212         for(int ix = 1; ix <= totPages; ix++) {
213             hrefPageNo = ((currentPageSet-1)*JasperServerConst.PAGE_SET_COUNT) + ix;
214             if(hrefPageNo == pagenumber) {
215                 sbf.append("<font color=\"#003399\" style=\"size:11px;\">" + hrefPageNo + "</font>" + "&nbsp;&nbsp;&nbsp;");
216             } else {
217                 sbf.append("<a HREF=\"javascript:pagenoclick(");
218                 sbf.append(hrefPageNo + ");\"");
219                 sbf.append(">" + hrefPageNo + "</a>&nbsp;&nbsp;&nbsp;");
220             }
221         }
222
223         int pagenumber_bkup = pagenumber;
224         pagenumber = pagenumber - ((currentPageSet-1) * JasperServerConst.PAGE_SET_COUNT);
225
226         startIndex = ((pagenumber-1)*resultsPerPage);
227         if(totObjects < pagenumber*(resultsPerPage))
228             endIndex = totObjects - 1;
229         else
230             endIndex = (pagenumber*resultsPerPage) - 1;
231
232         displayList = new ArrayList();
233         for(int iy = startIndex; iy <= endIndex; iy++) {
234             displayList.add(objectList.get(iy));
235         }
236
237         sbf.append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
238         sbf.append("<input type=\"hidden\" name=\"currentpageno\" value=\"" + pagenumber_bkup + "\"/>");
239         req.setAttribute("displayList", displayList);
240
241         //condition for displaying 'Prev Set' link
242
if(currentPageSet > 1) {
243             sbf.insert(0, "<a HREF=\"javascript:prevSetclick(" + (currentPageSet-1) + ");\"" + "> Prev Set&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + "</a>");
244         }
245
246         //condition for displaying 'First Set' set# 1
247
if(currentPageSet > 2) {
248             sbf.insert(0, "<a HREF=\"javascript:prevSetclick(1);\"> First Set &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + "</a>");
249         }
250
251         //condition for displaying 'Next Set'
252
if(dispNextSet) {
253             sbf.append("&nbsp;&nbsp;<a HREF=\"javascript:nextSetclick(" + (currentPageSet+1) + ");\"");
254             sbf.append("> Next Set" + "</a>" + "&nbsp;&nbsp;");
255         }
256
257         //condition for displaying 'Last Set' set# totPageSets
258
if(currentPageSet <= (totalPageSets - 2)) {
259             sbf.append("&nbsp;&nbsp;<a HREF=\"javascript:nextSetclick(" + totalPageSets + ");\"");
260             sbf.append("> Last Set" + "</a>" + "&nbsp;&nbsp;");
261         }
262
263         //commonly add hidden parameter to keep track of currentpageset
264
sbf.append("<input type=\"hidden\" name=\"currentpageset\" value=\"" + currentPageSet + "\"" + "/>");
265
266         //specific to retrieving object permission values
267
if(getRetrvPerm() != null && getRetrvPerm().equals("yes")) {
268             req.setAttribute("displayPermList", setPermissionToObjects(displayList));
269         }
270
271         setHtmlOP(sbf.toString());
272         return SKIP_BODY;
273     }
274
275     /*
276      * Lifecycle method overridden
277      * @see javax.servlet.jsp.tagext.Tag#doEndTag()
278      */

279     public int doEndTag() {
280         if(getHtmlOP()==null || getHtmlOP().trim().length()==0)
281             setHtmlOP("&nbsp;");
282         pageContext.setAttribute("pageLinks", htmlOP);
283         return EVAL_PAGE;
284     }
285
286     /*
287      * method to fetch the permission associated to each object
288      * @param
289      * @return
290      */

291     protected Hashtable setPermissionToObjects(List displayList) {
292
293         if(displayList == null || displayList.size() == 0) {
294             return null;
295         }
296
297         try {
298             HttpServletRequest JavaDoc req = (HttpServletRequest JavaDoc) pageContext.getRequest();
299             ServletContext JavaDoc servletContext = pageContext.getServletContext();
300             WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
301             RepositoryService repository = (RepositoryService) wac.getBean("repositoryService");
302             ObjectPermissionService objPermService = (ObjectPermissionService)wac.getBean("objectPermissionService");
303
304             ExecutionContext context = new ExecutionContextImpl();
305             Hashtable objPermList = new Hashtable();
306             String JavaDoc objectIdentifier = req.getParameter("resource");
307             Object JavaDoc targetObject = null;
308             if(objectIdentifier != null && objectIdentifier.trim().length() != 0) {
309                 targetObject = repository.getResource(context, objectIdentifier);
310
311                 if (targetObject == null) {
312                     targetObject = repository.getFolder(context, objectIdentifier);
313                 }
314             }
315
316             if (targetObject == null) {
317                 log.warn("PaginationTag.setPermissionToObjects: *** targetObject resource is NULL *** ");
318                 return objPermList;
319             } else {
320                 log.debug("PaginationTag.setPermissionToObjects: targetObject - " + targetObject);
321             }
322
323             ListIterator iterator = displayList.listIterator();
324
325             while (iterator.hasNext()) {
326                 Object JavaDoc recpObject = iterator.next();
327
328                 String JavaDoc objPermKey = null;
329
330                 if (recpObject instanceof User) {
331                     objPermKey = ((User) recpObject).getUsername();
332                 } else if (recpObject instanceof Role) {
333                     objPermKey = ((Role) recpObject).getRoleName();
334                 } else {
335                     log.warn("PaginationTag.setPermissionToObjects: recipient object ignored " + recpObject);
336                 }
337
338                 if (objPermKey != null) {
339                     Integer JavaDoc permissionToDisplay = new Integer JavaDoc(-1);
340
341                     List lstPermns = objPermService.getObjectPermissionsForObjectAndRecipient(context, targetObject, recpObject);
342                     if (lstPermns != null && lstPermns.size() > 0) {
343                         ObjectPermission objPermission = (ObjectPermission) lstPermns.get(0);
344
345                         // Because of default permissions, we could get something that has no recipient
346

347                         if (objPermission != null && objPermission.getPermissionRecipient() != null) {
348                             permissionToDisplay = new Integer JavaDoc(objPermission.getPermissionMask());
349                         }
350                     }
351                     objPermList.put(objPermKey, permissionToDisplay.toString());
352                     log.debug("PaginationTag.setPermissionToObjects: object:" + recpObject + ", " + objPermKey + " - permission: " + permissionToDisplay);
353                 }
354             }
355             return objPermList;
356         } catch (Exception JavaDoc _ex) {
357             _ex.printStackTrace();
358         }
359         return null;
360     }
361
362     /*
363      * function to decide whether to display 'First & Last' and 'Last Set'?
364      *
365      * @param
366      * @return
367      */

368     private int getFirstLastSetDisplay(int objSize, int resultsPerPage) {
369         int tot_Page_Sets = objSize/(JasperServerConst.PAGE_SET_COUNT * resultsPerPage);
370         if(objSize%(JasperServerConst.PAGE_SET_COUNT * resultsPerPage) != 0)
371             tot_Page_Sets += 1;
372         return tot_Page_Sets;
373     }
374
375 }
376
Popular Tags