Index: lams_build/lib/lams/lams-central.jar =================================================================== diff -u -r9349bab097150a4a15cf4c6c10b7946400c3fbd0 -rcad516bd852b193b61c821c5177cecacf3e5d016 Binary files differ Index: lams_central/src/java/org/lamsfoundation/lams/web/TextSearchForm.java =================================================================== diff -u --- lams_central/src/java/org/lamsfoundation/lams/web/TextSearchForm.java (revision 0) +++ lams_central/src/java/org/lamsfoundation/lams/web/TextSearchForm.java (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -0,0 +1,99 @@ +/**************************************************************** + * 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.web; + +import org.lamsfoundation.lams.learningdesign.TextSearchCondition; + +/** + * The form that contains all the fields provided in lams:TextSearch tag. + * + * @author Marcin Cieslak + * + * + */ +public class TextSearchForm { + + public static final String formName = "TextSearchActionForm"; + private String allWords; + private String phrase; + private String anyWords; + private String excludedWords; + private String sessionMapID; + + public TextSearchForm() { + } + + /** + * Fills the form with data provided by condition. + * + * @param condition + * condition to read the data from + */ + public void populateForm(TextSearchCondition condition) { + allWords = condition.getAllWords(); + phrase = condition.getPhrase(); + anyWords = condition.getAnyWords(); + excludedWords = condition.getExcludedWords(); + } + + public String getAllWords() { + return allWords; + } + + public void setAllWords(String allWords) { + this.allWords = allWords; + } + + public String getPhrase() { + return phrase; + } + + public void setPhrase(String phrase) { + this.phrase = phrase; + } + + public String getAnyWords() { + return anyWords; + } + + public void setAnyWords(String anyWords) { + this.anyWords = anyWords; + } + + public String getExcludedWords() { + return excludedWords; + } + + public void setExcludedWords(String excludedWords) { + this.excludedWords = excludedWords; + } + + public String getSessionMapID() { + return sessionMapID; + } + + public void setSessionMapID(String sessionMapID) { + this.sessionMapID = sessionMapID; + } +} \ No newline at end of file Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringController.java =================================================================== diff -u -rb9f506afc78a6f28e20a87ef15915076fd9d839f -rcad516bd852b193b61c821c5177cecacf3e5d016 --- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringController.java (.../AuthoringController.java) (revision b9f506afc78a6f28e20a87ef15915076fd9d839f) +++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringController.java (.../AuthoringController.java) (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -710,23 +710,23 @@ * @param form * @param request */ - private void populateItemToForm(int itemIdx, TaskListItem item, TaskListItemForm form, HttpServletRequest request) { - form.setDescription(item.getDescription()); - form.setTitle(item.getTitle()); + private void populateItemToForm(int itemIdx, TaskListItem item, TaskListItemForm taskListItemForm, HttpServletRequest request) { + taskListItemForm.setDescription(item.getDescription()); + taskListItemForm.setTitle(item.getTitle()); if (itemIdx >= 0) { - form.setItemIndex(new Integer(itemIdx).toString()); + taskListItemForm.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()); + taskListItemForm.setRequired(item.isRequired()); + taskListItemForm.setCommentsAllowed(item.isCommentsAllowed()); + taskListItemForm.setCommentsRequired(item.isCommentsRequired()); + taskListItemForm.setFilesAllowed(item.isFilesAllowed()); + taskListItemForm.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()); + taskListItemForm.setCommentsFilesAllowed(item.isCommentsFilesAllowed()); + taskListItemForm.setShowCommentsToAll(item.getShowCommentsToAll()); + taskListItemForm.setChildTask(item.isChildTask()); + taskListItemForm.setParentTaskName(item.getParentTaskName()); } /** Fisheye: Tag cad516bd852b193b61c821c5177cecacf3e5d016 refers to a dead (removed) revision in file `lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringTaskListConditionAction.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringTaskListConditionController.java =================================================================== diff -u --- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringTaskListConditionController.java (revision 0) +++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/AuthoringTaskListConditionController.java (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -0,0 +1,493 @@ +/**************************************************************** + * 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.HashMap; +import java.util.List; +import java.util.Map; +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.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.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.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +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 + */ + +@Controller +@RequestMapping("/authoringCondition") +public class AuthoringTaskListConditionController { + + + /** + * Display same entire authoring page content from HttpSession variable. + * + * @param taskListForm + * @param request + * @return + * @throws ServletException + */ + @RequestMapping("/showConditions") + public String showConditions(@ModelAttribute TaskListForm taskListForm, 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(taskListForm, existForm); + } catch (Exception e) { + throw new ServletException(e); + } + + return "pages/authoring/conditions"; + } + + /** + * Display empty page for new taskList item. + * + * @param taskListConditionForm + * @param request + * @param response + * @return + */ + @RequestMapping("/newConditionInit") + public String newConditionInit(@ModelAttribute TaskListForm taskListForm, HttpServletRequest request) { + + TaskListConditionForm taskListConditionForm = new TaskListConditionForm(); + String sessionMapID = request.getParameter(TaskListConstants.ATTR_SESSION_MAP_ID); + taskListConditionForm.setSessionMapID(sessionMapID); + populateFormWithPossibleItems(taskListConditionForm, request); + request.setAttribute("taskListConditionForm", taskListConditionForm); + return "pages/authoring/parts/addcondition"; + } + + + /** + * Display edit page for existed taskList item. + * + * @param taskListConditionForm + * @param request + * @param response + * @return + */ + @RequestMapping("/editCondition") + public String editCondition(@ModelAttribute TaskListConditionForm taskListConditionForm, HttpServletRequest request) { + + // 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, request); + } + } + + populateFormWithPossibleItems(taskListConditionForm, request); + return item == null ? null : "pages/authoring/parts/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 form + * @param request + * @param response + * @return + * @throws ServletException + */ + @RequestMapping("/saveOrUpdateCondition") + public String saveOrUpdateCondition(@ModelAttribute TaskListConditionForm taskListConditionForm, Errors errors, HttpServletRequest request) { + + validateTaskListCondition(taskListConditionForm, errors, request); + if (errors.hasErrors()) { + populateFormWithPossibleItems(taskListConditionForm, request); + return "pages/authoring/parts/addcondition"; + } + + try { + extractFormToTaskListCondition(request, taskListConditionForm); + } catch (Exception e) { + // any upload exception will display as normal error message rather then throw exception directly + errors.reject("error.condition.name.blank"); + if (errors.hasErrors()) { + populateFormWithPossibleItems(taskListConditionForm, request); + return "pages/authoring/parts/addcondition"; + } + + } + // set session map ID so that itemlist.jsp can get sessionMAP + request.setAttribute(TaskListConstants.ATTR_SESSION_MAP_ID, taskListConditionForm.getSessionMapID()); + // return null to close this window + return "pages/authoring/parts/conditionlist"; + } + + + /** + * 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 form + * @param request + * @param response + * @return + */ + @RequestMapping("/removeCondition") + public String removeCondition(@ModelAttribute TaskListConditionForm taskListConditionForm, HttpServletRequest request) { + + // 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 "pages/authoring/parts/conditionlist"; + } + + /** + * Move up current item. + * + * @param request + * @return + */ + @RequestMapping("/upCondition") + public String upCondition(HttpServletRequest request) { + return switchItem(request, true); + } + + /** + * Move down current item. + * + * @param request + * @return + */ + @RequestMapping("/downCondition") + public String downCondition(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 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 "pages/authoring/parts/conditionlist"; + } + + // ************************************************************************************* + // Private methods for internal needs + // ************************************************************************************* + + /** + * 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 taskListConditionForm, + HttpServletRequest request) { + if (sequenceId >= 0) { + taskListConditionForm.setSequenceId(new Integer(sequenceId).toString()); + } + taskListConditionForm.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(); + } + taskListConditionForm.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(TaskListConditionForm taskListConditionForm, 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. + Map possibleItems = new HashMap(itemList.size()); + + for (TaskListItem item : itemList) { + possibleItems.put(String.valueOf(item.getSequenceId()), item.getTitle()); + } + taskListConditionForm.setPossibleItems(possibleItems); + + } + + /** + * 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 void validateTaskListCondition(TaskListConditionForm taskListConditionForm, Errors errors, HttpServletRequest request) { + + + String formConditionName = taskListConditionForm.getName(); + if (StringUtils.isBlank(formConditionName)) { + errors.reject(TaskListConstants.ERROR_MSG_NAME_BLANK); + } else if (StringUtils.contains(formConditionName, '#')) { + errors.reject(TaskListConstants.ERROR_MSG_NAME_CONTAINS_WRONG_SYMBOL); + } else { + + String formConditionSequenceId = taskListConditionForm.getSequenceId(); + + String sessionMapID = taskListConditionForm.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.reject(TaskListConstants.ERROR_MSG_NAME_DUPLICATED); + break; + } + } + } + + // should be selected at least one TaskListItem + String[] selectedItems = taskListConditionForm.getSelectedItems(); + if (selectedItems == null || selectedItems.length == 0) { + errors.reject(TaskListConstants.ERROR_MSG_NO_TASK_LIST_ITEMS); + } + + } + +} Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/LearningController.java =================================================================== diff -u -rb9f506afc78a6f28e20a87ef15915076fd9d839f -rcad516bd852b193b61c821c5177cecacf3e5d016 --- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/LearningController.java (.../LearningController.java) (revision b9f506afc78a6f28e20a87ef15915076fd9d839f) +++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/controller/LearningController.java (.../LearningController.java) (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -1,797 +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"; - } - -} +///**************************************************************** +// * 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/form/ReflectionForm.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -rcad516bd852b193b61c821c5177cecacf3e5d016 --- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/ReflectionForm.java (.../ReflectionForm.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/ReflectionForm.java (.../ReflectionForm.java) (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -33,7 +33,7 @@ * * */ -public class ReflectionForm extends ValidatorForm { +public class ReflectionForm { private static final long serialVersionUID = -9054365604649146735L; private static Logger logger = Logger.getLogger(ReflectionForm.class.getName()); Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListConditionForm.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -rcad516bd852b193b61c821c5177cecacf3e5d016 --- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListConditionForm.java (.../TaskListConditionForm.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListConditionForm.java (.../TaskListConditionForm.java) (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -23,8 +23,11 @@ package org.lamsfoundation.lams.tool.taskList.web.form; -import org.apache.struts.action.ActionForm; + +import java.util.Map; + import org.apache.struts.util.LabelValueBean; +import org.lamsfoundation.lams.web.TextSearchForm; /** * Form responsible for representing TaskListCondition objects on a view layer. @@ -33,7 +36,7 @@ * * */ -public class TaskListConditionForm extends ActionForm { +public class TaskListConditionForm extends TextSearchForm { //tool access mode; private String mode; @@ -42,7 +45,7 @@ private String sequenceId; private String name; // private String taskListItemName; - private LabelValueBean[] possibleItems; + private Map possibleItems; private String[] selectedItems; public TaskListConditionForm() { @@ -142,11 +145,11 @@ // this.taskListItemName = taskListItemName; // } - public LabelValueBean[] getPossibleItems() { + public Map getPossibleItems() { return possibleItems; } - public void setPossibleItems(LabelValueBean[] lvBeans) { + public void setPossibleItems(Map lvBeans) { this.possibleItems = lvBeans; } Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListForm.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -rcad516bd852b193b61c821c5177cecacf3e5d016 --- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListForm.java (.../TaskListForm.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListForm.java (.../TaskListForm.java) (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -39,7 +39,7 @@ * * User: Dapeng.Ni */ -public class TaskListForm extends ActionForm { +public class TaskListForm { private static final long serialVersionUID = 3599879328307492312L; private static Logger logger = Logger.getLogger(TaskListForm.class.getName()); @@ -67,22 +67,7 @@ } } - @Override - public void reset(ActionMapping mapping, HttpServletRequest request) { - String param = mapping.getParameter(); - //if it is start page, all data read out from database or current session - //so need not reset checkbox to refresh value! - if (!StringUtils.equals(param, "start") && !StringUtils.equals(param, "initPage")) { - taskList.setLockWhenFinished(false); - taskList.setSequentialOrder(false); - taskList.setMinimumNumberTasks(0); - taskList.setAllowContributeTasks(false); - taskList.setMonitorVerificationRequired(false); - taskList.setDefineLater(false); - taskList.setReflectOnActivity(false); - } - } - + public int getCurrentTab() { return currentTab; } Index: lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListItemForm.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -rcad516bd852b193b61c821c5177cecacf3e5d016 --- lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListItemForm.java (.../TaskListItemForm.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_task/src/java/org/lamsfoundation/lams/tool/taskList/web/form/TaskListItemForm.java (.../TaskListItemForm.java) (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -34,7 +34,7 @@ * * */ -public class TaskListItemForm extends ActionForm { +public class TaskListItemForm { private String itemIndex; private String sessionMapID; Index: lams_tool_task/web/WEB-INF/tags/AuthoringButton.tag =================================================================== diff -u -r20d56e5a580f9c44979e40663e21cd981f75dc80 -rcad516bd852b193b61c821c5177cecacf3e5d016 --- lams_tool_task/web/WEB-INF/tags/AuthoringButton.tag (.../AuthoringButton.tag) (revision 20d56e5a580f9c44979e40663e21cd981f75dc80) +++ lams_tool_task/web/WEB-INF/tags/AuthoringButton.tag (.../AuthoringButton.tag) (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -32,7 +32,6 @@ <%@ tag body-content="scriptless" %> <%@ taglib uri="tags-core" prefix="c" %> <%@ taglib uri="tags-fmt" prefix="fmt" %> -<%@ taglib uri="tags-html" prefix="html" %> <%@ taglib uri="tags-lams" prefix="lams"%> <%@ attribute name="formID" required="true" rtexprvalue="true" %> @@ -123,11 +122,11 @@ } \ No newline at end of file Index: lams_tool_task/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag =================================================================== diff -u -r540199b8a30f643c2ca5960c007e5bef74acd397 -rcad516bd852b193b61c821c5177cecacf3e5d016 --- lams_tool_task/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag (.../AuthoringRatingAllStyleCriteria.tag) (revision 540199b8a30f643c2ca5960c007e5bef74acd397) +++ lams_tool_task/web/WEB-INF/tags/AuthoringRatingAllStyleCriteria.tag (.../AuthoringRatingAllStyleCriteria.tag) (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -8,7 +8,6 @@ <%@ tag body-content="scriptless" %> <%@ taglib uri="tags-core" prefix="c" %> <%@ taglib uri="tags-fmt" prefix="fmt" %> -<%@ taglib uri="tags-html" prefix="html" %> <%@ taglib uri="tags-lams" prefix="lams"%> <%@ taglib uri="tags-function" prefix="fn" %> Index: lams_tool_task/web/WEB-INF/tags/AuthoringRatingCriteria.tag =================================================================== diff -u -r5bdde98b1e94d44d239a50549987293714a5bef1 -rcad516bd852b193b61c821c5177cecacf3e5d016 --- lams_tool_task/web/WEB-INF/tags/AuthoringRatingCriteria.tag (.../AuthoringRatingCriteria.tag) (revision 5bdde98b1e94d44d239a50549987293714a5bef1) +++ lams_tool_task/web/WEB-INF/tags/AuthoringRatingCriteria.tag (.../AuthoringRatingCriteria.tag) (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -8,9 +8,10 @@ <%@ tag body-content="scriptless" %> <%@ taglib uri="tags-core" prefix="c" %> <%@ taglib uri="tags-fmt" prefix="fmt" %> -<%@ taglib uri="tags-html" prefix="html" %> <%@ taglib uri="tags-lams" prefix="lams"%> <%@ taglib uri="tags-function" prefix="fn" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> + <%@ attribute name="criterias" required="true" rtexprvalue="true" type="java.util.Collection" %> @@ -284,42 +285,42 @@ - - + + - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + - - + + - - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + Index: lams_tool_task/web/WEB-INF/tags/CommentsAuthor.tag =================================================================== diff -u -r500ae45f4243aa718eac7436bc903b4f137a3aa7 -rcad516bd852b193b61c821c5177cecacf3e5d016 --- lams_tool_task/web/WEB-INF/tags/CommentsAuthor.tag (.../CommentsAuthor.tag) (revision 500ae45f4243aa718eac7436bc903b4f137a3aa7) +++ lams_tool_task/web/WEB-INF/tags/CommentsAuthor.tag (.../CommentsAuthor.tag) (revision cad516bd852b193b61c821c5177cecacf3e5d016) @@ -1,7 +1,7 @@ <%@ taglib uri="tags-core" prefix="c"%> -<%@ taglib uri="tags-html" prefix="html"%> <%@ taglib uri="tags-fmt" prefix="fmt"%> <%@ taglib uri="tags-lams" prefix="lams"%> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <%@ attribute name="allowCommentsVariableName" required="false" rtexprvalue="true"%> <%@ attribute name="allowCommentLabelKey" required="false" rtexprvalue="true"%> @@ -39,20 +39,18 @@ -
-
-     -   +     +