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"%> - + +