package zeuzgroup.application.utils; import java.util.Locale; import java.util.Map; import org.apache.log4j.Logger; import org.apache.wicket.IRequestTarget; import org.apache.wicket.Page; import org.apache.wicket.Request; import org.apache.wicket.RequestCycle; import org.apache.wicket.request.IRequestCodingStrategy; import org.apache.wicket.request.RequestParameters; import org.apache.wicket.request.target.coding.IRequestTargetUrlCodingStrategy; /** * encoding strategy that prepends keyword to url, usefull for caching * * * @author Nino Martinez Wael (nino.martinez@jayway.dk) * */ public class PrependKeywordEncodingStrategy implements IRequestCodingStrategy { /** log. */ private static org.apache.log4j.Logger log = Logger .getLogger(PrependKeywordEncodingStrategy.class); /** The default request coding strategy most of the methods are delegated to */ private final IRequestCodingStrategy defaultStrategy; private final String keyword; /** * Construct. * * @param defaultStrategy * The default strategy most requests are forwarded to */ public PrependKeywordEncodingStrategy( final IRequestCodingStrategy defaultStrategy, String keyword) { this.defaultStrategy = defaultStrategy; this.keyword = keyword; } /** * Decode the querystring of the URL * * @see org.apache.wicket.request.IRequestCodingStrategy#decode(org.apache.wicket.Request) */ public RequestParameters decode(final Request request) { if (request.getURL().contains(keyword)) { String url = request.decodeURL(request.getURL()); // remove locale from request url = url.replace(keyword, ""); Request fakeRequest = new FakeRequest(request, url); return defaultStrategy.decode(fakeRequest); } return defaultStrategy.decode(request); } /** * Encode the querystring of the URL * * @see org.apache.wicket.request.IRequestCodingStrategy#encode(org.apache.wicket.RequestCycle, * org.apache.wicket.IRequestTarget) */ public CharSequence encode(final RequestCycle requestCycle, final IRequestTarget requestTarget) { Page page = requestCycle.getRequest().getPage(); CharSequence url = defaultStrategy.encode(requestCycle, requestTarget); if (ContainsKeyword.class.isInstance(page)) { ContainsKeyword containsKeyword = (ContainsKeyword) page; if (containsKeyword.hasKeyword()) { if (url != "./") { if (url.subSequence(url.length() - 1, url.length()) .toString().compareTo("/") == 0) { url = url.subSequence(0, url.length() - 1); } url = url + "/" + keyword; } } } return url; } /** * @see org.apache.wicket.request.IRequestTargetMounter#mount( * org.apache.wicket.request.target.coding.IRequestTargetUrlCodingStrategy) */ public void mount(IRequestTargetUrlCodingStrategy urlCodingStrategy) { defaultStrategy.mount(urlCodingStrategy); } /** * @see org.apache.wicket.request.IRequestTargetMounter#unmount(java.lang.String) */ public void unmount(String path) { defaultStrategy.unmount(path); } /** * @see org.apache.wicket.request.IRequestTargetMounter#urlCodingStrategyForPath(java.lang.String) */ public IRequestTargetUrlCodingStrategy urlCodingStrategyForPath(String path) { return defaultStrategy.urlCodingStrategyForPath(path); } /** * @see org.apache.wicket.request.IRequestTargetMounter#pathForTarget(org.apache.wicket.IRequestTarget) */ public CharSequence pathForTarget(IRequestTarget requestTarget) { return defaultStrategy.pathForTarget(requestTarget); } /** * @see org.apache.wicket.request.IRequestTargetMounter#targetForRequest(org.apache.wicket.request.RequestParameters) */ public IRequestTarget targetForRequest(RequestParameters requestParameters) { return defaultStrategy.targetForRequest(requestParameters); } private static class FakeRequest extends Request { private final Request request; /** The new URL with the locale removed */ private final String url; public FakeRequest(Request request, String url) { this.request = request; this.url = url; } @Override public Locale getLocale() { return request.getLocale(); } @Override public String getParameter(String key) { return request.getParameter(key); } @Override public Map getParameterMap() { return request.getParameterMap(); } @Override public String[] getParameters(String key) { return request.getParameters(key); } @Override public String getPath() { return url; } @Override public String getRelativePathPrefixToContextRoot() { return request.getRelativePathPrefixToContextRoot(); } @Override public String getRelativePathPrefixToWicketHandler() { return request.getRelativePathPrefixToWicketHandler(); } @Override public String getURL() { return url; } } }