001: /*--
002:
003: Copyright (C) 2000-2003 Anthony Eden.
004: All rights reserved.
005:
006: Redistribution and use in source and binary forms, with or without
007: modification, are permitted provided that the following conditions
008: are met:
009:
010: 1. Redistributions of source code must retain the above copyright
011: notice, this list of conditions, and the following disclaimer.
012:
013: 2. Redistributions in binary form must reproduce the above copyright
014: notice, this list of conditions, and the disclaimer that follows
015: these conditions in the documentation and/or other materials
016: provided with the distribution.
017:
018: 3. The name "EdenLib" must not be used to endorse or promote products
019: derived from this software without prior written permission. For
020: written permission, please contact me@anthonyeden.com.
021:
022: 4. Products derived from this software may not be called "EdenLib", nor
023: may "EdenLib" appear in their name, without prior written permission
024: from Anthony Eden (me@anthonyeden.com).
025:
026: In addition, I request (but do not require) that you include in the
027: end-user documentation provided with the redistribution and/or in the
028: software itself an acknowledgement equivalent to the following:
029: "This product includes software developed by
030: Anthony Eden (http://www.anthonyeden.com/)."
031:
032: THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
033: WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
034: OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
035: DISCLAIMED. IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT,
036: INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
037: (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
038: SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
039: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
040: STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
041: IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
042: POSSIBILITY OF SUCH DAMAGE.
043:
044: For more information on EdenLib, please see <http://edenlib.sf.net/>.
045:
046: */
047:
048: package com.anthonyeden.lib.util;
049:
050: import java.io.File;
051: import java.io.Reader;
052: import java.io.Writer;
053: import java.io.FileReader;
054: import java.io.InputStream;
055: import java.io.StringWriter;
056: import java.io.InputStreamReader;
057: import java.util.Map;
058: import java.util.Iterator;
059: import java.util.Collections;
060:
061: import org.apache.velocity.VelocityContext;
062: import org.apache.velocity.app.Velocity;
063:
064: /** A simple tool for parsing files which use the Velocity templating
065: language.
066:
067: @author Anthony Eden
068: */
069:
070: public class VelocityTool {
071:
072: private VelocityTool() {
073: // no op
074: }
075:
076: /** Parse the text file at the given path.
077:
078: @param path The path
079: @return The resulting String
080: @throws Exception
081: */
082:
083: public static String parseTextFile(String path) throws Exception {
084: return parseTextFile(new File(path));
085: }
086:
087: /** Parse the text file at the given path. Variables are specified as
088: name/value pairs in the contextMap.
089:
090: @param path The path
091: @param contextMap The name/value variable pairs
092: @return The resulting String
093: @throws Exception
094: */
095:
096: public static String parseTextFile(String path, Map contextMap)
097: throws Exception {
098: return parseTextFile(path, contextMap);
099: }
100:
101: /** Parse the text file at the given path.
102:
103: @param file The File
104: @return The resulting String
105: @throws Exception
106: */
107:
108: public static String parseTextFile(File file) throws Exception {
109: return parseTextFile(file, Collections.EMPTY_MAP);
110: }
111:
112: /** Parse the text file. Variables are specified as name/value pairs in
113: the contextMap.
114:
115: @param file The File
116: @param contextMap The name/value variable pairs
117: @return The resulting String
118: @throws Exception
119: */
120:
121: public static String parseTextFile(File file, Map contextMap)
122: throws Exception {
123: StringWriter writer = new StringWriter();
124: FileReader reader = new FileReader(file);
125:
126: parse(reader, writer, contextMap);
127:
128: return writer.toString();
129: }
130:
131: /** Parse the InputStream.
132:
133: @param in The InputStream
134: @return The resulting String
135: @throws Exception
136: */
137:
138: public static String parseInputStream(InputStream in)
139: throws Exception {
140: return parseInputStream(in, Collections.EMPTY_MAP);
141: }
142:
143: /** Parse the text file at the given path. Variables are specified as
144: name/value pairs in the contextMap.
145:
146: @param in The input stream
147: @param contextMap The name/value variable pairs
148: @return The resulting String
149: @throws Exception
150: */
151:
152: public static String parseInputStream(InputStream in, Map contextMap)
153: throws Exception {
154: StringWriter writer = new StringWriter();
155: InputStreamReader reader = new InputStreamReader(in);
156:
157: parse(reader, writer, contextMap);
158:
159: return writer.toString();
160: }
161:
162: /** Pass all data from the given Reader through Velocity and write the
163: resulting data to the given Writer.
164:
165: @param reader The reader
166: @param writer The writer
167: @param contextMap The context map
168: @throws Exception
169: */
170:
171: public static void parse(Reader reader, Writer writer,
172: Map contextMap) throws Exception {
173: VelocityContext customContext = new VelocityContext();
174: Iterator keys = contextMap.keySet().iterator();
175: while (keys.hasNext()) {
176: Object key = keys.next();
177: customContext.put(key.toString(), contextMap.get(key));
178: }
179:
180: Velocity.evaluate(customContext, writer, VelocityTool.class
181: .getName(), reader);
182: }
183:
184: }
|