/* * HeadsUp Agile * Copyright 2009-2012 Heads Up Development Ltd. * * 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/>. */ package org.headsupdev.agile.web; import org.headsupdev.agile.storage.StorageThread; import org.apache.wicket.util.tester.BaseWicketTester; import org.apache.wicket.util.tester.ITestPageSource; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.*; import org.apache.wicket.session.ISessionStore; import org.apache.wicket.application.IClassResolver; import org.apache.wicket.protocol.http.WebApplication; import org.apache.wicket.protocol.http.WebRequest; import org.apache.wicket.protocol.http.HttpSessionStore; import java.io.Serializable; import org.headsupdev.agile.api.Manager; import org.headsupdev.agile.web.wicket.HeadsUpPageRequestTargetUrlCodingStrategy; /** * TODO document me * * @author Andrew Williams * @since 1.0 */ public abstract class RenderUtil implements Serializable { public static final String PANEL_ID = "testpanel"; private static IClassResolver resolver; public static void setClassResolver( IClassResolver resolver ) { RenderUtil.resolver = resolver; } public static Class getPageClass( String hint ) { return ApplicationPageMapper.get().getPageClass( hint ); } public String getRenderedContent() { final StringBuilder out = new StringBuilder(); final Object wait = new Serializable(){}; new StorageThread() { public void runWithSession() { try { BaseWicketTester tester = new BaseWicketTester( new TestApplication() ); tester.getApplication().getMarkupSettings().setStripWicketTags( true ); tester.startPage( new ITestPageSource() { public Page getTestPage() { return new TestPage( getPanel() ); } }); out.append( tester.getServletResponse().getDocument() ); } catch ( Exception e ) { out.append( "<p>Error rendering content - " ); out.append( e.getMessage() ); out.append( "</p>" ); } finally { synchronized( wait ) { wait.notifyAll(); } } } }.start(); while ( out.length() == 0 ) { try { synchronized( wait ) { wait.wait(); } } catch ( InterruptedException e ) { // got the content - if not just try again } } return out.toString().replace( "\"resources/", "\"/resources/" ); } public abstract Panel getPanel(); static class TestPage extends WebPage { public TestPage( Panel testPanel ) { add( testPanel ); } } static class TestApplication extends WebApplication implements Serializable { protected void init() { super.init(); getApplicationSettings().setClassResolver( resolver ); for ( String url : ApplicationPageMapper.get().getMountPaths() ) { if ( !url.equals( "" ) ) { mount( new HeadsUpPageRequestTargetUrlCodingStrategy( url, ApplicationPageMapper.get().getPageClass( url ) ) { public CharSequence encode(IRequestTarget requestTarget) { return "/" + super.encode(requestTarget); } } ); } } } public String getConfigurationType() { return DEPLOYMENT; } public Class getHomePage() { return ApplicationPageMapper.get().getPageClass( "" ); } public RequestCycle newRequestCycle( Request request, Response response ) { return new HibernateRequestCycle( this, (WebRequest) request, response ) { public Page onRuntimeException( Page page, RuntimeException e ) { Manager.getLogger( getClass().getName() ).error( "Error rendering static page", e ); return super.onRuntimeException( page, e ); } }; } @Override protected ISessionStore newSessionStore() { return new HttpSessionStore( this ); } @Override public Session newSession( Request request, Response response ) { return new HeadsUpSession( request ); } } }