/*
* Copyright 2000-2001,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.
*/
/*
* PortletAction.java
*
*
* $Id: PortletAction.java,v 1.8.2.1 2003/02/24 18:45:42 tkuebler Exp $
*
* Created on January 29, 2003, 2:52 PM
*/
package org.apache.jetspeed.modules.actions.portlets;
import org.apache.jetspeed.portal.Portlet;
import org.apache.jetspeed.portal.portlets.GenericMVCPortlet;
import org.apache.jetspeed.util.PortletSessionState;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;
/**
*
* Abstract holder for the portlet specific methods required above and
* beyond the standard turbine action.
*
* Extends the PortletActionEvent, which
* encapsulates the event handling feature.
*
* @author tkuebler
* @author <a href="mailto:weaver@apache.org">Scott T. Weaver</a>
* @version $Id: PortletAction.java,v 1.8.2.1 2003/02/24 18:45:42 tkuebler Exp $
* @stereotype moment-interval
*
*/
/*
* Note:
* assumes a templated portlet, maybe should break this up into two classes
* the portletaction would only have the build*Context methods
* the templatedportletaction would have the rest
* skipping this complexity for now since non-templated portlet actions can just
* extend ActionEvent and forget about the context probably
*/
public abstract class PortletAction
extends PortletActionEvent
{
/** Creates a new instance of PortletAction */
public PortletAction()
{
}
public void doPerform(RunData data)
throws Exception
{
// assumes a context for the portlet...
// should check for null and create one
doPerform(data, getContext(data));
}
/**
* You SHOULD override this method and implement it in your
* action.
*
* @param data Turbine information.
* @param context Context for web pages.
* @exception Exception, a generic exception.
*/
public abstract void doPerform(RunData data, Context context)
throws Exception;
/**
* Return the Context
*
* @param RunData data
* @return Context, a context for web pages.
*/
protected Context getContext(RunData data)
{
return (Context) data.getTemplateInfo().getTemplateContext("VelocityPortletContext");
}
/**
* This method is used when you want to short circuit an Action
* and change the template that will be executed next. The TTL
* for this is a single request.
*
* @param data Turbine information.
* @param template The template that will be executed next.
*/
public void setTemplate(RunData data, String template)
{
setTemplate(data, template, false);
}
/**
* This method is used when you want to short circuit an Action
* and change the template that will be executed next. If
* the <code>persistent</code> attribute is set to <i>true</i>
* the template value is stored in the portlet's session state
* and will be used until a new value has been set, either within
* portlet session or within the context. Regardless of the
* value of <code>persistent</code>, the context will ALWAYS
* have the correct "template" attribute set within.
*
* @param data Turbine information.
* @param template The template that will be executed next.
* @param persistent whether or not to make the template set
* persistent for the extent of the portlet session
* @author <a href="mailto:weaver@apache.org">Scott T. Weaver</a>
*/
public void setTemplate(RunData data, String template, boolean persistent)
{
Portlet portlet = getPortlet(getContext(data));
if (template != null)
{
if (persistent)
{
PortletSessionState.setAttribute(
portlet,
data,
GenericMVCPortlet.TEMPLATE,
template);
}
else
{
// Make sure there is no ssession residue ;)
resetTemplate(data);
}
// Always make the current template is available within the
// context.
getContext(data).put("template", template);
}
}
/**
* Clears the PortletSessionState of the <code>template</code>
* attribute.
*/
protected void resetTemplate(RunData data)
{
Portlet portlet = getPortlet(getContext(data));
PortletSessionState.clearAttribute(portlet, data, GenericMVCPortlet.PORTLET);
}
public Portlet getPortlet(Context context)
{
return (Portlet) context.get(GenericMVCPortlet.PORTLET);
}
/**
* Retrieves the template for this PortletAction's Portlet.
* The Portlet <code>init()</code> will have already initialized
* the template value within the current context in this order:<br/>
* 1. From the PortletSessionState's "template" attribute <br />
* 2. From the PortletConfig's "template" parameter.<br /><br />
* However, the action may have overriden this value using
* any of the <code>setTemplate()</code> methods.
* @param Context context the context for this action's portlet.
* @return String Current view template for this action's portlet.
* @author <a href="mailto:weaver@apache.org">Scott T. Weaver</a>
*/
public String getTemplate(Context context)
{
return (String) context.get(GenericMVCPortlet.TEMPLATE);
}
protected abstract void buildConfigureContext(Portlet portlet, Context context, RunData data)
throws Exception;
protected abstract void buildMaximizedContext(Portlet portlet, Context context, RunData data)
throws Exception;
protected abstract void buildNormalContext(Portlet portlet, Context context, RunData data)
throws Exception;
}