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