    001// Copyright 2006-2013 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.tapestry5.internal.services;
    016
    017import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
    018import org.apache.tapestry5.ioc.internal.util.InternalUtils;
    019import org.apache.tapestry5.ioc.services.PerthreadManager;
    020import org.apache.tapestry5.services.Session;
    021
    022import javax.servlet.http.HttpServletRequest;
    023import javax.servlet.http.HttpSession;
    024import java.util.Collections;
    025import java.util.Enumeration;
    026import java.util.List;
    027
    028/**
    029 * A thin wrapper around {@link HttpSession}.
    030 */
    031public class SessionImpl implements Session
    032{
    033    private final HttpServletRequest request;
    034
    035    private final HttpSession session;
    036
    037    private boolean invalidated = false;
    038
    039    private final SessionLock lock;
    040
    041    public SessionImpl(HttpServletRequest request, HttpSession session, SessionLock lock)
    042    {
    043        this.request = request;
    044        this.session = session;
    045        this.lock = lock;
    046    }
    047
    048    public Object getAttribute(String name)
    049    {
    050        lock.acquireWriteLock();
    051
    052        return session.getAttribute(name);
    053    }
    054
    055    public List<String> getAttributeNames()
    056    {
    057        lock.acquireReadLock();
    058
    059        return InternalUtils.toList(session.getAttributeNames());
    060    }
    061
    062    public void setAttribute(String name, Object value)
    063    {
    064        lock.acquireWriteLock();
    065
    066        session.setAttribute(name, value);
    067    }
    068
    069    public List<String> getAttributeNames(String prefix)
    070    {
    071        lock.acquireReadLock();
    072
    073        List<String> result = CollectionFactory.newList();
    074
    075        Enumeration e = session.getAttributeNames();
    076        while (e.hasMoreElements())
    077        {
    078            String name = (String) e.nextElement();
    079
    080            if (name.startsWith(prefix)) result.add(name);
    081        }
    082
    083        Collections.sort(result);
    084
    085        return result;
    086    }
    087
    088    public int getMaxInactiveInterval()
    089    {
    090        return session.getMaxInactiveInterval();
    091    }
    092
    093    public void invalidate()
    094    {
    095        invalidated = true;
    096
    097        session.invalidate();
    098    }
    099
    100    public boolean isInvalidated()
    101    {
    102        if (invalidated) return true;
    103
    104        // The easy case is when the session was invalidated through the Tapestry Session
    105        // object. The hard case is when the HttpSession was invalidated outside of Tapestry,
    106        // in which case, request.getSession() will return a new HttpSession instance (or null)
    107
    108        invalidated = request.getSession(false) != session;
    109
    110        return invalidated;
    111    }
    112
    113    public void setMaxInactiveInterval(int seconds)
    114    {
    115        session.setMaxInactiveInterval(seconds);
    116    }
    117
    118    public void restoreDirtyObjects()
    119    {
    120
    121    }
    122}