/*
* Copyright 2000-2004 The Apache Software Foundation.
*
* 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.apache.jetspeed.portal.controllers;
// Turbine stuff
import org.apache.turbine.modules.ActionLoader;
import org.apache.turbine.services.velocity.TurbineVelocity;
import org.apache.turbine.services.pull.TurbinePull;
import org.apache.turbine.util.RunData;
// Jetspeed stuff
import org.apache.jetspeed.services.TemplateLocator;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
// Ecs stuff
import org.apache.ecs.ConcreteElement;
import org.apache.ecs.StringElement;
// Velocity Stuff
import org.apache.velocity.context.Context;
/**
* A Velocity based portlet controller implementation
*
* @author <a href="mailto:re_carrasco@bco011.sonda.cl">Roberto Carrasco</a>
* @author <a href="mailto:raphael@apache.org">Rapha謖 Luta</a>
*
* @version $Id: VelocityPortletController.java,v 1.12 2004/02/23 03:25:06 jford Exp $
*/
public class VelocityPortletController extends AbstractPortletController
{
/**
* Static initialization of the logger for this class
*/
private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(VelocityPortletController.class.getName());
public ConcreteElement getContent( RunData rundata )
{
// create a blank context and with all the global application
// Pull Tools inside
Context context = TurbineVelocity.getContext();
context.put( "data", rundata );
context.put( "controller", this );
context.put( "portlets", this.getPortlets().toArray() );
context.put( "config", this.getConfig() );
context.put( "skin", this.getPortlets().getPortletConfig().getPortletSkin() );
context.put( "template", getConfig().getInitParameter("template") );
// Put the request and session based contexts
TurbinePull.populateContext(context, rundata);
// allow subclass to insert specific objects in the context
buildContext(rundata, context);
String actionName = getConfig().getInitParameter("action");
if (actionName != null)
{
// store the context so that the action can retrieve it
rundata.getTemplateInfo().setTemplateContext( "VelocityControllerContext", context );
// if there is an action with the same name in modules/actions/portlets exec it
try
{
ActionLoader.getInstance().exec( rundata, actionName );
}
catch( Exception e)
{
logger.error("Exception", e);
}
}
// either the action selected the template, or use the default template
// defined in the registry
String template = (String)context.get( "template" );
// generate the content
String s = "";
try
{
if (-1 == template.indexOf(".vm"))
{
template = template + ".vm";
}
String templatePath = TemplateLocator.locateControllerTemplate(rundata, template);
TurbineVelocity.handleRequest(context, templatePath, rundata.getOut());
}
catch( Exception e)
{
logger.error( "Error generating content: ", e );
s= e.toString();
}
TurbineVelocity.requestFinished(context);
return new StringElement( s );
}
public void buildContext(RunData data, Context context)
{
// nothing special
}
}