// ========================================================================
// $Id: LocalState.java,v 1.4 2004/05/09 20:30:47 gregwilkins Exp $
// Copyright 2002-2004 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========================================================================
package org.mortbay.j2ee.session;
//----------------------------------------
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import org.jboss.logging.Logger;
//----------------------------------------
/**
* Hold the state of an HttpSession
*
* @author <a href="mailto:jules@mortbay.com">Jules Gosnell</a>
* @version 1.0
*/
public class LocalState implements State, java.io.Serializable
{
protected static final Logger _log = Logger.getLogger(LocalState.class);
protected String _id;
protected int _maxInactiveInterval;
protected int _actualMaxInactiveInterval;
protected long _creationTime;
protected long _lastAccessedTime;
protected Map _attributes; // allocated lazily
public LocalState(String id, long creationTime, int maxInactiveInterval,
int actualMaxInactiveInterval)
{
_id = id;
_creationTime = creationTime;
_lastAccessedTime = _creationTime;
_maxInactiveInterval = maxInactiveInterval;
_actualMaxInactiveInterval = actualMaxInactiveInterval;
}
public LocalState(String id, int maxInactiveInterval,
int actualMaxInactiveInterval)
{
_id = id;
_creationTime = System.currentTimeMillis();
_lastAccessedTime = _creationTime;
_maxInactiveInterval = maxInactiveInterval;
_actualMaxInactiveInterval = actualMaxInactiveInterval;
}
protected LocalState()
{
// for deserialisation only
}
public String getId()
{
return _id;
}
public long getCreationTime()
{
return _creationTime;
}
public int getActualMaxInactiveInterval()
{
return _actualMaxInactiveInterval;
}
public long getLastAccessedTime()
{
return _lastAccessedTime;
}
public void setLastAccessedTime(long time)
{
_lastAccessedTime = time;
}
public int getMaxInactiveInterval()
{
return _maxInactiveInterval;
}
public void setMaxInactiveInterval(int interval)
{
_log.info("_maxInactiveInterval=" + interval);
_maxInactiveInterval = interval;
}
// allocate attribute map lazily. This is more complex, but JSPs
// seem to force allocation of sessions and then never put anything
// in them! - so it is a worthwhile saving in speed and footprint...
protected static Map _emptyMap = Collections.EMPTY_MAP;
protected static Enumeration _emptyEnumeration = Collections
.enumeration(Collections.EMPTY_LIST);
protected static String[] _emptyStringArray = new String[0]; // could
// this be
// changed
// by user ?
protected void ensureAttributes()
{
if (_attributes == null) _attributes = new HashMap();
}
public Object getAttribute(String name)
{
// _log.info("getAttribute("+name+")");
return _attributes == null ? null : _attributes.get(name);
}
public Map getAttributes()
{
return (_attributes == null || _attributes.size() == 0) ? _emptyMap : Collections
.unmodifiableMap(_attributes);
}
public Enumeration getAttributeNameEnumeration()
{
return (_attributes == null || _attributes.size() == 0) ? _emptyEnumeration : Collections
.enumeration(_attributes.keySet());
}
public String[] getAttributeNameStringArray()
{
return (_attributes == null || _attributes.size() == 0) ? _emptyStringArray : (String[]) _attributes
.keySet().toArray(new String[_attributes.size()]);
}
public Object setAttribute(String name, Object value, boolean returnValue)
{
// we can be sure that name is non-null, because this will have
// been checked in our adaptor...
// _log.info("setAttribute("+name+", "+value+", "+returnValue+")");
ensureAttributes();
Object tmp = _attributes.put(name, value);
return returnValue ? tmp : null;
}
public void setAttributes(Map attributes)
{
if (_attributes != null) _attributes.clear();
if (attributes.size() > 0)
{
ensureAttributes();
_attributes.putAll(attributes);
}
}
public Object removeAttribute(String name, boolean returnValue)
{
if (_attributes == null)
return null;
else
{
Object tmp = _attributes.remove(name);
return returnValue ? tmp : null;
}
}
protected long remainingTime()
{
long maxInactiveInterval = _maxInactiveInterval < 1 ? _actualMaxInactiveInterval : _maxInactiveInterval;
return (_lastAccessedTime + (maxInactiveInterval * 1000L))
- System.currentTimeMillis();
}
public boolean isValid(int extraTime)
{
long remainingTime = remainingTime();
long etime = (extraTime * 1000L);
boolean valid = remainingTime + etime > 0;
return valid;
}
public boolean isValid()
{
return isValid(0);
}
}