Index: lams_tool_task/.externalToolBuilders/SASS_lams_tool_task.launch
===================================================================
diff -u -ra83b0eec89979dce7415b02afdda324b14018dbb -rb9f506afc78a6f28e20a87ef15915076fd9d839f
--- lams_tool_task/.externalToolBuilders/SASS_lams_tool_task.launch (.../SASS_lams_tool_task.launch) (revision a83b0eec89979dce7415b02afdda324b14018dbb)
+++ lams_tool_task/.externalToolBuilders/SASS_lams_tool_task.launch (.../SASS_lams_tool_task.launch) (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -1,17 +1,23 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Fisheye: Tag b9f506afc78a6f28e20a87ef15915076fd9d839f refers to a dead (removed) revision in file `lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/action/AuthoringAction.java'.
Fisheye: No comparison available. Pass `N' to diff?
Fisheye: Tag b9f506afc78a6f28e20a87ef15915076fd9d839f refers to a dead (removed) revision in file `lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/action/AuthoringTaskListConditionAction.java'.
Fisheye: No comparison available. Pass `N' to diff?
Fisheye: Tag b9f506afc78a6f28e20a87ef15915076fd9d839f refers to a dead (removed) revision in file `lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/action/ClearSessionAction.java'.
Fisheye: No comparison available. Pass `N' to diff?
Fisheye: Tag b9f506afc78a6f28e20a87ef15915076fd9d839f refers to a dead (removed) revision in file `lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/action/LearningAction.java'.
Fisheye: No comparison available. Pass `N' to diff?
Fisheye: Tag b9f506afc78a6f28e20a87ef15915076fd9d839f refers to a dead (removed) revision in file `lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/action/MonitoringAction.java'.
Fisheye: No comparison available. Pass `N' to diff?
Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringController.java
===================================================================
diff -u
--- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringController.java (revision 0)
+++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringController.java (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -0,0 +1,897 @@
+/****************************************************************
+ * 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 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
+ * ****************************************************************
+ */
+
+package org.lamsfoundation.lams.tool.taskList.web.controller;
+
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.NumberUtils;
+import org.apache.log4j.Logger;
+import org.apache.struts.action.ActionForm;
+import org.lamsfoundation.lams.authoring.web.AuthoringConstants;
+import org.lamsfoundation.lams.tool.ToolAccessMode;
+import org.lamsfoundation.lams.tool.taskList.TaskListConstants;
+import org.lamsfoundation.lams.tool.taskList.model.TaskList;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListCondition;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListItem;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListUser;
+import org.lamsfoundation.lams.tool.taskList.service.ITaskListService;
+import org.lamsfoundation.lams.tool.taskList.service.TaskListException;
+import org.lamsfoundation.lams.tool.taskList.util.TaskListConditionComparator;
+import org.lamsfoundation.lams.tool.taskList.util.TaskListItemComparator;
+import org.lamsfoundation.lams.tool.taskList.web.form.TaskListForm;
+import org.lamsfoundation.lams.tool.taskList.web.form.TaskListItemForm;
+import org.lamsfoundation.lams.tool.taskList.web.form.TaskListPedagogicalPlannerForm;
+import org.lamsfoundation.lams.usermanagement.dto.UserDTO;
+import org.lamsfoundation.lams.util.WebUtil;
+import org.lamsfoundation.lams.web.session.SessionManager;
+import org.lamsfoundation.lams.web.util.AttributeNames;
+import org.lamsfoundation.lams.web.util.SessionMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Controller;
+import org.springframework.validation.Errors;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * The main action in author mode. All the authoring operations are located in
+ * here. Except for operations dealing with TaskListCondition that are located
+ * in AuthoringTaskListConditionAction
action.
+ *
+ * @author Steve.Ni
+ * @author Andrey Balan
+ * @see org.lamsfoundation.lams.tool.taskList.web.controller.AuthoringTaskListConditionController
+ */
+
+@Controller
+@RequestMapping("/authoring")
+public class AuthoringController {
+
+ private static Logger log = Logger.getLogger(AuthoringController.class);
+
+ @Autowired
+ @Qualifier("lataskTaskListService")
+ private ITaskListService taskListService;
+
+ // **********************************************************
+ // Solid taskList methods
+ // **********************************************************
+
+ /**
+ * Read taskList data from database and put them into HttpSession. It will
+ * redirect to init.do directly after this method run successfully.
+ *
+ * This method will avoid read database again and lost un-saved resouce item
+ * lost when user "refresh page",
+ *
+ * @throws ServletException
+ */
+
+ @RequestMapping("/start")
+ public String start(@ModelAttribute TaskListForm taskListForm, HttpServletRequest request) throws ServletException {
+
+ ToolAccessMode mode = WebUtil.readToolAccessModeAuthorDefaulted(request);
+ request.setAttribute(AttributeNames.ATTR_MODE, mode.toString());
+
+ // save toolContentID into HTTPSession
+ Long contentId = new Long(WebUtil.readLongParam(request, TaskListConstants.PARAM_TOOL_CONTENT_ID));
+
+ List items = null;
+ TaskList taskList = null;
+
+ // Get contentFolderID and save to form.
+ String contentFolderID = WebUtil.readStrParam(request, AttributeNames.PARAM_CONTENT_FOLDER_ID);
+ taskListForm.setContentFolderID(contentFolderID);
+
+ // initial Session Map
+ SessionMap sessionMap = new SessionMap<>();
+ request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap);
+ taskListForm.setSessionMapID(sessionMap.getSessionID());
+
+ try {
+ taskList = taskListService.getTaskListByContentId(contentId);
+ // if taskList does not exist, try to use default content instead.
+ if (taskList == null) {
+ taskList = taskListService.getDefaultContent(contentId);
+ if (taskList.getTaskListItems() != null) {
+ items = new ArrayList(taskList.getTaskListItems());
+ } else {
+ items = null;
+ }
+ } else {
+ items = taskListService.getAuthoredItems(taskList.getUid());
+ }
+
+ taskListForm.setTaskList(taskList);
+ } catch (Exception e) {
+ AuthoringController.log.error(e);
+ throw new ServletException(e);
+ }
+
+ // initialize conditions list
+ SortedSet conditionList = getTaskListConditionList(sessionMap);
+ conditionList.clear();
+ conditionList.addAll(taskList.getConditions());
+
+ // init it to avoid null exception in following handling
+ if (items == null) {
+ items = new ArrayList<>();
+ } else {
+ TaskListUser taskListUser = null;
+ // handle system default question: createBy is null, now set it to current user
+ for (TaskListItem item : items) {
+ if (item.getCreateBy() == null) {
+ if (taskListUser == null) {
+ // get back login user DTO
+ HttpSession ss = SessionManager.getSession();
+ UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER);
+ taskListUser = new TaskListUser(user, taskList);
+ }
+ item.setCreateBy(taskListUser);
+ }
+ }
+ }
+ // init taskList item list
+ SortedSet taskListItemList = getTaskListItemList(sessionMap);
+ taskListItemList.clear();
+ taskListItemList.addAll(items);
+
+ sessionMap.put(TaskListConstants.ATTR_TASKLIST_FORM, taskListForm);
+ request.getSession().setAttribute(AttributeNames.PARAM_NOTIFY_CLOSE_URL,
+ request.getParameter(AttributeNames.PARAM_NOTIFY_CLOSE_URL));
+ request.setAttribute("startForm", taskListForm);
+ return "pages/authoring/start";
+ }
+
+ @RequestMapping("/definelater")
+ public String defineLater(@ModelAttribute TaskListForm taskListForm, HttpServletRequest request)
+ throws ServletException {
+
+ // update define later flag to true
+ Long contentId = new Long(WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID));
+ TaskList taskList = taskListService.getTaskListByContentId(contentId);
+
+ taskList.setDefineLater(true);
+ taskListService.saveOrUpdateTaskList(taskList);
+
+ // audit log the teacher has started editing activity in monitor
+ taskListService.auditLogStartEditingActivityInMonitor(contentId);
+
+ request.setAttribute(AttributeNames.ATTR_MODE, ToolAccessMode.TEACHER.toString());
+
+ // save toolContentID into HTTPSession
+
+ List items = null;
+
+ // Get contentFolderID and save to form.
+ String contentFolderID = WebUtil.readStrParam(request, AttributeNames.PARAM_CONTENT_FOLDER_ID);
+ taskListForm.setContentFolderID(contentFolderID);
+
+ // initial Session Map
+ SessionMap sessionMap = new SessionMap<>();
+ request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap);
+ taskListForm.setSessionMapID(sessionMap.getSessionID());
+
+ try {
+ taskList = taskListService.getTaskListByContentId(contentId);
+ // if taskList does not exist, try to use default content instead.
+ if (taskList == null) {
+ taskList = taskListService.getDefaultContent(contentId);
+ if (taskList.getTaskListItems() != null) {
+ items = new ArrayList(taskList.getTaskListItems());
+ } else {
+ items = null;
+ }
+ } else {
+ items = taskListService.getAuthoredItems(taskList.getUid());
+ }
+
+ taskListForm.setTaskList(taskList);
+ } catch (Exception e) {
+ AuthoringController.log.error(e);
+ throw new ServletException(e);
+ }
+
+ // initialize conditions list
+ SortedSet conditionList = getTaskListConditionList(sessionMap);
+ conditionList.clear();
+ conditionList.addAll(taskList.getConditions());
+
+ // init it to avoid null exception in following handling
+ if (items == null) {
+ items = new ArrayList<>();
+ } else {
+ TaskListUser taskListUser = null;
+ // handle system default question: createBy is null, now set it to current user
+ for (TaskListItem item : items) {
+ if (item.getCreateBy() == null) {
+ if (taskListUser == null) {
+ // get back login user DTO
+ HttpSession ss = SessionManager.getSession();
+ UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER);
+ taskListUser = new TaskListUser(user, taskList);
+ }
+ item.setCreateBy(taskListUser);
+ }
+ }
+ }
+ // init taskList item list
+ SortedSet taskListItemList = getTaskListItemList(sessionMap);
+ taskListItemList.clear();
+ taskListItemList.addAll(items);
+
+ sessionMap.put(TaskListConstants.ATTR_TASKLIST_FORM, taskListForm);
+ request.getSession().setAttribute(AttributeNames.PARAM_NOTIFY_CLOSE_URL,
+ request.getParameter(AttributeNames.PARAM_NOTIFY_CLOSE_URL));
+ return "pages/authoring/start";
+
+ }
+
+ /**
+ * Display same entire authoring page content from HttpSession variable.
+ *
+ * @param taskListForm
+ * @param request
+ * @return
+ * @throws ServletException
+ */
+ @RequestMapping("/init")
+ public String initPage(@ModelAttribute TaskListForm startForm, HttpServletRequest request)
+ throws ServletException {
+
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession()
+ .getAttribute(sessionMapID);
+ TaskListForm existForm = (TaskListForm) sessionMap.get(TaskListConstants.ATTR_TASKLIST_FORM);
+
+ try {
+ PropertyUtils.copyProperties(startForm, existForm);
+ } catch (Exception e) {
+ throw new ServletException(e);
+ }
+
+ ToolAccessMode mode = WebUtil.readToolAccessModeAuthorDefaulted(request);
+ request.setAttribute(AttributeNames.ATTR_MODE, mode.toString());
+ request.setAttribute("taskListForm", startForm);
+ return "pages/authoring/authoring";
+ }
+
+ /**
+ * This method will persist all inforamtion in this authoring page, include all
+ * taskList item, information etc.
+ *
+ * @param taskListForm
+ * @param request
+ * @return
+ * @throws ServletException
+ */
+ @RequestMapping("/update")
+ public String updateContent(@ModelAttribute TaskListForm taskListForm, HttpServletRequest request)
+ throws Exception {
+
+ // get back sessionMAP
+ SessionMap sessionMap = (SessionMap) request.getSession()
+ .getAttribute(taskListForm.getSessionMapID());
+
+ ToolAccessMode mode = WebUtil.readToolAccessModeAuthorDefaulted(request);
+ request.setAttribute(AttributeNames.ATTR_MODE, mode.toString());
+
+ TaskList taskList = taskListForm.getTaskList();
+
+ // **********************************Get TaskList PO*********************
+ TaskList taskListPO = taskListService.getTaskListByContentId(taskListForm.getTaskList().getContentId());
+ if (taskListPO == null) {
+ // new TaskList, create it
+ taskListPO = taskList;
+ taskListPO.setCreated(new Timestamp(new Date().getTime()));
+ taskListPO.setUpdated(new Timestamp(new Date().getTime()));
+
+ } else {
+ Long uid = taskListPO.getUid();
+ PropertyUtils.copyProperties(taskListPO, taskList);
+ // get back UID
+ taskListPO.setUid(uid);
+
+ // if it's a teacher - change define later status
+ if (mode.isTeacher()) {
+ taskListPO.setDefineLater(false);
+ }
+
+ taskListPO.setUpdated(new Timestamp(new Date().getTime()));
+ }
+
+ // *******************************Handle user*******************
+ // try to get form system session
+ HttpSession ss = SessionManager.getSession();
+ // get back login user DTO
+ UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER);
+ TaskListUser taskListUser = taskListService.getUserByIDAndContent(new Long(user.getUserID().intValue()),
+ taskListForm.getTaskList().getContentId());
+ if (taskListUser == null) {
+ taskListUser = new TaskListUser(user, taskListPO);
+ }
+
+ taskListPO.setCreatedBy(taskListUser);
+
+ // ************************* Handle taskList items *******************
+ Set itemList = new LinkedHashSet();
+ SortedSet items = getTaskListItemList(sessionMap);
+ for (TaskListItem item : items) {
+ if (item != null) {
+ if (item.getUid() == null) {
+ // This flushs user UID info to message if this user is a new user.
+ item.setCreateBy(taskListUser);
+ itemList.add(item);
+ } else {
+ // Do not update if it is not null otherwise Edit Activity will overwrite the
+ // learner id for learner entered tasks
+ // But taskListUser & .getCreatedBy() are a stale lazy loaded object so need to
+ // the real things from the session
+ TaskListItem itemPO = taskListService.getTaskListItemByUid(item.getUid());
+ if (itemPO != null) {
+ updateTaskListItemFromSession(itemPO, item);
+ itemList.add(itemPO);
+ } else {
+ // something weird happened. Uid exists but can't find the task. Make it an
+ // authored task
+ item.setCreateBy(taskListUser);
+ item.setCreateByAuthor(true);
+ itemList.add(item);
+ }
+ }
+ }
+ }
+ taskListPO.setTaskListItems(itemList);
+
+ // ************************* Handle taskList conditions *******************
+ SortedSet conditions = getTaskListConditionList(sessionMap);
+ SortedSet conditionListWithoutEmptyElements = new TreeSet<>(conditions);
+ List delConditions = getDeletedTaskListConditionList(sessionMap);
+
+ for (TaskListCondition condition : conditions) {
+ if (condition.getTaskListItems().size() == 0) {
+ conditionListWithoutEmptyElements.remove(condition);
+ delConditions.add(condition);
+
+ // reorder remaining conditions
+ for (TaskListCondition otherCondition : conditionListWithoutEmptyElements) {
+ if (otherCondition.getSequenceId() > condition.getSequenceId()) {
+ otherCondition.setSequenceId(otherCondition.getSequenceId() - 1);
+ }
+ }
+ }
+ }
+ conditions.clear();
+ conditions.addAll(conditionListWithoutEmptyElements);
+ taskListPO.setConditions(conditions);
+
+ // delete TaskListConditions from database.
+ Iterator iter = delConditions.iterator();
+ while (iter.hasNext()) {
+ TaskListCondition condition = (TaskListCondition) iter.next();
+ iter.remove();
+
+ if (condition.getUid() != null) {
+ taskListService.deleteTaskListCondition(condition.getUid());
+ }
+ }
+
+ // delete TaskListItems from database. This should be done after
+ // TaskListConditions have been deleted from the database. This is due
+ // to prevent errors with foreign keys.
+ List delTaskListItems = getDeletedTaskListItemList(sessionMap);
+ iter = delTaskListItems.iterator();
+ while (iter.hasNext()) {
+ TaskListItem item = (TaskListItem) iter.next();
+ iter.remove();
+ if (item.getUid() != null) {
+ taskListService.deleteTaskListItem(item.getUid());
+ }
+ }
+
+ // if MinimumNumberTasksComplete is bigger than available items, then set it
+ // topics size
+ if (taskListPO.getMinimumNumberTasks() > items.size()) {
+ taskListPO.setMinimumNumberTasks(items.size());
+ }
+
+ // **********************************************
+ // finally persist taskListPO again
+ taskListService.saveOrUpdateTaskList(taskListPO);
+
+ taskListService.getTaskListByContentId(taskListPO.getContentId());
+
+ taskListForm.setTaskList(taskListPO);
+
+ request.setAttribute(AuthoringConstants.LAMS_AUTHORING_SUCCESS_FLAG, Boolean.TRUE);
+ return "pages/authoring/authoring";
+ }
+
+ // **********************************************************
+ // Add taskListItem methods
+ // **********************************************************
+
+ /**
+ * Display empty page for new taskList item.
+ *
+ * @param taskListForm
+ * @param request
+ * @return
+ */
+ @RequestMapping("/newItemInit")
+ public String newItemlInit(@ModelAttribute TaskListItemForm taskListItemForm, HttpServletRequest request) {
+
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ taskListItemForm.setSessionMapID(sessionMapID);
+
+ return "pages/authoring/parts/addtask";
+ }
+
+ /**
+ * Display edit page for existed taskList item.
+ *
+ * @param taskListForm
+ * @param request
+ * @return
+ */
+ @RequestMapping("editItemInit")
+ public String editItemInit(@ModelAttribute TaskListItemForm taskListItemForm, HttpServletRequest request) {
+
+ // get back sessionMAP
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession()
+ .getAttribute(sessionMapID);
+
+ int itemIdx = NumberUtils.stringToInt(request.getParameter(TaskListConstants.PARAM_ITEM_INDEX), -1);
+ TaskListItem item = null;
+ if (itemIdx != -1) {
+ SortedSet taskListList = getTaskListItemList(sessionMap);
+ List rList = new ArrayList<>(taskListList);
+ item = rList.get(itemIdx);
+ if (item != null) {
+ populateItemToForm(itemIdx, item, taskListItemForm, request);
+ }
+ }
+
+ return item == null ? null : "pages/authoring/parts/addtask";
+ }
+
+ /**
+ * This method will get necessary information from taskList item form and save
+ * or update into HttpSession
TaskListItemList. Notice, this save
+ * is not persist them into database, just save HttpSession
+ * temporarily. Only they will be persist when the entire authoring page is
+ * being persisted.
+ *
+ * @param form
+ * @param request
+ * @return
+ * @throws ServletException
+ */
+ @RequestMapping("/saveOrUpdateItem")
+ public String saveOrUpdateItem(@ModelAttribute TaskListItemForm taskListItemForm, Errors errors,
+ HttpServletRequest request) {
+
+ validateTaskListItem(taskListItemForm, errors);
+
+ if (errors.hasErrors()) {
+ return "pages/authoring/parts/addtask";
+ }
+//
+ try {
+ extractFormToTaskListItem(request, taskListItemForm);
+ } catch (Exception e) {
+ // any upload exception will display as normal error message rather then throw
+ // exception directly
+ errors.reject(TaskListConstants.ERROR_MSG_UPLOAD_FAILED);
+ return "pages/authoring/parts/addtask";
+ }
+ // set session map ID so that itemlist.jsp can get sessionMAP
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, taskListItemForm.getSessionMapID());
+ // return null to close this window
+ return "pages/authoring/parts/itemlist";
+ }
+
+ /**
+ * Remove taskList item from HttpSession list and update page display. As
+ * authoring rule, all persist only happen when user submit whole page. So this
+ * remove is just impact HttpSession values.
+ *
+ * @param taskListForm
+ * @param request
+ * @param response
+ * @return
+ */
+ @RequestMapping("/removeItem")
+ public String removeItem(HttpServletRequest request) {
+
+ // get back sessionMAP
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession()
+ .getAttribute(sessionMapID);
+
+ int itemIdx = NumberUtils.stringToInt(request.getParameter(TaskListConstants.PARAM_ITEM_INDEX), -1);
+ if (itemIdx != -1) {
+ SortedSet taskListList = getTaskListItemList(sessionMap);
+ List rList = new ArrayList<>(taskListList);
+ TaskListItem item = rList.remove(itemIdx);
+ taskListList.clear();
+ taskListList.addAll(rList);
+ // add to delList
+ List delList = getDeletedTaskListItemList(sessionMap);
+ delList.add(item);
+
+ // delete tasklistitems that still may be contained in Conditions
+ SortedSet conditionList = getTaskListConditionList(sessionMap);
+ for (TaskListCondition condition : conditionList) {
+ Set itemList = condition.getTaskListItems();
+ if (itemList.contains(item)) {
+ itemList.remove(item);
+ }
+ }
+
+ }
+
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, sessionMapID);
+ return "pages/authoring/parts/itemlist";
+ }
+
+ /**
+ * Move up current item.
+ *
+ * @param request
+ * @return
+ */
+ @RequestMapping("/upItem")
+ public String upItem(HttpServletRequest request) {
+ return switchItem(request, true);
+ }
+
+ /**
+ * Move down current item.
+ *
+ * @param request
+ * @return
+ */
+ @RequestMapping("/downItem")
+ public String downItem(HttpServletRequest request) {
+ return switchItem(request, false);
+ }
+
+ public String switchItem(HttpServletRequest request, boolean up) {
+ // get back sessionMAP
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession()
+ .getAttribute(sessionMapID);
+
+ int itemIdx = NumberUtils.stringToInt(request.getParameter(TaskListConstants.PARAM_ITEM_INDEX), -1);
+ if (itemIdx != -1) {
+ SortedSet taskListList = getTaskListItemList(sessionMap);
+ List rList = new ArrayList<>(taskListList);
+ // get current and the target item, and switch their sequnece
+ TaskListItem item = rList.get(itemIdx);
+ TaskListItem repItem;
+ if (up) {
+ repItem = rList.get(--itemIdx);
+ } else {
+ repItem = rList.get(++itemIdx);
+ }
+ int upSeqId = repItem.getSequenceId();
+ repItem.setSequenceId(item.getSequenceId());
+ item.setSequenceId(upSeqId);
+
+ // put back list, it will be sorted again
+ taskListList.clear();
+ taskListList.addAll(rList);
+ }
+
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, sessionMapID);
+ return "pages/authoring/parts/itemlist";
+ }
+
+ // *************************************************************************************
+ // Private methods for internal needs
+ // *************************************************************************************
+
+ /**
+ * List save current taskList items.
+ *
+ * @param request
+ * @return
+ */
+ private SortedSet getTaskListItemList(SessionMap sessionMap) {
+ SortedSet list = (SortedSet) sessionMap
+ .get(TaskListConstants.ATTR_TASKLIST_ITEM_LIST);
+ if (list == null) {
+ list = new TreeSet<>(new TaskListItemComparator());
+ sessionMap.put(TaskListConstants.ATTR_TASKLIST_ITEM_LIST, list);
+ }
+ return list;
+ }
+
+ /**
+ * List save current taskList items.
+ *
+ * @param request
+ * @return
+ */
+ private SortedSet getTaskListConditionList(SessionMap sessionMap) {
+ SortedSet list = (SortedSet) sessionMap
+ .get(TaskListConstants.ATTR_CONDITION_LIST);
+ if (list == null) {
+ list = new TreeSet<>(new TaskListConditionComparator());
+ sessionMap.put(TaskListConstants.ATTR_CONDITION_LIST, list);
+ }
+ return list;
+ }
+
+ /**
+ * List save deleted taskList items, which could be persisted or non-persisted
+ * items.
+ *
+ * @param request
+ * @return
+ */
+ private List getDeletedTaskListConditionList(SessionMap sessionMap) {
+ return getListFromSession(sessionMap, TaskListConstants.ATTR_DELETED_CONDITION_LIST);
+ }
+
+ /**
+ * List save deleted taskList items, which could be persisted or non-persisted
+ * items.
+ *
+ * @param request
+ * @return
+ */
+ private List getDeletedTaskListItemList(SessionMap sessionMap) {
+ return getListFromSession(sessionMap, TaskListConstants.ATTR_DELETED_TASKLIST_ITEM_LIST);
+ }
+
+ /**
+ * Get java.util.List
from HttpSession by given name.
+ *
+ * @param request
+ * @param name
+ * @return
+ */
+ private List getListFromSession(SessionMap sessionMap, String name) {
+ List list = (List) sessionMap.get(name);
+ if (list == null) {
+ list = new ArrayList();
+ sessionMap.put(name, list);
+ }
+ return list;
+ }
+
+ /**
+ * This method will populate taskList item information to its form for edit use.
+ *
+ * @param itemIdx
+ * @param item
+ * @param form
+ * @param request
+ */
+ private void populateItemToForm(int itemIdx, TaskListItem item, TaskListItemForm form, HttpServletRequest request) {
+ form.setDescription(item.getDescription());
+ form.setTitle(item.getTitle());
+ if (itemIdx >= 0) {
+ form.setItemIndex(new Integer(itemIdx).toString());
+ }
+ form.setRequired(item.isRequired());
+ form.setCommentsAllowed(item.isCommentsAllowed());
+ form.setCommentsRequired(item.isCommentsRequired());
+ form.setFilesAllowed(item.isFilesAllowed());
+ form.setFilesRequired(item.isFilesRequired());
+ // The next 2 options always will be true (as it set in jsp). Waiting
+ // for the final decision -- if this options will be needed later.
+ form.setCommentsFilesAllowed(item.isCommentsFilesAllowed());
+ form.setShowCommentsToAll(item.getShowCommentsToAll());
+ form.setChildTask(item.isChildTask());
+ form.setParentTaskName(item.getParentTaskName());
+ }
+
+ /**
+ * Extract web from content to taskList item.
+ *
+ * @param request
+ * @param itemForm
+ * @throws TaskListException
+ */
+ private void extractFormToTaskListItem(HttpServletRequest request, TaskListItemForm itemForm) throws Exception {
+ /*
+ * BE CAREFUL: This method will copy necessary info from request form to a old
+ * or new TaskListItem instance. It gets all info EXCEPT TaskListItem.createDate
+ * and TaskListItem.createBy, which need be set when persisting this taskList
+ * item.
+ */
+
+ SessionMap sessionMap = (SessionMap) request.getSession()
+ .getAttribute(itemForm.getSessionMapID());
+ // check whether it is "edit(old item)" or "add(new item)"
+ SortedSet taskListList = getTaskListItemList(sessionMap);
+ int itemIdx = NumberUtils.stringToInt(itemForm.getItemIndex(), -1);
+ TaskListItem item = null;
+
+ if (itemIdx == -1) { // add
+ item = new TaskListItem();
+ item.setCreateDate(new Timestamp(new Date().getTime()));
+ int maxSeq = 1;
+ if (taskListList != null && taskListList.size() > 0) {
+ TaskListItem last = taskListList.last();
+ maxSeq = last.getSequenceId() + 1;
+ }
+ item.setSequenceId(maxSeq);
+ taskListList.add(item);
+ } else { // edit
+ List rList = new ArrayList<>(taskListList);
+ item = rList.get(itemIdx);
+ }
+
+ item.setTitle(itemForm.getTitle());
+ item.setDescription(itemForm.getDescription());
+ item.setCreateByAuthor(true);
+
+ item.setRequired(itemForm.isRequired());
+ item.setCommentsAllowed(itemForm.isCommentsAllowed());
+ item.setCommentsRequired(itemForm.isCommentsRequired());
+ item.setFilesAllowed(itemForm.isFilesAllowed());
+ item.setFilesRequired(itemForm.isFilesRequired());
+ // The next 2 options always will be true (as it set in jsp). Waiting
+ // for the final decision -- if this options will be needed later.
+ item.setCommentsFilesAllowed(itemForm.isCommentsFilesAllowed());
+ item.setShowCommentsToAll(itemForm.getShowCommentsToAll());
+ item.setChildTask(itemForm.isChildTask());
+ item.setParentTaskName(itemForm.getParentTaskName());
+ }
+
+ /**
+ * Extract session request version of a taskListItem update the DB version of
+ * the taskListItem.
+ *
+ * @throws TaskListException
+ */
+ private void updateTaskListItemFromSession(TaskListItem itemPO, TaskListItem itemFromSession) throws Exception {
+ /*
+ * BE CAREFUL: This method will copy necessary info from session to an existing
+ * TaskListItem instance. It gets all info EXCEPT uid, createDate, createBy,
+ * createByAuthor, attachments and comments which need be left the same as they
+ * were previously. If you change them then LiveEdit will change Learner created
+ * items.
+ */
+
+ itemPO.setTitle(itemFromSession.getTitle());
+ itemPO.setDescription(itemFromSession.getDescription());
+ itemPO.setSequenceId(itemFromSession.getSequenceId());
+ itemPO.setRequired(itemFromSession.isRequired());
+ itemPO.setCommentsAllowed(itemFromSession.isCommentsAllowed());
+ itemPO.setCommentsRequired(itemFromSession.isCommentsRequired());
+ itemPO.setFilesAllowed(itemFromSession.isFilesAllowed());
+ itemPO.setFilesRequired(itemFromSession.isFilesRequired());
+ itemPO.setCommentsFilesAllowed(itemFromSession.isCommentsFilesAllowed());
+ itemPO.setShowCommentsToAll(itemFromSession.getShowCommentsToAll());
+ itemPO.setChildTask(itemFromSession.isChildTask());
+ itemPO.setParentTaskName(itemFromSession.getParentTaskName());
+ }
+
+ /**
+ * Vaidate taskList item regards to their type (url/file/learning object/website
+ * zip file)
+ *
+ * @param itemForm
+ * @param errors
+ * @return
+ */
+ private void validateTaskListItem(TaskListItemForm itemForm, Errors errors) {
+ if (StringUtils.isBlank(itemForm.getTitle())) {
+ errors.reject(TaskListConstants.ERROR_MSG_TITLE_BLANK);
+ }
+ }
+
+ @RequestMapping("/initPedagogicalPlannerForm")
+ public String initPedagogicalPlannerForm(ActionForm form, HttpServletRequest request) {
+ TaskListPedagogicalPlannerForm plannerForm = (TaskListPedagogicalPlannerForm) form;
+ Long toolContentID = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID);
+ TaskList taskList = taskListService.getTaskListByContentId(toolContentID);
+ plannerForm.fillForm(taskList);
+ return "pages/authoring/pedagogicalPlannerForm";
+ }
+
+ @RequestMapping("/saveOrUpdatePedagogicalPlannerForm")
+ public String saveOrUpdatePedagogicalPlannerForm(TaskListPedagogicalPlannerForm plannerForm, Errors errors,
+ HttpServletRequest request) throws IOException {
+ plannerForm.validate(errors);
+ if (!errors.hasErrors()) {
+ TaskList taskList = taskListService.getTaskListByContentId(plannerForm.getToolContentID());
+
+ int itemIndex = 0;
+ String item = null;
+ TaskListItem taskListItem = null;
+ List newItems = new LinkedList<>();
+ Iterator taskListTopicIterator = taskList.getTaskListItems().iterator();
+ do {
+ item = plannerForm.getTaskListItem(itemIndex);
+ if (StringUtils.isEmpty(item)) {
+ plannerForm.removeTaskListItem(itemIndex);
+ } else {
+ if (taskListTopicIterator.hasNext()) {
+ taskListItem = taskListTopicIterator.next();
+ taskListItem.setTitle(item);
+ } else {
+ taskListItem = new TaskListItem();
+ taskListItem.setCreateByAuthor(true);
+ Date currentDate = new Date();
+ taskListItem.setCreateDate(currentDate);
+
+ HttpSession session = SessionManager.getSession();
+ UserDTO user = (UserDTO) session.getAttribute(AttributeNames.USER);
+ TaskListUser taskListUser = taskListService.getUserByIDAndContent(
+ new Long(user.getUserID().intValue()), plannerForm.getToolContentID());
+ taskListItem.setCreateBy(taskListUser);
+
+ taskListItem.setTitle(item);
+
+ newItems.add(taskListItem);
+ }
+ itemIndex++;
+ }
+
+ } while (item != null);
+ while (taskListTopicIterator.hasNext()) {
+ taskListItem = taskListTopicIterator.next();
+ taskListTopicIterator.remove();
+ taskListService.deleteTaskListItem(taskListItem.getUid());
+ }
+ taskList.getTaskListItems().addAll(newItems);
+ taskListService.saveOrUpdateTaskList(taskList);
+ }
+
+ return "pages/authoring/pedagogicalPlannerForm";
+ }
+
+ @RequestMapping("/createPedagogicalPlannerItem")
+ public String createPedagogicalPlannerItem(ActionForm form, HttpServletRequest request)
+ throws IOException, ServletException {
+ TaskListPedagogicalPlannerForm plannerForm = (TaskListPedagogicalPlannerForm) form;
+ plannerForm.setTaskListItem(plannerForm.getTaskListItemCount().intValue(), "");
+ return "pages/authoring/pedagogicalPlannerForm";
+ }
+}
Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringTaskListConditionAction.java
===================================================================
diff -u
--- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringTaskListConditionAction.java (revision 0)
+++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringTaskListConditionAction.java (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -0,0 +1,551 @@
+/****************************************************************
+ * 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
+ * ****************************************************************
+ */
+
+
+package org.lamsfoundation.lams.tool.taskList.web.controller;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.math.NumberUtils;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.util.LabelValueBean;
+import org.lamsfoundation.lams.tool.ToolAccessMode;
+import org.lamsfoundation.lams.tool.taskList.TaskListConstants;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListCondition;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListItem;
+import org.lamsfoundation.lams.tool.taskList.service.ITaskListService;
+import org.lamsfoundation.lams.tool.taskList.service.TaskListException;
+import org.lamsfoundation.lams.tool.taskList.util.TaskListConditionComparator;
+import org.lamsfoundation.lams.tool.taskList.util.TaskListItemComparator;
+import org.lamsfoundation.lams.tool.taskList.web.form.TaskListConditionForm;
+import org.lamsfoundation.lams.tool.taskList.web.form.TaskListForm;
+import org.lamsfoundation.lams.util.WebUtil;
+import org.lamsfoundation.lams.web.util.AttributeNames;
+import org.lamsfoundation.lams.web.util.SessionMap;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+
+/**
+ * Auxiliary action in author mode. It contains operations with TaskListCondition. The rest of operations are located in
+ * AuthoringAction
action.
+ *
+ * @author Andrey Balan
+ * @see org.lamsfoundation.lams.tool.taskList.web.controller.AuthoringController
+ */
+
+public class AuthoringTaskListConditionAction extends Action {
+
+ @Override
+ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws Exception {
+
+ String param = mapping.getParameter();
+
+ if (param.equals("showConditions")) {
+ return showConditions(mapping, form, request, response);
+ }
+ if (param.equals("newConditionInit")) {
+ return newConditionInit(mapping, form, request, response);
+ }
+ if (param.equals("editCondition")) {
+ return editCondition(mapping, form, request, response);
+ }
+ if (param.equals("saveOrUpdateCondition")) {
+ return saveOrUpdateCondition(mapping, form, request, response);
+ }
+ if (param.equals("removeCondition")) {
+ return removeCondition(mapping, form, request, response);
+ }
+ if (param.equals("upCondition")) {
+ return upCondition(mapping, form, request, response);
+ }
+ if (param.equals("downCondition")) {
+ return downCondition(mapping, form, request, response);
+ }
+
+ return mapping.findForward(TaskListConstants.ERROR);
+ }
+
+ /**
+ * Display same entire authoring page content from HttpSession variable.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ * @throws ServletException
+ */
+ private ActionForward showConditions(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws ServletException {
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+ TaskListForm existForm = (TaskListForm) sessionMap.get(TaskListConstants.ATTR_TASKLIST_FORM);
+
+ TaskListForm taskListForm = (TaskListForm) form;
+ try {
+ PropertyUtils.copyProperties(taskListForm, existForm);
+ } catch (Exception e) {
+ throw new ServletException(e);
+ }
+
+ return mapping.findForward(TaskListConstants.SUCCESS);
+ }
+
+ /**
+ * Display empty page for new taskList item.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward newConditionInit(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ ((TaskListConditionForm) form).setSessionMapID(sessionMapID);
+
+ populateFormWithPossibleItems(form, request);
+ return mapping.findForward("addcondition");
+ }
+
+ /**
+ * Display edit page for existed taskList item.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward editCondition(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+
+ // get back sessionMAP
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+
+ int sequenceId = NumberUtils.stringToInt(request.getParameter(TaskListConstants.PARAM_SEQUENCE_ID), -1);
+ TaskListCondition item = null;
+ if (sequenceId != -1) {
+ SortedSet conditionList = getTaskListConditionList(sessionMap);
+ List rList = new ArrayList(conditionList);
+ item = rList.get(sequenceId);
+ if (item != null) {
+ populateConditionToForm(sequenceId, item, (TaskListConditionForm) form, request);
+ }
+ }
+
+ populateFormWithPossibleItems(form, request);
+ return item == null ? null : mapping.findForward("addcondition");
+ }
+
+ /**
+ * This method will get necessary information from taskList item form and save or update into
+ * HttpSession
TaskListItemList. Notice, this save is not persist them into database, just save
+ * HttpSession
temporarily. Only they will be persist when the entire authoring page is being
+ * persisted.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ * @throws ServletException
+ */
+ private ActionForward saveOrUpdateCondition(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+
+ TaskListConditionForm conditionForm = (TaskListConditionForm) form;
+ ActionErrors errors = validateTaskListCondition(conditionForm, request);
+
+ if (!errors.isEmpty()) {
+ populateFormWithPossibleItems(form, request);
+ this.addErrors(request, errors);
+ return mapping.findForward("addcondition");
+ }
+
+ try {
+ extractFormToTaskListCondition(request, conditionForm);
+ } catch (Exception e) {
+ // any upload exception will display as normal error message rather then throw exception directly
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage(TaskListConstants.ERROR_MSG_UPLOAD_FAILED, e.getMessage()));
+ if (!errors.isEmpty()) {
+ populateFormWithPossibleItems(form, request);
+ this.addErrors(request, errors);
+ return mapping.findForward("addcondition");
+ }
+ }
+ // set session map ID so that itemlist.jsp can get sessionMAP
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, conditionForm.getSessionMapID());
+ // return null to close this window
+ return mapping.findForward(TaskListConstants.SUCCESS);
+ }
+
+ /**
+ * Remove taskList item from HttpSession list and update page display. As authoring rule, all persist only happen
+ * when user submit whole page. So this remove is just impact HttpSession values.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward removeCondition(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+
+ // get back sessionMAP
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+
+ int sequenceId = NumberUtils.stringToInt(request.getParameter(TaskListConstants.PARAM_SEQUENCE_ID), -1);
+ if (sequenceId != -1) {
+ SortedSet conditionList = getTaskListConditionList(sessionMap);
+ List rList = new ArrayList(conditionList);
+ TaskListCondition condition = rList.remove(sequenceId);
+ for (TaskListCondition otherCondition : conditionList) {
+ if (otherCondition.getSequenceId() > sequenceId) {
+ otherCondition.setSequenceId(otherCondition.getSequenceId() - 1);
+ }
+ }
+ conditionList.clear();
+ conditionList.addAll(rList);
+ // add to delList
+ List delList = getDeletedTaskListConditionList(sessionMap);
+ delList.add(condition);
+ }
+
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, sessionMapID);
+ return mapping.findForward(TaskListConstants.SUCCESS);
+ }
+
+ /**
+ * Move up current item.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward upCondition(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+ return switchItem(mapping, request, true);
+ }
+
+ /**
+ * Move down current item.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward downCondition(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+ return switchItem(mapping, request, false);
+ }
+
+ private ActionForward switchItem(ActionMapping mapping, HttpServletRequest request, boolean up) {
+ // get back sessionMAP
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+
+ int sequenceId = NumberUtils.stringToInt(request.getParameter(TaskListConstants.PARAM_SEQUENCE_ID), -1);
+ if (sequenceId != -1) {
+ SortedSet conditionList = getTaskListConditionList(sessionMap);
+ List rList = new ArrayList(conditionList);
+ // get current and the target item, and switch their sequnece
+ TaskListCondition condition = rList.get(sequenceId);
+ TaskListCondition repCondition;
+ if (up) {
+ repCondition = rList.get(--sequenceId);
+ } else {
+ repCondition = rList.get(++sequenceId);
+ }
+ int upSeqId = repCondition.getSequenceId();
+ repCondition.setSequenceId(condition.getSequenceId());
+ condition.setSequenceId(upSeqId);
+
+ // put back list, it will be sorted again
+ conditionList.clear();
+ conditionList.addAll(rList);
+ }
+
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, sessionMapID);
+ return mapping.findForward(TaskListConstants.SUCCESS);
+ }
+
+ // *************************************************************************************
+ // Private methods for internal needs
+ // *************************************************************************************
+ /**
+ * Return TaskListService bean.
+ */
+ private ITaskListService getTaskListService() {
+ WebApplicationContext wac = WebApplicationContextUtils
+ .getRequiredWebApplicationContext(getServlet().getServletContext());
+ return (ITaskListService) wac.getBean(TaskListConstants.TASKLIST_SERVICE);
+ }
+
+ /**
+ * List save current taskList items.
+ *
+ * @param request
+ * @return
+ */
+ private SortedSet getTaskListConditionList(SessionMap sessionMap) {
+ SortedSet list = (SortedSet) sessionMap
+ .get(TaskListConstants.ATTR_CONDITION_LIST);
+ if (list == null) {
+ list = new TreeSet(new TaskListConditionComparator());
+ sessionMap.put(TaskListConstants.ATTR_CONDITION_LIST, list);
+ }
+ return list;
+ }
+
+ /**
+ * List save current taskList items.
+ *
+ * @param request
+ * @return
+ */
+ private SortedSet getTaskListItemList(SessionMap sessionMap) {
+ SortedSet list = (SortedSet) sessionMap
+ .get(TaskListConstants.ATTR_TASKLIST_ITEM_LIST);
+ if (list == null) {
+ list = new TreeSet(new TaskListItemComparator());
+ sessionMap.put(TaskListConstants.ATTR_TASKLIST_ITEM_LIST, list);
+ }
+ return list;
+ }
+
+ /**
+ * List save deleted taskList items, which could be persisted or non-persisted items.
+ *
+ * @param request
+ * @return
+ */
+ private List getDeletedTaskListConditionList(SessionMap sessionMap) {
+ return getListFromSession(sessionMap, TaskListConstants.ATTR_DELETED_CONDITION_LIST);
+ }
+
+ /**
+ * Get java.util.List
from HttpSession by given name.
+ *
+ * @param request
+ * @param name
+ * @return
+ */
+ private List getListFromSession(SessionMap sessionMap, String name) {
+ List list = (List) sessionMap.get(name);
+ if (list == null) {
+ list = new ArrayList();
+ sessionMap.put(name, list);
+ }
+ return list;
+ }
+
+ /**
+ * This method will populate taskList item information to its form for edit use.
+ *
+ * @param sequenceId
+ * @param condition
+ * @param form
+ * @param request
+ */
+ private void populateConditionToForm(int sequenceId, TaskListCondition condition, TaskListConditionForm form,
+ HttpServletRequest request) {
+ if (sequenceId >= 0) {
+ form.setSequenceId(new Integer(sequenceId).toString());
+ }
+ form.setName(condition.getName());
+
+ Set itemList = condition.getTaskListItems();
+ String[] selectedItems = new String[itemList.size()];
+ int i = 0;
+ for (TaskListItem item : itemList) {
+ selectedItems[i++] = (new Integer(item.getSequenceId())).toString();
+ }
+ form.setSelectedItems(selectedItems);
+ }
+
+ /**
+ * This method will populate taskList item information to its form for edit use.
+ *
+ * @param sequenceId
+ * @param condition
+ * @param form
+ * @param request
+ */
+ private void populateFormWithPossibleItems(ActionForm form, HttpServletRequest request) {
+
+ // get back sessionMAP
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+
+ SortedSet itemList = getTaskListItemList(sessionMap);
+
+ // Initialise the LabelValueBeans in the possibleOptions array.
+ LabelValueBean[] lvBeans = new LabelValueBean[itemList.size()];
+
+ int i = 0;
+ for (TaskListItem item : itemList) {
+ lvBeans[i++] = new LabelValueBean(item.getTitle(), (new Integer(item.getSequenceId())).toString());
+ }
+ ((TaskListConditionForm) form).setPossibleItems(lvBeans);
+ }
+
+ /**
+ * Extract form content to taskListContent.
+ *
+ * @param request
+ * @param form
+ * @throws TaskListException
+ */
+ private void extractFormToTaskListCondition(HttpServletRequest request, TaskListConditionForm form)
+ throws Exception {
+ /*
+ * BE CAREFUL: This method will copy necessary info from request form to a old or new TaskListItem instance. It
+ * gets all info EXCEPT TaskListItem.createDate and TaskListItem.createBy, which need be set when persisting
+ * this taskList item.
+ */
+
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(form.getSessionMapID());
+ // check whether it is "edit(old item)" or "add(new item)"
+ SortedSet conditionList = getTaskListConditionList(sessionMap);
+ int sequenceId = NumberUtils.stringToInt(form.getSequenceId(), -1);
+ TaskListCondition condition = null;
+
+ if (sequenceId == -1) { // add
+ condition = new TaskListCondition();
+ int maxSeq = 1;
+ if (conditionList != null && conditionList.size() > 0) {
+ TaskListCondition last = conditionList.last();
+ maxSeq = last.getSequenceId() + 1;
+ }
+ condition.setSequenceId(maxSeq);
+ conditionList.add(condition);
+ } else { // edit
+ List rList = new ArrayList(conditionList);
+ condition = rList.get(sequenceId);
+ }
+
+ condition.setName(form.getName());
+
+ String[] selectedItems = form.getSelectedItems();
+ SortedSet itemList = getTaskListItemList(sessionMap);
+ SortedSet conditionItemList = new TreeSet(new TaskListItemComparator());
+
+ for (String selectedItem : selectedItems) {
+ for (TaskListItem item : itemList) {
+ if (selectedItem.equals((new Integer(item.getSequenceId())).toString())) {
+ conditionItemList.add(item);
+ }
+ }
+ }
+ condition.setTaskListItems(conditionItemList);
+
+ }
+
+ /**
+ * Validate taskListCondition
+ *
+ * @param conditionForm
+ * @return
+ */
+ private ActionErrors validateTaskListCondition(TaskListConditionForm conditionForm, HttpServletRequest request) {
+ ActionErrors errors = new ActionErrors();
+
+ String formConditionName = conditionForm.getName();
+ if (StringUtils.isBlank(formConditionName)) {
+ errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(TaskListConstants.ERROR_MSG_NAME_BLANK));
+ } else if (StringUtils.contains(formConditionName, '#')) {
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage(TaskListConstants.ERROR_MSG_NAME_CONTAINS_WRONG_SYMBOL));
+ } else {
+
+ String formConditionSequenceId = conditionForm.getSequenceId();
+
+ String sessionMapID = conditionForm.getSessionMapID();
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+ SortedSet conditionList = getTaskListConditionList(sessionMap);
+ for (TaskListCondition condition : conditionList) {
+ if (formConditionName.equals(condition.getName())
+ && !formConditionSequenceId.equals((new Integer(condition.getSequenceId() - 1)).toString())) {
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage(TaskListConstants.ERROR_MSG_NAME_DUPLICATED));
+ break;
+ }
+ }
+ }
+
+ // should be selected at least one TaskListItem
+ String[] selectedItems = conditionForm.getSelectedItems();
+ if (selectedItems == null || selectedItems.length == 0) {
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage(TaskListConstants.ERROR_MSG_NO_TASK_LIST_ITEMS));
+ }
+
+ return errors;
+ }
+
+ private ActionMessages validate(TaskListForm taskListForm, ActionMapping mapping, HttpServletRequest request) {
+ ActionMessages errors = new ActionMessages();
+ // if (StringUtils.isBlank(taskListForm.getTaskList().getTitle())) {
+ // ActionMessage error = new ActionMessage("error.resource.item.title.blank");
+ // errors.add(ActionMessages.GLOBAL_MESSAGE, error);
+ // }
+
+ // define it later mode(TEACHER) skip below validation.
+ String modeStr = request.getParameter(AttributeNames.ATTR_MODE);
+ if (StringUtils.equals(modeStr, ToolAccessMode.TEACHER.toString())) {
+ return errors;
+ }
+
+ // Some other validation outside basic Tab.
+
+ return errors;
+ }
+
+}
Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/ClearSessionAction.java
===================================================================
diff -u
--- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/ClearSessionAction.java (revision 0)
+++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/ClearSessionAction.java (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -0,0 +1,51 @@
+/****************************************************************
+ * 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
+ * ****************************************************************
+ */
+
+
+package org.lamsfoundation.lams.tool.taskList.web.controller;
+
+import javax.servlet.http.HttpSession;
+
+import org.lamsfoundation.lams.authoring.web.LamsAuthoringFinishAction;
+import org.lamsfoundation.lams.tool.ToolAccessMode;
+import org.springframework.stereotype.Controller;
+
+/**
+ * This class give a chance to clear HttpSession when user save/close authoring page.
+ *
+ * @author Steve.Ni
+ *
+ * @version $Revision$
+ */
+
+
+public class ClearSessionAction extends LamsAuthoringFinishAction {
+
+ @Override
+ public void clearSession(String customiseSessionID, HttpSession session, ToolAccessMode mode) {
+ if (mode.isAuthor()) {
+ session.removeAttribute(customiseSessionID);
+ }
+ }
+
+}
Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/LearningController.java
===================================================================
diff -u
--- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/LearningController.java (revision 0)
+++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/LearningController.java (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -0,0 +1,797 @@
+/****************************************************************
+ * 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
+ * ****************************************************************
+ */
+
+
+package org.lamsfoundation.lams.tool.taskList.web.controller;
+
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import java.util.TimeZone;
+import java.util.TreeSet;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.action.ActionRedirect;
+import org.apache.struts.upload.FormFile;
+import org.lamsfoundation.lams.learning.web.bean.ActivityPositionDTO;
+import org.lamsfoundation.lams.learning.web.util.LearningWebUtil;
+import org.lamsfoundation.lams.notebook.model.NotebookEntry;
+import org.lamsfoundation.lams.notebook.service.CoreNotebookConstants;
+import org.lamsfoundation.lams.tool.ToolAccessMode;
+import org.lamsfoundation.lams.tool.taskList.TaskListConstants;
+import org.lamsfoundation.lams.tool.taskList.dto.TasListItemDTO;
+import org.lamsfoundation.lams.tool.taskList.model.TaskList;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListItem;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListItemAttachment;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListItemComment;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListSession;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListUser;
+import org.lamsfoundation.lams.tool.taskList.service.ITaskListService;
+import org.lamsfoundation.lams.tool.taskList.service.TaskListException;
+import org.lamsfoundation.lams.tool.taskList.service.UploadTaskListFileException;
+import org.lamsfoundation.lams.tool.taskList.util.TaskListItemAttachmentComparator;
+import org.lamsfoundation.lams.tool.taskList.util.TaskListItemCommentComparator;
+import org.lamsfoundation.lams.tool.taskList.util.TaskListItemComparator;
+import org.lamsfoundation.lams.tool.taskList.web.form.ReflectionForm;
+import org.lamsfoundation.lams.tool.taskList.web.form.TaskListItemForm;
+import org.lamsfoundation.lams.usermanagement.dto.UserDTO;
+import org.lamsfoundation.lams.util.DateUtil;
+import org.lamsfoundation.lams.util.FileValidatorUtil;
+import org.lamsfoundation.lams.util.WebUtil;
+import org.lamsfoundation.lams.web.session.SessionManager;
+import org.lamsfoundation.lams.web.util.AttributeNames;
+import org.lamsfoundation.lams.web.util.SessionMap;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+
+/**
+ *
+ * @author Steve.Ni
+ */
+
+
+public class LearningController extends Action {
+
+ private static Logger log = Logger.getLogger(LearningController.class);
+
+ @Override
+ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws IOException, ServletException, UploadTaskListFileException {
+
+ String param = mapping.getParameter();
+ // -----------------------TaskList Learner function ---------------------------
+ if (param.equals("start")) {
+ return start(mapping, form, request, response);
+ }
+
+ if (param.equals("complete")) {
+ return complete(mapping, form, request, response);
+ }
+
+ if (param.equals("finish")) {
+ return finish(mapping, form, request, response);
+ }
+
+ if (param.equals("addtask")) {
+ return addTask(mapping, form, request, response);
+ }
+ if (param.equals("saveNewTask")) {
+ return saveNewTask(mapping, form, request, response);
+ }
+
+ if (param.equals("addNewComment")) {
+ return addNewComment(mapping, form, request, response);
+ }
+ if (param.equals("uploadFile")) {
+ return uploadFile(mapping, form, request, response);
+ }
+
+ // ================ Reflection =======================
+ if (param.equals("newReflection")) {
+ return newReflection(mapping, form, request, response);
+ }
+ if (param.equals("submitReflection")) {
+ return submitReflection(mapping, form, request, response);
+ }
+
+ return mapping.findForward(TaskListConstants.ERROR);
+ }
+
+ /**
+ * Read taskList data from database and put them into HttpSession. It will redirect to init.do directly after this
+ * method run successfully.
+ *
+ * This method will avoid read database again and lost un-saved resouce item lost when user "refresh page",
+ *
+ */
+ private ActionForward start(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+
+ // initial Session Map
+ SessionMap sessionMap = new SessionMap();
+ request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap);
+
+ // save toolContentID into HTTPSession
+ ToolAccessMode mode = WebUtil.readToolAccessModeParam(request, AttributeNames.PARAM_MODE, true);
+
+ Long sessionId = new Long(request.getParameter(TaskListConstants.PARAM_TOOL_SESSION_ID));
+
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID());
+ request.setAttribute(AttributeNames.ATTR_MODE, mode);
+ request.setAttribute(AttributeNames.PARAM_TOOL_SESSION_ID, sessionId);
+
+ // get back the taskList and item list and display them on page
+ ITaskListService service = getTaskListService();
+ TaskListUser taskListUser = null;
+ if (mode != null && mode.isTeacher()) {
+ // monitoring mode - user is specified in URL
+ // taskListUser may be null if the user was force completed.
+ taskListUser = getSpecifiedUser(service, sessionId,
+ WebUtil.readIntParam(request, AttributeNames.PARAM_USER_ID, false));
+ } else {
+ taskListUser = getCurrentUser(service, sessionId);
+ }
+
+ TaskList taskList = service.getTaskListBySessionId(sessionId);
+
+ // Create set of TaskListItems besides this filtering out items added by users from other groups
+ TreeSet items = new TreeSet(new TaskListItemComparator());
+ if (mode.isLearner()) {
+
+ List grouppedUsers = service.getUserListBySessionId(sessionId);
+ Set allTaskListItems = taskList.getTaskListItems();
+
+ for (TaskListItem item : allTaskListItems) {
+ for (TaskListUser grouppedUser : grouppedUsers) {
+ if (item.isCreateByAuthor() || grouppedUser.getUserId().equals(item.getCreateBy().getUserId())) {
+ items.add(item);
+ }
+ }
+ }
+
+ } else {
+ items.addAll(taskList.getTaskListItems());
+ }
+
+ // check whehter finish lock is on/off
+ boolean lock = taskList.getLockWhenFinished() && taskListUser != null && taskListUser.isSessionFinished();
+
+ // get notebook entry
+ String entryText = new String();
+ if (taskListUser != null) {
+ NotebookEntry notebookEntry = service.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL,
+ TaskListConstants.TOOL_SIGNATURE, taskListUser.getUserId().intValue());
+ if (notebookEntry != null) {
+ entryText = notebookEntry.getEntry();
+ }
+ }
+
+ // set complete flag for display purpose
+ if (taskListUser != null) {
+ service.retrieveComplete(items, taskListUser);
+ }
+
+ TreeSet itemDTOs = new TreeSet(new Comparator() {
+ @Override
+ public int compare(TasListItemDTO o1, TasListItemDTO o2) {
+ if (o1 != null && o2 != null) {
+ return o1.getTaskListItem().getSequenceId() - o2.getTaskListItem().getSequenceId();
+ } else if (o1 != null) {
+ return 1;
+ } else {
+ return -1;
+ }
+ }
+ });
+
+ boolean isPreviousTaskCompleted = true;
+ for (TaskListItem item : items) {
+ TasListItemDTO itemDTO = new TasListItemDTO(item);
+
+ // checks if this item met all comment requirements
+ boolean isCommentRequirementsMet = true;
+ if (item.isCommentsRequired()) {
+ isCommentRequirementsMet = false;
+ Set comments = item.getComments();
+ for (TaskListItemComment comment : comments) {
+ if (taskListUser.getUserId().equals(comment.getCreateBy().getUserId())) {
+ isCommentRequirementsMet = true;
+ }
+ }
+ }
+ itemDTO.setCommentRequirementsMet(isCommentRequirementsMet);
+
+ // checks if this item met all attachment requirements
+ boolean isAttachmentRequirementsMet = true;
+ if (item.isFilesRequired()) {
+ isAttachmentRequirementsMet = false;
+ Set attachments = item.getAttachments();
+ for (TaskListItemAttachment attachment : attachments) {
+ if (taskListUser.getUserId().equals(attachment.getCreateBy().getUserId())) {
+ isAttachmentRequirementsMet = true;
+ }
+ }
+ }
+ itemDTO.setAttachmentRequirementsMet(isAttachmentRequirementsMet);
+
+ // checks if this item is allowed by its parent
+ boolean isAllowedByParent = true;
+ if (item.isChildTask()) {
+ for (TaskListItem parentItem : items) {
+ if (parentItem.getTitle().equals(item.getParentTaskName()) && !parentItem.isComplete()) {
+ isAllowedByParent = false;
+ }
+ }
+ }
+ itemDTO.setAllowedByParent(isAllowedByParent);
+
+ // checks whether this TaskListItem shoud be displayed open or close
+ boolean isDisplayedOpen = true;
+ if ((item.getDescription() != null) && (item.getDescription().length() > 1000)) {
+ isDisplayedOpen = false;
+ }
+ itemDTO.setDisplayedOpen(isDisplayedOpen);
+
+ // sets whether the previous TaskListItem was completed
+ itemDTO.setPreviousTaskCompleted(isPreviousTaskCompleted);
+ isPreviousTaskCompleted = item.isComplete();
+
+ // filter out comments and attachments which belong to another group
+ Set filteredComments = new TreeSet(new TaskListItemCommentComparator());
+ Set filteredAttachments = new TreeSet(new TaskListItemAttachmentComparator());
+ if (mode.isLearner()) {
+
+ List grouppedUsers = service.getUserListBySessionId(sessionId);
+ Set comments = item.getComments();
+ Set attachments = item.getAttachments();
+
+ for (TaskListItemComment comment : comments) {
+ for (TaskListUser grouppedUser : grouppedUsers) {
+ if (grouppedUser.getUserId().equals(comment.getCreateBy().getUserId())) {
+ filteredComments.add(comment);
+ }
+ }
+ }
+
+ for (TaskListItemAttachment attachment : attachments) {
+ for (TaskListUser grouppedUser : grouppedUsers) {
+ if (grouppedUser.getUserId().equals(attachment.getCreateBy().getUserId())) {
+ filteredAttachments.add(attachment);
+ }
+ }
+ }
+ } else {
+ filteredComments = item.getComments();
+ filteredAttachments = item.getAttachments();
+ }
+ itemDTO.setComments(filteredComments);
+ itemDTO.setAttachments(filteredAttachments);
+
+ itemDTOs.add(itemDTO);
+ }
+
+ // construct taskList dto field
+
+ Integer numberCompletedTasks = service.getNumTasksCompletedByUser(sessionId, taskListUser.getUserId());
+ Integer minimumNumberTasks = taskList.getMinimumNumberTasks();
+ if ((minimumNumberTasks - numberCompletedTasks) > 0) {
+ String MinimumNumberTasksStr = service.getMessageService().getMessage("lable.learning.minimum.view.number",
+ new Object[] { minimumNumberTasks, numberCompletedTasks });
+ taskList.setMinimumNumberTasksErrorStr(MinimumNumberTasksStr);
+ }
+
+ // basic information
+ sessionMap.put(TaskListConstants.ATTR_TITLE, taskList.getTitle());
+ sessionMap.put(TaskListConstants.ATTR_FINISH_LOCK, lock);
+ sessionMap.put(TaskListConstants.ATTR_USER_FINISHED, taskListUser != null && taskListUser.isSessionFinished());
+ sessionMap.put(TaskListConstants.ATTR_USER_VERIFIED_BY_MONITOR, taskListUser.isVerifiedByMonitor());
+ sessionMap.put(AttributeNames.PARAM_TOOL_SESSION_ID, sessionId);
+ sessionMap.put(AttributeNames.ATTR_MODE, mode);
+ sessionMap.put(TaskListConstants.ATTR_TASK_LIST_ITEM_DTOS, itemDTOs);
+ // reflection information
+ sessionMap.put(TaskListConstants.ATTR_REFLECTION_ON, taskList.isReflectOnActivity());
+ sessionMap.put(TaskListConstants.ATTR_REFLECTION_INSTRUCTION, taskList.getReflectInstructions());
+ sessionMap.put(TaskListConstants.ATTR_REFLECTION_ENTRY, entryText);
+
+ // add define later support
+ if (taskList.isDefineLater()) {
+ return mapping.findForward("defineLater");
+ }
+
+ // set contentInUse flag to true!
+ taskList.setContentInUse(true);
+ taskList.setDefineLater(false);
+ service.saveOrUpdateTaskList(taskList);
+
+ ActivityPositionDTO activityPosition = LearningWebUtil.putActivityPositionInRequestByToolSessionId(sessionId,
+ request, getServlet().getServletContext());
+ sessionMap.put(AttributeNames.ATTR_ACTIVITY_POSITION, activityPosition);
+
+ // check if there is submission deadline
+ Date submissionDeadline = taskList.getSubmissionDeadline();
+ if (submissionDeadline != null) {
+ HttpSession ss = SessionManager.getSession();
+ UserDTO learnerDto = (UserDTO) ss.getAttribute(AttributeNames.USER);
+ TimeZone learnerTimeZone = learnerDto.getTimeZone();
+ Date tzSubmissionDeadline = DateUtil.convertToTimeZoneFromDefault(learnerTimeZone, submissionDeadline);
+ Date currentLearnerDate = DateUtil.convertToTimeZoneFromDefault(learnerTimeZone, new Date());
+ sessionMap.put(TaskListConstants.ATTR_SUBMISSION_DEADLINE, tzSubmissionDeadline);
+
+ // calculate whether deadline has passed, and if so forward to "submissionDeadline"
+ if (currentLearnerDate.after(tzSubmissionDeadline)) {
+ return mapping.findForward("submissionDeadline");
+ }
+
+ }
+
+ sessionMap.put(TaskListConstants.ATTR_TASKLIST, taskList);
+
+ return mapping.findForward(TaskListConstants.SUCCESS);
+ }
+
+ /**
+ * Mark taskList item as complete status.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward complete(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+ String mode = request.getParameter(AttributeNames.ATTR_MODE);
+ String sessionMapID = request.getParameter(TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+ Long sessionId = (Long) sessionMap.get(TaskListConstants.ATTR_TOOL_SESSION_ID);
+
+ doComplete(request);
+
+ ActionRedirect redirect = new ActionRedirect(mapping.findForwardConfig(TaskListConstants.SUCCESS));
+ redirect.addParameter(AttributeNames.ATTR_MODE, mode);
+ redirect.addParameter(AttributeNames.PARAM_TOOL_SESSION_ID, sessionId);
+ return redirect;
+ }
+
+ /**
+ * Finish learning session.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward finish(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+
+ // get back SessionMap
+ String sessionMapID = request.getParameter(TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+
+ Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID);
+
+ // auto run mode, when use finish the only one taskList item, mark it as complete then finish this activity as
+ // well.
+ String taskListItemUid = request.getParameter(TaskListConstants.PARAM_ITEM_UID);
+ if (taskListItemUid != null) {
+ doComplete(request);
+ // NOTE:So far this flag is useless(31/08/2006).
+ // set flag, then finish page can know redir target is parent(AUTO_RUN) or self(normal)
+ request.setAttribute(TaskListConstants.ATTR_RUN_AUTO, true);
+ } else {
+ request.setAttribute(TaskListConstants.ATTR_RUN_AUTO, false);
+ }
+
+ if (!validateBeforeFinish(request, sessionMapID)) {
+ return mapping.getInputForward();
+ }
+
+ ITaskListService service = getTaskListService();
+ // get sessionId from HttpServletRequest
+ String nextActivityUrl = null;
+ try {
+ HttpSession ss = SessionManager.getSession();
+ UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER);
+ Long userID = new Long(user.getUserID().longValue());
+
+ nextActivityUrl = service.finishToolSession(sessionId, userID);
+ request.setAttribute(TaskListConstants.ATTR_NEXT_ACTIVITY_URL, nextActivityUrl);
+ } catch (TaskListException e) {
+ log.error("Failed get next activity url:" + e.getMessage());
+ }
+
+ return mapping.findForward(TaskListConstants.SUCCESS);
+ }
+
+ /**
+ * Initial page for add taskList item (single file or URL).
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward addTask(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+ TaskListItemForm itemForm = (TaskListItemForm) form;
+ itemForm.setMode(WebUtil.readStrParam(request, AttributeNames.ATTR_MODE));
+ itemForm.setSessionMapID(WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID));
+ return mapping.findForward(TaskListConstants.SUCCESS);
+ }
+
+ /**
+ * Save new user task into database.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward saveNewTask(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+ // get back SessionMap
+ String sessionMapID = request.getParameter(TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+
+ TaskListItemForm itemForm = (TaskListItemForm) form;
+ ActionErrors errors = validateTaskListItem(itemForm);
+
+ if (!errors.isEmpty()) {
+ this.addErrors(request, errors);
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, sessionMapID);
+ return mapping.findForward("task");
+ }
+
+ // create a new TaskListItem
+ TaskListItem item = new TaskListItem();
+ ITaskListService service = getTaskListService();
+ Long sessionId = (Long) sessionMap.get(TaskListConstants.ATTR_TOOL_SESSION_ID);
+ TaskListUser taskListUser = getCurrentUser(service, sessionId);
+ item.setTitle(itemForm.getTitle());
+ item.setDescription(itemForm.getDescription());
+ item.setCreateDate(new Timestamp(new Date().getTime()));
+ item.setCreateByAuthor(false);
+ item.setCreateBy(taskListUser);
+
+ // setting SequenceId
+ TaskList taskList = (TaskList) sessionMap.get(TaskListConstants.ATTR_TASKLIST);
+ Set taskListItems = taskList.getTaskListItems();
+ int maxSeq = 0;
+ for (TaskListItem dbItem : taskListItems) {
+ if (dbItem.getSequenceId() > maxSeq) {
+ maxSeq = dbItem.getSequenceId();
+ }
+ }
+ maxSeq++;
+ item.setSequenceId(maxSeq);
+
+ taskListItems.add(item);
+ service.saveOrUpdateTaskList(taskList);
+
+ // redirect
+ String mode = request.getParameter(AttributeNames.ATTR_MODE);
+ request.setAttribute(AttributeNames.ATTR_MODE, mode);
+ request.setAttribute(AttributeNames.PARAM_TOOL_SESSION_ID, sessionId);
+ return mapping.findForward(TaskListConstants.SUCCESS);
+ }
+
+ /**
+ * Adds new user commment.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward addNewComment(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+ TaskListItemForm taskListItemForm = (TaskListItemForm) form;
+ String mode = request.getParameter(AttributeNames.ATTR_MODE);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(taskListItemForm.getSessionMapID());
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID());
+ Long sessionId = (Long) sessionMap.get(TaskListConstants.ATTR_TOOL_SESSION_ID);
+
+ boolean isTestHarness = Boolean.valueOf(request.getParameter("testHarness"));
+ String commentMessage = isTestHarness ? request.getParameter("comment__textarea")
+ : taskListItemForm.getComment();
+ if (commentMessage == null || StringUtils.isBlank(commentMessage)) {
+ return mapping.findForward("refresh");
+ }
+
+ TaskListItemComment comment = new TaskListItemComment();
+ comment.setComment(commentMessage);
+ UserDTO user = (UserDTO) SessionManager.getSession().getAttribute(AttributeNames.USER);
+ ITaskListService service = getTaskListService();
+ TaskListUser taskListUser = service.getUserByIDAndSession(new Long(user.getUserID().intValue()), sessionId);
+ comment.setCreateBy(taskListUser);
+ comment.setCreateDate(new Timestamp(new Date().getTime()));
+
+ // persist TaskListItem changes in DB
+ Long itemUid = new Long(request.getParameter(TaskListConstants.PARAM_ITEM_UID));
+ TaskListItem dbItem = service.getTaskListItemByUid(itemUid);
+ Set dbComments = dbItem.getComments();
+ dbComments.add(comment);
+ service.saveOrUpdateTaskListItem(dbItem);
+
+ // to make available new changes be visible in jsp page
+ sessionMap.put(TaskListConstants.ATTR_TASK_LIST_ITEM, dbItem);
+
+ // form.reset(mapping, request);
+
+ ActionRedirect redirect = new ActionRedirect(mapping.findForwardConfig(TaskListConstants.SUCCESS));
+ redirect.addParameter(AttributeNames.ATTR_MODE, mode);
+ redirect.addParameter(AttributeNames.PARAM_TOOL_SESSION_ID, sessionId);
+ return redirect;
+ }
+
+ /**
+ * Uploads specified file to repository and associates it with current TaskListItem.
+ *
+ * @param mapping
+ * @param form
+ * @param type
+ * @param request
+ * @return
+ * @throws UploadTaskListFileException
+ */
+ private ActionForward uploadFile(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws UploadTaskListFileException {
+
+ TaskListItemForm taskListItemForm = (TaskListItemForm) form;
+ String mode = request.getParameter(AttributeNames.ATTR_MODE);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(taskListItemForm.getSessionMapID());
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID());
+ Long sessionId = (Long) sessionMap.get(TaskListConstants.ATTR_TOOL_SESSION_ID);
+
+ FormFile file = taskListItemForm.getUploadedFile();
+
+ if (file == null || StringUtils.isBlank(file.getFileName())) {
+ return mapping.findForward("refresh");
+ }
+
+ // validate file size
+ ActionMessages errors = new ActionMessages();
+ FileValidatorUtil.validateFileSize(file, false, errors);
+ if (!errors.isEmpty()) {
+ this.addErrors(request, errors);
+ this.saveErrors(request, errors);
+ return mapping.findForward("refresh");
+ }
+
+ // upload to repository
+ ITaskListService service = getTaskListService();
+ UserDTO user = (UserDTO) SessionManager.getSession().getAttribute(AttributeNames.USER);
+ TaskListUser taskListUser = service.getUserByIDAndSession(new Long(user.getUserID().intValue()), sessionId);
+ TaskListItemAttachment att = service.uploadTaskListItemFile(file, taskListUser);
+
+ // persist TaskListItem changes in DB
+ Long itemUid = new Long(request.getParameter(TaskListConstants.PARAM_ITEM_UID));
+ TaskListItem dbItem = service.getTaskListItemByUid(itemUid);
+ Set dbAttachments = dbItem.getAttachments();
+ dbAttachments.add(att);
+ service.saveOrUpdateTaskListItem(dbItem);
+
+ // to make available new changes be visible in jsp page
+ sessionMap.put(TaskListConstants.ATTR_TASK_LIST_ITEM, dbItem);
+
+ // form.reset(mapping, request);
+
+ ActionRedirect redirect = new ActionRedirect(mapping.findForwardConfig(TaskListConstants.SUCCESS));
+ redirect.addParameter(AttributeNames.ATTR_MODE, mode);
+ redirect.addParameter(AttributeNames.PARAM_TOOL_SESSION_ID, sessionId);
+ return redirect;
+ }
+
+ /**
+ * Display empty reflection form.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward newReflection(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+
+ // get session value
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+
+ if (!validateBeforeFinish(request, sessionMapID)) {
+ return mapping.getInputForward();
+ }
+
+ ReflectionForm refForm = (ReflectionForm) form;
+ HttpSession ss = SessionManager.getSession();
+ UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER);
+
+ refForm.setUserID(user.getUserID());
+ refForm.setSessionMapID(sessionMapID);
+
+ // get the existing reflection entry
+ ITaskListService submitFilesService = getTaskListService();
+
+ SessionMap map = (SessionMap) request.getSession().getAttribute(sessionMapID);
+ Long toolSessionID = (Long) map.get(AttributeNames.PARAM_TOOL_SESSION_ID);
+ NotebookEntry entry = submitFilesService.getEntry(toolSessionID, CoreNotebookConstants.NOTEBOOK_TOOL,
+ TaskListConstants.TOOL_SIGNATURE, user.getUserID());
+
+ if (entry != null) {
+ refForm.setEntryText(entry.getEntry());
+ }
+
+ return mapping.findForward(TaskListConstants.SUCCESS);
+ }
+
+ /**
+ * Submit reflection form input database.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ private ActionForward submitReflection(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+ ReflectionForm refForm = (ReflectionForm) form;
+ Integer userId = refForm.getUserID();
+
+ String sessionMapID = WebUtil.readStrParam(request, TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+ Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID);
+
+ ITaskListService service = getTaskListService();
+
+ // check for existing notebook entry
+ NotebookEntry entry = service.getEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL,
+ TaskListConstants.TOOL_SIGNATURE, userId);
+
+ if (entry == null) {
+ // create new entry
+ service.createNotebookEntry(sessionId, CoreNotebookConstants.NOTEBOOK_TOOL,
+ TaskListConstants.TOOL_SIGNATURE, userId, refForm.getEntryText());
+ } else {
+ // update existing entry
+ entry.setEntry(refForm.getEntryText());
+ entry.setLastModified(new Date());
+ service.updateEntry(entry);
+ }
+
+ return finish(mapping, form, request, response);
+ }
+
+ // *************************************************************************************
+ // Private method
+ // *************************************************************************************
+ private ITaskListService getTaskListService() {
+ WebApplicationContext wac = WebApplicationContextUtils
+ .getRequiredWebApplicationContext(getServlet().getServletContext());
+ return (ITaskListService) wac.getBean(TaskListConstants.TASKLIST_SERVICE);
+ }
+
+ private TaskListUser getCurrentUser(ITaskListService service, Long sessionId) {
+ // try to get form system session
+ HttpSession ss = SessionManager.getSession();
+ // get back login user DTO
+ UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER);
+ TaskListUser taskListUser = service.getUserByIDAndSession(new Long(user.getUserID().intValue()), sessionId);
+
+ if (taskListUser == null) {
+ TaskListSession session = service.getSessionBySessionId(sessionId);
+ taskListUser = new TaskListUser(user, session);
+ service.createUser(taskListUser);
+ }
+ return taskListUser;
+ }
+
+ private TaskListUser getSpecifiedUser(ITaskListService service, Long sessionId, Integer userId) {
+ TaskListUser taskListUser = service.getUserByIDAndSession(new Long(userId.intValue()), sessionId);
+ if (taskListUser == null) {
+ log.error("Unable to find specified user for taskList activity. Screens are likely to fail. SessionId="
+ + sessionId + " UserId=" + userId);
+ }
+ return taskListUser;
+ }
+
+ /**
+ * @param itemForm
+ * @return
+ */
+ private ActionErrors validateTaskListItem(TaskListItemForm itemForm) {
+ ActionErrors errors = new ActionErrors();
+ if (StringUtils.isBlank(itemForm.getTitle())) {
+ errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage(TaskListConstants.ERROR_MSG_TITLE_BLANK));
+ }
+
+ return errors;
+ }
+
+ private boolean validateBeforeFinish(HttpServletRequest request, String sessionMapID) {
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+ Long sessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID);
+
+ HttpSession ss = SessionManager.getSession();
+ UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER);
+ Long userID = new Long(user.getUserID().longValue());
+
+ ITaskListService service = getTaskListService();
+
+ int numberCompletedTasks = service.getNumTasksCompletedByUser(sessionId, userID);
+ int minimumNumberTasks = service.getTaskListBySessionId(sessionId).getMinimumNumberTasks();
+ // if current user view less than reqired view count number, then just return error message.
+ if ((minimumNumberTasks - numberCompletedTasks) > 0) {
+ ActionErrors errors = new ActionErrors();
+ errors.add(ActionMessages.GLOBAL_MESSAGE,
+ new ActionMessage("lable.learning.minimum.view.number", minimumNumberTasks, numberCompletedTasks));
+ this.addErrors(request, errors);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Set complete flag for given taskList item.
+ *
+ * @param request
+ * @param sessionId
+ */
+ private void doComplete(HttpServletRequest request) {
+ // get back sessionMap
+ String sessionMapID = request.getParameter(TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID);
+
+ Long taskListItemUid = new Long(request.getParameter(TaskListConstants.PARAM_ITEM_UID));
+ ITaskListService service = getTaskListService();
+ HttpSession ss = SessionManager.getSession();
+ // get back login user DTO
+ UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER);
+
+ Long sessionId = (Long) sessionMap.get(TaskListConstants.ATTR_TOOL_SESSION_ID);
+ service.setItemComplete(taskListItemUid, new Long(user.getUserID().intValue()), sessionId);
+ sessionMapID = "4";
+ }
+
+}
Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/MonitoringAction.java
===================================================================
diff -u
--- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/MonitoringAction.java (revision 0)
+++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/MonitoringAction.java (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -0,0 +1,482 @@
+/****************************************************************
+ * 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
+ * ****************************************************************
+ */
+
+package org.lamsfoundation.lams.tool.taskList.web.controller;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+import java.util.TimeZone;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.lamsfoundation.lams.tool.taskList.TaskListConstants;
+import org.lamsfoundation.lams.tool.taskList.dto.ReflectDTO;
+import org.lamsfoundation.lams.tool.taskList.dto.SessionDTO;
+import org.lamsfoundation.lams.tool.taskList.dto.TaskListUserDTO;
+import org.lamsfoundation.lams.tool.taskList.model.TaskList;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListItem;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListItemAttachment;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListItemComment;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListSession;
+import org.lamsfoundation.lams.tool.taskList.model.TaskListUser;
+import org.lamsfoundation.lams.tool.taskList.service.ITaskListService;
+import org.lamsfoundation.lams.usermanagement.dto.UserDTO;
+import org.lamsfoundation.lams.util.Configuration;
+import org.lamsfoundation.lams.util.ConfigurationKeys;
+import org.lamsfoundation.lams.util.DateUtil;
+import org.lamsfoundation.lams.util.WebUtil;
+import org.lamsfoundation.lams.web.session.SessionManager;
+import org.lamsfoundation.lams.web.util.AttributeNames;
+import org.lamsfoundation.lams.web.util.SessionMap;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+import org.springframework.web.util.HtmlUtils;
+
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.JsonNodeFactory;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+
+public class MonitoringAction extends Action {
+
+
+ public static Logger log = Logger.getLogger(MonitoringAction.class);
+ private static String TOOL_URL = Configuration.get(ConfigurationKeys.SERVER_URL) + "/tool/"
+ + TaskListConstants.TOOL_SIGNATURE + "/";
+
+ @Override
+ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws IOException, ServletException {
+ String param = mapping.getParameter();
+
+ if (param.equals("summary")) {
+ return summary(mapping, form, request, response);
+ }
+ if (param.equals("itemSummary")) {
+ return itemSummary(mapping, form, request, response);
+ }
+ if (param.equals("getPagedUsers")) {
+ return getPagedUsers(mapping, form, request, response);
+ }
+ if (param.equals("getPagedUsersByItem")) {
+ return getPagedUsersByItem(mapping, form, request, response);
+ }
+ if (param.equals("setVerifiedByMonitor")) {
+ return setVerifiedByMonitor(mapping, form, request, response);
+ }
+ if (param.equals("setSubmissionDeadline")) {
+ return setSubmissionDeadline(mapping, form, request, response);
+ }
+
+ return mapping.findForward(TaskListConstants.ERROR);
+ }
+
+ private ActionForward summary(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+
+ // initial Session Map
+ SessionMap sessionMap = new SessionMap<>();
+ request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap);
+
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID());
+ request.setAttribute("initialTabId", WebUtil.readLongParam(request, AttributeNames.PARAM_CURRENT_TAB, true));
+ Long contentId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID);
+ request.setAttribute(AttributeNames.PARAM_TOOL_CONTENT_ID, contentId);
+
+ ITaskListService service = getTaskListService();
+ TaskList taskList = service.getTaskListByContentId(contentId);
+
+ List sessionDtos = service.getSummary(contentId);
+
+ // cache into sessionMap
+ sessionMap.put(TaskListConstants.ATTR_SESSION_DTOS, sessionDtos);
+ sessionMap.put(TaskListConstants.ATTR_MONITOR_VERIFICATION_REQUIRED, taskList.isMonitorVerificationRequired());
+ sessionMap.put(TaskListConstants.PAGE_EDITABLE, taskList.isContentInUse());
+ sessionMap.put(TaskListConstants.ATTR_TASKLIST, taskList);
+ sessionMap.put(TaskListConstants.ATTR_TOOL_CONTENT_ID, contentId);
+ sessionMap.put(AttributeNames.PARAM_CONTENT_FOLDER_ID,
+ WebUtil.readStrParam(request, AttributeNames.PARAM_CONTENT_FOLDER_ID));
+ sessionMap.put(TaskListConstants.ATTR_IS_GROUPED_ACTIVITY, service.isGroupedActivity(contentId));
+
+ if (taskList.getSubmissionDeadline() != null) {
+ Date submissionDeadline = taskList.getSubmissionDeadline();
+ HttpSession ss = SessionManager.getSession();
+ UserDTO teacher = (UserDTO) ss.getAttribute(AttributeNames.USER);
+ TimeZone teacherTimeZone = teacher.getTimeZone();
+ Date tzSubmissionDeadline = DateUtil.convertToTimeZoneFromDefault(teacherTimeZone, submissionDeadline);
+ sessionMap.put(TaskListConstants.ATTR_SUBMISSION_DEADLINE, tzSubmissionDeadline.getTime());
+ sessionMap.put(TaskListConstants.ATTR_SUBMISSION_DEADLINE_DATESTRING,
+ DateUtil.convertToStringForJSON(submissionDeadline, request.getLocale()));
+ }
+
+ // Create reflectList if reflection is enabled.
+ if (taskList.isReflectOnActivity()) {
+ List reflectList = service.getReflectList(taskList.getContentId());
+ // Add reflectList to sessionMap
+ sessionMap.put(TaskListConstants.ATTR_REFLECT_LIST, reflectList);
+ }
+
+ return mapping.findForward(TaskListConstants.SUCCESS);
+ }
+
+ private ActionForward itemSummary(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) {
+ ITaskListService service = getTaskListService();
+ String sessionMapID = request.getParameter(TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession()
+ .getAttribute(sessionMapID);
+ request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, sessionMapID);
+
+ Long contentId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID);
+ Long itemUid = WebUtil.readLongParam(request, TaskListConstants.PARAM_ITEM_UID);
+
+ TaskListItem item = service.getTaskListItemByUid(itemUid);
+
+ // create sessionList depending on whether the item was created by author or by learner
+ List sessionDtos = new ArrayList<>();
+ if (item.isCreateByAuthor()) {
+ List sessionList = service.getSessionsByContentId(contentId);
+ for (TaskListSession session : sessionList) {
+ SessionDTO sessionDto = new SessionDTO(session);
+ sessionDtos.add(sessionDto);
+ }
+
+ } else {
+ TaskListSession userSession = item.getCreateBy().getSession();
+ SessionDTO sessionDto = new SessionDTO(userSession);
+ sessionDtos.add(sessionDto);
+ }
+
+ request.setAttribute(TaskListConstants.ATTR_SESSION_DTOS, sessionDtos);
+ request.setAttribute(TaskListConstants.ATTR_TASK_LIST_ITEM, item);
+
+ return mapping.findForward(TaskListConstants.SUCCESS);
+ }
+
+ /**
+ * Refreshes user list.
+ */
+ public ActionForward getPagedUsers(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse res) throws IOException, ServletException {
+ ITaskListService service = getTaskListService();
+
+ String sessionMapID = request.getParameter(TaskListConstants.ATTR_SESSION_MAP_ID);
+ SessionMap sessionMap = (SessionMap) request.getSession()
+ .getAttribute(sessionMapID);
+ TaskList tasklist = (TaskList) sessionMap.get(TaskListConstants.ATTR_TASKLIST);
+ Long sessionId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID);
+ List sessionDtos = (List) sessionMap.get(TaskListConstants.ATTR_SESSION_DTOS);
+
+ //find according sessionDto
+ SessionDTO sessionDto = null;
+ for (SessionDTO sessionDtoIter : sessionDtos) {
+ if (sessionDtoIter.getSessionId().equals(sessionId)) {
+ sessionDto = sessionDtoIter;
+ }
+ }
+ List items = sessionDto.getTaskListItems();
+
+ // Getting the params passed in from the jqGrid
+ int page = WebUtil.readIntParam(request, AttributeNames.PARAM_PAGE);
+ int rowLimit = WebUtil.readIntParam(request, AttributeNames.PARAM_ROWS);
+ String sortOrder = WebUtil.readStrParam(request, AttributeNames.PARAM_SORD);
+ String sortBy = WebUtil.readStrParam(request, AttributeNames.PARAM_SIDX, true);
+ if (StringUtils.isEmpty(sortBy)) {
+ sortBy = "userName";
+ }
+ String searchString = WebUtil.readStrParam(request, "userName", true);
+
+ // Get the user list from the db
+ Collection userDtos = service.getPagedUsersBySession(sessionId, page - 1, rowLimit, sortBy,
+ sortOrder, searchString);
+ int countSessionUsers = service.getCountPagedUsersBySession(sessionId, searchString);
+
+ int totalPages = new Double(
+ Math.ceil(new Integer(countSessionUsers).doubleValue() / new Integer(rowLimit).doubleValue()))
+ .intValue();
+
+ ArrayNode rows = JsonNodeFactory.instance.arrayNode();
+ int i = 1;
+ for (TaskListUserDTO userDto : userDtos) {
+
+ ArrayNode userData = JsonNodeFactory.instance.arrayNode();
+ userData.add(userDto.getUserId());
+ String fullName = HtmlUtils.htmlEscape(userDto.getFullName());
+ userData.add(fullName);
+
+ Set completedTaskUids = userDto.getCompletedTaskUids();
+ for (TaskListItem item : items) {
+ String completionImage = completedTaskUids.contains(item.getUid()) ? ""
+ : "";
+ userData.add(completionImage);
+ }
+
+ if (tasklist.isMonitorVerificationRequired()) {
+ String label = HtmlUtils.htmlEscape(service.getMessage("label.confirm"));
+
+ String verificationStatus = userDto.isVerifiedByMonitor() ? ""
+ : "" + label + "";
+ userData.add(verificationStatus);
+ }
+
+ userData.add(userDto.getPortraitId());
+
+ ObjectNode userRow = JsonNodeFactory.instance.objectNode();
+ userRow.put("id", i++);
+ userRow.put("cell", userData);
+
+ rows.add(userRow);
+ }
+
+ ObjectNode responseJSON = JsonNodeFactory.instance.objectNode();
+ responseJSON.put("total", totalPages);
+ responseJSON.put("page", page);
+ responseJSON.put("records", countSessionUsers);
+ responseJSON.set("rows", rows);
+
+ res.setContentType("application/json;charset=utf-8");
+ res.getWriter().print(new String(responseJSON.toString()));
+ return null;
+ }
+
+ /**
+ * Refreshes user list.
+ */
+ public ActionForward getPagedUsersByItem(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse res) throws IOException, ServletException {
+ ITaskListService service = getTaskListService();
+
+ Long sessionId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_SESSION_ID);
+ Long itemUid = WebUtil.readLongParam(request, TaskListConstants.PARAM_ITEM_UID);
+
+ // Getting the params passed in from the jqGrid
+ int page = WebUtil.readIntParam(request, AttributeNames.PARAM_PAGE);
+ int rowLimit = WebUtil.readIntParam(request, AttributeNames.PARAM_ROWS);
+ String sortOrder = WebUtil.readStrParam(request, AttributeNames.PARAM_SORD);
+ String sortBy = WebUtil.readStrParam(request, AttributeNames.PARAM_SIDX, true);
+ if (StringUtils.isEmpty(sortBy)) {
+ sortBy = "userName";
+ }
+ String searchString = WebUtil.readStrParam(request, "userName", true);
+
+ // Get the user list from the db
+ Collection userDtos = service.getPagedUsersBySessionAndItem(sessionId, itemUid, page - 1,
+ rowLimit, sortBy, sortOrder, searchString);
+ int countSessionUsers = service.getCountPagedUsersBySession(sessionId, searchString);
+
+ int totalPages = new Double(
+ Math.ceil(new Integer(countSessionUsers).doubleValue() / new Integer(rowLimit).doubleValue()))
+ .intValue();
+
+ //date formatters
+ DateFormat dateFormatter = new SimpleDateFormat("d-MMM-yyyy h:mm a");
+ HttpSession ss = SessionManager.getSession();
+ UserDTO monitorDto = (UserDTO) ss.getAttribute(AttributeNames.USER);
+ TimeZone monitorTimeZone = monitorDto.getTimeZone();
+
+ //get all comments and attachments
+ TaskListItem item = service.getTaskListItemByUid(itemUid);
+ Set itemComments = item.getComments();
+ Set itemAttachments = item.getAttachments();
+ String label = HtmlUtils.htmlEscape(service.getMessage("label.download"));
+
+ int i = 0;
+ ArrayNode rows = JsonNodeFactory.instance.arrayNode();
+ for (TaskListUserDTO userDto : userDtos) {
+
+ ArrayNode userData = JsonNodeFactory.instance.arrayNode();
+ String fullName = HtmlUtils.htmlEscape(userDto.getFullName());
+ userData.add(fullName);
+
+ String completionImage = userDto.isCompleted() ? ""
+ : "";
+ userData.add(completionImage);
+
+ String accessDate = (userDto.getAccessDate() == null) ? ""
+ : dateFormatter
+ .format(DateUtil.convertToTimeZoneFromDefault(monitorTimeZone, userDto.getAccessDate()));
+ userData.add(accessDate);
+
+ // fill up with comments and attachments made by this user
+ if (item.isCommentsAllowed() || item.isFilesAllowed()) {
+ String commentsFiles = "";
+
+ ArrayList userComments = new ArrayList<>();
+ for (TaskListItemComment comment : itemComments) {
+ if (userDto.getUserId().equals(comment.getCreateBy().getUserId())) {
+ userComments.add(comment.getComment());
+ }
+ }
+ if (!userComments.isEmpty()) {
+ commentsFiles += "- ";
+ for (String userComment : userComments) {
+ commentsFiles += HtmlUtils.htmlEscape(userComment);
+ }
+ commentsFiles += "
";
+ }
+
+ ArrayList userAttachments = new ArrayList<>();
+ for (TaskListItemAttachment attachment : itemAttachments) {
+ if (userDto.getUserId().equals(attachment.getCreateBy().getUserId())) {
+ userAttachments.add(attachment);
+ }
+ }
+ if (!userAttachments.isEmpty()) {
+ commentsFiles += "- ";
+ for (TaskListItemAttachment userAttachment : userAttachments) {
+ commentsFiles += HtmlUtils.htmlEscape(userAttachment.getFileName()) + " ";
+ commentsFiles += "" + label
+ + "";
+ }
+ commentsFiles += "
";
+ }
+
+ commentsFiles += "
";
+
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+ userData.add(commentsFiles);
+ }
+
+ ObjectNode userRow = JsonNodeFactory.instance.objectNode();
+ userRow.put("id", i++);
+ userRow.set("cell", userData);
+
+ rows.add(userRow);
+ }
+
+ ObjectNode responseJSON = JsonNodeFactory.instance.objectNode();
+ responseJSON.put("total", totalPages);
+ responseJSON.put("page", page);
+ responseJSON.put("records", countSessionUsers);
+ responseJSON.set("rows", rows);
+
+ res.setContentType("application/json;charset=utf-8");
+ res.getWriter().print(new String(responseJSON.toString()));
+ return null;
+ }
+
+ /**
+ * Mark taskList user as verified.
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ * @throws IOException
+ */
+ private ActionForward setVerifiedByMonitor(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws IOException {
+
+ Long userUid = WebUtil.readLongParam(request, TaskListConstants.ATTR_USER_UID);
+ ITaskListService service = getTaskListService();
+ TaskListUser user = service.getUser(userUid);
+ user.setVerifiedByMonitor(true);
+ service.createUser(user);
+
+ response.setContentType("text/html");
+ PrintWriter out = response.getWriter();
+ out.write(userUid.toString());
+ out.flush();
+ out.close();
+ return null;
+ }
+
+ /**
+ * Set Submission Deadline
+ *
+ * @param mapping
+ * @param form
+ * @param request
+ * @param response
+ * @return
+ */
+ public ActionForward setSubmissionDeadline(ActionMapping mapping, ActionForm form, HttpServletRequest request,
+ HttpServletResponse response) throws IOException {
+
+ ITaskListService service = getTaskListService();
+ Long contentID = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID);
+ TaskList taskList = service.getTaskListByContentId(contentID);
+
+ Long dateParameter = WebUtil.readLongParam(request, TaskListConstants.ATTR_SUBMISSION_DEADLINE, true);
+ Date tzSubmissionDeadline = null;
+ String formattedDate = "";
+ if (dateParameter != null) {
+ Date submissionDeadline = new Date(dateParameter);
+ HttpSession ss = SessionManager.getSession();
+ org.lamsfoundation.lams.usermanagement.dto.UserDTO teacher = (org.lamsfoundation.lams.usermanagement.dto.UserDTO) ss
+ .getAttribute(AttributeNames.USER);
+ TimeZone teacherTimeZone = teacher.getTimeZone();
+ tzSubmissionDeadline = DateUtil.convertFromTimeZoneToDefault(teacherTimeZone, submissionDeadline);
+ formattedDate = DateUtil.convertToStringForJSON(tzSubmissionDeadline, request.getLocale());
+ }
+ taskList.setSubmissionDeadline(tzSubmissionDeadline);
+ service.saveOrUpdateTaskList(taskList);
+ response.setContentType("text/plain;charset=utf-8");
+ response.getWriter().print(formattedDate);
+ return null;
+ }
+
+ // *************************************************************************************
+ // Private method
+ // *************************************************************************************
+ private ITaskListService getTaskListService() {
+ WebApplicationContext wac = WebApplicationContextUtils
+ .getRequiredWebApplicationContext(getServlet().getServletContext());
+ return (ITaskListService) wac.getBean(TaskListConstants.TASKLIST_SERVICE);
+ }
+
+}
Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListPedagogicalPlannerForm.java
===================================================================
diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -rb9f506afc78a6f28e20a87ef15915076fd9d839f
--- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListPedagogicalPlannerForm.java (.../TaskListPedagogicalPlannerForm.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11)
+++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListPedagogicalPlannerForm.java (.../TaskListPedagogicalPlannerForm.java) (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -20,29 +20,25 @@
* ****************************************************************
*/
-
package org.lamsfoundation.lams.tool.taskList.web.form;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
-import org.apache.struts.action.ActionMessage;
-import org.apache.struts.action.ActionMessages;
import org.lamsfoundation.lams.tool.taskList.model.TaskList;
import org.lamsfoundation.lams.tool.taskList.model.TaskListItem;
import org.lamsfoundation.lams.web.planner.PedagogicalPlannerActivityForm;
+import org.springframework.validation.Errors;
/**
*
*/
public class TaskListPedagogicalPlannerForm extends PedagogicalPlannerActivityForm {
private List taskListItem;
- @Override
- public ActionMessages validate() {
- ActionMessages errors = new ActionMessages();
+ public void validate(Errors errors) {
boolean valid = true;
boolean allEmpty = true;
if (taskListItem != null && !taskListItem.isEmpty()) {
@@ -54,21 +50,19 @@
}
}
if (allEmpty) {
- ActionMessage error = new ActionMessage("authoring.msg.no.tasks.save");
- errors.add(ActionMessages.GLOBAL_MESSAGE, error);
+ errors.reject("authoring.msg.no.tasks.save");
valid = false;
taskListItem = null;
}
setValid(valid);
- return errors;
}
public void fillForm(TaskList taskList) {
if (taskList != null) {
setToolContentID(taskList.getContentId());
- taskListItem = new ArrayList();
+ taskListItem = new ArrayList<>();
Set items = taskList.getTaskListItems();
if (items != null) {
int topicIndex = 0;
@@ -81,7 +75,7 @@
public void setTaskListItem(int number, String TaskListItems) {
if (taskListItem == null) {
- taskListItem = new ArrayList();
+ taskListItem = new ArrayList<>();
}
while (number >= taskListItem.size()) {
taskListItem.add(null);
Index: lams_tool_task/web/WEB-INF/spring-servlet.xml
===================================================================
diff -u
--- lams_tool_task/web/WEB-INF/spring-servlet.xml (revision 0)
+++ lams_tool_task/web/WEB-INF/spring-servlet.xml (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
Index: lams_tool_task/web/WEB-INF/web.xml
===================================================================
diff -u -rac280c8fb2043ec90a0b7756ede0c7ab64c089d8 -rb9f506afc78a6f28e20a87ef15915076fd9d839f
--- lams_tool_task/web/WEB-INF/web.xml (.../web.xml) (revision ac280c8fb2043ec90a0b7756ede0c7ab64c089d8)
+++ lams_tool_task/web/WEB-INF/web.xml (.../web.xml) (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -72,27 +72,12 @@
/*
-
- action
- org.apache.struts.action.ActionServlet
-
- config
- /WEB-INF/struts-config.xml
-
-
- debug
- 999
-
-
- detail
- 1
-
-
- validate
- true
-
- 2
+ spring
+
+ org.springframework.web.servlet.DispatcherServlet
+
+ 1
@@ -123,7 +108,7 @@
- action
+ spring
*.do
@@ -139,7 +124,7 @@
-
+
@@ -175,6 +160,7 @@
tags-tiles-el
/WEB-INF/tlds/struts/struts-tiles-el.tld
+
@@ -194,7 +180,21 @@
tags-xml
/WEB-INF/tlds/jstl/x.tld
+
+
+
+
+ tags-permittedTaglibs
+ /WEB-INF/tlds/jstl/permittedTaglibs.tld
+
+
+
+ tags-scriptfree
+ /WEB-INF/tlds/jstl/scriptfree.tld
+
+
+
Index: lams_tool_task/web/common/header.jsp
===================================================================
diff -u -re2b0fb42ae13324ae334a09dc5261c56a193f817 -rb9f506afc78a6f28e20a87ef15915076fd9d839f
--- lams_tool_task/web/common/header.jsp (.../header.jsp) (revision e2b0fb42ae13324ae334a09dc5261c56a193f817)
+++ lams_tool_task/web/common/header.jsp (.../header.jsp) (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -5,7 +5,7 @@
-
+
@@ -15,6 +15,6 @@
-
+
Index: lams_tool_task/web/common/tabbedheader.jsp
===================================================================
diff -u -rd6dcae53cbe27a85aedf62b8545ee3193ec55220 -rb9f506afc78a6f28e20a87ef15915076fd9d839f
--- lams_tool_task/web/common/tabbedheader.jsp (.../tabbedheader.jsp) (revision d6dcae53cbe27a85aedf62b8545ee3193ec55220)
+++ lams_tool_task/web/common/tabbedheader.jsp (.../tabbedheader.jsp) (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -4,14 +4,14 @@
-
+
-
+
Index: lams_tool_task/web/common/taglibs.jsp
===================================================================
diff -u -r9d26aaf34391eb58df037978365deda31de85c1b -rb9f506afc78a6f28e20a87ef15915076fd9d839f
--- lams_tool_task/web/common/taglibs.jsp (.../taglibs.jsp) (revision 9d26aaf34391eb58df037978365deda31de85c1b)
+++ lams_tool_task/web/common/taglibs.jsp (.../taglibs.jsp) (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -7,5 +7,5 @@
<%@ taglib uri="tags-fmt" prefix="fmt" %>
<%@ taglib uri="tags-xml" prefix="x" %>
<%@ taglib uri="tags-lams" prefix="lams" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
Index: lams_tool_task/web/pages/authoring/advance.jsp
===================================================================
diff -u -r9bde0c194f5868e0e9e1dd133aefd38416574b1b -rb9f506afc78a6f28e20a87ef15915076fd9d839f
--- lams_tool_task/web/pages/authoring/advance.jsp (.../advance.jsp) (revision 9bde0c194f5868e0e9e1dd133aefd38416574b1b)
+++ lams_tool_task/web/pages/authoring/advance.jsp (.../advance.jsp) (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -1,13 +1,13 @@
<%@ include file="/common/taglibs.jsp"%>
-
+
@@ -16,7 +16,7 @@
-
+
-
+
Index: lams_tool_task/web/pages/authoring/authoring.jsp
===================================================================
diff -u -r412fe7a30d27bd7402ae872029af8dd655d4a638 -rb9f506afc78a6f28e20a87ef15915076fd9d839f
--- lams_tool_task/web/pages/authoring/authoring.jsp (.../authoring.jsp) (revision 412fe7a30d27bd7402ae872029af8dd655d4a638)
+++ lams_tool_task/web/pages/authoring/authoring.jsp (.../authoring.jsp) (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -64,13 +64,12 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
@@ -106,19 +105,20 @@
accessMode="author"
--%>
-
+
+
-
+
Index: lams_tool_task/web/pages/authoring/basic.jsp
===================================================================
diff -u -r0138aabe01dc8f301e7c727bd39e97424b4fa38a -rb9f506afc78a6f28e20a87ef15915076fd9d839f
--- lams_tool_task/web/pages/authoring/basic.jsp (.../basic.jsp) (revision 0138aabe01dc8f301e7c727bd39e97424b4fa38a)
+++ lams_tool_task/web/pages/authoring/basic.jsp (.../basic.jsp) (revision b9f506afc78a6f28e20a87ef15915076fd9d839f)
@@ -1,6 +1,5 @@
<%@ include file="/common/taglibs.jsp"%>
-
+
+