geirm       01/08/07 15:00:21

  Added:       src/java/org/apache/velocity/runtime RuntimeSingleton.java
  Log:
  Replaces the original Runtime class
  
  Revision  Changes    Path
  1.1                  
jakarta-velocity/src/java/org/apache/velocity/runtime/RuntimeSingleton.java
  
  Index: RuntimeSingleton.java
  ===================================================================
  package org.apache.velocity.runtime;
  
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000-2001 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 acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Velocity", and "Apache Software
   *    Foundation" 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"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 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/>.
   */
  
  import java.io.InputStream;
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.IOException;
  import java.io.Reader;
  
  import java.util.List;
  import java.util.ArrayList;
  import java.util.Map;
  import java.util.Hashtable;
  import java.util.Properties;
  import java.util.Stack;
  import java.util.Enumeration;
  import java.util.TreeMap;
  import java.util.Vector;
  
  import org.apache.log.Logger;
  
  import org.apache.velocity.Template;
  
  import org.apache.velocity.runtime.log.LogManager;
  import org.apache.velocity.runtime.log.LogSystem;
  
  import org.apache.velocity.runtime.parser.Parser;
  import org.apache.velocity.runtime.parser.ParseException;
  import org.apache.velocity.runtime.parser.node.SimpleNode;
  
  import org.apache.velocity.runtime.directive.Directive;
  import org.apache.velocity.runtime.VelocimacroFactory;
  
  import org.apache.velocity.runtime.resource.Resource;
  import org.apache.velocity.runtime.resource.ContentResource;
  import org.apache.velocity.runtime.resource.ResourceManager;
  
  import org.apache.velocity.util.SimplePool;
  import org.apache.velocity.util.StringUtils;
  
  import org.apache.velocity.exception.ResourceNotFoundException;
  import org.apache.velocity.exception.ParseErrorException;
  
  import org.apache.commons.collections.ExtendedProperties;
  
  /**
   * This is the Runtime system for Velocity. It is the
   * single access point for all functionality in Velocity.
   * It adheres to the mediator pattern and is the only
   * structure that developers need to be familiar with
   * in order to get Velocity to perform.
   *
   * The Runtime will also cooperate with external
   * systems like Turbine. Runtime properties can
   * set and then the Runtime is initialized.
   *
   * Turbine for example knows where the templates
   * are to be loaded from, and where the velocity
   * log file should be placed.
   *
   * So in the case of Velocity cooperating with Turbine
   * the code might look something like the following:
   *
   * <pre>
   * Runtime.setProperty(Runtime.FILE_RESOURCE_LOADER_PATH, templatePath);
   * Runtime.setProperty(Runtime.RUNTIME_LOG, pathToVelocityLog);
   * Runtime.init();
   * </pre>
   *
   * <pre>
   * -----------------------------------------------------------------------
   * N O T E S  O N  R U N T I M E  I N I T I A L I Z A T I O N
   * -----------------------------------------------------------------------
   * Runtime.init()
   * 
   * If Runtime.init() is called by itself the Runtime will
   * initialize with a set of default values.
   * -----------------------------------------------------------------------
   * Runtime.init(String/Properties)
   *
   * In this case the default velocity properties are layed down
   * first to provide a solid base, then any properties provided
   * in the given properties object will override the corresponding
   * default property.
   * -----------------------------------------------------------------------
   * </pre>
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Jason van Zyl</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Jeff Bowden</a>
   * @author <a href="mailto:[EMAIL PROTECTED]";>Geir Magusson Jr.</a>
   * @version $Id: RuntimeSingleton.java,v 1.1 2001/08/07 22:00:21 geirm Exp $
   */
  public class RuntimeSingleton implements RuntimeConstants
  {
      private static RuntimeInstance ri = new RuntimeInstance();
  
      /*
       * This is the primary initialization method in the Velocity
       * Runtime. The systems that are setup/initialized here are
       * as follows:
       * 
       * <ul>
       *   <li>Logging System</li>
       *   <li>ResourceManager</li>
       *   <li>Parser Pool</li>
       *   <li>Global Cache</li>
       *   <li>Static Content Include System</li>
       *   <li>Velocimacro System</li>
       * </ul>
       */
      public synchronized static void init()
          throws Exception
      {
          ri.init();
      }
  
      public static RuntimeServices getRuntimeServices()
      {
          return (RuntimeServices) ri;
      }
    
  
      /**
       * Allows an external system to set a property in
       * the Velocity Runtime.
       *
       * @param String property key
       * @param String property value
       */
      public static void setProperty(String key, Object value)
      {
          ri.setProperty( key, value );
      }        
  
      /**
       * Allow an external system to set an ExtendedProperties
       * object to use. This is useful where the external
       * system also uses the ExtendedProperties class and
       * the velocity configuration is a subset of
       * parent application's configuration. This is
       * the case with Turbine.
       *
       * @param ExtendedProperties configuration
       */
      public static void setConfiguration( ExtendedProperties configuration)
      {
          ri.setConfiguration( configuration );
      }
  
      /**
       * Add a property to the configuration. If it already
       * exists then the value stated here will be added
       * to the configuration entry. For example, if
       *
       * resource.loader = file
       *
       * is already present in the configuration and you
       *
       * addProperty("resource.loader", "classpath")
       *
       * Then you will end up with a Vector like the
       * following:
       *
       * ["file", "classpath"]
       *
       * @param String key
       * @param String value
       */
      public static void addProperty(String key, Object value)
      {
          ri.addProperty( key, value );
      }
      
      /**
       * Clear the values pertaining to a particular
       * property.
       *
       * @param String key of property to clear
       */
      public static void clearProperty(String key)
      {
          ri.clearProperty( key );
      }
      
      /**
       *  Allows an external caller to get a property.  The calling
       *  routine is required to know the type, as this routine
       *  will return an Object, as that is what properties can be.
       *
       *  @param key property to return
       */
      public static Object getProperty( String key )
      {
          return ri.getProperty( key );
      }
  
      /**
       * Initialize the Velocity Runtime with a Properties
       * object.
       *
       * @param Properties
       */
      public static void init(Properties p) throws Exception
      {
          ri.init(p);
      }
      
      /**
       * Initialize the Velocity Runtime with the name of
       * ExtendedProperties object.
       *
       * @param Properties
       */
      public static void init(String configurationFile)
          throws Exception
      {
          ri.init( configurationFile );
      }
  
      /**
       * Returns a JavaCC generated Parser.
       *
       * @return Parser javacc generated parser
       */
      private static Parser createNewParser()
      {
          return ri.createNewParser();
      }
  
      /**
       * Parse the input and return the root of
       * AST node structure.
       * <br><br>
       *  In the event that it runs out of parsers in the
       *  pool, it will create and let them be GC'd 
       *  dynamically, logging that it has to do that.  This
       *  is considered an exceptional condition.  It is
       *  expected that the user will set the 
       *  PARSER_POOL_SIZE property appropriately for their
       *  application.  We will revisit this.
       *
       * @param InputStream inputstream retrieved by a resource loader
       * @param String name of the template being parsed
       */
      public static SimpleNode parse( Reader reader, String templateName )
          throws ParseException
      {
          return ri.parse( reader, templateName );
      }
  
      /**
       *  Parse the input and return the root of the AST node structure.
       *
       * @param InputStream inputstream retrieved by a resource loader
       * @param String name of the template being parsed
       * @param dumpNamespace flag to dump the Velocimacro namespace for this template
       */
      public static SimpleNode parse( Reader reader, String templateName, boolean 
dumpNamespace )
          throws ParseException
      {
          return ri.parse( reader, templateName, dumpNamespace );
      }
      
   
      /**
       * Returns a <code>Template</code> from the resource manager.
       * This method assumes that the character encoding of the 
       * template is set by the <code>input.encoding</code>
       * property.  The default is "ISO-8859-1"
       *
       * @param name The file name of the desired template.
       * @return     The template.
       * @throws ResourceNotFoundException if template not found
       *          from any available source.
       * @throws ParseErrorException if template cannot be parsed due
       *          to syntax (or other) error.
       * @throws Exception if an error occurs in template initialization
       */
      public static Template getTemplate(String name)
          throws ResourceNotFoundException, ParseErrorException, Exception
      {
          return ri.getTemplate( name );
      }
  
      /**
       * Returns a <code>Template</code> from the resource manager
       *
       * @param name The  name of the desired template.
       * @param encoding Character encoding of the template
       * @return     The template.
       * @throws ResourceNotFoundException if template not found
       *          from any available source.
       * @throws ParseErrorException if template cannot be parsed due
       *          to syntax (or other) error.
       * @throws Exception if an error occurs in template initialization
       */
      public static Template getTemplate(String name, String  encoding)
          throws ResourceNotFoundException, ParseErrorException, Exception
      {
          return ri.getTemplate( name, encoding );
      }
  
      /**
       * Returns a static content resource from the
       * resource manager.  Uses the current value
       * if INPUT_ENCODING as the character encoding.
       *
       * @param name Name of content resource to get
       * @return parsed ContentResource object ready for use
       * @throws ResourceNotFoundException if template not found
       *          from any available source.
       */
      public static ContentResource getContent(String name)
          throws ResourceNotFoundException, ParseErrorException, Exception
      {
          return ri.getContent( name );
      }
  
      /**
       * Returns a static content resource from the
       * resource manager.
       *
       * @param name Name of content resource to get
       * @param encoding Character encoding to use
       * @return parsed ContentResource object ready for use
       * @throws ResourceNotFoundException if template not found
       *          from any available source.
       */
      public static ContentResource getContent( String name, String encoding )
          throws ResourceNotFoundException, ParseErrorException, Exception
      {
          return ri.getContent( name, encoding );
      }
  
  
      /**
       *  Determines is a template exists, and returns name of the loader that 
       *  provides it.  This is a slightly less hokey way to support
       *  the Velocity.templateExists() utility method, which was broken
       *  when per-template encoding was introduced.  We can revisit this.
       *
       *  @param resourceName Name of template or content resource
       *  @return class name of loader than can provide it
       */
      public static String getLoaderNameForResource( String resourceName )
      {
          return ri.getLoaderNameForResource( resourceName );
      }
  
      
      /**
       * Log a warning message.
       *
       * @param Object message to log
       */
      public static void warn(Object message)
      {
          ri.warn( message );
      }
      
      /** 
       * Log an info message.
       *
       * @param Object message to log
       */
      public static void info(Object message)
      {
          ri.info( message );
      }
      
      /**
       * Log an error message.
       *
       * @param Object message to log
       */
      public static void error(Object message)
      {
          ri.error( message );
      }
      
      /**
       * Log a debug message.
       *
       * @param Object message to log
       */
      public static void debug(Object message)
      {
          ri.debug( message );
      }
  
      /**
       * String property accessor method with default to hide the
       * configuration implementation.
       * 
       * @param String key property key
       * @param String defaultValue  default value to return if key not 
       *               found in resource manager.
       * @return String  value of key or default 
       */
      public static String getString( String key, String defaultValue)
      {
          return ri.getString( key, defaultValue );
      }
  
      /**
       * Returns the appropriate VelocimacroProxy object if strVMname
       * is a valid current Velocimacro.
       *
       * @param String vmName  Name of velocimacro requested
       * @return String VelocimacroProxy 
       */
      public static Directive getVelocimacro( String vmName, String templateName  )
      {
          return ri.getVelocimacro( vmName, templateName );
      }
  
     /**
       * Adds a new Velocimacro. Usually called by Macro only while parsing.
       *
       * @param String name  Name of velocimacro 
       * @param String macro  String form of macro body
       * @param String argArray  Array of strings, containing the 
       *                         #macro() arguments.  the 0th is the name.
       * @return boolean  True if added, false if rejected for some 
       *                  reason (either parameters or permission settings) 
       */
      public static boolean addVelocimacro( String name, 
                                            String macro, 
                                            String argArray[], 
                                            String sourceTemplate )
      {    
          return ri.addVelocimacro( name, macro, argArray, sourceTemplate );
      }
   
      /**
       *  Checks to see if a VM exists
       *
       * @param name  Name of velocimacro
       * @return boolean  True if VM by that name exists, false if not
       */
      public static boolean isVelocimacro( String vmName, String templateName )
      {
          return ri.isVelocimacro( vmName, templateName );
      }
  
      /**
       *  tells the vmFactory to dump the specified namespace.  This is to support
       *  clearing the VM list when in inline-VM-local-scope mode
       */
      public static boolean dumpVMNamespace( String namespace )
      {
          return ri.dumpVMNamespace( namespace );
      }
  
      /* --------------------------------------------------------------------
       * R U N T I M E  A C C E S S O R  M E T H O D S
       * --------------------------------------------------------------------
       * These are the getXXX() methods that are a simple wrapper
       * around the configuration object. This is an attempt
       * to make a the Velocity Runtime the single access point
       * for all things Velocity, and allow the Runtime to
       * adhere as closely as possible the the Mediator pattern
       * which is the ultimate goal.
       * --------------------------------------------------------------------
       */
  
      /**
       * String property accessor method to hide the configuration implementation
       * @param key  property key
       * @return   value of key or null
       */
      public static String getString(String key)
      {
          return ri.getString( key );
      }
  
      /**
       * Int property accessor method to hide the configuration implementation.
       *
       * @param String key property key
       * @return int value
       */
      public static int getInt( String key )
      {
          return ri.getInt( key );
      }
  
      /**
       * Int property accessor method to hide the configuration implementation.
       *
       * @param key  property key
       * @param int default value
       * @return int  value
       */
      public static int getInt( String key, int defaultValue )
      {
          return ri.getInt( key, defaultValue );
      }
  
      /**
       * Boolean property accessor method to hide the configuration implementation.
       * 
       * @param String key  property key
       * @param boolean default default value if property not found
       * @return boolean  value of key or default value
       */
      public static boolean getBoolean( String key, boolean def )
      {
          return ri.getBoolean( key, def );
      }
  
      /**
       * Return the velocity runtime configuration object.
       *
       * @return ExtendedProperties configuration object which houses
       *                       the velocity runtime properties.
       */
      public static ExtendedProperties getConfiguration()
      {
          return ri.getConfiguration();
      }        
  }
  
  
  

Reply via email to