View Javadoc

1   /*
2    * Copyright (c) 2005 Regents of the University of California (Regents). Created
3    * by TELS, Graduate School of Education, University of California at Berkeley.
4    *
5    * This software is distributed under the GNU Lesser General Public License, v2.
6    *
7    * Permission is hereby granted, without written agreement and without license
8    * or royalty fees, to use, copy, modify, and distribute this software and its
9    * documentation for any purpose, provided that the above copyright notice and
10   * the following two paragraphs appear in all copies of this software.
11   *
12   * REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
13   * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
14   * PURPOSE. THE SOFTWAREAND ACCOMPANYING DOCUMENTATION, IF ANY, PROVIDED
15   * HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION TO PROVIDE
16   * MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
17   *
18   * IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
19   * SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
20   * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
21   * REGENTS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
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); //$NON-NLS-1$
164 	}
165 
166 	public void tryToTerminate() {
167 		logger.severe("trying to terminate -  : exception: " + null); //$NON-NLS-1$
168 		stopTime = new Date();
169 		fireSessionEvent(new SessionEvent(this, SessionEvent.END));
170 		logger.info("Session ended at " + stopTime); //$NON-NLS-1$
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); //$NON-NLS-1$
215 			PrintStream ps = new PrintStream(new FileOutputStream(file));
216 			serviceProvider.agentService.dump(this, ps);
217 			if (logger.isLoggable(Level.CONFIG)) {
218 				logger.info("done."); //$NON-NLS-1$
219 			}
220 		} catch (Exception e) {
221 			logger
222 					.severe("FAILED to dump persistance data -  : exception: " + e); //$NON-NLS-1$
223 			logger.severe("exception: " + e); //$NON-NLS-1$
224 		}
225 	}
226 
227 	@Override
228 	public String toString() {
229 		return ReflectionToStringBuilder.toString(this);
230 	}
231 }