001 // Copyright 2004, 2005 The Apache Software Foundation 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package org.apache.tapestry.script; 016 017 import org.apache.hivemind.Resource; 018 import org.apache.tapestry.IComponent; 019 import org.apache.tapestry.IRequestCycle; 020 import org.apache.tapestry.IScriptProcessor; 021 import org.apache.tapestry.coerce.ValueConverter; 022 import org.apache.tapestry.services.ExpressionEvaluator; 023 024 import java.util.Map; 025 026 /** 027 * The result of executing a script, the session is used during the parsing 028 * process as well. Following 029 * {@link org.apache.tapestry.IScript#execute(IComponent, org.apache.tapestry.IRequestCycle, org.apache.tapestry.IScriptProcessor, java.util.Map)}, 030 * the session provides access to output symbols as well as the body and 031 * initialization blocks created by the script tokens. 032 * 033 * @author Howard Lewis Ship 034 * @since 0.2.9 035 */ 036 037 public class ScriptSessionImpl implements ScriptSession 038 { 039 040 private IRequestCycle _cycle; 041 042 private IScriptProcessor _processor; 043 044 private Resource _scriptTemplateResource; 045 046 private Map _symbols; 047 048 /** @since 4.0 */ 049 private ExpressionEvaluator _evaluator; 050 051 /** @since 4.0 */ 052 private ValueConverter _valueConverter; 053 054 private IComponent _component; 055 056 public ScriptSessionImpl(Resource scriptTemplateResource, 057 IRequestCycle cycle, IScriptProcessor processor, 058 ExpressionEvaluator evaluator, ValueConverter valueConverter, 059 Map symbols) 060 { 061 _scriptTemplateResource = scriptTemplateResource; 062 _cycle = cycle; 063 _processor = processor; 064 _symbols = symbols; 065 _evaluator = evaluator; 066 _valueConverter = valueConverter; 067 } 068 069 public ScriptSessionImpl(Resource scriptTemplateResource, 070 IComponent component, 071 IRequestCycle cycle, IScriptProcessor processor, 072 ExpressionEvaluator evaluator, ValueConverter valueConverter, 073 Map symbols) 074 { 075 _scriptTemplateResource = scriptTemplateResource; 076 _component = component; 077 _cycle = cycle; 078 _processor = processor; 079 _symbols = symbols; 080 _evaluator = evaluator; 081 _valueConverter = valueConverter; 082 } 083 084 public Object evaluate(String expression) 085 { 086 return _evaluator.read(_symbols, expression); //_evaluator.read(_symbols, expression); 087 } 088 089 public Object evaluate(String expression, Class desiredType) 090 { 091 Object raw = evaluate(expression); 092 093 return _valueConverter.coerceValue(raw, desiredType); 094 } 095 096 public Resource getScriptTemplateResource() 097 { 098 return _scriptTemplateResource; 099 } 100 101 public Map getSymbols() 102 { 103 return _symbols; 104 } 105 106 public IRequestCycle getRequestCycle() 107 { 108 return _cycle; 109 } 110 111 public void addBodyScript(String script) 112 { 113 addBodyScript(_component, script); 114 } 115 116 /** 117 * {@inheritDoc} 118 */ 119 public boolean isBodyScriptAllowed(IComponent target) 120 { 121 return _processor.isBodyScriptAllowed(target); 122 } 123 124 /** 125 * {@inheritDoc} 126 */ 127 public boolean isExternalScriptAllowed(IComponent target) 128 { 129 return _processor.isExternalScriptAllowed(target); 130 } 131 132 /** 133 * {@inheritDoc} 134 */ 135 public boolean isInitializationScriptAllowed(IComponent target) 136 { 137 return _processor.isInitializationScriptAllowed(target); 138 } 139 140 public void addBodyScript(IComponent target, String script) 141 { 142 if (_processor.isBodyScriptAllowed(target)) 143 _processor.addBodyScript(target, script); 144 } 145 146 public void addExternalScript(Resource resource) 147 { 148 addExternalScript(_component, resource); 149 } 150 151 public void addExternalScript(IComponent target, Resource resource) 152 { 153 if (_processor.isExternalScriptAllowed(target)) 154 _processor.addExternalScript(target, resource); 155 } 156 157 public void addInitializationScript(String script) 158 { 159 addInitializationScript(_component, script); 160 } 161 162 public void addInitializationScript(IComponent target, String script) 163 { 164 if (_processor.isInitializationScriptAllowed(target)) 165 _processor.addInitializationScript(target, script); 166 } 167 168 public void addScriptAfterInitialization(IComponent target, String script) 169 { 170 if (_processor.isInitializationScriptAllowed(target)) 171 _processor.addScriptAfterInitialization(target, script); 172 } 173 174 public String getUniqueString(String baseValue) 175 { 176 return _processor.getUniqueString(baseValue); 177 } 178 179 public String toString() 180 { 181 StringBuffer buffer = new StringBuffer(); 182 183 buffer.append("ScriptSession["); 184 buffer.append(_scriptTemplateResource); 185 buffer.append(']'); 186 187 return buffer.toString(); 188 } 189 }