View Javadoc

1   package org.apache.velocity.runtime;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.    
20   */
21  
22  import java.io.Reader;
23  import java.util.Properties;
24  import org.apache.commons.collections.ExtendedProperties;
25  import org.apache.velocity.Template;
26  import org.apache.velocity.app.event.EventCartridge;
27  import org.apache.velocity.exception.ParseErrorException;
28  import org.apache.velocity.exception.ResourceNotFoundException;
29  import org.apache.velocity.runtime.directive.Directive;
30  import org.apache.velocity.runtime.log.Log;
31  import org.apache.velocity.runtime.parser.ParseException;
32  import org.apache.velocity.runtime.parser.Parser;
33  import org.apache.velocity.runtime.parser.node.SimpleNode;
34  import org.apache.velocity.runtime.resource.ContentResource;
35  import org.apache.velocity.util.introspection.Introspector;
36  import org.apache.velocity.util.introspection.Uberspect;
37  
38  
39  /**
40   * Interface for internal runtime services that are needed by the
41   * various components w/in Velocity.  This was taken from the old
42   * Runtime singleton, and anything not necessary was removed.
43   *
44   *  Currently implemented by RuntimeInstance.
45   *
46   * @author <a href="mailto:geirm@optonline.net">Geir Magusson Jr.</a>
47   * @version $Id: RuntimeServices.java 463298 2006-10-12 16:10:32Z henning $
48   */
49  public interface RuntimeServices extends RuntimeLogger
50  {
51  
52     /**
53       * This is the primary initialization method in the Velocity
54       * Runtime. The systems that are setup/initialized here are
55       * as follows:
56       *
57       * <ul>
58       *   <li>Logging System</li>
59       *   <li>ResourceManager</li>
60       *   <li>Parser Pool</li>
61       *   <li>Global Cache</li>
62       *   <li>Static Content Include System</li>
63       *   <li>Velocimacro System</li>
64       * </ul>
65   * @throws Exception
66       */
67      public void init() throws Exception;
68  
69      /**
70       * Allows an external system to set a property in
71       * the Velocity Runtime.
72       *
73       * @param key property key
74       * @param value property value
75       */
76      public  void setProperty(String key, Object value);
77  
78      /**
79       * Allow an external system to set an ExtendedProperties
80       * object to use. This is useful where the external
81       * system also uses the ExtendedProperties class and
82       * the velocity configuration is a subset of
83       * parent application's configuration. This is
84       * the case with Turbine.
85       *
86       * @param configuration
87       */
88      public void setConfiguration( ExtendedProperties configuration);
89  
90      /**
91       * Add a property to the configuration. If it already
92       * exists then the value stated here will be added
93       * to the configuration entry. For example, if
94       *
95       * resource.loader = file
96       *
97       * is already present in the configuration and you
98       *
99       * addProperty("resource.loader", "classpath")
100      *
101      * Then you will end up with a Vector like the
102      * following:
103      *
104      * ["file", "classpath"]
105      *
106      * @param key
107      * @param value
108      */
109     public void addProperty(String key, Object value);
110 
111     /**
112      * Clear the values pertaining to a particular
113      * property.
114      *
115      * @param key of property to clear
116      */
117     public void clearProperty(String key);
118 
119     /**
120      *  Allows an external caller to get a property.  The calling
121      *  routine is required to know the type, as this routine
122      *  will return an Object, as that is what properties can be.
123      *
124      *  @param key property to return
125      * @return The value.
126      */
127     public  Object getProperty( String key );
128 
129     /**
130      * Initialize the Velocity Runtime with a Properties
131      * object.
132      *
133      * @param p
134      * @throws Exception
135      */
136     public void init(Properties p) throws Exception;
137 
138     /**
139      * Initialize the Velocity Runtime with the name of
140      * ExtendedProperties object.
141      *
142      * @param configurationFile
143      * @throws Exception
144      */
145     public void init(String configurationFile) throws Exception;
146 
147     /**
148      * Parse the input and return the root of
149      * AST node structure.
150      * <br><br>
151      *  In the event that it runs out of parsers in the
152      *  pool, it will create and let them be GC'd
153      *  dynamically, logging that it has to do that.  This
154      *  is considered an exceptional condition.  It is
155      *  expected that the user will set the
156      *  PARSER_POOL_SIZE property appropriately for their
157      *  application.  We will revisit this.
158      *
159      * @param reader inputstream retrieved by a resource loader
160      * @param templateName name of the template being parsed
161      * @return The AST representing the template.
162      * @throws ParseException
163      */
164     public  SimpleNode parse( Reader reader, String templateName )
165         throws ParseException;
166 
167     /**
168      *  Parse the input and return the root of the AST node structure.
169      *
170      * @param reader inputstream retrieved by a resource loader
171      * @param templateName name of the template being parsed
172      * @param dumpNamespace flag to dump the Velocimacro namespace for this template
173      * @return The AST representing the template.
174      * @throws ParseException
175      */
176     public SimpleNode parse( Reader reader, String templateName, boolean dumpNamespace )
177         throws ParseException;
178 
179     /**
180      * Returns a <code>Template</code> from the resource manager.
181      * This method assumes that the character encoding of the
182      * template is set by the <code>input.encoding</code>
183      * property.  The default is "ISO-8859-1"
184      *
185      * @param name The file name of the desired template.
186      * @return     The template.
187      * @throws ResourceNotFoundException if template not found
188      *          from any available source.
189      * @throws ParseErrorException if template cannot be parsed due
190      *          to syntax (or other) error.
191      * @throws Exception if an error occurs in template initialization
192      */
193     public Template getTemplate(String name)
194         throws ResourceNotFoundException, ParseErrorException, Exception;
195 
196     /**
197      * Returns a <code>Template</code> from the resource manager
198      *
199      * @param name The  name of the desired template.
200      * @param encoding Character encoding of the template
201      * @return     The template.
202      * @throws ResourceNotFoundException if template not found
203      *          from any available source.
204      * @throws ParseErrorException if template cannot be parsed due
205      *          to syntax (or other) error.
206      * @throws Exception if an error occurs in template initialization
207      */
208     public Template getTemplate(String name, String  encoding)
209         throws ResourceNotFoundException, ParseErrorException, Exception;
210 
211     /**
212      * Returns a static content resource from the
213      * resource manager.  Uses the current value
214      * if INPUT_ENCODING as the character encoding.
215      *
216      * @param name Name of content resource to get
217      * @return parsed ContentResource object ready for use
218      * @throws ResourceNotFoundException if template not found
219      *          from any available source.
220      * @throws ParseErrorException
221      * @throws Exception
222      */
223     public ContentResource getContent(String name)
224         throws ResourceNotFoundException, ParseErrorException, Exception;
225 
226     /**
227      * Returns a static content resource from the
228      * resource manager.
229      *
230      * @param name Name of content resource to get
231      * @param encoding Character encoding to use
232      * @return parsed ContentResource object ready for use
233      * @throws ResourceNotFoundException if template not found
234      *          from any available source.
235      * @throws ParseErrorException
236      * @throws Exception
237      */
238     public ContentResource getContent( String name, String encoding )
239         throws ResourceNotFoundException, ParseErrorException, Exception;
240 
241     /**
242      *  Determines is a template exists, and returns name of the loader that
243      *  provides it.  This is a slightly less hokey way to support
244      *  the Velocity.templateExists() utility method, which was broken
245      *  when per-template encoding was introduced.  We can revisit this.
246      *
247      *  @param resourceName Name of template or content resource
248      *  @return class name of loader than can provide it
249      */
250     public String getLoaderNameForResource( String resourceName );
251 
252     /**
253      * String property accessor method with default to hide the
254      * configuration implementation.
255      *
256      * @param key property key
257      * @param defaultValue  default value to return if key not
258      *               found in resource manager.
259      * @return String  value of key or default
260      */
261     public String getString( String key, String defaultValue);
262 
263     /**
264      * Returns the appropriate VelocimacroProxy object if strVMname
265      * is a valid current Velocimacro.
266      *
267      * @param vmName  Name of velocimacro requested
268      * @param templateName Name of the namespace.
269      * @return VelocimacroProxy
270      */
271     public Directive getVelocimacro( String vmName, String templateName  );
272 
273    /**
274      * Adds a new Velocimacro. Usually called by Macro only while parsing.
275      *
276      * @param name  Name of velocimacro
277      * @param macro  String form of macro body
278      * @param argArray  Array of strings, containing the
279      *                         #macro() arguments.  the 0th is the name.
280  * @param sourceTemplate
281      * @return boolean  True if added, false if rejected for some
282      *                  reason (either parameters or permission settings)
283      */
284     public boolean addVelocimacro( String name,
285                                           String macro,
286                                           String argArray[],
287                                           String sourceTemplate );
288 
289     /**
290      *  Checks to see if a VM exists
291      *
292      * @param vmName  Name of velocimacro
293      * @param templateName
294      * @return boolean  True if VM by that name exists, false if not
295      */
296     public boolean isVelocimacro( String vmName, String templateName );
297 
298     /**
299      *  tells the vmFactory to dump the specified namespace.  This is to support
300      *  clearing the VM list when in inline-VM-local-scope mode
301      * @param namespace
302      * @return True if the Namespace was dumped.
303      */
304     public boolean dumpVMNamespace( String namespace );
305 
306     /**
307      * String property accessor method to hide the configuration implementation
308      * @param key  property key
309      * @return   value of key or null
310      */
311     public String getString(String key);
312 
313     /**
314      * Int property accessor method to hide the configuration implementation.
315      *
316      * @param key property key
317      * @return int value
318      */
319     public int getInt( String key );
320 
321     /**
322      * Int property accessor method to hide the configuration implementation.
323      *
324      * @param key  property key
325      * @param defaultValue default value
326      * @return int  value
327      */
328     public int getInt( String key, int defaultValue );
329 
330     /**
331      * Boolean property accessor method to hide the configuration implementation.
332      *
333      * @param key  property key
334      * @param def default default value if property not found
335      * @return boolean  value of key or default value
336      */
337     public boolean getBoolean( String key, boolean def );
338 
339     /**
340      * Return the velocity runtime configuration object.
341      *
342      * @return ExtendedProperties configuration object which houses
343      *                       the velocity runtime properties.
344      */
345     public ExtendedProperties getConfiguration();
346 
347     /**
348      * Return the specified application attribute.
349      *
350      * @param key The name of the attribute to retrieve.
351      * @return The value of the attribute.
352      */
353     public Object getApplicationAttribute( Object key );
354 
355     /**
356      * Set the specified application attribute.
357      *
358      * @param key The name of the attribute to set.
359      * @param value The attribute value to set.
360      * @return the displaced attribute value
361      */
362     public Object setApplicationAttribute( Object key, Object value );
363 
364     /**
365      * Returns the configured class introspection/reflection
366      * implemenation.
367      * @return The current Uberspect object.
368      */
369     public Uberspect getUberspect();
370 
371     /**
372      * Returns a convenient Log instance that wraps the current LogChute.
373      * @return A log object.
374      */
375     public Log getLog();
376 
377     /**
378       * Returns the event handlers for the application.
379      * @return The event handlers for the application.
380       */
381      public EventCartridge getApplicationEventCartridge();
382 
383 
384     /**
385      * Returns the configured method introspection/reflection
386      * implementation.
387      * @return The configured method introspection/reflection
388      * implementation.
389      */
390     public Introspector getIntrospector();
391 
392     /**
393      * Returns true if the RuntimeInstance has been successfully initialized.
394      * @return True if the RuntimeInstance has been successfully initialized.
395      */
396     public boolean isInitialized();
397 
398     /**
399      * Create a new parser instance.
400      * @return A new parser instance.
401      */
402     public Parser createNewParser();
403 }