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
015package org.apache.tapestry.script;
016
017import java.util.Map;
018
019import org.apache.hivemind.Resource;
020import org.apache.tapestry.IRequestCycle;
021import org.apache.tapestry.IScriptProcessor;
022import org.apache.tapestry.coerce.ValueConverter;
023import org.apache.tapestry.services.ExpressionEvaluator;
024
025/**
026 * The result of executing a script, the session is used during the parsing process as well.
027 * Following
028 * {@link org.apache.tapestry.IScript#execute(org.apache.tapestry.IRequestCycle, org.apache.tapestry.IScriptProcessor, java.util.Map)},
029 * the session provides access to output symbols as well as the body and initialization blocks
030 * created by the script tokens.
031 * 
032 * @author Howard Lewis Ship
033 * @since 0.2.9
034 */
035
036public class ScriptSessionImpl implements ScriptSession
037{
038    private IRequestCycle _cycle;
039
040    private IScriptProcessor _processor;
041
042    private Resource _scriptTemplateResource;
043
044    private Map _symbols;
045
046    /** @since 4.0 */
047    private ExpressionEvaluator _evaluator;
048
049    /** @since 4.0 */
050    private ValueConverter _valueConverter;
051
052    public ScriptSessionImpl(Resource scriptTemplateResource, IRequestCycle cycle,
053            IScriptProcessor processor, ExpressionEvaluator evaluator,
054            ValueConverter valueConverter, Map symbols)
055    {
056        _scriptTemplateResource = scriptTemplateResource;
057        _cycle = cycle;
058        _processor = processor;
059        _symbols = symbols;
060        _evaluator = evaluator;
061        _valueConverter = valueConverter;
062    }
063
064    public Object evaluate(String expression)
065    {
066        return _evaluator.read(_symbols, expression);
067    }
068
069    public Object evaluate(String expression, Class desiredType)
070    {
071        Object raw = evaluate(expression);
072
073        return _valueConverter.coerceValue(raw, desiredType);
074    }
075
076    public Resource getScriptTemplateResource()
077    {
078        return _scriptTemplateResource;
079    }
080
081    public Map getSymbols()
082    {
083        return _symbols;
084    }
085
086    public IRequestCycle getRequestCycle()
087    {
088        return _cycle;
089    }
090
091    public void addBodyScript(String script)
092    {
093        _processor.addBodyScript(script);
094    }
095
096    public void addExternalScript(Resource resource)
097    {
098        _processor.addExternalScript(resource);
099    }
100
101    public void addInitializationScript(String script)
102    {
103        _processor.addInitializationScript(script);
104    }
105
106    public String getUniqueString(String baseValue)
107    {
108        return _processor.getUniqueString(baseValue);
109    }
110
111    public String toString()
112    {
113        StringBuffer buffer = new StringBuffer();
114
115        buffer.append("ScriptSession[");
116        buffer.append(_scriptTemplateResource);
117        buffer.append(']');
118
119        return buffer.toString();
120    }
121}