1 /*** 2 * Copyright (c) 2003 held jointly by the individual authors. This library is 3 * free software; you can redistribute it and/or modify it under the terms of 4 * the GNU Lesser General Public License as published by the Free Software 5 * Foundation; either version 2.1 of the License, or (at your option) any later 6 * version. This library is distributed in the hope that it will be useful, but 7 * WITHOUT ANY WARRANTY; with out even the implied warranty of MERCHANTABILITY 8 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 9 * License for more details. You should have received a copy of the GNU Lesser 10 * General Public License along with this library; if not, write to the Free 11 * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 12 * USA. > http://www.gnu.org/copyleft/lesser.html > 13 * http://www.opensource.org/licenses/lgpl-license.php 14 */ 15 16 package net.mlw.vlh.web.mvc; 17 18 import java.util.Map; 19 20 import javax.servlet.http.HttpServletRequest; 21 import javax.servlet.http.HttpSession; 22 23 import net.mlw.vlh.ValueList; 24 import net.mlw.vlh.ValueListHandler; 25 import net.mlw.vlh.ValueListInfo; 26 import net.mlw.vlh.web.ValueListRequestUtil; 27 import net.mlw.vlh.web.tag.TableInfo; 28 29 import org.apache.commons.logging.Log; 30 import org.apache.commons.logging.LogFactory; 31 32 /*** 33 * This package is used in mvc controlers to better handle with the 34 * ValueListHandler. It allow you to 35 * <li>backup ValueList <b>info </b> to the session before redirect!</li> 36 * <li>modify paging possition, focusing property and values, sorting order, 37 * etc.</li> 38 * <h5>Usage</h5> 39 * Please, before use, set a ValueListHandler property with a reference to your 40 * valueListHandler!</h4> 41 * 42 * @author Andrej Zachar 43 * @version $Revision: 1.6 $ $Date: 2005/11/23 14:19:45 $ 44 */ 45 public class ValueListHandlerHelper 46 { 47 /*** 48 * Logger for this class 49 */ 50 private static final Log LOGGER = LogFactory.getLog(ValueListHandlerHelper.class); 51 52 private ValueListHandler _valueListHandler = null; 53 54 /*** 55 * @param valueListHandler The valueListHandler to set. 56 */ 57 public void setValueListHandler(ValueListHandler valueListHandler) 58 { 59 _valueListHandler = valueListHandler; 60 } 61 62 /*** 63 * Get a bean of the ValueListHandler. 64 * 65 * @return ValueListHandler 66 */ 67 public ValueListHandler getValueListHandler() 68 { 69 return _valueListHandler; 70 } 71 72 /*** 73 * Retrieve valueList from ValueListHadler bean. 74 * 75 * @param name the name of the Adapter 76 * @param info 77 * @return ValueList 78 */ 79 public ValueList getValueList(String name, ValueListInfo info) 80 { 81 return getValueListHandler().getValueList(name, info); 82 } 83 84 /*** 85 * To get ValueListInfo it use the TableInfo.DEFAULT_ID as the tableId. 86 * 87 * @see ValueListHandlerHelper#getValueListInfo(HttpServletRequest, String) 88 * @see TableInfo#DEFAULT_ID 89 * @param request 90 * @return ValueListInfo 91 */ 92 public ValueListInfo getValueListInfo(HttpServletRequest request) 93 { 94 LOGGER.warn("Gettting a valueListInfo for a table with the default id!"); 95 return getValueListInfo(request, TableInfo.DEFAULT_ID); 96 } 97 98 /*** 99 * Return ValueListInfo from a <b>request </b> (which is preferr to session) 100 * or a session or new ValueListInfo(). 101 * <li>If request contains any parameters, which belongs to a table with 102 * the <b>tableId </b>, return the ValueListInfo from the <b>request. </b> 103 * </li> 104 * <li>Otherwise if the session <b>contains attribute tableId </b>, then 105 * return it from the <b>session </b>.</li> 106 * <li>If the request or the session <b>dosn't </b> contain the 107 * ValueListInfo, return <b>new </b> ValueListInfo.</li> 108 * 109 * @see ValueListHandlerHelper#getValueListInfo(HttpServletRequest) 110 * @param request 111 * @param tableId 112 * @return ValueListInfo 113 */ 114 115 public ValueListInfo getValueListInfo(HttpServletRequest request, String tableId) 116 { 117 if (request == null) 118 { 119 final String message = "getValueListInfo - request is null!"; 120 LOGGER.error(message); 121 throw new NullPointerException(message); 122 } 123 if (tableId == null) 124 { 125 LOGGER.error("TableId is null!"); 126 tableId = TableInfo.DEFAULT_ID; 127 } 128 129 if (LOGGER.isDebugEnabled()) 130 { 131 LOGGER.debug("Start to getting ValuelistInfo for the tableId '" + tableId + "'."); 132 } 133 134 Map requestParamsMap = ValueListRequestUtil.getRequestParameterMap(request, tableId); 135 136 ValueListInfo info = null; 137 138 if (requestParamsMap.isEmpty()) 139 { 140 141 if (LOGGER.isDebugEnabled()) 142 { 143 LOGGER.debug("Try to get backup of an info from the session for the tableId '" + tableId + "'."); 144 } 145 146 HttpSession session = request.getSession(); 147 if (session != null) 148 { 149 info = (ValueListInfo) session.getAttribute(tableId); 150 } 151 else 152 { 153 LOGGER.warn("ValueListInfo for tableId '" + tableId + "' was not found in the sesion due to session is null!"); 154 } 155 156 if (LOGGER.isDebugEnabled()) 157 { 158 if (info == null) 159 { 160 LOGGER.debug("Backup of the ValueListInfo for the tableId '" + tableId + "'was NOT found in the session."); 161 } 162 else 163 { 164 LOGGER.debug("Backup of the ValueListInfo for the tableId '" + tableId + "' was FOUND in the session"); 165 } 166 } 167 168 } 169 else 170 { 171 info = ValueListRequestUtil.buildValueListInfo(request, tableId); 172 if (LOGGER.isDebugEnabled()) 173 { 174 LOGGER.debug("ValueListInfo for the tableId '" + tableId + "' was build from the request's params."); 175 } 176 } 177 178 if (info == null) 179 { 180 if (LOGGER.isInfoEnabled()) 181 { 182 LOGGER.info("Creating a default ValueListInfo for the tableId '" + tableId + "'"); 183 } 184 info = new ValueListInfo(); 185 } 186 return info; 187 188 } 189 190 /*** 191 * Do 2 things: 192 * <li>Backup the ValueList <b>Info to the session </b> with the 193 * attribute's name <b>tableId </b> and</li> 194 * <li>store Value <b>List to the request </b> with the attribute key's 195 * name <b>valueListName </b></li> 196 * 197 * @see ValueListHandlerHelper#backupInfoFor(HttpServletRequest, 198 * ValueListInfo, String) 199 * @see ValueListHandlerHelper#setValueListTo(HttpServletRequest, ValueList, 200 * String) 201 * @param request 202 * @param valueList null -> info will be removed from session and storing 203 * will be skipped. 204 * @param valueListName the name used in the <vlh:root 205 * value="valueListName" ... to retrieve 206 * @param tableId unique id in the session 207 */ 208 public void backupAndSet(HttpServletRequest request, ValueList valueList, String valueListName, String tableId) 209 { 210 211 backupInfoFor(request, valueList == null ? null : valueList.getValueListInfo(), tableId); 212 setValueListTo(request, valueList, valueListName); 213 214 } 215 216 /*** 217 * Store only ValueList to request as an attribute with the name 218 * valueListName. 219 * 220 * @param request 221 * @param valueList ValueList to store 222 * @param valueListName request attribute's 223 */ 224 public void setValueListTo(HttpServletRequest request, ValueList valueList, String valueListName) 225 { 226 if (valueListName != null && valueListName.length() > 0) 227 { 228 request.setAttribute(valueListName, valueList); 229 if (LOGGER.isDebugEnabled()) 230 { 231 LOGGER.debug("ValueList '" + valueListName + "' is stored in the request."); 232 } 233 } 234 else 235 { 236 LOGGER.error("Skiped storing of the ValueList to the request, valueListName is null or empty!"); 237 } 238 } 239 240 /*** 241 * Save ValueListInfo to the session with key of TableInfo.DEFAULT_ID. You 242 * should prevent of use this method. 243 * 244 * @see TableInfo#DEFAULT_ID 245 * @see ValueListHandlerHelper#backupInfoFor(HttpServletRequest, 246 * ValueListInfo, String) 247 * @param request HttpServletRequest 248 * @param info ValueListInfo 249 */ 250 public void backupInfoFor(HttpServletRequest request, ValueListInfo info) 251 { 252 LOGGER.warn("Backing Up with the default table id "); 253 backupInfoFor(request, info, TableInfo.DEFAULT_ID); 254 255 } 256 257 /*** 258 * Save ValueListInfo to session with key of tableId if info is null, remove 259 * the tableId attribute from session. 260 * 261 * @param request HttpServletRequest 262 * @param info ValueListInfo to back up to session 263 * @param tableId String session's attributes name 264 * @see TableInfo#DEFAULT_ID 265 * <h4> during accesing session, we are not using any synchronization.</h4> 266 */ 267 public void backupInfoFor(HttpServletRequest request, ValueListInfo info, String tableId) 268 { 269 270 if (tableId != null && tableId.length() > 0) 271 { 272 if (info == null) 273 { 274 request.getSession().removeAttribute(tableId); 275 276 if (LOGGER.isWarnEnabled()) 277 { 278 LOGGER.warn("ValueListInfo to back up is null! ValueListInfo for the tableId '" + tableId 279 + "' was removed from the session."); 280 } 281 } 282 else 283 { 284 request.getSession().setAttribute(tableId, info); 285 if (LOGGER.isDebugEnabled()) 286 { 287 LOGGER.debug("ValueListInfo for tableId '" + tableId + "' was saved in session."); 288 } 289 } 290 } 291 else 292 { 293 throw new NullPointerException( 294 "The session unique attribute tableId is null or empty, skipped backUp of valueListInfo into the session!"); 295 } 296 } 297 298 /*** 299 * Return the name of parameter with ActionTag.ACTION_TEMP_PARAM_PREFIX 300 * Example: param <b>id </b> return <b>ACTid </b> 301 * 302 * @see net.mlw.vlh.web.tag.ActionTag#ACTION_TEMP_PARAM_PREFIX 303 * @param request 304 * @param name 305 * @return String 306 */ 307 public String getActionTempParam(HttpServletRequest request, String name) 308 { 309 return request.getParameter(ValueListRequestUtil.getActionTempParamName(name)); 310 } 311 312 /*** 313 * Return the name of parameter without ActionTag.ACTION_TEMP_PARAM_PREFIX 314 * Example: param <b>id </b> return <b>id </b> 315 * 316 * @see net.mlw.vlh.web.tag.ActionTag#ACTION_TEMP_PARAM_PREFIX 317 * @param request 318 * @param name 319 * @return String 320 */ 321 public String getActionParam(HttpServletRequest request, String name) 322 { 323 return request.getParameter(name); 324 } 325 326 /*** 327 * If delete first and at that time also the last entry on the last page, 328 * you sets actual last page! You should call this method in a action after 329 * delete is done. 330 * 331 * @param info ValueListInfo 332 * @return int Last page, or last page -1 of last retrieved valueListInfo. 333 * @see ValueListInfo#getTotalNumberOfEntries() 334 * @see ValueListInfo#getPagingNumberPer() 335 * @see ValueListInfo#getPagingPer() 336 */ 337 public int getLastPageAfterDelete(ValueListInfo info) 338 { 339 int lastPage = info.getPagingPage(); 340 341 int lastCount = info.getTotalNumberOfEntries() % info.getPagingNumberPer(); 342 343 if (lastCount == 1 && lastPage > 1) 344 { 345 lastPage--; 346 } 347 return lastPage; 348 } 349 }