001: /*
002: * Copyright (c) 2003 The Visigoth Software Society. All rights
003: * reserved.
004: *
005: * Redistribution and use in source and binary forms, with or without
006: * modification, are permitted provided that the following conditions
007: * are met:
008: *
009: * 1. Redistributions of source code must retain the above copyright
010: * notice, this list of conditions and the following disclaimer.
011: *
012: * 2. Redistributions in binary form must reproduce the above copyright
013: * notice, this list of conditions and the following disclaimer in
014: * the documentation and/or other materials provided with the
015: * distribution.
016: *
017: * 3. The end-user documentation included with the redistribution, if
018: * any, must include the following acknowledgement:
019: * "This product includes software developed by the
020: * Visigoth Software Society (http://www.visigoths.org/)."
021: * Alternately, this acknowledgement may appear in the software itself,
022: * if and wherever such third-party acknowledgements normally appear.
023: *
024: * 4. Neither the name "FreeMarker", "Visigoth", nor any of the names of the
025: * project contributors may be used to endorse or promote products derived
026: * from this software without prior written permission. For written
027: * permission, please contact visigoths@visigoths.org.
028: *
029: * 5. Products derived from this software may not be called "FreeMarker" or "Visigoth"
030: * nor may "FreeMarker" or "Visigoth" appear in their names
031: * without prior written permission of the Visigoth Software Society.
032: *
033: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
034: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
035: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
036: * DISCLAIMED. IN NO EVENT SHALL THE VISIGOTH SOFTWARE SOCIETY OR
037: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
038: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
039: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
040: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
041: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
042: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
043: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
044: * SUCH DAMAGE.
045: * ====================================================================
046: *
047: * This software consists of voluntary contributions made by many
048: * individuals on behalf of the Visigoth Software Society. For more
049: * information on the Visigoth Software Society, please see
050: * http://www.visigoths.org/
051: */
052:
053: package freemarker.testcase.models;
054:
055: import freemarker.template.*;
056: import java.io.*;
057: import java.util.Map;
058:
059: /**
060: * A TemplateTransformModel that includes properties. These properties can be
061: * set at model construction time, or, for the purposes of this demonstration,
062: * can be passed in from a wrapper TemplateMethodModel.
063: *
064: * @version $Id: TransformModel1.java,v 1.21 2003/01/12 23:40:25 revusky Exp $
065: */
066: public class TransformModel1 implements TemplateTransformModel {
067:
068: private boolean m_bAmpersands = false;
069: private boolean m_bQuotes = false;
070: private boolean m_bTags = false;
071: private String m_aComment = "";
072:
073: private static final int READER_BUFFER_SIZE = 4096;
074:
075: public Writer getWriter(final Writer out, final Map args) {
076: final StringBuffer buf = new StringBuffer();
077: return new Writer(out) {
078: public void write(char cbuf[], int off, int len) {
079: buf.append(cbuf, off, len);
080: }
081:
082: public void flush() {
083: }
084:
085: public void close() throws IOException {
086: StringReader sr = new StringReader(buf.toString());
087: StringWriter sw = new StringWriter();
088: transform(sr, sw);
089: out.write(sw.toString());
090: }
091: };
092: }
093:
094: /**
095: * Indicates whether we escape ampersands. This property can be set either
096: * while the model is being constructed, or via a property passed in through
097: * a <code>TemplateMethodModel</code>.
098: */
099: public void setAmpersands(boolean bAmpersands) {
100: m_bAmpersands = bAmpersands;
101: }
102:
103: /**
104: * Indicates whether we escape quotes. This property can be set either
105: * while the model is being constructed, or via a property passed in through
106: * a <code>TemplateMethodModel</code>.
107: */
108: public void setQuotes(boolean bQuotes) {
109: m_bQuotes = bQuotes;
110: }
111:
112: /**
113: * Indicates whether we escape tags. This property can be set either
114: * while the model is being constructed, or via a property passed in through
115: * a <code>TemplateMethodModel</code>.
116: */
117: public void setTags(boolean bTags) {
118: m_bTags = bTags;
119: }
120:
121: /**
122: * Sets a comment for this transformation. This property can be set either
123: * while the model is being constructed, or via a property passed in through
124: * a <code>TemplateMethodModel</code>.
125: */
126: public void setComment(String aComment) {
127: m_aComment = aComment;
128: }
129:
130: /**
131: * Performs a transformation/filter on FreeMarker output.
132: *
133: * @param source the input to be transformed
134: * @param output the destination of the transformation
135: */
136: public void transform(Reader source, Writer output)
137: throws IOException {
138: // Output the source, converting unsafe certain characters to their
139: // equivalent entities.
140: int n = 0;
141: boolean bCommentSent = false;
142: char[] aBuffer = new char[READER_BUFFER_SIZE];
143: int i = source.read(aBuffer);
144: while (i >= 0) {
145: for (int j = 0; j < i; j++) {
146: char c = aBuffer[j];
147: switch (c) {
148: case '&':
149: if (m_bAmpersands) {
150: output.write("&");
151: } else {
152: output.write(c);
153: }
154: break;
155: case '<':
156: if (m_bTags) {
157: output.write("<");
158: } else {
159: output.write(c);
160: }
161: break;
162: case '>':
163: if (m_bTags) {
164: output.write(">");
165: } else {
166: output.write(c);
167: }
168: break;
169: case '"':
170: if (m_bQuotes) {
171: output.write(""");
172: } else {
173: output.write(c);
174: }
175: break;
176: case '\'':
177: if (m_bQuotes) {
178: output.write("'");
179: } else {
180: output.write(c);
181: }
182: break;
183: case '*':
184: if (!bCommentSent) {
185: output.write(m_aComment);
186: bCommentSent = true;
187: } else {
188: output.write(c);
189: }
190: break;
191: default:
192: output.write(c);
193: }
194: n++;
195: }
196: i = source.read(aBuffer);
197: }
198: }
199: }
|