weaver 2004/01/12 10:17:46
Added: portal/src/java/org/apache/jetspeed/velocity
JetspeedPowerTool.java
Log:
Velocity tool the simplifies common, repetitive tasks while hiding implementation
details
Can easily be used in JSPs or custom tags.
Revision Changes Path
1.1
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/velocity/JetspeedPowerTool.java
Index: JetspeedPowerTool.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache Jetspeed" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache",
* "Apache Jetspeed", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.jetspeed.velocity;
import java.io.IOException;
import java.util.List;
import javax.portlet.PortletConfig;
import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jetspeed.aggregator.ContentDispatcher;
import org.apache.jetspeed.cps.CommonPortletServices;
import org.apache.jetspeed.cps.template.Template;
import org.apache.jetspeed.cps.template.TemplateLocator;
import org.apache.jetspeed.cps.template.TemplateLocatorException;
import org.apache.jetspeed.cps.template.TemplateLocatorService;
import org.apache.jetspeed.om.page.Fragment;
import org.apache.jetspeed.om.page.Page;
import org.apache.jetspeed.services.entity.PortletEntityAccess;
import org.apache.jetspeed.util.JetspeedObjectID;
import org.apache.pluto.Constants;
import org.apache.pluto.om.entity.PortletEntity;
import org.apache.velocity.context.Context;
import org.apache.velocity.io.VelocityWriter;
import org.apache.velocity.tools.view.context.ViewContext;
import org.apache.velocity.tools.view.tools.ViewTool;
/**
* <p>
* JetspeedPowerTool
* </p>
* <p>
* The JetspeedPowerTool is meant to be used by template designers to build
* templates for internal Jetspeed portlet applications. It hides the
implementation
* details of the more common template actions so that future changes to said
implementation
* have minimal effect on template.
* </p>
* <p>
* Where applicable, methods have been marked with a <strong>BEST PRATICES</strong>
* meaning that this method should be used instead the synonymous code listed
within the
* method docuementation.
* </p>
* <p>
* <pre>
* Toolbox configuration for Velocity tool box:
* <tool>
* <key>jetspeed</key>
*
* <scope>request</scope>
* <class>org.apache.jetspeed.velocity.JetspeedPowerTool</class>
* </tool>
</pre></p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">Scott T. Weaver</a>
* @version $Id: JetspeedPowerTool.java,v 1.1 2004/01/12 18:17:46 weaver Exp $
*
*/
public class JetspeedPowerTool implements ViewTool
{
public static final String DISPATCHER_ATTR = "dispatcher";
private static final String COLUMNS_ATTR = "columns";
public static final String PAGE_ATTR = "page";
public static final String FRAGMENT_ATTR = "fragment";
public static final String HIDDEN = "hidden";
private RenderRequest renderRequest;
private RenderResponse renderResponse;
private PortletConfig portletConfig;
private ViewContext viewCtx;
private static final Log log = LogFactory.getLog(JetspeedPowerTool.class);
/**
* Empty constructor DO NOT USE!!!! This is only here to allow creation of the
* via the Velocity Tool Box. For proper use out side the tool box use @see
#JetspeedPowerTool(javax.portlet.RenderRequest, javax.portlet.RenderResponse,
javax.portlet.PortletConfig)
*/
public JetspeedPowerTool()
{
super();
}
/**
* This is here to make this tool easily useable in any
* templating environment including JSPs
* @param request Current PortletRequest
*/
public JetspeedPowerTool(RenderRequest request, RenderResponse resp,
PortletConfig config)
{
this();
renderRequest = request;
renderResponse = resp;
portletConfig = config;
}
/**
* @see org.apache.velocity.tools.view.tools.ViewTool#init(java.lang.Object)
*/
public void init(Object obj)
{
Context ctx = null;
if (obj instanceof ViewContext)
{
ViewContext viewContext = (ViewContext) obj;
this.viewCtx = viewContext;
ctx = viewContext.getVelocityContext();
setRequest((RenderRequest) ctx.get("renderRequest"));
}
else if (obj instanceof PortletRequest)
{
RenderRequest request = (RenderRequest) obj;
ctx = (Context)
request.getAttribute(JetspeedVelocityViewServlet.VELOCITY_CONTEXT_ATTR);
setRequest(request);
}
else
{
throw new IllegalArgumentException("Was expecting " + ViewContext.class
+" or " + PortletRequest.class);
}
renderRequest = (RenderRequest) ctx.get(Constants.PORTLET_REQUEST);
renderResponse = (RenderResponse) ctx.get(Constants.PORTLET_RESPONSE);
portletConfig = (PortletConfig) ctx.get(Constants.PORTLET_CONFIG);
}
/**
* @param request
*/
private void setRequest(RenderRequest request)
{
this.renderRequest = request;
}
/**
*
* @return
*/
public Fragment getCurrentFragment()
{
checkState();
return (Fragment) renderRequest.getAttribute(FRAGMENT_ATTR);
}
/**
*
* @param f
*/
public void setCurrentFragment(Fragment f)
{
checkState();
renderRequest.setAttribute(FRAGMENT_ATTR, f);
}
/**
*
* @return
*/
public Page getPage()
{
checkState();
return (Page) renderRequest.getAttribute(PAGE_ATTR);
}
/**
*
* @return
*/
public List[] getColumns()
{
checkState();
return (List[]) renderRequest.getAttribute(COLUMNS_ATTR);
}
/**
*
* @return
*/
public PortletEntity getCurrentPortletEntity()
{
PortletEntity portletEntity =
PortletEntityAccess.getEntity(JetspeedObjectID.createFromString(getCurrentFragment().getId()));
return portletEntity;
}
/**
*
* @param f Fragment whose <code>PortletEntity</code> we want to retreive.
* @return The PortletEntity represented by the current fragment.
*/
public PortletEntity getPortletEntity(Fragment f)
{
PortletEntity portletEntity =
PortletEntityAccess.getEntity(JetspeedObjectID.createFromString(f.getId()));
return portletEntity;
}
/**
* This method is synonymous with the following code:
* <p>
* <code>
* ContentDispatcher dispatcher = (ContentDispatcher)
renderRequest.getAttribute("dispatcher");<br />
* </code>
* </p>
* @see org.apache.jetspeed.aggregator.ContentDispatcher
* <strong>BEST PRACTICE:</strong> Use this method in templates instead of
* directly using the equivalent code defined above.
* @return ContentDispatcher for the RenderRequest
*/
public ContentDispatcher getContentDispatcher()
{
checkState();
return (ContentDispatcher) renderRequest.getAttribute(DISPATCHER_ATTR);
}
/**
* Checks the the visibilty of this fragment with respect to the current
RenderReqeust.
* @param f Fragment
* @return whether or not the Fragment in question should be considered
visible during rendering.
*/
public boolean isHidden(Fragment f)
{
checkState();
if (f == null)
{
throw new IllegalArgumentException("Fragment cannot be null for
isHidden(Fragment)");
}
return f.getState() != null && f.getState().equals(HIDDEN);
}
/**
* Retreives a template using Jetspeed's @see
org.apache.jetspeed.cps.template.TemplateLocatorService
*
*
* @param path Expected to the template. This may actually be changed by the
TL service
* based the capability and localization information provided by the client.
* @return Template object containng the pertinent information required to
inlcude the
* request template path in the current response
* @throws TemplateLocatorException if the <code>path</code> does not exist.
*/
public Template getTemplate(String path) throws TemplateLocatorException
{
checkState();
try
{
TemplateLocatorService tls =
(TemplateLocatorService)
CommonPortletServices.getPortalService(TemplateLocatorService.SERVICE_NAME);
TemplateLocator locator = tls.createLocator("layout");
locator.setName(path);
Template template = tls.locateTemplate(locator);
return template;
}
catch (TemplateLocatorException e)
{
log.error("Unable to locate template: " + path, e);
System.out.println("Unable to locate template: " + path);
throw e;
}
}
/**
* Includes a portal Fragment into the current <code>RenderResponse.</code>
* This is the same as calling:
* <p>
* <code>
* ContentDispatcher dispatcher = (ContentDispatcher)
renderRequest.getAttribute("dispatcher");<br />
* dispatcher.include(fragment, renderRequest, renderResponse);<br />
* </code>
* </p>
* <strong>BEST PRACTICE:</strong> Use this method in templates instead of
* directly using the equivalent code defined above.
* @param f Fragment to include.
* @throws IOException
*/
public void include(Fragment f) throws IOException
{
checkState();
// We need to flush so that content gets render in the correct place
if(viewCtx != null)
{
VelocityWriter vw = (VelocityWriter)
viewCtx.getVelocityContext().get(JetspeedVelocityViewServlet.VELOCITY_WRITER_ATTR);
vw.flush();
}
getContentDispatcher().include(f, renderRequest, renderResponse);
}
// public String include(String template) throws IOException
// {
//
// // RequestDispatcher dispatcher =
viewCtx.getRequest().getRequestDispatcher(template);
// StringWriter buf = new StringWriter();
// try
// {
// Velocity.mergeTemplate(template, "UTF-8",
viewCtx.getVelocityContext(), buf);
// }
// catch (Exception e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// }
/**
*
*/
public void flush() throws IOException
{
checkState();
// ((RenderResponse)renderResponse ).flushBuffer();
viewCtx.getResponse().getWriter().flush();
}
/**
*
*
* @throws java.lang.IllegalStateException if the <code>PortletConfig</code>,
<code>RenderRequest</code> or
* <code>RenderReponse</code> is null.
*/
private void checkState()
{
if(portletConfig == null || renderRequest == null || renderResponse == null)
{
throw new IllegalStateException("JetspeedPowerTool has not been
properly initialized. "+ "" +
"The
JetspeedPowerTool generally only usuable during the rendering phase of "+
"internal
portlet applications.");
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]