/* * The contents of this file are subject to the Mozilla Public License Version 1.1 * (the "License"); you may not use this file except in compliance with the License. * You may obtain a copy of the License at . * * Software distributed under the License is distributed on an "AS IS" basis, WITHOUT * WARRANTY OF ANY KIND, either express or implied. See the License for the specific * language governing rights and limitations under the License. * * The Original Code is the Venice Web Communities System. * * The Initial Developer of the Original Code is Eric J. Bowersox , * for Silverwrist Design Studios. Portions created by Eric J. Bowersox are * Copyright (C) 2002-03 Eric J. Bowersox/Silverwrist Design Studios. All Rights Reserved. * * Contributor(s): */ package com.silverwrist.venice.content; import java.io.IOException; import org.apache.log4j.Logger; import org.w3c.dom.*; import com.silverwrist.util.xml.*; import com.silverwrist.dynamo.except.*; import com.silverwrist.dynamo.iface.*; import com.silverwrist.dynamo.util.*; import com.silverwrist.dynamo.velocity.VelocityRendererConfig; import com.silverwrist.venice.VeniceNamespaces; import com.silverwrist.venice.iface.*; import com.silverwrist.venice.util.*; public class StandardContentSupplier implements NamedObject, ComponentInitialize, ComponentShutdown, ServiceProvider, ContentBlockProvider, TextRenderer { /*-------------------------------------------------------------------------------- * Internal object implementing Velocity operations *-------------------------------------------------------------------------------- */ public class ContentOps { /*==================================================================== * Constructor *==================================================================== */ ContentOps() { // do nothing } // end constructor /*==================================================================== * External operations *==================================================================== */ public Object header1(String title) throws DatabaseException { ContentBlock rc = getContentBlock("content.header"); rc.setContentParameter("title",title); return rc; } // end header1 public Object header2(String title, String subtitle) throws DatabaseException { ContentBlock rc = getContentBlock("content.header"); rc.setContentParameter("title",title); rc.setContentParameter("subtitle",subtitle); return rc; } // end header1 } // end class ContentOps /*-------------------------------------------------------------------------------- * Static data members *-------------------------------------------------------------------------------- */ private Logger logger = Logger.getLogger(StandardContentSupplier.class); /*-------------------------------------------------------------------------------- * Attributes *-------------------------------------------------------------------------------- */ private String m_name = null; // name of the object private ObjectProvider m_blocks; // global blocks provider private ComponentShutdown m_shut_1; // shut down renderer private ComponentShutdown m_shut_2; // shut down Velocity object /*-------------------------------------------------------------------------------- * Constructor *-------------------------------------------------------------------------------- */ public StandardContentSupplier() { // do nothing } // end constructor /*-------------------------------------------------------------------------------- * Implementations from interface NamedObject *-------------------------------------------------------------------------------- */ public String getName() { return m_name; } // end getName /*-------------------------------------------------------------------------------- * Implementations from interface ComponentInitialize *-------------------------------------------------------------------------------- */ /** * Initialize the component. * * @param config_root Pointer to the section of the Dynamo XML configuration file that configures this * particular component. This is to be considered "read-only" by the component. * @param services An implementation of {@link com.silverwrist.dynamo.iface.ServiceProvider ServiceProvider} * which provides initialization services to the component. This will include an implementation * of {@link com.silverwrist.dynamo.iface.ObjectProvider ObjectProvider} which may be used to * get information about other objects previously initialized by the application. * @exception com.silverwrist.dynamo.except.ConfigException If an error is encountered in the component * configuration. */ public void initialize(Element config_root, ServiceProvider services) throws ConfigException { logger.info("StandardContentSupplier initializing"); XMLLoader loader = XMLLoader.get(); String gprops = null; try { // verify the right node name loader.verifyNodeName(config_root,"object"); // get the object's name m_name = loader.getAttribute(config_root,"name"); // get the name of the global properties object DOMElementHelper config_root_h = new DOMElementHelper(config_root); Element foo = loader.getSubElement(config_root_h,"global-properties"); gprops = loader.getAttribute(foo,"object"); } // end try catch (XMLLoadException e) { // error loading XML config data logger.fatal("XML loader exception in StandardContentSupplier",e); throw new ConfigException(e); } // end catch // Get the standard block provider. ServiceProvider gdm_sp = (ServiceProvider)(GetObjectUtils.getDynamoComponent(services,ServiceProvider.class,gprops)); try { // get the "blocks" service from that object m_blocks = (ObjectProvider)(gdm_sp.queryService(ObjectProvider.class,"blocks")); } // end try catch (NoSuchServiceException e) { // this shouldn't happen, but... logger.fatal("Unable to find global properties object \"" + gprops + "\"",e); throw new ConfigException(StandardContentSupplier.class,"ContentMessages","init.noBlock",e); } // end catch // Register this object as a renderer for some objects. RendererRegistration rr = (RendererRegistration)(services.queryService(RendererRegistration.class)); m_shut_1 = rr.registerRenderer(ErrorBox.class,this); // Add an object to the standard objects available to Velocity. VelocityRendererConfig vrcon = (VelocityRendererConfig)(services.queryService(VelocityRendererConfig.class)); m_shut_2 = vrcon.addStandardComponentInstance("content",new ContentOps()); } // end initialize /*-------------------------------------------------------------------------------- * Implementations from interface ComponentShutdown *-------------------------------------------------------------------------------- */ public void shutdown() { m_shut_2.shutdown(); m_shut_2 = null; m_shut_1.shutdown(); m_shut_1 = null; m_blocks = null; } // end shutdown /*-------------------------------------------------------------------------------- * Implementations from interface ServiceProvider *-------------------------------------------------------------------------------- */ /** * Queries this object for a specified service. * * @param klass The class of the object that should be returned as a service. * @return A service object. The service object is guaranteed to be of the class * specified by klass; that is, if queryService(klass) * yields some object x, then the expression klass.isInstance(x) * is true. * @exception com.silverwrist.dynamo.except.NoSuchServiceException If no service is available in * the specified class. */ public Object queryService(Class klass) { if (klass==ContentBlockProvider.class) return (ContentBlockProvider)this; throw new NoSuchServiceException(getName(),klass); } // end queryService /** * Queries this object for a specified service. * * @param klass The class of the object that should be returned as a service. * @param serviceid ID for the service to be requested, to further discriminate between requests. * @return A service object. The service object is guaranteed to be of the class * specified by klass; that is, if queryService(klass) * yields some object x, then the expression klass.isInstance(x) * is true. * @exception com.silverwrist.dynamo.except.NoSuchServiceException If no service is available in * the specified class. */ public Object queryService(Class klass, String serviceid) { if (klass==ContentBlockProvider.class) return (ContentBlockProvider)this; throw new NoSuchServiceException(getName(),klass,serviceid); } // end queryService /*-------------------------------------------------------------------------------- * Implementations from interface ContentBlockProvider *-------------------------------------------------------------------------------- */ public ContentBlock getContentBlock(String name) throws DatabaseException { try { // get the content block and wrap it in an object String block = m_blocks.getObject(VeniceNamespaces.CONTENT_LAF_NAMESPACE,name).toString(); return new StringTemplateContentBlock(block,name); } // end try catch (NoSuchObjectException e) { // unwrap the DatabaseException if there's one in there if (e.getCause() instanceof DatabaseException) throw (DatabaseException)(e.getCause()); else throw e; } // end catch } // end getContentBlock /*-------------------------------------------------------------------------------- * Implementations from interface TextRenderer *-------------------------------------------------------------------------------- */ public void render(Object obj, TextRenderControl control) throws IOException, RenderingException { if (obj instanceof ErrorBox) { // render an ErrorBox ErrorBox ebox = (ErrorBox)obj; try { // get the error box template out of the database ContentBlock blk = this.getContentBlock("error.box"); blk.setContentParameter("title",ebox.getTitle()); blk.setContentParameter("message",ebox.getMessage()); if (ebox.getException()!=null) blk.setContentParameter("except",ebox.getException()); if (ebox.getBackLink()!=null) { // set the "back" and "backtype" parameters blk.setContentParameter("backtype",ebox.getBackType()); blk.setContentParameter("back",ebox.getBackLink()); } // end if control.renderSubObject(blk); // render the block } // end try catch (DatabaseException e) { // translate this into a rendering exception RenderingException re = new RenderingException(StandardContentSupplier.class,"ContentMessages", "render.errorBox",e); re.setParameter(0,e.getMessage()); re.setParameter(1,ebox.getTitle()); re.setParameter(2,ebox.getMessage()); throw re; } // end catch } // end if } // end render } // end class StandardContentSupplier