View Javadoc
1   /*
2    * $Source$
3    * $Revision$
4    *
5    * Copyright (C) 2005 Tim Pizey
6    *
7    * Part of Melati (http://melati.org), a framework for the rapid
8    * development of clean, maintainable web applications.
9    *
10   * Melati is free software; Permission is granted to copy, distribute
11   * and/or modify this software under the terms either:
12   *
13   * a) the GNU General Public License as published by the Free Software
14   *    Foundation; either version 2 of the License, or (at your option)
15   *    any later version,
16   *
17   *    or
18   *
19   * b) any version of the Melati Software License, as published
20   *    at http://melati.org
21   *
22   * You should have received a copy of the GNU General Public License and
23   * the Melati Software License along with this program;
24   * if not, write to the Free Software Foundation, Inc.,
25   * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA to obtain the
26   * GNU General Public License and visit http://melati.org to obtain the
27   * Melati Software License.
28   *
29   * Feel free to contact the Developers of Melati (http://melati.org),
30   * if you would like to work out a different arrangement than the options
31   * outlined here.  It is our intention to allow Melati to be used by as
32   * wide an audience as possible.
33   *
34   * This program is distributed in the hope that it will be useful,
35   * but WITHOUT ANY WARRANTY; without even the implied warranty of
36   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
37   * GNU General Public License for more details.
38   *
39   * Contact details for copyright holder:
40   *
41   *     Tim Pizey <timp At paneris.org>
42   *     http://paneris.org/~timp
43   */
44  
45  package org.melati.template.webmacro;
46  
47  
48  import org.melati.MelatiConfig;
49  import org.melati.poem.AccessPoemException;
50  import org.melati.template.AbstractTemplateEngine;
51  import org.melati.template.NotFoundException;
52  import org.melati.template.TemplateContext;
53  import org.melati.template.TemplateEngine;
54  import org.melati.template.TemplateEngineException;
55  import org.melati.util.MelatiStringWriter;
56  import org.melati.util.MelatiWriter;
57  import org.webmacro.InitException;
58  import org.webmacro.PropertyException;
59  import org.webmacro.WM;
60  import org.webmacro.Context;
61  
62  
63  /**
64   * Wrapper for the WebMacro Template Engine for use with Melati.
65   */
66  public class WebmacroTemplateEngine extends AbstractTemplateEngine implements TemplateEngine {
67  
68    /** The name of the engine. */
69    public static final String NAME = "webmacro";
70  
71    /** The WebMacro. */
72    public WM wm;
73    //private WebContext _webContext;
74  
75    /**
76     * Constructor.
77     */
78    public WebmacroTemplateEngine() {
79      super();
80    }
81    
82    /**
83     * Construct a new Engine.
84     *
85     * @param melatiConfig a {@link MelatiConfig}
86     * @throws TemplateEngineException if any problem occurs with the engine
87     */
88    public void init(MelatiConfig melatiConfig) 
89        throws TemplateEngineException {
90      try {
91        wm = new WM ();
92      } catch (InitException e) {
93        throw new TemplateEngineException(e);
94      }
95    }
96  
97    /**
98     * Create a new, empty, Context for WebMacro.
99     *
100    * @return a {@link TemplateContext}
101    */
102   public TemplateContext getTemplateContext() {
103     Context context = new Context(wm.getBroker());
104     return new WebmacroTemplateContext(context);
105   }
106   
107   /**
108    * The name of the template engine (used to find the templets).
109    * @return the name of the current configured template engine
110    */
111   public String getName () {
112     return NAME;
113   }
114 
115   /**
116    * @return the extension of the templates used by 
117    * WebMacro, including the dot. 
118    * 
119    */
120   public String templateExtension() {
121     return ".wm";
122   }
123 
124   /** 
125    * Get a template given it's name.
126    * 
127    * @param templateName the name of the template to find
128    * @return a template
129    * @throws NotFoundException if template not found
130    */
131   public org.melati.template.Template template(String templateName)
132       throws NotFoundException {
133     try {                                  
134       org.webmacro.Template template = wm.getTemplate(templateName);
135       return new WebmacroTemplate(template);
136     } catch (org.webmacro.NotFoundException e) {
137       throw new NotFoundException("Could not find template " + templateName);
138     } catch (Exception e) {
139       throw new TemplateEngineException(e);
140     }
141   }
142 
143   /** 
144    * Expand the Template against the context.
145    *
146    * @param out             a {@link MelatiWriter} to output on
147    * @param templateName    the name of the template to expand
148    * @param templateContext the {@link TemplateContext} to expand 
149    *                        the template against
150    * @throws NotFoundException if template not found
151    */
152   public void expandTemplate(MelatiWriter out, 
153                              String templateName, 
154                              TemplateContext templateContext)
155       throws NotFoundException {
156     expandTemplate (out, template(templateName), templateContext);
157   }
158 
159   /**
160    * Expand the Template against the context.
161    *
162    * @param out             a {@link MelatiWriter} to output on
163    * @param template        the {@link org.melati.template.Template} to expand
164    * @param templateContext the {@link TemplateContext} to expand 
165    *                        the template against
166    */
167   public void expandTemplate(MelatiWriter out,
168                              org.melati.template.Template template, 
169                              TemplateContext templateContext) {
170     try {
171       template.write(out, templateContext);
172     } catch (TemplateEngineException problem) {
173       // underlying will always be a PropertyException
174       PropertyException underlying = (PropertyException)problem.subException;
175       Throwable caught = underlying.getCause();
176       if (caught instanceof AccessPoemException) {
177         throw (AccessPoemException)caught;
178       }
179       throw problem;
180     }
181   }
182 
183   /**
184    * {@inheritDoc}
185    * @see org.melati.template.AbstractTemplateEngine#expandedTemplate
186    */
187   public String expandedTemplate(org.melati.template.Template template,  
188                                  TemplateContext templateContext) {
189       MelatiStringWriter s = new MelatiWebmacroStringWriter();
190       expandTemplate(s, template, templateContext);
191       return s.toString();
192   }
193 
194   /** 
195    * Return a {@link MelatiWebmacroStringWriter}.
196    *
197    * {@inheritDoc}
198    * @see org.melati.Melati#getStringWriter() 
199    * @see org.melati.template.AbstractTemplateEngine#getStringWriter()
200    */
201   public MelatiStringWriter getStringWriter() {
202     return new MelatiWebmacroStringWriter();
203   }
204 
205   /**
206    * Get the underlying engine.
207    *
208    * @return the configured template engine
209    */
210   public Object getEngine() {
211     return wm;
212   }
213 
214 }