1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package tsukuba_bunko.peko.session;
20
21 import java.io.Serializable;
22
23 import java.util.Date;
24 import java.util.HashMap;
25 import java.util.HashSet;
26
27 import tsukuba_bunko.peko.Logger;
28
29 import tsukuba_bunko.peko.scenario.SceneContext;
30
31
32 /***
33 * 現在のセッションの情報を格納します。
34 * @author $Author: ppoi $
35 * @version $Revision: 1.2 $
36 */
37 public class Session implements Serializable {
38
39 /***
40 * serial version UID
41 */
42 private static final long serialVersionUID = 2010059632489065304L;
43
44 /***
45 * セッションフラグ
46 */
47 protected HashSet _sessionFlags = null;
48
49 /***
50 * システムフラグ
51 */
52 protected HashSet _systemFlags = null;
53
54 /***
55 * システムフラグのロードタイムスタンプ
56 */
57 protected Date _timestamp = null;
58
59
60 /***
61 * 現在進行中のシーンのコンテクスト
62 */
63 protected SceneContext _sceneContext = null;
64
65 /***
66 * その他の属性
67 */
68 protected HashMap _attributes = new HashMap( 17 );
69
70
71 /***
72 * 現在シーンを処理しているスレッド
73 */
74 protected transient Thread _activeThread = null;
75
76
77 /***
78 * <code>Session</code> のインスタンスを生成します。
79 */
80 public Session()
81 {
82 super();
83 }
84
85
86 /***
87 * 現在進行中のシーンのコンテクストを設定します。
88 * @param context シーンコンテクスト
89 * @param processThread シーンを処理するスレッド
90 */
91 public synchronized void setSceneContext( SceneContext context, Thread processThread )
92 {
93 _sceneContext = context;
94 _activeThread = processThread;
95 }
96
97 /***
98 * 現在のスレッドで進行中のシーンのコンテクストを設定します。
99 * @param context シーンコンテクスト
100 */
101 public void setSceneContext( SceneContext context )
102 {
103 setSceneContext( context, Thread.currentThread() );
104 }
105
106 /***
107 * セッションで現在進行中のシーンのコンテクストを取得します。
108 * @return シーン名
109 */
110 public SceneContext getSceneContext()
111 {
112 return _sceneContext;
113 }
114
115
116 /***
117 * セッションフラグを立てます。
118 * @param flagID 立てるフラグのフラグ ID
119 */
120 public void declareSessionFlag( String flagID )
121 {
122 Logger.debug( "[session] declare session flag: " + flagID );
123 if( isActiveThread() ) {
124 _sessionFlags.add( flagID );
125 }
126 else {
127 Logger.debug( "[session] canceled declaring session flag: " + flagID );
128 }
129 }
130
131 /***
132 * セッションフラグを降ろします。
133 * @param flagID 降ろすフラグのフラグ ID
134 */
135 public void undeclareSessionFlag( String flagID )
136 {
137 Logger.debug( "[session] undeclare session flag: " + flagID );
138 if( isActiveThread() ) {
139 _sessionFlags.remove( flagID );
140 }
141 else {
142 Logger.debug( "[session] canceled undeclaring session flag: " + flagID );
143 }
144 }
145
146 /***
147 * 指定されたフラグがセッションフラグとして立てられているかどうかを判定します。
148 * @param flagID 判定するフラグ ID
149 * @return フラグが立っている場合 <code>true</code>、それ以外 <code>false</code>
150 */
151 public boolean isDeclaredSessionFlag( String flagID )
152 {
153 return _sessionFlags.contains( flagID );
154 }
155
156 /***
157 * システムフラグを立てます。
158 * @param flagID 立てるフラグのフラグ ID
159 */
160 public void declareSystemFlag( String flagID )
161 {
162 Logger.debug( "[session] declare system flag: " + flagID );
163 if( isActiveThread() ) {
164 _systemFlags.add( flagID );
165 }
166 else {
167 Logger.debug( "[session] canceled declaring system flag: " + flagID );
168 }
169 }
170
171 /***
172 * システムフラグを降ろします。
173 * @param flagID 降ろすフラグのフラグ ID
174 */
175 public void undeclareSystemFlag( String flagID )
176 {
177 Logger.debug( "[session] undeclare system flag: " + flagID );
178 if( isActiveThread() ) {
179 _systemFlags.remove( flagID );
180 }
181 else {
182 Logger.debug( "[session] canceled undeclaring system flag: " + flagID );
183 }
184 }
185
186 /***
187 * 指定されたフラグがシステムフラグとして立てられているかどうかを判定します。
188 * @param flagID 判定するフラグ ID
189 * @return フラグが立っている場合 <code>true</code>、それ以外 <code>false</code>
190 */
191 public boolean isDeclaredSystemFlag( String flagID )
192 {
193 return _systemFlags.contains( flagID );
194 }
195
196
197 /***
198 * セッションフラグ集合を設定します。
199 * @param flagSet フラグ集合
200 */
201 public void setSessionFlagSet( HashSet flagSet )
202 {
203 _sessionFlags = flagSet;
204 }
205
206 /***
207 * セッションフラグ集合を取得します。
208 * @return フラグ集合
209 */
210 public HashSet getSessionFlagSet()
211 {
212 return _sessionFlags;
213 }
214
215 /***
216 * システムフラグ集合を設定した時刻を取得します。
217 * @return システムフラグ集合を設定した時刻
218 */
219 public Date getTimestamp()
220 {
221 return _timestamp;
222 }
223
224 /***
225 * システムフラグ集合を設定します。<code>timestamp</code> が、現在のコンテクストに設定されている時刻より古い場合は設定は反映されません。
226 * @param flagSet フラグ集合
227 * @param timestamp フラグ集合のタイムスタンプ
228 */
229 public void setSystemFlagSet( HashSet flagSet, Date timestamp )
230 {
231 if( (_timestamp == null) || _timestamp.before(timestamp) ) {
232 _systemFlags = flagSet;
233 _timestamp = timestamp;
234 }
235 }
236
237 /***
238 * システムフラグ集合を取得します。
239 * @return フラグ集合
240 */
241 public HashSet getSystemFlagSet()
242 {
243 return _systemFlags;
244 }
245
246
247 /***
248 * セッションに属性を設定します。
249 * @param name 属性名
250 * @param value 属性値
251 */
252 public void setSessionAttribute( String name, Serializable value )
253 {
254 _attributes.put( name, value );
255 }
256
257 /***
258 * セッションの属性を取得します。
259 * @param name 属性名
260 * @return 属性値
261 */
262 public Object getSessionAttribute( String name )
263 {
264 return _attributes.get( name );
265 }
266
267
268 /***
269 * 現在のスレッドがシーン処理中のスレッドかどうかを判定します。
270 * @return 現在のスレッドがシーン処理中のスレッドの場合 <code>true</code>、それ以外の場合 <code>false</code>
271 */
272 protected boolean isActiveThread()
273 {
274 return (_activeThread == Thread.currentThread());
275 }
276 }