001// Copyright 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.engine.state;
016
017import java.util.HashMap;
018import java.util.Iterator;
019import java.util.Map;
020
021import org.apache.hivemind.PoolManageable;
022
023/**
024 * This implementation expects to be pooled.
025 * 
026 * @author Howard M. Lewis Ship
027 * @since 4.0
028 */
029public class ApplicationStateManagerImpl implements ApplicationStateManager, PoolManageable
030{
031
032    /**
033     * Keyed on application static object name, value is the current state object.
034     */
035
036    private Map _stateObjects = new HashMap();
037
038    private StateObjectManagerRegistry _registry;
039
040    public void activateService()
041    {
042    }
043
044    public void passivateService()
045    {
046        _stateObjects.clear();
047    }
048
049    public boolean exists(String objectName)
050    {
051        return _stateObjects.containsKey(objectName) || _registry.get(objectName).exists();
052    }
053
054    public Object get(String objectName)
055    {
056        Object result = _stateObjects.get(objectName);
057
058        if (result == null)
059        {
060            result = _registry.get(objectName).get();
061
062            _stateObjects.put(objectName, result);
063        }
064
065        return result;
066    }
067
068    public void store(String objectName, Object stateObject)
069    {
070        _registry.get(objectName).store(stateObject);
071
072        _stateObjects.put(objectName, stateObject);
073    }
074
075    public void flush()
076    {
077        Iterator i = _stateObjects.entrySet().iterator();
078        while (i.hasNext())
079        {
080            Map.Entry e = (Map.Entry) i.next();
081
082            String objectName = (String) e.getKey();
083            Object stateObject = e.getValue();
084
085            // Slight bending of law-of-demeter
086
087            _registry.get(objectName).store(stateObject);
088        }
089    }
090
091    public void setRegistry(StateObjectManagerRegistry registry)
092    {
093        _registry = registry;
094    }
095}