##### Coverage Report - org.webmacro.resource.DelegatingTemplateProvider

Classes in this File | Line Coverage | Branch Coverage | Complexity
DelegatingTemplateProvider |
0% | 0/38
0% | 0/10
| 4.2;4.2

1 |  |
     /*
2 |  |
      * Copyright (C) 1998-2000 Semiotek Inc.  All Rights Reserved.
3 |  |
      *
4 |  |
      * Redistribution and use in source and binary forms, with or without
5 |  |
      * modification, are permitted under the terms of either of the following
6 |  |
      * Open Source licenses:
7 |  |
      *
8 |  |
      * The GNU General Public License, version 2, or any later version, as
9 |  |
      * published by the Free Software Foundation
10 |  |
      * (http://www.fsf.org/copyleft/gpl.html);
11 |  |
      *
12 |  |
      *  or
13 |  |
      *
14 |  |
      * The Semiotek Public License (http://webmacro.org/LICENSE.)
15 |  |
      *
16 |  |
      * This software is provided "as is", with NO WARRANTY, not even the
17 |  |
      * implied warranties of fitness to purpose, or merchantability. You
18 |  |
      * assume all risks and liabilities associated with its use.
19 |  |
      *
20 |  |
      * See www.webmacro.org for more information on the WebMacro project.
21 |  |
      */
22 |  |
23 |  |
24 |  |
     package org.webmacro.resource;
25 |  |
26 |  |
     import java.util.ArrayList;
27 |  |
     import java.util.Arrays;
28 |  |
     import java.util.Collections;
29 |  |
     import java.util.List;
30 |  |
31 |  |
     import org.slf4j.Logger;
32 |  |
     import org.slf4j.LoggerFactory;
33 |  |
     import org.webmacro.Broker;
34 |  |
     import org.webmacro.Context;
35 |  |
     import org.webmacro.InitException;
36 |  |
     import org.webmacro.NotFoundException;
37 |  |
     import org.webmacro.ResourceException;
38 |  |
     import org.webmacro.Template;
39 |  |
     import org.webmacro.util.Settings;
40 |  |
41 |  |
     /**
42 |  |
      * Alternative implementation of a TemplateProvider that uses TemplateLoaders to do the actual work.
43 |  |
      * This template provider controls a list of TemplateLoaders to do the actual work of loading
44 |  |
      * a template. It asks the template loaders one by one, until a template is found or the end of
45 |  |
      * the list is reached. It is configured by a list of "TemplateLoaderPath.n" settings in
46 |  |
      * WebMacro.properties.<br>
47 |  |
      * <br>
48 |  |
      * Each template loader is described by an url like syntax with a TemplateLoaderPath.n setting,
49 |  |
      * where n should be a number starting from one.
50 |  |
      * <br>
51 |  |
      * Each template loader path is of the form "[protocol:][path]". If the protocol part in square brackets
52 |  |
      * is ommited, "default:" is assumed.
53 |  |
      * For each protocol, a "TemplateLoader.protocol" setting must give the fully qualified
54 |  |
      * classname of the template loader to be used for this protocol.
55 |  |
      * Example configuration:<br>
56 |  |
      * <pre>
57 |  |
      * TemplateLoaderPath.1=.
58 |  |
      * TemplateLoaderPath.2=classpath:
59 |  |
      * TemplateLoaderPath.3=webapp:/WEB-INF/templates/
60 |  |
      * TemplateLoader.default=org.webmacro.resource.FileTemplateLoader
61 |  |
      * TemplateLoader.classpath=org.webmacro.resource.ClassPathTemplateLoader
62 |  |
      * TemplateLoader.webapp=org.webmacro.resource.ServletContextTemplateLoader
63 |  |
      * </pre>
64 |  |
      * This configuration will search for templates at three locations in this order:
65 |  |
      * <ol>
66 |  |
      * <li>The current directory (".")
67 |  |
      * <li>The classpath (classpath:)
68 |  |
      * <li>The directory WEB-INF/templates/ in the web-app directory ("webapp:/WEB-INF/templates/")
69 |  |
      * </ol>
70 |  |
      * NOTE This setup only makes sense in a web-app environment, because the webapp template loader
71 |  |
      * won't work otherwise.
72 |  |
      * @author Sebastian Kanthak (sebastian.kanthak@muehlheim.de)
73 |  |
      */
74 | 0 |
     public class DelegatingTemplateProvider extends CachingProvider
