libreccm-legacy/ccm-ldn-util/src/com/arsdigita/london/util/UrlUtil.java

158 lines
4.6 KiB
Java
Executable File

/*
* Copyright (C) 2005-2006 UNDP. All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package com.arsdigita.london.util;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.parameters.ParameterModel;
import com.arsdigita.web.ParameterMap;
import com.arsdigita.web.URL;
public class UrlUtil {
/**
* Processes the URL for location.
*/
public static String prepareURL(final PageState state, String location, ParameterMap params) {
return prepareURL(state, location, params, true);
}
/**
* Processes the URL for location.
*/
public static String prepareURL(PageState state, String location, ParameterMap params, boolean includeDispatcherPath) {
return prepareURL(state, location, params, includeDispatcherPath, (List) null, false);
}
/**
* Processes the URL for location.
*/
public static String prepareURL(final PageState state, String location, ParameterMap params, boolean includeDispatcherPath, String ignoreParam) {
ArrayList ignoreParams = new ArrayList();
ignoreParams.add(ignoreParam);
return prepareURL(state, location, params, includeDispatcherPath, ignoreParams, false);
}
/**
* Processes the URL for location.
*/
public static String prepareURL(final PageState state, String location,
ParameterMap params, boolean includeDispatcherPath,
List ignoreParams, boolean addPageStateParams) {
final HttpServletRequest req = state.getRequest();
final HttpServletResponse resp = state.getResponse();
if (params == null) {
params = new ParameterMap();
}
//add global state parameters
if (addPageStateParams) {
Iterator stateParams = state.getPage().getParameters();
while (stateParams.hasNext()) {
ParameterModel param = (ParameterModel) stateParams.next();
Object value = state.getValue(param);
if (value != null) {
String paramName = param.getName();
//don't replace param
if (params.getParameter(paramName) == null) {
params.setParameter(paramName, value);
}
}
}
}
params.runListeners(req);
if (includeDispatcherPath && location.startsWith("/")) {
location = URL.getDispatcherPath() + location;
}
String url;
if (location.indexOf("?") == -1) {
// m_params adds the "?" as needed.
url = resp.encodeURL(location + params);
}
else {
// The location already includes a query string, so
// append to it without including a "?".
if (location.endsWith("&")) {
url = resp.encodeURL(location + params.getQueryString());
}
else {
url = resp.encodeURL(location + "&" + params.getQueryString());
}
}
//remove ignored params
if (ignoreParams != null) {
Iterator iParsIter = ignoreParams.iterator();
while (iParsIter.hasNext()) {
String ignoreParam = (String) iParsIter.next();
url = removeParameter(url, ignoreParam);
}
}
return url;
}
/**
* Removes the URL's paremeter
*/
public static String removeParameter(String url, String parameter) {
Pattern p = Pattern.compile("[?&]" + parameter + "=[^&]*");
Matcher m = p.matcher(url);
int index = 0;
int lastIndex = 0;
int length = url.length();
StringBuffer out = new StringBuffer();
while (m.find(index)) {
index = m.start();
int end = m.end();
if (url.charAt(index) == '&') {
out.append(url.substring(lastIndex, index));
}
else {
//start with ?...
out.append(url.substring(lastIndex, index + 1));
if (length > end && url.charAt(end) == '&') {
end++;
}
}
index = end;
lastIndex = index;
}
if (url.length() > lastIndex) {
out.append(url.substring(lastIndex));
}
//remove '?' as last char
index = out.length() - 1;
if (index >= 0 && out.charAt(index) == '?') {
out.deleteCharAt(index);
}
return out.toString();
}
}