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.core;
054:
055: import freemarker.template.*;
056:
057: /**
058: * A reference to a built-in identifier, such as .root
059: */
060: final class BuiltinVariable extends Expression {
061:
062: static final String NAMESPACE = "namespace";
063: static final String MAIN = "main";
064: static final String GLOBALS = "globals";
065: static final String LOCALS = "locals";
066: static final String DATA_MODEL = "data_model";
067: static final String LANG = "lang";
068: static final String LOCALE = "locale";
069: static final String CURRENT_NODE = "current_node";
070: static final String NODE = "node";
071: static final String PASS = "pass";
072: static final String VARS = "vars";
073: static final String VERSION = "version";
074: static final String ERROR = "error";
075: static final String OUTPUT_ENCODING = "output_encoding";
076: static final String URL_ESCAPING_CHARSET = "url_escaping_charset";
077:
078: private final String name;
079:
080: BuiltinVariable(String name) throws ParseException {
081: name = name.intern();
082: this .name = name;
083: if (name != NAMESPACE && name != MAIN && name != GLOBALS
084: && name != LOCALS && name != LANG && name != LOCALE
085: && name != DATA_MODEL && name != CURRENT_NODE
086: && name != NODE && name != PASS && name != VARS
087: && name != VERSION && name != OUTPUT_ENCODING
088: && name != URL_ESCAPING_CHARSET && name != ERROR) {
089: throw new ParseException("Unknown built-in variable: "
090: + name, this );
091: }
092: }
093:
094: TemplateModel _getAsTemplateModel(Environment env)
095: throws TemplateException {
096: if (name == NAMESPACE) {
097: return env.getCurrentNamespace();
098: }
099: if (name == MAIN) {
100: return env.getMainNamespace();
101: }
102: if (name == GLOBALS) {
103: return env.getGlobalVariables();
104: }
105: if (name == LOCALS) {
106: return env.getCurrentMacroContext().getLocals();
107: }
108: if (name == DATA_MODEL) {
109: return env.getDataModel();
110: }
111: if (name == VARS) {
112: return new VarsHash(env);
113: }
114: if (name == LOCALE) {
115: return new SimpleScalar(env.getLocale().toString());
116: }
117: if (name == LANG) {
118: return new SimpleScalar(env.getLocale().getLanguage());
119: }
120: if (name == CURRENT_NODE || name == NODE) {
121: return env.getCurrentVisitorNode();
122: }
123: if (name == PASS) {
124: return Macro.DO_NOTHING_MACRO;
125: }
126: if (name == VERSION) {
127: return new SimpleScalar(Configuration.getVersionNumber());
128: }
129: if (name == OUTPUT_ENCODING) {
130: String s = env.getOutputEncoding();
131: return s != null ? new SimpleScalar(s) : null;
132: }
133: if (name == URL_ESCAPING_CHARSET) {
134: String s = env.getURLEscapingCharset();
135: return s != null ? new SimpleScalar(s) : null;
136: }
137: if (name == ERROR) {
138: return new SimpleScalar(env
139: .getCurrentRecoveredErrorMesssage());
140: }
141: throw new TemplateException("Invalid built-in variable: "
142: + this , env);
143: }
144:
145: public String toString() {
146: return "." + name;
147: }
148:
149: public String getCanonicalForm() {
150: return "." + name;
151: }
152:
153: boolean isLiteral() {
154: return false;
155: }
156:
157: Expression _deepClone(String name, Expression subst) {
158: return this ;
159: }
160:
161: class VarsHash implements TemplateHashModel {
162:
163: Environment env;
164:
165: VarsHash(Environment env) {
166: this .env = env;
167: }
168:
169: public TemplateModel get(String key)
170: throws TemplateModelException {
171: return env.getVariable(key);
172: }
173:
174: public boolean isEmpty() {
175: return false;
176: }
177: }
178: }
|