Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -r4b24094f139dd10a9779ce6e678cb8ca38317148 -rfa09bf1b589df6f305cb8f0fbd8fbe4d985ee494 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 4b24094f139dd10a9779ce6e678cb8ca38317148) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision fa09bf1b589df6f305cb8f0fbd8fbe4d985ee494) @@ -638,4 +638,8 @@ /** Get the record of the learner's progress for a particular lesson */ public LearnerProgress getLearnerProgress(Integer learnerId, Long lessonId); + /** + * Start multiple lessons in one call. + */ + public boolean startLessons(Integer creatorUserId, String lessonPacket) throws Exception; } Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r4b24094f139dd10a9779ce6e678cb8ca38317148 -rfa09bf1b589df6f305cb8f0fbd8fbe4d985ee494 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 4b24094f139dd10a9779ce6e678cb8ca38317148) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision fa09bf1b589df6f305cb8f0fbd8fbe4d985ee494) @@ -81,6 +81,7 @@ import org.lamsfoundation.lams.tool.service.ILamsCoreToolService; import org.lamsfoundation.lams.usermanagement.Organisation; import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.usermanagement.UserOrganisation; import org.lamsfoundation.lams.usermanagement.Workspace; import org.lamsfoundation.lams.usermanagement.WorkspaceFolder; import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException; @@ -2410,5 +2411,150 @@ public LearnerProgress getLearnerProgress(Integer learnerId, Long lessonId) { return learnerService.getProgress(learnerId, lessonId); } + + /** + * Same as initializeLesson, but for multiple lessons, returning multiple lesson ids. + * Used internally by startLessons + */ + private List initializeLessons(Integer creatorUserId, String lessonPacket) throws Exception { + ArrayList lessonIds = new ArrayList(); + + try { + Hashtable table = (Hashtable) WDDXProcessor.deserialize(lessonPacket); + + // parse WDDX values + + String title = WDDXProcessor.convertToString("lessonName", table.get("lessonName")); + String desc = WDDXProcessor.convertToString("lessonDescription", table.get("lessonDescription")); + int copyType = WDDXProcessor.convertToInt("copyType", table.get("copyType")); + Integer organisationId = WDDXProcessor.convertToInteger("organisationID", table.get("organisationID")); + long ldId = WDDXProcessor.convertToLong(AttributeNames.PARAM_LEARNINGDESIGN_ID, table + .get(AttributeNames.PARAM_LEARNINGDESIGN_ID)); + boolean learnerExportAvailable = WDDXProcessor.convertToBoolean("learnerExportPortfolio", table + .get("learnerExportPortfolio")); + boolean learnerPresenceAvailable = WDDXProcessor.convertToBoolean("enablePresence", table + .get("enablePresence")); + boolean learnerImAvailable = WDDXProcessor.convertToBoolean("enableIm", table.get("enableIm")); + String customCSV = WDDXProcessor.convertToString(WDDXTAGS.CUSTOM_CSV, table.get(WDDXTAGS.CUSTOM_CSV)); + boolean multiple = WDDXProcessor.convertToBoolean("multiple", table.get("multiple")); + int numLessons = WDDXProcessor.convertToInt("numLessons", table.get("numLessons")); + + // initialise multiple lessons + + if (multiple) { + if (numLessons > 0) { + for (int i = 1; i <= numLessons; i++) { + Lesson newLesson = initializeLesson(title + " " + i, desc, learnerExportAvailable, ldId, + organisationId, creatorUserId, customCSV, learnerPresenceAvailable, learnerImAvailable); + lessonIds.add(newLesson.getLessonId()); + } + } + } + + } catch (Exception e) { + MonitoringService.log.error("Exception occured trying to initialise lessons ", e); + throw new Exception(e); + } + + return lessonIds; + } + + /** + * Same as create, but for multiple lessons, returning multiple lesson ids. + * Used internally by startLessons + */ + private boolean createLessonClasses(Integer creatorUserId, String lessonPacket, List lessonIds) { + try { + Hashtable table = (Hashtable) WDDXProcessor.deserialize(lessonPacket); + + // multiple lesson info + int numLessons = WDDXProcessor.convertToInt("numLessons", table.get("numLessons")); + int learnersPerLesson = WDDXProcessor.convertToInt("learnersPerLesson", table.get("learnersPerLesson")); + + // todo: convert:data type: + Integer orgId = WDDXProcessor.convertToInteger(MonitoringConstants.KEY_ORGANISATION_ID, table + .get(MonitoringConstants.KEY_ORGANISATION_ID)); + long lessonId = WDDXProcessor.convertToLong(MonitoringConstants.KEY_LESSON_ID, + table.get(MonitoringConstants.KEY_LESSON_ID)).longValue(); + + // get learner group info + Hashtable learnerMap = (Hashtable) table.get(MonitoringConstants.KEY_LEARNER); + //ignored + //List learners = (List) learnerMap.get(MonitoringConstants.KEY_USERS); + String learnerGroupName = WDDXProcessor.convertToString(learnerMap, MonitoringConstants.KEY_GROUP_NAME); + // get staff group info + Hashtable staffMap = (Hashtable) table.get(MonitoringConstants.KEY_STAFF); + List staffs = (List) staffMap.get(MonitoringConstants.KEY_USERS); + String staffGroupName = WDDXProcessor.convertToString(staffMap, MonitoringConstants.KEY_GROUP_NAME); + + if (staffs == null) { + staffs = new LinkedList(); + } + + Organisation organisation = (Organisation) baseDAO.find(Organisation.class, orgId); + User creator = (User) baseDAO.find(User.class, creatorUserId); + + // prepare staff list + List staffList = new LinkedList(); + staffList.add(creator); + Iterator iter = staffs.iterator(); + while (iter.hasNext()) { + try { + int id = ((Double) iter.next()).intValue(); + staffList.add((User) baseDAO.find(User.class, id)); + } catch (Exception e) { + MonitoringService.log.error("Error parsing staff ID from " + lessonPacket); + continue; + } + } + + // get all learners + List allLearners = new LinkedList(); + Set userOrgs = organisation.getUserOrganisations(); + iter = userOrgs.iterator(); + while (iter.hasNext()) { + UserOrganisation userOrg = (UserOrganisation) iter.next(); + allLearners.add(userOrg.getUser()); + } + + for (int i = 0; i < numLessons; i++) { + List learnerList = new LinkedList(); + // get every numLessons'th learner + for (int j = i; j < allLearners.size(); j += numLessons) { + learnerList.add(allLearners.get(j)); + } + // Create Lesson class + createLessonClassForLesson(lessonId, organisation, learnerGroupName + " " + i, learnerList, + staffGroupName + " " + i, staffList, creatorUserId); + } + + return true; + } catch (Exception e) { + MonitoringService.log.error("Exception occured trying to create a lesson class ", e); + return false; + } + + } + + /** + * Start multiple lessons in one call. + */ + public boolean startLessons(Integer creatorUserId, String lessonPacket) throws Exception { + + try { + List lessonIds = new ArrayList(); + lessonIds = initializeLessons(creatorUserId, lessonPacket); + if (createLessonClasses(creatorUserId, lessonPacket, lessonIds)) { + for (Long lessonId : lessonIds) { + startLesson(lessonId, creatorUserId); + } + } + return true; + } catch (Exception e) { + MonitoringService.log.error("Exception occured trying to start lessons ", e); + throw new Exception(e); + } + } + } \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/StartLessonsServlet.java =================================================================== diff -u --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/StartLessonsServlet.java (revision 0) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/StartLessonsServlet.java (revision fa09bf1b589df6f305cb8f0fbd8fbe4d985ee494) @@ -0,0 +1,118 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $$Id$$ */ +package org.lamsfoundation.lams.monitoring.web; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.lamsfoundation.lams.monitoring.MonitoringConstants; +import org.lamsfoundation.lams.monitoring.service.IMonitoringService; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.util.audit.IAuditService; +import org.lamsfoundation.lams.util.wddx.FlashMessage; +import org.lamsfoundation.lams.web.servlet.AbstractStoreWDDXPacketServlet; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +/** + * Servlet for flash to call in order to initialise, create lesson classes for, + * and start multiple lessons. + * + * @author Jun-Dir Liew + * + * @web:servlet name="startLessons" + * @web:servlet-mapping url-pattern="/startLessons" + */ +public class StartLessonsServlet extends AbstractStoreWDDXPacketServlet { + // --------------------------------------------------------------------- + // Instance variables + // --------------------------------------------------------------------- + private static Logger log = Logger.getLogger(StartLessonsServlet.class); + + private static final long serialVersionUID = 2349582345234543680L; + + private static IAuditService auditService; + + private static String messageKey = "startLessons"; + + protected String process(String lessonPackage, HttpServletRequest request) throws Exception { + FlashMessage flashMessage; + auditService = getAuditService(); + + // get User infomation from shared session. + HttpSession ss = SessionManager.getSession(); + + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + Integer userID = (user != null) ? user.getUserID() : null; + + if (userID == null) { + log.error("Can not find valid login user information"); + flashMessage = new FlashMessage(messageKey, "Can not find valid login user information", + FlashMessage.ERROR); + } + + if (log.isDebugEnabled()) { + log.debug("StartLessonsServlet process received packet " + lessonPackage); + } + + try { + IMonitoringService monitoringService = getMonitoringService(); + if (monitoringService.startLessons(userID, lessonPackage)) { + flashMessage = new FlashMessage(messageKey, Boolean.TRUE); + } else { + flashMessage = new FlashMessage(messageKey, Boolean.FALSE); + } + } catch (Exception e) { + log.error("Exception thrown while starting lessons.", e); + flashMessage = FlashMessage.getExceptionOccured(messageKey, e.getMessage()); + auditService.log(StartLessonsServlet.class.getName(), e.getMessage()); + } + + return flashMessage.serializeMessage(); + } + + protected String getMessageKey(String packet, HttpServletRequest request) { + return messageKey; + } + + public IMonitoringService getMonitoringService() { + WebApplicationContext webContext = WebApplicationContextUtils + .getRequiredWebApplicationContext(getServletContext()); + return (IMonitoringService) webContext.getBean(MonitoringConstants.MONITORING_SERVICE_BEAN_NAME); + } + + private IAuditService getAuditService() { + if (auditService == null) { + WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(this + .getServletContext()); + auditService = (IAuditService) ctx.getBean("auditService"); + } + return auditService; + } + +}