Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaAppConstants.java =================================================================== diff -u -rc4e8969c8dd14ae2428a6cfd6bb941dfe5cf479a -r35ebea0b2dfa2e0323f604242035c2d7e5a299dd --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaAppConstants.java (.../QaAppConstants.java) (revision c4e8969c8dd14ae2428a6cfd6bb941dfe5cf479a) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/QaAppConstants.java (.../QaAppConstants.java) (revision 35ebea0b2dfa2e0323f604242035c2d7e5a299dd) @@ -116,7 +116,6 @@ // for condition management use public static final String ATTR_SESSION_MAP_ID = "sessionMapID"; public static final String ATTR_CONDITION_SET = "conditionList"; - public static final String ATTR_QA_AUTHORING_FORM = "QaAuthoringForm"; public static final String PARAM_ORDER_ID = "orderId"; public static final String ATTR_DELETED_CONDITION_LIST = "deletedConditionList"; public static final int QUESTION_CUTOFF_INDEX = 40; Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/model/QaCondition.java =================================================================== diff -u -r86c25c80d92701a94c3161575c76c363891402ad -r35ebea0b2dfa2e0323f604242035c2d7e5a299dd --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/model/QaCondition.java (.../QaCondition.java) (revision 86c25c80d92701a94c3161575c76c363891402ad) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/model/QaCondition.java (.../QaCondition.java) (revision 35ebea0b2dfa2e0323f604242035c2d7e5a299dd) @@ -62,7 +62,7 @@ * the words that make the condition's parameters. */ @ManyToMany - @Cascade({ CascadeType.SAVE_UPDATE }) +// @Cascade({ CascadeType.SAVE_UPDATE }) @JoinTable(name = "tl_laqa11_condition_questions", joinColumns = @JoinColumn(name = "condition_id"), inverseJoinColumns = @JoinColumn(name = "question_uid")) @OrderBy("uid ASC") private Set questions = new TreeSet<>(new QaQuestionComparator()); @@ -162,7 +162,6 @@ * tool content. */ public QaCondition clone(QaContent qaContent) { - Set questionsCopy = new TreeSet<>(new QaQuestionComparator()); for (QaQueContent conditionQuestion : getQuestions()) { for (QaQueContent contentQuestion : qaContent.getQaQueContents()) { Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/QaAuthoringConditionController.java =================================================================== diff -u -r86c25c80d92701a94c3161575c76c363891402ad -r35ebea0b2dfa2e0323f604242035c2d7e5a299dd --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/QaAuthoringConditionController.java (.../QaAuthoringConditionController.java) (revision 86c25c80d92701a94c3161575c76c363891402ad) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/QaAuthoringConditionController.java (.../QaAuthoringConditionController.java) (revision 35ebea0b2dfa2e0323f604242035c2d7e5a299dd) @@ -24,10 +24,8 @@ import java.util.ArrayList; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; @@ -105,7 +103,7 @@ int orderId = NumberUtils.stringToInt(request.getParameter(QaAppConstants.PARAM_ORDER_ID), -1); QaCondition condition = null; if (orderId != -1) { - SortedSet conditionSet = getQaConditionSet(sessionMap); + SortedSet conditionSet = getConditions(sessionMap); List conditionList = new ArrayList<>(conditionSet); condition = conditionList.get(orderId); if (condition != null) { @@ -175,7 +173,7 @@ int orderId = NumberUtils.stringToInt(request.getParameter(QaAppConstants.PARAM_ORDER_ID), -1); if (orderId != -1) { - SortedSet conditionSet = getQaConditionSet(sessionMap); + SortedSet conditionSet = getConditions(sessionMap); List conditionList = new ArrayList<>(conditionSet); QaCondition condition = conditionList.remove(orderId); for (QaCondition otherCondition : conditionSet) { @@ -223,7 +221,7 @@ int orderId = NumberUtils.stringToInt(request.getParameter(QaAppConstants.PARAM_ORDER_ID), -1); if (orderId != -1) { - SortedSet conditionSet = getQaConditionSet(sessionMap); + SortedSet conditionSet = getConditions(sessionMap); List conditionList = new ArrayList<>(conditionSet); // get current and the target item, and switch their sequnece QaCondition condition = conditionList.get(orderId); @@ -257,7 +255,7 @@ * @return */ @SuppressWarnings("unchecked") - private SortedSet getQaConditionSet(SessionMap sessionMap) { + public static SortedSet getConditions(SessionMap sessionMap) { SortedSet list = (SortedSet) sessionMap.get(QaAppConstants.ATTR_CONDITION_SET); if (list == null) { list = new TreeSet<>(new TextSearchConditionComparator()); @@ -360,7 +358,7 @@ SessionMap sessionMap = (SessionMap) request.getSession() .getAttribute(form.getSessionMapID()); // check whether it is "edit(old item)" or "add(new item)" - SortedSet conditionSet = getQaConditionSet(sessionMap); + SortedSet conditionSet = getConditions(sessionMap); int orderId = form.getOrderId(); QaCondition condition = null; @@ -415,7 +413,7 @@ String sessionMapID = QaConditionForm.getSessionMapID(); SessionMap sessionMap = (SessionMap) request.getSession().getAttribute(sessionMapID); - SortedSet conditionSet = getQaConditionSet(sessionMap); + SortedSet conditionSet = getConditions(sessionMap); for (QaCondition condition : conditionSet) { if (formConditionName.equals(condition.getDisplayName()) && !formConditionOrderId.equals(condition.getOrderId())) { Index: lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/QaAuthoringController.java =================================================================== diff -u -rc4e8969c8dd14ae2428a6cfd6bb941dfe5cf479a -r35ebea0b2dfa2e0323f604242035c2d7e5a299dd --- lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/QaAuthoringController.java (.../QaAuthoringController.java) (revision c4e8969c8dd14ae2428a6cfd6bb941dfe5cf479a) +++ lams_tool_laqa/src/java/org/lamsfoundation/lams/tool/qa/web/controller/QaAuthoringController.java (.../QaAuthoringController.java) (revision 35ebea0b2dfa2e0323f604242035c2d7e5a299dd) @@ -42,7 +42,6 @@ import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; -import org.lamsfoundation.lams.learningdesign.TextSearchConditionComparator; import org.lamsfoundation.lams.qb.QbUtils; import org.lamsfoundation.lams.qb.form.QbQuestionForm; import org.lamsfoundation.lams.qb.model.QbQuestion; @@ -146,12 +145,10 @@ } } } - SortedSet conditionList = getConditions(sessionMap); + SortedSet conditionList = QaAuthoringConditionController.getConditions(sessionMap); conditionList.clear(); conditionList.addAll(qa.getConditions()); - sessionMap.put(QaAppConstants.ATTR_QA_AUTHORING_FORM, form); - // get rating criterias from DB List ratingCriterias = qaService.getRatingCriterias(qa.getQaContentId()); sessionMap.put(AttributeNames.ATTR_RATING_CRITERIAS, ratingCriterias); @@ -181,6 +178,12 @@ qaPO.setUpdateDate(new Timestamp(new Date().getTime())); } else { + // copyProperties() below sets qaPO's conditions to empty collection + // but the conditions still exist in Hibernate cache, so we need to evict them now + for (QaCondition condition : qaPO.getConditions()) { + qaService.releaseFromCache(condition); + } + qaPO.getQaQueContents().clear(); qaPO.getConditions().clear(); Long uid = qaPO.getUid(); @@ -219,14 +222,22 @@ qaPO.setCreatedBy(userId); qaService.saveOrUpdateQaContent(qaPO); - // ************************* Handle Q&A conditions ******************* + // ************************* Handle Q&A questions ******************* + Set items = new LinkedHashSet<>(); Set newItems = getQuestions(sessionMap); - SortedSet conditions = getConditions(sessionMap); + for (QaQueContent question : newItems) { + question.setQaContent(qaPO); + question.setToolContentId(qaPO.getQaContentId()); + qaService.saveOrUpdate(question); + items.add(question); + } + qaPO.setQaQueContents(items); + + // ************************* Handle Q&A conditions ******************* + SortedSet conditions = QaAuthoringConditionController.getConditions(sessionMap); for (QaCondition condition : conditions) { condition.setQuestions(new TreeSet<>(new QaQuestionComparator())); for (QaQueContent qaQuestion : condition.temporaryQaQuestions) { - //TODO check how conditions get saved - for (QaQueContent question : newItems) { if (qaQuestion.getDisplayOrder() == question.getDisplayOrder()) { condition.getQuestions().add(question); @@ -236,21 +247,12 @@ } qaPO.setConditions(conditions); - // ************************* Handle Q&A questions ******************* - Set items = new LinkedHashSet<>(); - Iterator iter = newItems.iterator(); + //reorder questions so displayOrder numbers come in strictly sequential order (it's required for proper work of learning) int displayOrder = 1; - while (iter.hasNext()) { - QaQueContent question = iter.next(); - if (question != null) { - question.setQaContent(qaPO); - question.setToolContentId(qaPO.getQaContentId()); - question.setDisplayOrder(displayOrder++); - qaService.saveOrUpdate(question); - items.add(question); - } + for (QaQueContent question : newItems) { + question.setDisplayOrder(displayOrder++); + qaService.saveOrUpdate(question); } - qaPO.setQaQueContents(items); qaService.saveOrUpdateQaContent(qaPO); @@ -471,7 +473,7 @@ delList.add(questionToDelete); //take care about conditions - SortedSet conditions = getConditions(sessionMap); + SortedSet conditions = QaAuthoringConditionController.getConditions(sessionMap); Iterator conditionIter = conditions.iterator(); while (conditionIter.hasNext()) { QaCondition condition = conditionIter.next(); @@ -515,7 +517,6 @@ private Set swapQuestions(QaAuthoringForm form, HttpServletRequest request, String direction) { SessionMap sessionMap = getSessionMap(form, request); Set questions = getQuestions(sessionMap); - SortedSet conditions = getConditions(sessionMap); int originalQuestionIndex = WebUtil.readIntParam(request, "questionIndex"); int replacedQuestionIndex = direction.equals("down") ? originalQuestionIndex + 1 : originalQuestionIndex - 1; @@ -531,19 +532,6 @@ // put back list, it will be sorted again questions.clear(); questions.addAll(rList); - - // references in conditions also need to be changed - if (conditions != null) { - for (QaCondition condition : conditions) { - SortedSet newQuestionSet = new TreeSet<>(new QaQuestionComparator()); - for (QaQueContent question : questions) { - if (condition.temporaryQaQuestions.contains(question)) { - newQuestionSet.add(question); - } - } - condition.temporaryQaQuestions = newQuestionSet; - } - } return questions; } @@ -590,16 +578,6 @@ } @SuppressWarnings("unchecked") - private SortedSet getConditions(SessionMap sessionMap) { - SortedSet list = (SortedSet) sessionMap.get(QaAppConstants.ATTR_CONDITION_SET); - if (list == null) { - list = new TreeSet<>(new TextSearchConditionComparator()); - sessionMap.put(QaAppConstants.ATTR_CONDITION_SET, list); - } - return list; - } - - @SuppressWarnings("unchecked") private SessionMap getSessionMap(QaAuthoringForm form, HttpServletRequest request) { String sessionMapID = form.getSessionMapID(); request.setAttribute(QaAppConstants.ATTR_SESSION_MAP_ID, sessionMapID);