/*
* Copyright 2004-2005 Malcolm A. Edgar
*
* 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.
*/
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpSession;
/**
* Provides a Map adaptor for HttpSession objects. A SessionMap instance is
* available in each Velocity page using the name "session".
*
* For example suppose we have a User object in the session with the
* attribute name "user" when a user is logged on. We can display the users
* name in the page when the are logged onto the system.
*
*
* #if ($session.user)
* $session.user.fullname you are logged on.
* #else
* You are not logged on.
* #end
*
* The ClickServlet adds a SessionMap instance to the Velocity Context before
* it is merged with the page template.
*
* The SessionMap supports {@link FlashAttribute} which when accessed via
* {@link #get(Object)} are removed from the session.
*
* @author Malcolm.Edgar
*/
public class SessionMap implements Map {
/** The internal session attribute. */
protected HttpSession session;
/**
* Create a HttpSession Map adaptor.
*
* @param value the http session
*/
public SessionMap(HttpSession value) {
session = value;
}
/**
* @see java.util.Map#size()
*/
public int size() {
if (session != null) {
int size = 0;
Enumeration enumeration = session.getAttributeNames();
while (enumeration.hasMoreElements()) {
enumeration.nextElement();
size++;
}
return size;
} else {
return 0;
}
}
/**
* @see java.util.Map#isEmpty()
*/
public boolean isEmpty() {
return size() == 0;
}
/**
* @see java.util.Map#containsKey(Object)
*/
public boolean containsKey(Object key) {
if (session != null && key != null) {
return session.getAttribute(key.toString()) != null;
} else {
return false;
}
}
/**
* This method is not supported and will throw
* UnsupportedOperationException if invoked.
*
* @see java.util.Map#containsValue(Object)
*/
public boolean containsValue(Object value) {
throw new UnsupportedOperationException();
}
/**
* If the stored object is a FlashObject this method will return the
* FlashObject value and then remove it from the session.
*
* @see java.util.Map#get(Object)
*/
public Object get(Object key) {
if (session != null && key != null) {
Object object = session.getAttribute(key.toString());
if (object instanceof FlashAttribute) {
FlashAttribute flashObject = (FlashAttribute) object;
object = flashObject.getValue();
session.removeAttribute(key.toString());
}
return object;
} else {
return null;
}
}
/**
* @see java.util.Map#put(Object, Object)
*/
public Object put(Object key, Object value) {
if (session != null && key != null) {
Object out = session.getAttribute(key.toString());
session.setAttribute(key.toString(), value);
return out;
} else {
return null;
}
}
/**
* @see java.util.Map#remove(Object)
*/
public Object remove(Object key) {
if (session != null && key != null) {
Object out = session.getAttribute(key.toString());
session.removeAttribute(key.toString());
return out;
} else {
return null;
}
}
/**
* @see java.util.Map#putAll(Map)
*/
public void putAll(Map map) {
if (session != null && map != null) {
for (Iterator i = map.entrySet().iterator(); i.hasNext();) {
Map.Entry entry = (Map.Entry) i.next();
String key = entry.getKey().toString();
Object value = entry.getValue();
session.setAttribute(key, value);
}
}
}
/**
* @see java.util.Map#clear()
*/
public void clear() {
if (session != null) {
Enumeration enumeration = session.getAttributeNames();
while (enumeration.hasMoreElements()) {
String name = enumeration.nextElement().toString();
session.removeAttribute(name);
}
}
}
/**
* @see java.util.Map#keySet()
*/
public Set keySet() {
if (session != null) {
Set keySet = new HashSet();
Enumeration enumeration = session.getAttributeNames();
while (enumeration.hasMoreElements()) {
keySet.add(enumeration.nextElement());
}
return keySet;
} else {
return Collections.EMPTY_SET;
}
}
/**
* This method is not supported and will throw
* UnsupportedOperationException if invoked.
*
* @see java.util.Map#values()
*/
public Collection values() {
throw new UnsupportedOperationException();
}
/**
* @see java.util.Map#entrySet()
*/
public Set entrySet() {
if (session != null) {
Set entrySet = new HashSet();
Enumeration enumeration = session.getAttributeNames();
while (enumeration.hasMoreElements()) {
String name = enumeration.nextElement().toString();
Object value = session.getAttribute(name);
entrySet.add(value);
}
return entrySet;
} else {
return Collections.EMPTY_SET;
}
}
}