/*
This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2011 Servoy BV
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation; either version 3 of the License, or (at your option) any
later version.
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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along
with this program; if not, see http://www.gnu.org/licenses or write to the Free
Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
*/
package com.servoy.j2db.server.headlessclient;
import org.apache.wicket.AbortException;
import org.apache.wicket.Page;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.Response;
import org.apache.wicket.RestartResponseAtInterceptPageException;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.protocol.http.ClientProperties;
import org.apache.wicket.protocol.http.PageExpiredException;
import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.protocol.http.WebRequest;
import org.apache.wicket.protocol.http.WebRequestCycle;
import org.apache.wicket.protocol.http.request.InvalidUrlException;
import org.apache.wicket.protocol.http.request.WebClientInfo;
import org.apache.wicket.request.ClientInfo;
import org.slf4j.MDC;
import com.servoy.j2db.J2DBGlobals;
import com.servoy.j2db.util.Debug;
import com.servoy.j2db.util.Settings;
import com.servoy.j2db.util.Utils;
/**
* The {@link WebRequestCycle} implementation that for setting up the right thread locals and handling errors.
*
* @author jcompagner
*
* @since 6.1
*/
public final class ServoyRequestCycle extends WebRequestCycle
{
public static final void set(RequestCycle requestCycle)
{
RequestCycle.set(requestCycle);
}
/**
* @param application
* @param request
* @param response
*/
ServoyRequestCycle(WebApplication application, WebRequest request, Response response)
{
super(application, request, response);
}
/**
* @see wicket.RequestCycle#onBeginRequest()
*/
@SuppressWarnings("nls")
@Override
protected void onBeginRequest()
{
WebClientSession webClientSession = (WebClientSession)getSession();
WebClient webClient = webClientSession.getWebClient();
if (webClient != null)
{
if (webClient.getSolution() != null)
{
MDC.put("clientid", webClient.getClientID());
MDC.put("solution", webClient.getSolution().getName());
}
J2DBGlobals.setServiceProvider(webClient);
webClient.onBeginRequest(webClientSession);
}
}
/**
* @see wicket.RequestCycle#onEndRequest()
*/
@SuppressWarnings("nls")
@Override
protected void onEndRequest()
{
J2DBGlobals.setServiceProvider(null);
WebClientSession webClientSession = (WebClientSession)getSession();
WebClient webClient = webClientSession.getWebClient();
if (webClient != null)
{
try
{
webClient.onEndRequest(webClientSession);
}
finally
{
MDC.remove("clientid");
MDC.remove("solution");
}
}
}
/**
* @see org.apache.wicket.protocol.http.WebRequestCycle#newClientInfo()
*/
@Override
protected ClientInfo newClientInfo()
{
// We will always do a redirect here. The servoy browser info has to make one.
WebClientInfo webClientInfo = new WebClientInfo(this);
ClientProperties cp = webClientInfo.getProperties();
if (cp.isBrowserInternetExplorer() || cp.isBrowserMozilla() || cp.isBrowserKonqueror() || cp.isBrowserOpera() || cp.isBrowserSafari() ||
cp.isBrowserChrome())
{
if (cp.isBrowserInternetExplorer() && cp.getBrowserVersionMajor() != -1 && cp.getBrowserVersionMajor() < 7)
{
// IE6 is no longer supported when anchoring is enabled.
boolean enableAnchoring = Utils.getAsBoolean(Settings.getInstance().getProperty("servoy.webclient.enableAnchors", Boolean.TRUE.toString())); //$NON-NLS-1$
if (enableAnchoring)
{
throw new RestartResponseException(new UnsupportedBrowserPage("Internet Explorer 6")); //$NON-NLS-1$
}
}
Page page = getResponsePage();
if (page != null)
{
throw new RestartResponseAtInterceptPageException(new ServoyBrowserInfoPage(urlFor(page).toString().replaceAll("../", ""))); //$NON-NLS-1$ //$NON-NLS-2$
}
else
{
throw new RestartResponseAtInterceptPageException(new ServoyBrowserInfoPage(getRequest().getURL()));
}
}
return webClientInfo;
}
/**
* @see org.apache.wicket.RequestCycle#onRuntimeException(org.apache.wicket.Page, java.lang.RuntimeException)
*/
@Override
public Page onRuntimeException(Page page, RuntimeException e)
{
if (e instanceof PageExpiredException || e instanceof InvalidUrlException)
{
if (((WebRequest)RequestCycle.get().getRequest()).isAjax())
{
Debug.log("ajax request with exception aborted ", e); //$NON-NLS-1$
throw new AbortException();
}
}
if (page instanceof MainPage && ((MainPage)page).getController() != null)
{
Debug.error("Error rendering the page " + ((MainPage)page).getController().getName(), e); //$NON-NLS-1$
}
else
{
Debug.error("Error rendering the page " + page, e); //$NON-NLS-1$
}
return super.onRuntimeException(page, e);
}
}