75 |  |
     {
76 |  |
77 | 0 |
         static Logger _log =  LoggerFactory.getLogger(DelegatingTemplateProvider.class);
78 |  |
79 |  |
         private TemplateLoaderFactory factory;
80 |  |
         private TemplateLoader[] templateLoaders;
81 |  |
82 |  |
         public void init (Broker broker, Settings config) throws InitException
83 |  |
         {
84 | 0 |
             super.init(broker, config);
85 |  |
86 | 0 |
             String factoryClass = config.getSetting("TemplateLoaderFactory", "");
87 | 0 |
             _log.info("DelegatingTemplateProvider: Using TemplateLoaderFactory " + factoryClass);
88 | 0 |
             factory = createFactory(factoryClass);
89 |  |
90 | 0 |
             List loaders = new ArrayList();
91 |  |
92 |  |
             // for compatability reasons, check old TemplatePath setting
93 | 0 |
             if (config.getBooleanSetting("DelegatingTemplateProvider.EmulateTemplatePath", false))
94 |  |
             {
95 | 0 |
                 if (config.getSetting("TemplatePath", "").length() > 0)
96 |  |
                 {
97 | 0 |
                     TemplateLoader loader = new TemplatePathTemplateLoader();
98 | 0 |
                     loader.init(broker, config);
99 | 0 |
                     loader.setConfig("");
100 | 0 |
                     loaders.add(loader);
101 |  |
                 }
102 |  |
             }
103 |  |
104 | 0 |
             int i = 0;
105 | 0 |
             String loader = config.getSetting("TemplateLoaderPath.".concat(String.valueOf(i + 1)));
106 | 0 |
             while (loader != null)
107 |  |
             {
108 | 0 |
                 loaders.add(factory.getTemplateLoader(broker, loader));
109 | 0 |
                 i++;
110 | 0 |
                 loader = config.getSetting("TemplateLoaderPath.".concat(String.valueOf(i + 1)));
111 |  |
             }
112 | 0 |
             templateLoaders = new TemplateLoader[loaders.size()];
113 | 0 |
             loaders.toArray(templateLoaders);
114 | 0 |
         }
115 |  |
116 |  |
         public String getType ()
117 |  |
         {
118 | 0 |
             return "template";
119 |  |
         }
120 |  |
121 |  |
         /**
122 |  |
          * Ask all template loaders to load a template from query.
123 |  |
          * Returns the template from the first provider, that returns a non-null value
124 |  |
          * or throws a NotFoundException, if all providers return null.
125 |  |
          */
126 |  |
         public Object load (String query, CacheElement ce) throws ResourceException
127 |  |
         {
128 | 0 |
             for (int i = 0; i < templateLoaders.length; i++)
129 |  |
             {
130 | 0 |
                 Template t = templateLoaders[i].load(query, ce);
131 | 0 |
                 if (t != null)
132 |  |
                 {
133 | 0 |
                     return t;
134 |  |
                 }
135 |  |
             }
136 | 0 |
             throw new NotFoundException("Could not locate template " + query);
137 |  |
         }
138 |  |
139 |  |
         /**
140 |  |
          * Returns an unmodifieable list of this provider's template loaders.
141 |  |
          * The list is has the same order used for searching templates. You may
142 |  |
          * use this method to access template loaders and change their settings
143 |  |
          * at runtime if they have an appropriate method.
144 |  |
          * @return unmodifieable list of TemplateLoader objects
145 |  |
          */
146 |  |
         public List getTemplateLoaders ()
147 |  |
         {
148 | 0 |
             return Collections.unmodifiableList(Arrays.asList(templateLoaders));
149 |  |
         }
150 |  |
151 |  |
         protected TemplateLoaderFactory createFactory (String classname) throws InitException
152 |  |
         {
153 |  |
             try
154 |  |
             {
155 | 0 |
                 return (TemplateLoaderFactory) Class.forName(classname).newInstance();
156 |  |
             }
157 | 0 |
             catch (ClassNotFoundException e)
158 |  |
             {
159 | 0 |
                 throw new InitException("Class " + classname + " for template loader factory not found", e);
160 |  |
             }
161 | 0 |
             catch (InstantiationException e)
162 |  |
             {
163 | 0 |
                 throw new InitException("Could not instantiate class " + classname + " for template loader factory", e);
164 |  |
             }
165 | 0 |
             catch (IllegalAccessException e)
166 |  |
             {
167 | 0 |
                 throw new InitException("Could not instantiate class " + classname + " for template loader facory", e);
168 |  |
             }
169 | 0 |
             catch (ClassCastException e)
170 |  |
             {
171 | 0 |
                 throw new InitException("Class " + classname + " for template loader factory does not implement " +
172 |  |
                         "interface org.webmacro.resource.TemplateLoaderFactory", e);
173 |  |
             }
174 |  |
         }
175 |  |
     }