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.services.impl;
016
017import java.util.HashMap;
018import java.util.Map;
019
020import ognl.Ognl;
021
022import org.apache.hivemind.ApplicationRuntimeException;
023import org.apache.tapestry.event.ReportStatusEvent;
024import org.apache.tapestry.event.ReportStatusListener;
025import org.apache.tapestry.event.ResetEventListener;
026import org.apache.tapestry.services.ExpressionCache;
027
028/**
029 * @author Howard M. Lewis Ship
030 * @since 4.0
031 */
032public class ExpressionCacheImpl implements ExpressionCache, ResetEventListener,
033        ReportStatusListener
034{
035    private String _serviceId;
036
037    private Map _cache = new HashMap();
038
039    public synchronized void resetEventDidOccur()
040    {
041        _cache.clear();
042    }
043
044    public void reportStatus(ReportStatusEvent event)
045    {
046        event.title(_serviceId);
047
048        event.property("cached expression count", _cache.size());
049        event.collection("cached expressions", _cache.keySet());
050    }
051
052    public synchronized Object getCompiledExpression(String expression)
053    {
054        Object result = _cache.get(expression);
055
056        if (result == null)
057        {
058            result = parse(expression);
059            _cache.put(expression, result);
060        }
061
062        return result;
063    }
064
065    private Object parse(String expression)
066    {
067        try
068        {
069            return Ognl.parseExpression(expression);
070        }
071        catch (Exception ex)
072        {
073            throw new ApplicationRuntimeException(ImplMessages.unableToParseExpression(
074                    expression,
075                    ex), ex);
076        }
077    }
078
079    public void setServiceId(String serviceId)
080    {
081        _serviceId = serviceId;
082    }
083
084}