package com.rectang.xsm.wicket;
import com.rectang.xsm.Engine;
import com.rectang.xsm.Theme;
import com.rectang.xsm.io.XSMDocument;
import com.rectang.xsm.pages.XSMSession;
import com.rectang.xsm.site.DocumentPage;
import org.apache.velocity.VelocityContext;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.markup.IMarkupCacheKeyProvider;
import org.apache.wicket.markup.IMarkupResourceStreamProvider;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.StringResourceStream;
import java.io.StringWriter;
import java.util.Map;
/**
* A simple velocity panel that renders content from a velocity template instead of html markup.
* <p/>
* Copyright Kotikan Ltd 2011
* Created: 13/11/2011
*
* @author Andrew Williams
* @since 1.0
*/
public class VelocityPanel
extends Panel
implements IMarkupResourceStreamProvider, IMarkupCacheKeyProvider
{
public VelocityPanel( String id )
{
super( id );
}
public VelocityPanel( String id, IModel model )
{
super( id, model );
}
public VelocityPanel( String id, final String template )
{
super( id, new Model()
{
@Override
public String getObject()
{
return template;
}
} );
}
// TODO improve this "never cache" code with something that stores it until change needed...
public String getCacheKey( MarkupContainer markupContainer, Class aClass )
{
return null;
}
public IResourceStream getMarkupResourceStream( MarkupContainer markupContainer, Class aClass )
{
return new StringResourceStream( "<wicket:panel>" + evaluateVelocityTemplate() + "</wicket:panel>" );
}
/**
* Evaluates the template from our model and returns the result.
* @return the result of evaluating the velocity template
*/
private String evaluateVelocityTemplate()
{
XSMSession session = (XSMSession) getSession();
XSMDocument doc = null;
com.rectang.xsm.site.Page page = null;
if ( getPage() instanceof com.rectang.xsm.pages.cms.Page )
{
page = ((com.rectang.xsm.pages.cms.Page) getPage()).getXSMPage();
if ( page instanceof DocumentPage )
{
doc = XSMDocument.getXSMDoc( session.getSite(), (DocumentPage) page );
}
}
final Map<String, Object> map = Engine.getContext( doc, page, null, null, session.getSite(), "",
session.getUser() );
final VelocityContext context = new VelocityContext( map );
StringWriter out = new StringWriter();
try
{
// execute the velocity script and capture the output in writer
Engine.getVelocityEngine().evaluate( context, out, getClass().getSimpleName(), getDefaultModelObjectAsString() );
// replace the tag's body the Velocity output
return out.toString();
}
catch ( Exception e )
{
e.printStackTrace();
// TODO handle displaying this error for debug
return null;
}
}
}