/** * 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 org.brixcms.web.nodepage; import org.apache.wicket.core.request.handler.IPageProvider; import org.apache.wicket.core.request.handler.IPageRequestHandler; import org.apache.wicket.core.request.handler.RenderPageRequestHandler; import org.apache.wicket.model.IModel; 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.mapper.parameter.PageParameters; import org.brixcms.jcr.wrapper.BrixNode; public class BrixNodePageRequestHandler extends RenderPageRequestHandler implements IRequestHandler, IPageRequestHandler, PageParametersRequestHandler { // ------------------------------ FIELDS ------------------------------ private final IModel<BrixNode> node; private final PageFactory pageFactory; // --------------------------- CONSTRUCTORS --------------------------- public BrixNodePageRequestHandler(IModel<BrixNode> node, BrixNodeWebPage page) { super(new PageProviderAdapter(page), RedirectPolicy.NEVER_REDIRECT); this.node = node; this.pageFactory = null; } public BrixNodePageRequestHandler(IModel<BrixNode> node, PageFactory pageFactory) { super(new PageProviderAdapter(pageFactory), RedirectPolicy.NEVER_REDIRECT); this.node = node; this.pageFactory = pageFactory; } // --------------------- GETTER / SETTER METHODS --------------------- @Override public BrixNodeWebPage getPage() { return (BrixNodeWebPage) super.getPage(); } // ------------------------ INTERFACE METHODS ------------------------ // --------------------- Interface IRequestHandler --------------------- @Override public final void respond(IRequestCycle requestCycle) { // if (page == null) { // page = pageFactory.newPage(); // if (page.initialRedirect()) { // // if the page is newly created and initial redirect is set, we // // need to redirect to a hybrid URL // page.setStatelessHint(false); // Session.get().bind(); // // Session.get().touch(page); // requestCycle.scheduleRequestHandlerAfterCurrent(new // BrixNodeRequestHandler(page)); // return; // } // } respondWithInitialRedirectHandled(requestCycle); } @Override public void detach(IRequestCycle requestCycle) { super.detach(requestCycle); node.detach(); } // --------------------- Interface PageParametersRequestTarget // --------------------- @Override public BrixPageParameters getPageParameters() { if (pageFactory != null) { return pageFactory.getPageParameters(); } else { return getPage().getBrixPageParameters(); } } // -------------------------- OTHER METHODS -------------------------- protected void respondWithInitialRedirectHandled(IRequestCycle requestCycle) { // check if the listener invocation or something else hasn't changed the // request target if (RequestCycle.get().getActiveRequestHandler() == this) { super.respond(requestCycle); } } // -------------------------- INNER CLASSES -------------------------- public static interface PageFactory { public BrixNodeWebPage newPage(); public BrixPageParameters getPageParameters(); } private static class PageProviderAdapter implements IPageProvider { private BrixNodeWebPage page; private PageFactory factory; public PageProviderAdapter(PageFactory factory) { this.factory = factory; } public PageProviderAdapter(BrixNodeWebPage page) { this.page = page; } @Override public IRequestablePage getPageInstance() { if (page == null) { page = factory.newPage(); } return page; } @Override public PageParameters getPageParameters() { if (page != null) { return page.getPageParameters(); } else { return factory.getPageParameters(); } } @Override public boolean isNewPageInstance() { return page == null; } @Override public Class<? extends IRequestablePage> getPageClass() { return BrixNodeWebPage.class; } @Override public void detach() { if (page != null) page.detach(); } @Override public boolean hasPageInstance() { return page != null; } @Override public boolean isPageInstanceFresh() { return !hasPageInstance(); } @Override public Integer getPageId() { if (page != null) { return page.getPageId(); } return null; } @Override public Integer getRenderCount() { if (page != null) { return page.getRenderCount(); } return null; } @Override public boolean wasExpired() { return getPageId() != null && isPageInstanceFresh(); } } }