1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 package net.sf.sail.core.beans;
24
25 import java.util.logging.Level;
26 import java.util.logging.Logger;
27
28 import java.beans.beancontext.BeanContextServiceProvider;
29 import java.beans.beancontext.BeanContextServices;
30 import java.beans.beancontext.BeanContextServicesSupport;
31 import java.io.File;
32 import java.io.FileOutputStream;
33 import java.io.PrintStream;
34 import java.util.ArrayList;
35 import java.util.Date;
36 import java.util.Iterator;
37 import java.util.List;
38
39 import net.sf.sail.core.beans.event.SessionEvent;
40 import net.sf.sail.core.beans.event.SessionEventListener;
41 import net.sf.sail.core.beans.service.AgentService;
42 import net.sf.sail.core.beans.service.SessionService;
43 import net.sf.sail.core.entity.Offering;
44 import net.sf.sail.core.entity.User;
45 import net.sf.sail.core.session.DefaultSessionService;
46 import net.sf.sail.core.session.SessionDataService;
47 import net.sf.sail.core.uuid.SessionUuid;
48
49 import org.apache.commons.lang.builder.ReflectionToStringBuilder;
50
51 /***
52 * @author turadg
53 */
54 public class SessionContext extends BeanContextServicesSupport {
55 /***
56 * Logger for this class
57 */
58 private static final Logger logger = Logger.getLogger(SessionContext.class
59 .getName());
60
61 private static final long serialVersionUID = 1L;
62
63 /***
64 * @author turadg
65 */
66 class ServiceProvider implements BeanContextServiceProvider {
67
68 SessionService sessionService = new DefaultSessionService(
69 SessionContext.this);
70
71 AgentService agentService = null;
72
73 void register(BeanContextServices bcs) {
74 bcs.addService(SessionService.class, serviceProvider);
75 bcs.addService(AgentService.class, serviceProvider);
76 }
77
78 public void releaseService(BeanContextServices bcs, Object requestor,
79 Object service) {
80 throw new UnsupportedOperationException();
81 }
82
83 public Iterator getCurrentServiceSelectors(BeanContextServices bcs,
84 Class serviceClass) {
85 throw new UnsupportedOperationException();
86 }
87
88 public Object getService(BeanContextServices bcs, Object requestor,
89 Class serviceClass, Object serviceSelector) {
90 if (serviceClass == SessionService.class) {
91 return sessionService;
92 } else if (serviceClass == AgentService.class) {
93 return agentService;
94 } else
95 return null;
96 }
97 }
98
99 private final ServiceProvider serviceProvider = new ServiceProvider();
100
101 SessionUuid sessionId;
102
103 SessionDataService sessionDataService;
104
105 Offering offering;
106
107 Date startTime;
108
109 Date stopTime;
110
111 public Offering getOffering() {
112 return offering;
113 }
114
115 public void setOffering(Offering offering) {
116 this.offering = offering;
117 }
118
119 List<SessionEventListener> sessionEventListeners = new ArrayList<SessionEventListener>();
120
121 private boolean initiated;
122
123 public void addSessionEventListener(SessionEventListener sel) {
124 sessionEventListeners.add(sel);
125 }
126
127 protected void fireSessionEvent(SessionEvent se) {
128 for (Iterator iter = sessionEventListeners.iterator(); iter.hasNext();) {
129 SessionEventListener listener = (SessionEventListener) iter.next();
130 switch (se.getID()) {
131 case SessionEvent.INITIATE:
132 listener.sessionInitiated(se);
133 break;
134 case SessionEvent.START:
135 listener.sessionStarted(se);
136 break;
137 case SessionEvent.END:
138 listener.sessionStopped(se);
139 break;
140 }
141 }
142 }
143
144 public void addUser(User user) {
145 serviceProvider.sessionService.addUser(user);
146 }
147
148 public void initiate() {
149 if (sessionDataService == null)
150 throw new IllegalStateException(
151 "initiate() called before sessionDataService property set");
152 BeanContextServices bcs = getBeanContextServicesPeer();
153 serviceProvider.register(bcs);
154 fireSessionEvent(new SessionEvent(this, SessionEvent.INITIATE));
155 initiated = true;
156 }
157
158 public void start() {
159 if (!initiated)
160 throw new IllegalStateException("start() called before initiate()");
161 startTime = new Date();
162 fireSessionEvent(new SessionEvent(this, SessionEvent.START));
163 logger.info("Session started at " + startTime);
164 }
165
166 public void tryToTerminate() {
167 logger.severe("trying to terminate - : exception: " + null);
168 stopTime = new Date();
169 fireSessionEvent(new SessionEvent(this, SessionEvent.END));
170 logger.info("Session ended at " + stopTime);
171 dumpPersistance();
172 System.exit(0);
173 }
174
175 public Date getStartTime() {
176 return startTime;
177 }
178
179 public Date getStopTime() {
180 return stopTime;
181 }
182
183 public SessionUuid getSessionId() {
184 return sessionId;
185 }
186
187 public void setSessionId(SessionUuid sessionId) {
188 this.sessionId = sessionId;
189 }
190
191 public SessionDataService getSessionDataService() {
192 return sessionDataService;
193 }
194
195 public void setSessionDataService(SessionDataService sessionDataService) {
196 this.sessionDataService = sessionDataService;
197 serviceProvider.agentService = sessionDataService
198 .getPersistenceService(this);
199 }
200
201 /***
202 * @return milliseconds since the session started
203 */
204 public long getOffsetMilliseconds() {
205 return java.lang.System.currentTimeMillis() - startTime.getTime();
206 }
207
208 /***
209 *
210 */
211 private void dumpPersistance() {
212 try {
213 File file = File.createTempFile("saildump", ".xml");
214 logger.info("dumping persistance data to " + file);
215 PrintStream ps = new PrintStream(new FileOutputStream(file));
216 serviceProvider.agentService.dump(this, ps);
217 if (logger.isLoggable(Level.CONFIG)) {
218 logger.info("done.");
219 }
220 } catch (Exception e) {
221 logger
222 .severe("FAILED to dump persistance data - : exception: " + e);
223 logger.severe("exception: " + e);
224 }
225 }
226
227 @Override
228 public String toString() {
229 return ReflectionToStringBuilder.toString(this);
230 }
231 }