01: // THIS SOFTWARE IS PROVIDED BY SOFTARIS PTY.LTD. AND OTHER METABOSS
02: // CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING,
03: // BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
04: // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SOFTARIS PTY.LTD.
05: // OR OTHER METABOSS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
06: // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
07: // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
08: // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
09: // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
10: // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
11: // EVEN IF SOFTARIS PTY.LTD. OR OTHER METABOSS CONTRIBUTORS ARE ADVISED OF THE
12: // POSSIBILITY OF SUCH DAMAGE.
13: //
14: // Copyright 2000-2005 © Softaris Pty.Ltd. All Rights Reserved.
15: package com.metaboss.util;
16:
17: /** Utility class. Provides template resolving mechanism, which may be useful in many places.
18: * Template is any string. Processor helps to "render" this string by scanning it
19: * detecting the expressions in form ${ any text } and using ExpressionResolver to resolve it to string */
20: public class TemplateUtil {
21: private static final String sAttributeToken = "${";
22: private static final int sAttributeTokenLength = sAttributeToken
23: .length();
24: private static final String sEndToken = "}";
25: private static final int sEndTokenLength = sEndToken.length();
26:
27: /** This exception is thrown from processTemplate() method if there is a problem with its syntax */
28: public static class UnexpectedSyntaxException extends Exception {
29: /** Constructs UnexpectedSyntaxException with the message */
30: public UnexpectedSyntaxException(String pMessage) {
31: super (pMessage);
32: }
33: }
34:
35: /** This exception is thrown from processTemplate() method if there was a problem during resolution unrelatred to syntax */
36: public static class ResolutionException extends Exception {
37: /** Constructs ResolutionException with the exception */
38: public ResolutionException(Throwable pException) {
39: super (pException);
40: }
41: }
42:
43: /** This interface must be provided to processTemplate() method, so it can
44: * use it when it needs to resolve expression */
45: public interface ExpressionResolver {
46: /** Returns string to substitute given expression
47: * @exception UnexpectedSyntaxException should be thrown if there is a syntax problem with the expression
48: * @exception ResolutionException should be thrown if there was a problem unrelated to expression syntax */
49: public String resolve(String pExpression)
50: throws UnexpectedSyntaxException, ResolutionException;
51: }
52:
53: /** This method helps to resolve ant / velocity style templates expressions.
54: * These expresions are text strings whith zero or more macro expressions in form "${expr}"
55: * It takes care of all string parsing and uses callback interface to resolve expressions */
56: public static String processTemplate(String pTemplate,
57: ExpressionResolver pResolver)
58: throws UnexpectedSyntaxException, ResolutionException {
59: StringBuffer lOutputBuffer = new StringBuffer();
60: String lRemainderOfExpression = pTemplate;
61: while (true) {
62: int lPos = lRemainderOfExpression.indexOf(sAttributeToken);
63: if (lPos < 0) {
64: // Finished
65: lOutputBuffer.append(lRemainderOfExpression);
66: break;
67: }
68: // Found another one
69: lOutputBuffer.append(lRemainderOfExpression.substring(0,
70: lPos));
71: lRemainderOfExpression = lRemainderOfExpression
72: .substring(lPos + sAttributeTokenLength);
73: // The remainder begins with attribute name}
74: lPos = lRemainderOfExpression.indexOf(sEndToken);
75: if (lPos < 0)
76: throw new UnexpectedSyntaxException("Unclosed "
77: + sAttributeToken + " tag in the template: "
78: + pTemplate);
79: String lExpression = lRemainderOfExpression.substring(0,
80: lPos);
81: lOutputBuffer.append(pResolver.resolve(lExpression));
82: lRemainderOfExpression = lRemainderOfExpression
83: .substring(lPos + sEndTokenLength);
84: }
85: return lOutputBuffer.toString();
86: }
87: }
|