at.molindo.wicketutils.utils.WicketUtils.java Source code

Java tutorial

Introduction

Here is the source code for at.molindo.wicketutils.utils.WicketUtils.java

Source

/**
 * Copyright 2010 Molindo GmbH
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package at.molindo.wicketutils.utils;

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.LinkedHashMap;
import java.util.List;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.wicket.Application;
import org.apache.wicket.Page;
import org.apache.wicket.RuntimeConfigurationType;
import org.apache.wicket.Session;
import org.apache.wicket.ThreadContext;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.core.request.handler.BookmarkablePageRequestHandler;
import org.apache.wicket.markup.html.link.AbstractLink;
import org.apache.wicket.markup.html.link.ExternalLink;
import org.apache.wicket.mock.MockWebRequest;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.http.RequestUtils;
import org.apache.wicket.protocol.http.request.WebClientInfo;
import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
import org.apache.wicket.protocol.http.servlet.ServletWebResponse;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Response;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.component.IRequestablePage;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.request.http.handler.RedirectRequestHandler;
import org.apache.wicket.request.mapper.parameter.INamedParameters.NamedPair;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import org.apache.wicket.util.lang.Classes;

import at.molindo.thirdparty.org.apache.http.client.utils.URIUtils;

public final class WicketUtils {
    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(WicketUtils.class);

    private WicketUtils() {
        // no instance
    }

    public static Class<? extends IRequestablePage> getBookmarkablePage(final RequestCycle cycle) {
        if (cycle == null) {
            return null;
        }

        final IRequestHandler handler = cycle.getActiveRequestHandler();
        if (handler instanceof BookmarkablePageRequestHandler) {
            return ((BookmarkablePageRequestHandler) handler).getPageClass();
        }

        return null;
    }

    public static boolean isBookmarkableRequest(final URL url) {
        return getBookmarkableRequestHandler(url) != null;
    }

    public static Class<? extends IRequestablePage> getBookmarkablePage(final URL url) {
        final BookmarkablePageRequestHandler handler = getBookmarkableRequestHandler(url);
        return handler == null ? null : handler.getPageClass();
    }

    /**
     * @deprecated use {@link #getBookmarkableRequestHandler(URL)}
     */
    @Deprecated
    public static BookmarkablePageRequestHandler getBookmarkableRequestTarget(final URL url) {
        return getBookmarkableRequestHandler(url);
    }

    public static BookmarkablePageRequestHandler getBookmarkableRequestHandler(final URL url) {
        final IRequestHandler handler = getRequestHandler(url);
        if (handler instanceof BookmarkablePageRequestHandler) {
            return (BookmarkablePageRequestHandler) handler;
        } else {
            return null;
        }
    }

    /**
     * @deprecated use {@link #getRequestHandler(URL)}
     */
    @Deprecated
    public static IRequestHandler getRequestTarget(final URL url) {
        return getRequestHandler(url);
    }

    public static IRequestHandler getRequestHandler(final URL url) {
        if (url != null) {
            MockWebRequest request = new MockWebRequest(Url.parse(url.toString()));

            return Application.get().getRootRequestMapper().mapRequest(request);
        } else {
            return null;
        }
    }

    public static AbstractLink getBookmarkableRefererLink(final String id, final IModel<String> labelModel) {
        final String referer = getReferer();
        if (referer == null) {
            return null;
        }
        try {
            if (isBookmarkableRequest(new URL(referer))) {
                return new ExternalLink(id, new Model<String>(referer), labelModel);
            }
        } catch (final MalformedURLException e) {
            log.warn("malformed referer url: " + referer + " (" + e.toString() + ")");
        }
        return null;
    }

    public static String getReferer() {
        return getHttpServletRequest().getHeader("Referer");
    }

    // public static class UrlRequest extends Request {
    // private final ValueMap params = new ValueMap();
    //
    // private final Request realRequest;
    //
    // private final URL url;
    //
    // /**
    // * Construct.
    // *
    // * @param realRequest
    // * @param url
    // */
    // public UrlRequest(final Request realRequest, final URL url) {
    // this.realRequest = realRequest;
    // this.url = url;
    //
    // final String query = url.getQuery();
    // if (query != null) {
    // RequestUtils.decodeParameters(query, params);
    // }
    // }
    //
    // /**
    // * @see org.apache.wicket.Request#getLocale()
    // */
    // @Override
    // public Locale getLocale() {
    // return realRequest.getLocale();
    // }
    //
    // /**
    // * @see org.apache.wicket.Request#getParameter(java.lang.String)
    // */
    // @Override
    // public String getParameter(final String key) {
    // return (String) params.get(key);
    // }
    //
    // /**
    // * @see org.apache.wicket.Request#getParameterMap()
    // */
    // @SuppressWarnings({ "unchecked", "rawtypes" })
    // @Override
    // public Map getParameterMap() {
    // return params;
    // }
    //
    // /**
    // * @see org.apache.wicket.Request#getParameters(java.lang.String)
    // */
    // @Override
    // public String[] getParameters(final String key) {
    // final String param = (String) params.get(key);
    // if (param != null) {
    // return new String[] { param };
    // }
    // return new String[0];
    // }
    //
    // /**
    // * @see org.apache.wicket.Request#getPath()
    // */
    // @Override
    // public String getPath() {
    // String path = url.getPath();
    // if (path.startsWith("/")) {
    // path = path.substring(1);
    // }
    // return path;
    // }
    //
    // @Override
    // public String getRelativePathPrefixToContextRoot() {
    // throw new NotImplementedException();
    // }
    //
    // @Override
    // public String getRelativePathPrefixToWicketHandler() {
    // throw new NotImplementedException();
    // }
    //
    // /**
    // * @see org.apache.wicket.Request#getURL()
    // */
    // @Override
    // public String getURL() {
    // return url.toString();
    // }
    //
    // @Override
    // public String getQueryString() {
    // return realRequest.getQueryString();
    // }
    // }

    public static String getRequested() {
        final HttpServletRequest req = getHttpServletRequest();
        final StringBuilder buf = new StringBuilder();
        buf.append(req.getServletPath());
        final String path = req.getPathInfo();
        if (path != null) {
            buf.append(path);
        }
        final String query = req.getQueryString();
        if (query != null) {
            buf.append("?").append(query);
        }
        return buf.toString();
    }

    /**
     * @return may return null
     */
    public static HttpServletRequest getHttpServletRequest() {
        return getHttpServletRequest(getRequest());
    }

    public static HttpServletRequest getHttpServletRequest(Request request) {
        Object cr = request != null ? request.getContainerRequest() : null;
        return cr instanceof HttpServletRequest ? (HttpServletRequest) cr : null;
    }

    /**
     * @return may return null
     */
    public static HttpServletResponse getHttpServletResponse() {
        return getHttpServletResponse(getResponse());
    }

    public static HttpServletResponse getHttpServletResponse(Response response) {
        Object cr = response != null ? response.getContainerResponse() : null;
        return cr instanceof HttpServletResponse ? (HttpServletResponse) cr : null;
    }

    /**
     * @return may return null
     */
    public static HttpSession getHttpSession() {
        HttpServletRequest r = getHttpServletRequest();
        return r == null ? null : r.getSession();
    }

    public static String getRemoteAddr() {
        return getHttpServletRequest().getRemoteAddr();
    }

    public static String getRequestParameter(final String name) {
        return getHttpServletRequest().getParameter(name);
    }

    /**
     * @return may return null
     */
    public static Request getRequest() {
        final RequestCycle rc = RequestCycle.get();
        return rc == null ? null : rc.getRequest();
    }

    /**
     * @return may return null
     */
    public static WebRequest getWebRequest() {
        final Request request = getRequest();
        return request instanceof WebRequest ? (WebRequest) request : null;
    }

    /**
     * @return may return null
     */
    public static ServletWebRequest getServletWebRequest() {
        final Request request = getRequest();
        return request instanceof ServletWebRequest ? (ServletWebRequest) request : null;
    }

    /**
     * @deprecated use {@link RequestCycle#get()}
     */
    @Deprecated
    public static RequestCycle getWebRequestCycle() {
        return RequestCycle.get();
    }

    /**
     * @return may return null
     */
    public static Response getResponse() {
        final RequestCycle rc = RequestCycle.get();
        return rc == null ? null : rc.getResponse();
    }

    /**
     * @return may return null
     */
    public static WebResponse getWebResponse() {
        final Response response = getResponse();
        return response instanceof WebResponse ? (WebResponse) response : null;
    }

    public static ServletWebResponse getServletWebResponse() {
        final Response response = getResponse();
        return response instanceof ServletWebResponse ? (ServletWebResponse) response : null;
    }

    public static boolean isHttps() {
        return "https".equalsIgnoreCase(getHttpServletRequest().getScheme());
    }

    public static Cookie getCookie(final String name) {
        final Cookie[] cookies = getHttpServletRequest().getCookies();
        if (cookies == null) {
            return null;
        }
        for (final Cookie c : cookies) {
            if (name.equals(c.getName())) {
                return c;
            }
        }
        return null;
    }

    public static void deleteCookie(final String name) {
        final Cookie c = new Cookie(name, "");
        c.setMaxAge(0);
        getHttpServletResponse().addCookie(c);
    }

    public static String getHeader(final String name) {
        final HttpServletRequest r = getHttpServletRequest();
        return r == null ? null : r.getHeader(name);
    }

    public static WebClientInfo getClientInfo() {
        return (WebClientInfo) Session.get().getClientInfo();
    }

    public static String getUserAgent() {
        final WebClientInfo info = getClientInfo();
        return info == null ? null : info.getUserAgent();
    }

    /**
     * @return true if cookies are disabled, false if unknown
     */
    public static boolean isCookiesDisabled() {
        final WebClientInfo info = getClientInfo();
        return info == null || info.getProperties() == null ? false : !info.getProperties().isCookiesEnabled();

    }

    public static String getClientInfoString() {
        final WebClientInfo info = getClientInfo();
        return info == null ? null : info.getUserAgent() + " (" + info.getProperties().getRemoteAddress() + ")";
    }

    public static String getRequestContextPath() {
        final HttpServletRequest r = getHttpServletRequest();
        if (r == null) {
            return null;
        }
        try {
            final URL url = new URL(r.getRequestURL().toString());
            final StringBuilder buf = new StringBuilder(100);

            buf.append(url.getProtocol()).append("://").append(url.getHost());
            if (url.getPort() != -1) {
                buf.append(":").append(url.getPort());
            }
            return buf.append(r.getContextPath()).toString();
        } catch (final MalformedURLException e) {
            throw new WicketRuntimeException("client sent an illegal url?", e);
        }

    }

    public static String getHost() {
        final HttpServletRequest r = getHttpServletRequest();
        if (r == null) {
            return null;
        }
        try {
            return new URL(r.getRequestURL().toString()).getHost();
        } catch (final MalformedURLException e) {
            throw new WicketRuntimeException("client sent an illegal url?", e);
        }
    }

    /**
     * @deprecated bad naming, use {@link #toUrl(Class)} instead
     */
    @Deprecated
    public static String toAbsolutePath(final Class<? extends Page> pageClass) {
        return toUrl(pageClass, null).toString();
    }

    /**
     * @deprecated bad naming, use {@link #toUrl(Class, PageParameters)} instead
     */
    @Deprecated
    public static String toAbsolutePath(final Class<? extends Page> pageClass, final PageParameters parameters) {
        return toUrl(pageClass, parameters).toString();
    }

    public static URL toUrl(final Class<? extends Page> pageClass) {
        return toUrl(pageClass, null);
    }

    public static URL toUrl(final Class<? extends Page> pageClass, final PageParameters params) {
        try {
            String relativePagePath = RequestCycle.get().urlFor(pageClass, params).toString();
            URL requestUrl = new URL(getHttpServletRequest().getRequestURL().toString());
            URI resolved = URIUtils.resolve(requestUrl.toURI(), relativePagePath);
            return resolved.toURL();
        } catch (MalformedURLException e) {
            throw new WicketRuntimeException("failed to create URL", e);
        } catch (URISyntaxException e) {
            throw new WicketRuntimeException("failed to create URL", e);
        }
    }

    public static void performTemporaryRedirect(String targetURL) {
        performRedirect(targetURL, HttpServletResponse.SC_MOVED_TEMPORARILY);
    }

    public static void performPermanentRedirect(String targetURL) {
        performRedirect(targetURL, HttpServletResponse.SC_MOVED_PERMANENTLY);
    }

    public static void performRedirect(final String targetURL, final int statusCode) {
        ThreadContext.getRequestCycle()
                .scheduleRequestHandlerAfterCurrent(new RedirectRequestHandler(targetURL, statusCode));
    }

    public static void performRedirect(final Class<? extends Page> pageClass, final PageParameters parameters,
            final int statusCode) {
        performRedirect(toAbsolutePath(pageClass, parameters), statusCode);
    }

    /**
     * @return <code>true</code> if header "Wicket-Ajax" is set
     * @see ServletWebRequest#isAjax()
     */
    public static boolean isAjax() {
        Request req = getRequest();
        if (req instanceof ServletWebRequest) {
            return ((ServletWebRequest) req).isAjax();
        } else {
            return false;
        }
    }

    public static boolean isDeployment() {
        return RuntimeConfigurationType.DEPLOYMENT.equals(Application.get().getConfigurationType());
    }

    public static LinkedHashMap<String, Object> toMap(PageParameters params) {
        int indexed = params.getIndexedCount();
        List<NamedPair> named = params.getAllNamed();

        LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>((indexed + named.size()) * 2);

        for (int i = 0; i < indexed; i++) {
            String index = Integer.toString(i);
            Object value = params.get(i).to(Object.class);

            Object prev = map.put(index, value);
            if (prev != null) {
                map.put(index, merge(prev, value));
            }
        }

        for (NamedPair p : named) {
            map.put(p.getKey(), p.getValue());
        }

        return map;
    }

    private static Object[] merge(Object objectOrObjectArray, Object object) {
        if (objectOrObjectArray.getClass().isArray()) {
            Object[] array = (Object[]) objectOrObjectArray;
            Object[] copy = new Object[array.length + 1];
            System.arraycopy(array, 0, copy, 0, array.length);
            copy[array.length] = object;
            return copy;
        } else {
            return new Object[] { objectOrObjectArray, object };
        }
    }

    /**
     * replacement for {@link Classes}.resolveClass(String)
     * 
     * @param <T>
     *            class type
     * @param className
     *            Class to resolve
     * @return Resolved class
     */
    @SuppressWarnings("unchecked")
    public static <T> Class<T> resolveClass(final String className) {
        if (className == null) {
            return null;
        }
        try {
            if (Application.exists()) {
                return (Class<T>) Application.get().getApplicationSettings().getClassResolver()
                        .resolveClass(className);
            }
            return (Class<T>) Class.forName(className);
        } catch (ClassNotFoundException e) {
            log.warn("Could not resolve class: " + className);
            return null;
        }
    }

    /**
     * replacement for {@link RequestUtils}.toAbsolutePath(String)
     * 
     * Calculates absolute path to url relative to another absolute url.
     * 
     * @param relativePagePath
     *            path, relative to requestPath
     * @return absolute path for given url
     */
    public final static String toAbsolutePath(final String relativePagePath) {
        return RequestUtils.toAbsolutePath(getHttpServletRequest().getRequestURL().toString(), relativePagePath);
    }

    public static CssResourceReference css(Class<?> scope) {
        return css(scope, scope.getSimpleName() + ".css");
    }

    public static CssResourceReference css(Class<?> scope, String name) {
        return new CssResourceReference(scope, name);
    }

    public static CssResourceBehavior cssBehavior(Class<?> scope, String media) {
        return new CssResourceBehavior(scope, media);
    }

    public static CssResourceBehavior cssBehavior(Class<?> scope, String name, String media) {
        return new CssResourceBehavior(scope, name, media);
    }

    public static JavaScriptResourceReference js(Class<?> scope) {
        return js(scope, scope.getSimpleName() + ".js");
    }

    public static JavaScriptResourceReference js(Class<?> scope, String name) {
        return new JavaScriptResourceReference(scope, name);
    }

    public static JavaScriptResourceBehavior jsBehavior(Class<?> scope) {
        return new JavaScriptResourceBehavior(scope);
    }

    public static JavaScriptResourceBehavior jsBehavior(Class<?> scope, String name) {
        return new JavaScriptResourceBehavior(scope, name);
    }

}