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]>