Author: mrdon
Date: Mon Nov 13 12:29:41 2006
New Revision: 474497

URL: http://svn.apache.org/viewvc?view=rev&rev=474497
Log:
Changed template engines to be lazily loaded
WW-1498

Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/TemplateEngineManager.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/TemplateEngineManager.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/TemplateEngineManager.java?view=diff&rev=474497&r1=474496&r2=474497
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/TemplateEngineManager.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/template/TemplateEngineManager.java
 Mon Nov 13 12:29:41 2006
@@ -25,13 +25,10 @@
 
 import org.apache.struts2.StrutsConstants;
 import org.apache.struts2.dispatcher.Dispatcher;
-
+import com.opensymphony.xwork2.config.ConfigurationException;
 import com.opensymphony.xwork2.inject.Container;
 import com.opensymphony.xwork2.inject.Inject;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
 /**
  * The TemplateEngineManager will return a template engine for the template
  */
@@ -41,9 +38,8 @@
     /** The default template extenstion is <code>ftl</code>. */
     public static final String DEFAULT_TEMPLATE_TYPE = "ftl";
 
-    private static final Log LOG = 
LogFactory.getLog(TemplateEngineManager.class);
     
-    Map templateEngines = new HashMap();
+    Map<String,EngineFactory> templateEngines = new 
HashMap<String,EngineFactory>();
     Container container;
     String defaultTemplateType;
     
@@ -63,17 +59,7 @@
             TemplateEngine eng = null;
             String[] list = engines.split(",");
             for (String name : list) {
-                try {
-                    eng = container.getInstance(TemplateEngine.class, name);
-                } catch (Throwable t) {
-                    LOG.info("Unable to load engine ("+name+") due to 
"+t.getMessage());
-                    continue;
-                }    
-                if (eng != null) {
-                    templateEngines.put(name, eng);
-                } else {
-                    throw new IllegalArgumentException("Invalid template 
engine name: "+name);
-                }
+                templateEngines.put(name, new LazyEngineFactory(name));
             }
         }
     }
@@ -85,8 +71,12 @@
      * @param templateExtension  filename extension (eg. .jsp, .ftl, .vm).
      * @param templateEngine     the engine.
      */
-    public void registerTemplateEngine(String templateExtension, 
TemplateEngine templateEngine) {
-        templateEngines.put(templateExtension, templateEngine);
+    public void registerTemplateEngine(String templateExtension, final 
TemplateEngine templateEngine) {
+        templateEngines.put(templateExtension, new EngineFactory() {
+            public TemplateEngine create() {
+                return templateEngine;
+            }
+        });
     }
 
     /**
@@ -112,8 +102,29 @@
                 templateType = type;
             }
         }
-        return (TemplateEngine) templateEngines.get(templateType);
+        return templateEngines.get(templateType).create();
     }
 
-
+    /** Abstracts loading of the template engine */
+    interface EngineFactory {
+        public TemplateEngine create();
+    }    
+
+    /** 
+     * Allows the template engine to be loaded at request time, so that 
engines that are missing
+     * dependencies aren't accessed if never used.
+     */
+    class LazyEngineFactory implements EngineFactory {
+        private String name;
+        public LazyEngineFactory(String name) {
+            this.name = name;
+        }    
+        public TemplateEngine create() {
+            TemplateEngine engine = 
container.getInstance(TemplateEngine.class, name);
+            if (engine == null) {
+                throw new ConfigurationException("Unable to locate template 
engine: "+name);
+            }
+            return engine;
+        }    
+    }    
 }


Reply via email to