/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.gui.legacy.util; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.servlet.ServletException; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; /** * Utilities class that provides general convenience methods. */ public class ActionUtils { /** * Return a new <code>ActionForward</code> based on the given one but with the specified parameter name and value * added to the new forward's path. NOTE: this method would be unnecessary if Struts allowed us to "unfreeze" the * <code>ForwardConfig</code> that is the superclass of the forward. * * @param forward the ActionForward on which the new forward is based * @param param the name of the path parameter to add * @param value the value of the parameter to add * * @exception ServletException if encoding the path parameter fails */ public static ActionForward changeForwardPath(ActionForward forward, Map params) throws Exception { String newUrl = changeUrl(forward.getPath(), params); ActionForward newForward = new ActionForward(forward.getName(), newUrl, forward.getRedirect()); return newForward; } public static ActionForward changeForwardPath(ActionForward forward, String param, String value) throws Exception { HashMap params = new HashMap(1); params.put(param, value); return changeForwardPath(forward, params); } /** * Change a url by appending all of the <code>params</code> to it. * * @param url the original URL * @param params the name-value pairs to append * * @return the new url */ public static String changeUrl(String url, Map params) throws Exception { StringBuffer newUrl = new StringBuffer(url); if (params != null) { int index = url.indexOf('?'); String separator = (index == -1) ? "?" : "&"; Iterator i = params.keySet().iterator(); while (i.hasNext()) { Object name = i.next(); Object value = params.get(name); try { if ((value != null) && value.getClass().isArray()) { Object[] arr = (Object[]) value; for (int j = 0; j < arr.length; ++j) { _appendParam(newUrl, separator, name, arr[j]); } } else { _appendParam(newUrl, separator, name, value); } if ("?".equals(separator)) { separator = "&"; } } catch (UnsupportedEncodingException e) { // how on earth could a jvm not support UTF-8?? throw new ServletException( "could not encode ActionForward path parameters because the JVM does not support UTF-8!?", e); } } } return newUrl.toString(); } /** * Return a URL path that will return control to the current action. This path is generated by adding the specified * parameters to the path of the forward specified as the "input" forward for the given mapping. * * @param mapping the ActionMapping describing the current action's forwards * @param params a map containing the path parameters to add * * @exception ServletException if encoding the path parameter fails or input has not been set */ public static String findReturnPath(ActionMapping mapping, Map params) throws Exception { ActionForward inputForward = mapping.getInputForward(); if (inputForward.getPath() == null) { throw new ServletException("input cannot be null for returnPath on url: " + mapping.getPath()); } ActionForward returnForward = ActionUtils.changeForwardPath(inputForward, params); return returnForward.getPath(); } public static String findReturnPath(ActionMapping mapping, String param, String value) throws Exception { HashMap params = new HashMap(1); params.put(param, value); return findReturnPath(mapping, params); } private static void _appendParam(StringBuffer newPath, String separator, Object name, Object value) throws UnsupportedEncodingException { newPath.append(separator + URLEncoder.encode(name.toString(), "UTF-8")); newPath.append("="); if (value != null) { newPath.append(URLEncoder.encode(value.toString(), "UTF-8")); } } }