You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by wg...@apache.org on 2006/03/15 05:11:46 UTC

svn commit: r385967 - in /jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime: ParserPool.java ParserPoolImpl.java RuntimeConstants.java RuntimeInstance.java RuntimeServices.java defaults/velocity.properties

Author: wglass
Date: Tue Mar 14 20:11:43 2006
New Revision: 385967

URL: http://svn.apache.org/viewcvs?rev=385967&view=rev
Log:
Change the Parser Pool to be an interface with a default implementation.  Thanks to Serge Knystautas for the idea and patch.  VELOCITY-433.

Added:
    jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/ParserPool.java
    jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/ParserPoolImpl.java
Modified:
    jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeConstants.java
    jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeInstance.java
    jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeServices.java
    jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/defaults/velocity.properties

Added: jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/ParserPool.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/ParserPool.java?rev=385967&view=auto
==============================================================================
--- jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/ParserPool.java (added)
+++ jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/ParserPool.java Tue Mar 14 20:11:43 2006
@@ -0,0 +1,45 @@
+package org.apache.velocity.runtime;
+
+import org.apache.velocity.runtime.parser.Parser;
+
+/*
+ * Copyright 2000-2006 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.
+ */
+
+/**
+ * Provides instances of parsers as needed.  get() will return a new parser if
+ * available.  If a parser is acquired from the pool, put() should be called
+ * with that parser to make it available again for reuse.
+ *
+ * @author <a href="mailto:sergek@lokitech.com">Serge Knystautas</a>
+ * @version $Id: RuntimeInstance.java 384374 2006-03-08 23:19:30Z nbubna $
+ */
+public interface ParserPool
+{
+    /**
+     * Initialize the pool so that it can begin serving parser instances.
+     */
+    void initialize(RuntimeServices svc);
+
+    /**
+     * Retrieve an instance of a parser pool.
+     */
+    Parser get();
+
+    /**
+     * Return the parser to the pool so that it may be reused.
+     */
+    void put(Parser parser);
+}

Added: jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/ParserPoolImpl.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/ParserPoolImpl.java?rev=385967&view=auto
==============================================================================
--- jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/ParserPoolImpl.java (added)
+++ jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/ParserPoolImpl.java Tue Mar 14 20:11:43 2006
@@ -0,0 +1,79 @@
+package org.apache.velocity.runtime;
+
+import org.apache.velocity.runtime.parser.Parser;
+import org.apache.velocity.util.SimplePool;
+
+/*
+ * Copyright 2000-2006 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.
+ */
+
+/**
+ * This wraps the original parser SimplePool class.  It also handles
+ * instantiating ad-hoc parsers if none are available.
+ *
+ * @author <a href="mailto:sergek@lokitech.com">Serge Knystautas</a>
+ * @version $Id: RuntimeInstance.java 384374 2006-03-08 23:19:30Z nbubna $
+ */
+public class ParserPoolImpl implements ParserPool {
+
+    RuntimeServices rsvc = null;
+    SimplePool pool = null;
+    int max = RuntimeConstants.NUMBER_OF_PARSERS;
+
+    /**
+     * Create the underlying "pool".
+     */
+    public void initialize(RuntimeServices rsvc)
+    {
+        this.rsvc = rsvc;
+        max = rsvc.getInt(RuntimeConstants.PARSER_POOL_SIZE, RuntimeConstants.NUMBER_OF_PARSERS);
+        pool = new SimplePool(max);
+
+        for (int i = 0; i < max; i++)
+        {
+            pool.put(rsvc.createNewParser());
+        }
+
+        if (rsvc.getLog().isDebugEnabled())
+        {
+            rsvc.getLog().debug("Created '" + max + "' parsers.");
+        }
+    }
+
+    /**
+     * Call the wrapped pool.  If none are available, it will create a new
+     * temporary one.
+     */
+    public Parser get()
+    {
+        Parser parser = (Parser) pool.get();
+        if (parser == null)
+        {
+            rsvc.getLog().debug("Created new " +
+                    "parser (pool exhausted).  Consider " +
+                    "increasing pool size.");
+            parser = rsvc.createNewParser();
+        }
+        return parser;
+    }
+
+    /**
+     * Call the wrapped pool.
+     */
+    public void put(Parser parser)
+    {
+        pool.put(parser);
+    }
+}

Modified: jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeConstants.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeConstants.java?rev=385967&r1=385966&r2=385967&view=diff
==============================================================================
--- jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeConstants.java (original)
+++ jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeConstants.java Tue Mar 14 20:11:43 2006
@@ -337,6 +337,14 @@
     public static final String UBERSPECT_CLASSNAME = "runtime.introspector.uberspect";
 
     /**
+     * The <code>parser.pool.class</code> property
+     * specifies the name of the {@link
+     * org.apache.velocity.util.SimplePool}
+     * implementation to use.
+     */
+    public static final String PARSER_POOL_CLASS = "parser.pool.class";
+
+    /**
      * @see #NUMBER_OF_PARSERS
      */
     public static final String PARSER_POOL_SIZE = "parser.pool.size";

