/*
* 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.core.request.handler;
import org.apache.wicket.Application;
import org.apache.wicket.Session;
import org.apache.wicket.core.request.handler.logger.PageLogData;
import org.apache.wicket.request.ILoggableRequestHandler;
import org.apache.wicket.request.IRequestCycle;
import org.apache.wicket.request.IRequestHandler;
import org.apache.wicket.request.component.IRequestablePage;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.handler.render.PageRenderer;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.lang.Args;
/**
* {@link IRequestHandler} that renders page instance. Depending on the <code>redirectPolicy</code>
* flag and current request strategy the handler either just renders the page to the response, or
* redirects to render the page. <code>REDIRECT_TO_BUFFER</code> strategy is also supported.
* <p>
*
* @author Matej Knopp
*/
public class RenderPageRequestHandler
implements
IPageRequestHandler,
IPageClassRequestHandler,
ILoggableRequestHandler
{
private final IPageProvider pageProvider;
private final RedirectPolicy redirectPolicy;
private PageLogData logData;
/**
* Determines whether Wicket does a redirect when rendering a page
*
* @author Matej Knopp
*/
public enum RedirectPolicy {
/**
* Always redirect if current request URL is different than page URL.
*/
ALWAYS_REDIRECT,
/**
* Never redirect - always render the page to current response.
*/
NEVER_REDIRECT,
/**
* Redirect if necessary. The redirect will happen when all of the following conditions are
* met:
* <ul>
* <li>current request URL is different than page URL
* <li>page is not stateless or (page is stateless and session is not temporary)
* <li>render strategy is either REDIRECT_TO_BUFFER or REDIRECT_TO_RENDER
* </ul>
*/
AUTO_REDIRECT
}
/**
* Constructor.
*
* @param pageClass The class of the page to render
*/
public RenderPageRequestHandler(final Class<? extends IRequestablePage> pageClass)
{
this(pageClass, null);
}
/**
* Constructor.
*
* @param pageClass The class of the page to render
* @param parameters Wrapped query string parameters.
*/
public RenderPageRequestHandler(final Class<? extends IRequestablePage> pageClass, final PageParameters parameters)
{
this(new PageProvider(pageClass, parameters));
}
/**
* Constructor.
*
* @param page The page to render
*/
public RenderPageRequestHandler(final IRequestablePage page)
{
this(new PageProvider(page));
}
/**
* Construct. Renders the page with a redirect if necessary.
*
* @param pageProvider
*/
public RenderPageRequestHandler(IPageProvider pageProvider)
{
this(pageProvider, RedirectPolicy.AUTO_REDIRECT);
}
/**
* Construct.
*
* @param pageProvider
* @param redirectPolicy
*/
public RenderPageRequestHandler(IPageProvider pageProvider, RedirectPolicy redirectPolicy)
{
Args.notNull(pageProvider, "pageProvider");
Args.notNull(redirectPolicy, "redirectPolicy");
this.redirectPolicy = redirectPolicy;
this.pageProvider = pageProvider;
if (pageProvider.hasPageInstance())
{
if (Session.exists())
{
// WICKET-5499
Session.get().getPageManager().touchPage(pageProvider.getPageInstance());
}
}
}
/**
* @return page provider
*/
public IPageProvider getPageProvider()
{
return pageProvider;
}
/**
* @return redirect policy
*/
public RedirectPolicy getRedirectPolicy()
{
return redirectPolicy;
}
@Override
public Class<? extends IRequestablePage> getPageClass()
{
return pageProvider.getPageClass();
}
@Override
public Integer getPageId()
{
return pageProvider.getPageId();
}
@Override
public PageParameters getPageParameters()
{
return pageProvider.getPageParameters();
}
@Override
public void detach(IRequestCycle requestCycle)
{
if (logData == null)
logData = new PageLogData(pageProvider);
pageProvider.detach();
}
@Override
public PageLogData getLogData()
{
return logData;
}
@Override
public IRequestablePage getPage()
{
return pageProvider.getPageInstance();
}
@Override
public void respond(IRequestCycle requestCycle)
{
PageRenderer renderer = Application.get().getPageRendererProvider().apply(this);
renderer.respond((RequestCycle)requestCycle);
}
@Override
public final boolean isPageInstanceCreated()
{
return pageProvider.hasPageInstance();
}
@Override
public final Integer getRenderCount()
{
return pageProvider.getRenderCount();
}
}