package fr.openwide.core.wicket.more.request.cycle;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.cycle.RequestCycle;
import org.springframework.security.web.savedrequest.SavedRequest;
public final class RequestCycleUtils {
private static final String QUERY_STRING_SEPARATOR = "?";
public static final String SPRING_SECURITY_SAVED_REQUEST = "SPRING_SECURITY_SAVED_REQUEST";
public static String getCurrentRequestUrl() {
Request request = RequestCycle.get().getRequest();
if (!(request instanceof ServletWebRequest)) {
throw new IllegalStateException("Cannot be used in a non servlet environment");
}
ServletWebRequest servletWebRequest = (ServletWebRequest) request;
StringBuffer currentUrl = servletWebRequest.getContainerRequest().getRequestURL();
String queryString = servletWebRequest.getContainerRequest().getQueryString();
if (queryString != null) {
currentUrl.append(QUERY_STRING_SEPARATOR).append(queryString);
}
return currentUrl.toString();
}
public static HttpServletRequest getCurrentContainerRequest() {
Request request = RequestCycle.get().getRequest();
if (!(request instanceof ServletWebRequest)) {
throw new IllegalStateException("Cannot be used in a non servlet environment");
}
return ((ServletWebRequest) request).getContainerRequest();
}
public static HttpServletResponse getCurrentContainerResponse() {
// ici, on ne peut pas utiliser le même mécanisme qu'au dessus car la response peut aussi être
// une HeaderBufferingWebResponse et comme la classe est package protected, on est coincé...
Object containerResponse = RequestCycle.get().getResponse().getContainerResponse();
if (!(containerResponse instanceof HttpServletResponse)) {
throw new IllegalStateException("Cannot be used in a non servlet environment");
}
return ((HttpServletResponse) containerResponse);
}
public static String getSpringSecuritySavedRequest() {
String redirectUrl = null;
Object savedRequest = RequestCycleUtils.getCurrentContainerRequest().getSession().getAttribute(SPRING_SECURITY_SAVED_REQUEST);
if (savedRequest instanceof SavedRequest) {
redirectUrl = ((SavedRequest) savedRequest).getRedirectUrl();
}
RequestCycleUtils.getCurrentContainerRequest().getSession().removeAttribute(SPRING_SECURITY_SAVED_REQUEST);
return redirectUrl;
}
private RequestCycleUtils() {
}
}