Jason,

   I can back out the stuff if it upsets you that much.  No biggie.
        I will get on the IRC to clear things up. 

        But the caching mechanism is put in the DefaultResolver which
        can easily be not used.  I not changing stuff all over the place.
        Your architecture and design goals are well in tact.  Everthing
        is still decoupled--- If you don't want the cache in there now.
        fine.

        I didn't put the caching in help performance for me.  I did it
        so that we can keep moving on T3.  

        mike
        

On Thu, Nov 15, 2001 at 11:55:27AM -0500, Jason van Zyl wrote:
> On 11/15/01 10:58 AM, "[EMAIL PROTECTED]" <[EMAIL PROTECTED]> wrote:
> 
> > mikeh       01/11/15 07:58:34
> > 
> > Modified:    src/java/org/apache/turbine TurbineConstants.java
> >              src/java/org/apache/turbine/pipeline DefaultResolver.java
> > Added:       src/java/org/apache/turbine/util DoubleKeyCache.java
> > Log:
> > Adding a caching mechanism to the DefaultResolver.  Since the resolver
> > is the single entry point to get templates and modules, caching is
> > best done there.  I will remove the incomplete caching in the ModuleLoader.
> 
> What the hell are you doing?!?
> 
> I don't care if the caching mechanism isn't the most efficient. There is
> still a lot of work to be done before performance is even an issue.
> 
> You said you needed to add some stuff, fine. Don't start changing stuff all
> over the place and adding properties and changing the ways things work. Yes,
> I am very protective because I've spent an inordinate amount of time
> decoupling everything and you're putting utility code back into Turbine. Not
> good.
> 
> Bottom line is I don't give a rats ass if people are trying to use this in
> production. That's your problem. I warned people, and that's too bad if it
> doesn't perform as you need. The performance is the last thing that's
> required.
> 
> I'm a huge -1 on the last round of commits. Back them out.
>  
> > The TR props for the resolver are now:
> > resolver.default= org.apache.turbine.pipeline.DefaultResolver
> > resolver.cache.template = false
> > resolver.cache.module   = false
> > 
> > Added a very simple class to handle the double key caching required by
> > both templates and modules.
> > 
> > Revision  Changes    Path
> > 1.7       +5 -0  
> > jakarta-turbine-3/src/java/org/apache/turbine/TurbineConstants.java
> > 
> > Index: TurbineConstants.java
> > ===================================================================
> > RCS file: 
> > 
> /home/cvs/jakarta-turbine-3/src/java/org/apache/turbine/TurbineConstants.jav
> a,> v
> > retrieving revision 1.6
> > retrieving revision 1.7
> > diff -u -r1.6 -r1.7
> > --- TurbineConstants.java    2001/11/13 19:45:08    1.6
> > +++ TurbineConstants.java    2001/11/15 15:58:33    1.7
> > @@ -124,6 +124,11 @@
> >       */
> >      public static final String RESOLVER = "resolver.default";
> >  
> > +    /**
> > +     * what will the resolver cache (replaces the <module.cache> property)
> > +     */
> > +    public static final String RESOLVER_MODULE_CACHE =
> > "resolver.cache.module";
> > +    public static final String RESOLVER_TEMPLATE_CACHE =
> > "resolver.cache.template";
> >  
> >      /**
> >       * JDBC database driver.
> > 
> > 
> > 
> > 1.4       +107 -18
> > jakarta-turbine-3/src/java/org/apache/turbine/pipeline/DefaultResolver.java
> > 
> > Index: DefaultResolver.java
> > ===================================================================
> > RCS file: 
> > /home/cvs/jakarta-turbine-3/src/java/org/apache/turbine/pipeline/DefaultResolv
> > er.java,v
> > retrieving revision 1.3
> > retrieving revision 1.4
> > diff -u -r1.3 -r1.4
> > --- DefaultResolver.java    2001/11/13 21:35:44    1.3
> > +++ DefaultResolver.java    2001/11/15 15:58:33    1.4
> > @@ -62,10 +62,13 @@
> >  import java.util.List;
> >  import java.util.Iterator;
> >  import org.apache.turbine.Turbine;
> > +import org.apache.turbine.TurbineConstants;
> >  import org.apache.turbine.Log;
> >  import org.apache.turbine.Resolver;
> >  import org.apache.turbine.modules.Module;
> >  
> > +import org.apache.turbine.util.DoubleKeyCache;
> > +
> >  // Given a target template
> >  
> >  // 1. find all possible classes that could be used
> > @@ -116,6 +119,14 @@
> >     for finding, caching, and serving up modules.  That functionaly
> >     should be placed in the pluggable resolver.  I'll leave it for now so
> >     to make the changes more gradually.
> > +
> > +   subclasses can override findTemplate and findModule to
> > +   use a different algorithm, while using the caching mechanism
> > +   of the DefaultResolver
> > +
> > +   subclasses should override getTemplate and getModule if they
> > +   wish to use a different caching mechanism
> > +
> >  */
> >  
> >  /**
> > @@ -123,39 +134,124 @@
> >   *
> >   * @author <a href="mailto:[EMAIL PROTECTED]";>Jason van Zyl</a>
> >   * @author <a href="mailto:[EMAIL PROTECTED]";>Mike Haberman</a>
> > - * @version $Id: DefaultResolver.java,v 1.3 2001/11/13 21:35:44 mikeh Exp $
> > + * @version $Id: DefaultResolver.java,v 1.4 2001/11/15 15:58:33 mikeh Exp $
> >   */
> >  
> >  public class DefaultResolver
> > -       implements Resolver
> > +       implements Resolver,
> > +                  TurbineConstants
> >  {
> >      String defaultTemplate;
> >  
> > +    boolean doTemplateCache;
> > +    boolean doModuleCache;
> > +
> > +    DoubleKeyCache templateCache;
> > +    DoubleKeyCache moduleCache;
> > +
> >      public void init()
> >          throws Exception
> >      {
> >          defaultTemplate =
> > -         Turbine.getConfiguration().getString("template.default") + "." +
> > -         Turbine.getConfiguration().getString("template.default.extension");
> > +            Turbine.getConfiguration().getString("template.default") +
> > +            "." +
> > +            
> > Turbine.getConfiguration().getString("template.default.extension");
> >  
> > -        if (defaultTemplate.indexOf('/') == -1)
> > +        //
> > +        // insist that the default template starts with a '/'
> > +        //
> > +        int idx = defaultTemplate.indexOf('/');
> > +        if (idx == -1 || idx > 0)
> >          {
> >              defaultTemplate = "/" + defaultTemplate;
> >          }
> > +
> > +        //
> > +        // set up the cache
> > +        //
> > +        String value;
> > +        value = Turbine.getConfiguration().getString(RESOLVER_TEMPLATE_CACHE,
> > +                                                     "false");
> > +        doTemplateCache = Boolean.valueOf(value).booleanValue();
> > +
> > +        value = Turbine.getConfiguration().getString(RESOLVER_MODULE_CACHE,
> > +                                                     "false");
> > +        doModuleCache = Boolean.valueOf(value).booleanValue();
> > +
> > +        Log.debug("DefaultResolver: default template " + defaultTemplate);
> > +        Log.debug("DefaultResolver: cache templates " + doTemplateCache);
> > +        Log.debug("DefaultResolver: cache modules " + doModuleCache);
> > +
> > +        if (doTemplateCache)
> > +        {
> > +            templateCache = new DoubleKeyCache();
> > +        }
> >  
> > -        Log.debug("DefaultResolver: default template is " + defaultTemplate);
> > +        if (doModuleCache)
> > +        {
> > +            moduleCache = new DoubleKeyCache();
> > +        }
> >      }
> >  
> >      /**
> > +     * Get the qualified template name
> >       * Used for resolving top level rendering process.
> > +     * For turbine classic edition,
> > +     * moduleType is one of (layouts, screens, navigations)
> >       */
> >      public String getTemplate(String moduleType, String targetTemplate)
> >          throws Exception
> >      {
> > +        if (! doTemplateCache)
> > +        {
> > +            return findTemplate(moduleType, targetTemplate);
> > +        }
> > +
> >          //
> > -        // TODO: add caching here
> > +        //  caching is on
> >          //
> > +        String template = (String)templateCache.get(moduleType,
> > targetTemplate);
> > +        if (template == null)
> > +        {
> > +           template = findTemplate(moduleType, targetTemplate);
> > +           templateCache.put(moduleType, targetTemplate, template);
> > +        }
> > +        return template;
> > +    }
> >  
> > +    /**
> > +     * Get an instance of a module
> > +     *
> > +     * For turbine classic edition, type is one of (actions, screens)
> > +     * @param String name
> > +     * @param String type
> > +     * @return Module
> > +     */
> > +    public Module getModule(String type, String name)
> > +        throws Exception
> > +    {
> > +        if (! doModuleCache)
> > +        {
> > +            return findModule(type, name);
> > +        }
> > +
> > +        //
> > +        //  caching is on
> > +        //
> > +        Module module = (Module)moduleCache.get(type, name);
> > +        if (module == null)
> > +        {
> > +           module = findModule(type, name);
> > +           moduleCache.put(type, name, module);
> > +        }
> > +        return module;
> > +    }
> > +
> > +
> > +    protected String findTemplate(String moduleType, String targetTemplate)
> > +        throws Exception
> > +    {
> > +
> >          StringBuffer sb = new StringBuffer();
> >          int i = PipelineUtil.parseTemplatePath(targetTemplate, sb);
> >          Iterator j = getPossibleTemplates(sb.toString());
> > @@ -234,20 +330,13 @@
> >          return packages.iterator();
> >      }
> >  
> > -    /**
> > -     * Get an instance of a module
> > -     *
> > -     * @param String name
> > -     * @param String type
> > -     * @return Module
> > -     */
> > -    public Module getModule(String type, String name)
> > +    protected Module findModule(String type, String name)
> >          throws Exception
> >      {
> > +        //
> >          // just use the module loader's default algorithm
> > -        // for this pass
> > -        // eventually that functionality should be put
> > -        // in the resolver.
> > +        // perhaps that code should be put here
> > +        //
> >          return Turbine.getModuleLoader().getModule(type,name);
> >      }
> >  }
> > 
> > 
> > 
> > 1.1              
> > jakarta-turbine-3/src/java/org/apache/turbine/util/DoubleKeyCache.java
> > 
> > Index: DoubleKeyCache.java
> > ===================================================================
> > package org.apache.turbine.util;
> > 
> > /* ====================================================================
> >  * The Apache Software License, Version 1.1
> >  *
> >  * Copyright (c) 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 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 Turbine" 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 Turbine", 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/>.
> >  */
> > 
> > import java.util.Map;
> > import org.apache.commons.collections.FastHashMap;
> > 
> > 
> > /**
> >  * This class is used to handle template and module caching--
> >  * each requires a double hash to get the value
> >  * e.g  map.get(moduleType, templateName)
> >  *
> >  * we can add more methods as they are needed
> >  *
> >  * @author <a href="mailto:[EMAIL PROTECTED]";>Mike Haberman</a>
> >  * @version $Id: DoubleKeyCache.java,v 1.1 2001/11/15 15:58:33 mikeh Exp $
> >  */
> > 
> > 
> > public class DoubleKeyCache
> > {
> >     Map map = null;
> > 
> >     public DoubleKeyCache()
> >     {
> >         // map must be a synchronized data structure
> >         map = new FastHashMap();
> >     }
> > 
> >     public Object put(Object key1, Object key2, Object value)
> >     {
> >         Map table = (Map) map.get(key1);
> >         if (table == null)
> >         {
> >            table = new FastHashMap();
> >            map.put(key1, table);
> >         }
> >         return table.put(key2, value);
> >     }
> > 
> >     public Object get(Object key1, Object key2)
> >     {
> >         Map table = (Map) map.get(key1);
> >         if (table == null)
> >         {
> >            return null;
> >         }
> >         return table.get(key2);
> >     }
> > }
> > 
> > 
> > 
> > 
> > --
> > To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
> > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
> 
> -- 
> 
> jvz.
> 
> Jason van Zyl
> 
> http://tambora.zenplex.org
> http://jakarta.apache.org/turbine
> http://jakarta.apache.org/velocity
> http://jakarta.apache.org/alexandria
> http://jakarta.apache.org/commons
> 
> 
> 
> --
> To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

-- 
-------------------------------------------------
I am Vinz, Vinz Clortho.  Keymaster of Gozer,
Volguus Zildrohar, Lord of the Sebouillia.
Are you the Gatekeeper?
-------------------------------------------------

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to