
nablarch.common.web.session.Session Maven / Gradle / Ivy
The newest version!
package nablarch.common.web.session;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import nablarch.fw.ExecutionContext;
/**
* セッション全体を表すクラス。
*
* @author kawasima
* @author tajima
*/
public class Session implements Serializable, Iterable {
/** serialVersionUID */
private static final long serialVersionUID = 1L;
/** セッションID */
private String sessionId;
/** セッションファクトリ */
private transient SessionManager factory;
/** HTTPリクエストに付随する実行コンテキスト */
private final transient ExecutionContext executionContext;
/** セッション内の変数テーブルとなるMap */
private final transient Map entryMap = new HashMap();
/**
* コンストラクタ。
*
* @param executionContext 設定するコンテキスト
*/
public Session(ExecutionContext executionContext) {
this.executionContext = executionContext;
}
/**
* セッション自体を削除する。
*/
public void invalidate() {
if (sessionId != null) {
for (SessionStore store : factory.getAvailableStores()) {
store.invalidate(sessionId, executionContext);
}
sessionId = null;
}
}
/**
* セッションIDを取得する。
* セッションIDが存在しない場合は新しく生成する。
*
* @return セッションID
*/
public String getOrGenerateId() {
if (sessionId == null) {
sessionId = UUID.randomUUID().toString();
}
return sessionId;
}
/**
* セッションIDを取得する。
*
* @return セッションID
*/
public String getId() {
return sessionId;
}
/**
* セッションをロードする。
*
* @param sessionId セッションID
*/
public void load(String sessionId) {
this.sessionId = sessionId;
for (SessionStore store : factory.getAvailableStores()) {
List entries = store.load(sessionId, executionContext);
for (SessionEntry entry : entries) {
entryMap.put(entry.getKey(), entry);
}
}
}
/**
* セッションを保存する。
*/
public void save() {
// 新規Sessionの場合はセッションIDが生成されていないため。
if (sessionId == null) {
getOrGenerateId();
}
// SessionEntryが存在するStoreに対する保存。
Map> entriesByStorage = new HashMap>();
for (SessionEntry entry : entryMap.values()) {
List entries = entriesByStorage.get(entry.getStorage());
if (entries == null) {
entries = new ArrayList();
entriesByStorage.put(entry.getStorage(), entries);
}
entries.add(entry);
}
List stores = new ArrayList(factory.getAvailableStores());
for (Map.Entry> e : entriesByStorage.entrySet()) {
e.getKey().save(sessionId, e.getValue(), executionContext);
stores.remove(e.getKey());
}
// SessionEntryが存在しなくなったStoreに対する削除。
for (SessionStore store : stores) {
store.delete(sessionId, executionContext);
}
}
/**
* セッションキーからセッション値を取得する。
*
* @param key セッションキー
* @return セッション値
*/
public Object get(String key) {
SessionEntry entry = entryMap.get(key);
if (entry == null) {
return null;
}
return entry.getValue();
}
/**
* 指定されたセッションキーに対応する値を返す。
*
* @param 総称型
* @param key セッションキー
* @param type クラスタイプ
* @return セッション値
*/
public T get(String key, Class type) {
Object value = get(key);
return type.cast(value);
}
/**
* 指定されたセッションキーに対応する値を登録する。
*
* @param key セッションキー
* @param value セッション値
* @param storeName セッション名
*/
public void put(String key, Object value, String storeName) {
for (SessionStore storage : factory.getAvailableStores()) {
if (storage.getName().equals(storeName)) {
entryMap.put(key, new SessionEntry(key, value, storage));
return;
}
}
}
/**
* 指定されたエントリをセッションに登録する。
*
* @param entry エントリ
*/
public void put(SessionEntry entry) {
entryMap.put(entry.getKey(), entry);
}
/**
* 指定されたセッションキーに登録されている値を削除する。
*
* @param key セッションキー
*/
public void delete(String key) {
entryMap.remove(key);
}
/**
* クリアする。
*/
public void deleteAll() {
entryMap.clear();
}
/**
* このセッションを生成したファクトリを設定する。
*
* @param factory セッションファクトリ
*/
protected void setSessionFactory(SessionManager factory) {
this.factory = factory;
}
/**
* このセッションを生成したファクトリを取得する。
*
* @return セッションファクトリ
*/
public SessionManager getSessionFactory() {
return factory;
}
@Override
public Iterator iterator() {
return entryMap.values().iterator();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy