/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.wicket.request.handler.render;
import org.apache.wicket.Application;
import org.apache.wicket.Session;
import org.apache.wicket.core.request.handler.IPageProvider;
import org.apache.wicket.core.request.handler.RenderPageRequestHandler;
import org.apache.wicket.core.request.handler.RenderPageRequestHandler.RedirectPolicy;
import org.apache.wicket.request.component.IRequestablePage;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.settings.RequestCycleSettings;
/**
* Delegate responsible for rendering the page. Depending on the implementation (web, test, portlet,
* etc.) the delegate may or may not support the redirect policy set in the
* {@link RenderPageRequestHandler}.
*
* @author Matej Knopp
*/
public abstract class PageRenderer
{
private final RenderPageRequestHandler renderPageRequestHandler;
/**
* Construct.
*
* @param renderPageRequestHandler
*/
public PageRenderer(RenderPageRequestHandler renderPageRequestHandler)
{
this.renderPageRequestHandler = renderPageRequestHandler;
}
/**
* @return page provider
*/
protected IPageProvider getPageProvider()
{
return renderPageRequestHandler.getPageProvider();
}
/**
* @return redirect policy
*/
protected RedirectPolicy getRedirectPolicy()
{
return renderPageRequestHandler.getRedirectPolicy();
}
/**
* @return the request handler
*/
protected RenderPageRequestHandler getRenderPageRequestHandler()
{
return renderPageRequestHandler;
}
/**
* @return page instance
*/
protected IRequestablePage getPage()
{
return getPageProvider().getPageInstance();
}
protected boolean isOnePassRender()
{
return Application.get().getRequestCycleSettings().getRenderStrategy() ==
RequestCycleSettings.RenderStrategy.ONE_PASS_RENDER;
}
protected boolean isRedirectToRender()
{
return Application.get().getRequestCycleSettings().getRenderStrategy() ==
RequestCycleSettings.RenderStrategy.REDIRECT_TO_RENDER;
}
protected boolean isRedirectToBuffer()
{
return Application.get().getRequestCycleSettings().getRenderStrategy() ==
RequestCycleSettings.RenderStrategy.REDIRECT_TO_BUFFER;
}
/**
* @return the current session id for stateful pages and <code>null</code> for stateless pages
*/
protected String getSessionId()
{
return Session.exists() ? Session.get().getId() : null;
}
/**
* @return whether the current session is temporary
*/
protected boolean isSessionTemporary()
{
return Session.exists() ? Session.get().isTemporary() : true;
}
/**
* When the page renders to buffer and it is still stateless after rendering, this flag
* determines whether the redirect will take place or not.
* <p>
* By default we will redirect. This is so we do not end up having the browser be on a listener
* URL. A simple scenario is calling {@code setResponsePage(new StatelessPage())} inside form's
* {@code onSubmit()} or link's {@code onClick()} callbacks, or any other request listener
* callback. What will happen is that the browser will be on URL like
* {@code ./wicket/page?0-2.IFormSubmitListener-form}, and we will not redirect - leaving the
* browser on such URL. This is a worse alternative then saving one redirect because it may
* cause problems if user presses the refresh button in the browser.
*
* @return redirect flag
*/
protected boolean enableRedirectForStatelessPage()
{
return true;
}
/**
* Render the response using give {@link RequestCycle}.
*
* @param requestCycle
*/
public abstract void respond(RequestCycle requestCycle);
}