Modified: jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeInstance.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeInstance.java?rev=385967&r1=385966&r2=385967&view=diff
==============================================================================
--- jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeInstance.java (original)
+++ jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeInstance.java Tue Mar 14 20:11:43 2006
@@ -46,7 +46,6 @@
 import org.apache.velocity.runtime.resource.ContentResource;
 import org.apache.velocity.runtime.resource.ResourceManager;
 import org.apache.velocity.util.ClassUtils;
-import org.apache.velocity.util.SimplePool;
 import org.apache.velocity.util.StringUtils;
 import org.apache.velocity.util.introspection.Introspector;
 import org.apache.velocity.util.introspection.Uberspect;
@@ -117,7 +116,7 @@
     /**
      * The Runtime parser pool
      */
-    private  SimplePool parserPool;
+    private  ParserPool parserPool;
 
     /**
      * Indicate whether the Runtime is in the midst of initialization.
@@ -813,23 +812,67 @@
 
     /**
      * Initializes the Velocity parser pool.
-     * This still needs to be implemented.
      */
     private void initializeParserPool()
+    throws Exception
     {
-        int numParsers = getInt(PARSER_POOL_SIZE, NUMBER_OF_PARSERS);
-
-        parserPool = new SimplePool(numParsers);
-
-        for (int i = 0; i < numParsers; i++)
+        /*
+         * Which parser pool?
+         */
+        String pp = getString(RuntimeConstants.PARSER_POOL_CLASS);
+        
+        if (pp != null && pp.length() > 0)
         {
-            parserPool.put(createNewParser());
+            /*
+             *  if something was specified, then make one.
+             *  if that isn't a ParserPool, consider
+             *  this a huge error and throw
+             */
+            
+            Object o = null;
+            
+            try
+            {
+                o = ClassUtils.getNewInstance( pp );
+            }
+            catch (ClassNotFoundException cnfe )
+            {
+                String err = "The specified class for ParserPool ("
+                    + pp
+                    + ") does not exist (or is not accessible to the current classloader.";
+                log.error(err);
+                throw new Exception(err);
+            }
+            
+            if (!(o instanceof ParserPool))
+            {
+                String err = "The specified class for ParserPool ("
+                    + pp
+                    + ") does not implement org.apache.velocity.runtime.ParserPool."
+                    + " Velocity not initialized correctly.";
+                
+                log.error(err);
+                throw new Exception(err);
+            }
+            
+            parserPool = (ParserPool) o;
+            
+            parserPool.initialize(this);
         }
-
-        if (log.isDebugEnabled())
+        else
         {
-            log.debug("Created '" + numParsers + "' parsers.");
+            /*
+             *  someone screwed up.  Lets not fool around...
+             */
+            
+            String err = "It appears that no class was specified as the"
+                + " ParserPool.  Please ensure that all configuration"
+                + " information is correct.";
+            
+            log.error(err);
+            throw new Exception( err );
         }
+        
     }
 
     /**
@@ -958,12 +1001,10 @@
             finally
             {
                 /*
-                 *  if this came from the pool, then put back
+                 *  put it back
                  */
-                if (!madeNew)
-                {
-                    parserPool.put(parser);
-                }
+                parserPool.put(parser);
+                
             }
         }
         else

Modified: jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeServices.java
URL: http://svn.apache.org/viewcvs/jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeServices.java?rev=385967&r1=385966&r2=385967&view=diff
==============================================================================
--- jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeServices.java (original)
+++ jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/RuntimeServices.java Tue Mar 14 20:11:43 2006
@@ -18,7 +18,6 @@
 
 import java.io.Reader;
 import java.util.Properties;
-
 import org.apache.commons.collections.ExtendedProperties;
 import org.apache.velocity.Template;
 import org.apache.velocity.app.event.EventCartridge;
@@ -27,6 +26,7 @@
 import org.apache.velocity.runtime.directive.Directive;
 import org.apache.velocity.runtime.log.Log;
 import org.apache.velocity.runtime.parser.ParseException;
+import org.apache.velocity.runtime.parser.Parser;
 import org.apache.velocity.runtime.parser.node.SimpleNode;
 import org.apache.velocity.runtime.resource.ContentResource;
 import org.apache.velocity.util.introspection.Introspector;
@@ -369,4 +369,8 @@
      */
     public boolean isInitialized();
 
+    /**
+     * Create a new parser instance.
+     */
+    public Parser createNewParser();
 }

Modified: jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/defaults/velocity.properties
URL: http://svn.apache.org/viewcvs/jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/defaults/velocity.properties?rev=385967&r1=385966&r2=385967&view=diff
==============================================================================
--- jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/defaults/velocity.properties (original)
+++ jakarta/velocity/engine/trunk/src/java/org/apache/velocity/runtime/defaults/velocity.properties Tue Mar 14 20:11:43 2006
@@ -120,6 +120,7 @@
 #----------------------------------------------------------------------------
 resource.manager.class = org.apache.velocity.runtime.resource.ResourceManagerImpl
 resource.manager.cache.class = org.apache.velocity.runtime.resource.ResourceCacheImpl
+parser.pool.class = org.apache.velocity.runtime.ParserPoolImpl
 
 
 #----------------------------------------------------------------------------



---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-dev-help@jakarta.apache.org