Index: lams_tool_daco/conf/xdoclet/struts-actions.xml =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/conf/xdoclet/struts-actions.xml,v diff -u -r1.4 -r1.5 --- lams_tool_daco/conf/xdoclet/struts-actions.xml 8 Aug 2008 08:10:22 -0000 1.4 +++ lams_tool_daco/conf/xdoclet/struts-actions.xml 12 Aug 2008 01:43:04 -0000 1.5 @@ -94,10 +94,6 @@ parameter="removeAnswerOption"> - - - getQuestionSummaries(Long userUid, List blankSummary); + /** + * Gets the number of records in the group. + * @param sessionId session ID of the group + * @return number of records in that group + */ Integer getGroupRecordCount(Long sessionId); } \ No newline at end of file Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoDAOHibernate.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoDAOHibernate.java,v diff -u -r1.3 -r1.4 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoDAOHibernate.java 8 Aug 2008 08:10:22 -0000 1.3 +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dao/hibernate/DacoDAOHibernate.java 12 Aug 2008 01:43:04 -0000 1.4 @@ -30,7 +30,7 @@ /** * - * @author Steve.Ni + * @author Marcin Cieslak * * @version $Revision$ */ Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/MonitoringSummarySessionDTO.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/MonitoringSummarySessionDTO.java,v diff -u -r1.1 -r1.2 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/MonitoringSummarySessionDTO.java 31 Jul 2008 03:51:05 -0000 1.1 +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/MonitoringSummarySessionDTO.java 12 Aug 2008 01:43:04 -0000 1.2 @@ -26,7 +26,12 @@ import java.util.List; - +/** + * Represents a group of users with details that are useful for displaying summary in monitoring. + * + * @author Marcin Cieslak + * + */ public class MonitoringSummarySessionDTO { private Long sessionId; Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/MonitoringSummaryUserDTO.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/MonitoringSummaryUserDTO.java,v diff -u -r1.2 -r1.3 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/MonitoringSummaryUserDTO.java 8 Aug 2008 08:10:22 -0000 1.2 +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/MonitoringSummaryUserDTO.java 12 Aug 2008 01:43:04 -0000 1.3 @@ -7,6 +7,11 @@ import org.lamsfoundation.lams.tool.daco.model.DacoAnswer; +/** + * Contains the user details that are useful for displaying summary in monitoring. + * @author Marcin Cieslak + * + */ public class MonitoringSummaryUserDTO { private Long uid; Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/QuestionSummaryDTO.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/QuestionSummaryDTO.java,v diff -u -r1.2 -r1.3 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/QuestionSummaryDTO.java 8 Aug 2008 08:10:22 -0000 1.2 +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/QuestionSummaryDTO.java 12 Aug 2008 01:43:04 -0000 1.3 @@ -4,8 +4,19 @@ import java.util.Iterator; import java.util.List; +/** + * Contains summary values for a single question. + * @author Marcin Cieslak + * + */ public class QuestionSummaryDTO implements Cloneable { + /** + * Contains set of summary information for the user. + */ private List userSummary = new ArrayList(); + /** + * Contains set of summary information for the group of users (session). + */ private List groupSummary = new ArrayList(); private Long questionUid; @@ -70,6 +81,7 @@ catch (CloneNotSupportedException e) { e.printStackTrace(); } + // Group data stays the same, user data is cleared if (userSummary != null) { List list = new ArrayList(userSummary.size()); for (QuestionSummarySingleAnswerDTO singleAnswer : userSummary) { Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/QuestionSummarySingleAnswerDTO.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/QuestionSummarySingleAnswerDTO.java,v diff -u -r1.2 -r1.3 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/QuestionSummarySingleAnswerDTO.java 8 Aug 2008 08:10:22 -0000 1.2 +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/dto/QuestionSummarySingleAnswerDTO.java 12 Aug 2008 01:43:04 -0000 1.3 @@ -3,6 +3,11 @@ */ package org.lamsfoundation.lams.tool.daco.dto; +/** + * Represents a single answer and its summary. + * @author Marcin Cieslak + * + */ public class QuestionSummarySingleAnswerDTO { private String answer; private String sum; Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/model/Daco.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/model/Daco.java,v diff -u -r1.3 -r1.4 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/model/Daco.java 8 Aug 2008 08:10:22 -0000 1.3 +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/model/Daco.java 12 Aug 2008 01:43:04 -0000 1.4 @@ -39,7 +39,7 @@ /** * Daco * - * @author Dapeng Ni + * @author Marcin Cieslak * * @hibernate.class table="tl_ladaco10_contents" * Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/DacoServiceImpl.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/DacoServiceImpl.java,v diff -u -r1.5 -r1.6 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/DacoServiceImpl.java 8 Aug 2008 08:10:22 -0000 1.5 +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/DacoServiceImpl.java 12 Aug 2008 01:43:04 -0000 1.6 @@ -399,6 +399,7 @@ List result = new ArrayList(sessions.size()); Daco daco = getDacoByContentId(contentId); for (DacoSession session : sessions) { + //for each session a monitoring summary is created MonitoringSummarySessionDTO monitoringRecordList = new MonitoringSummarySessionDTO(session.getSessionId(), session .getSessionName()); List users = dacoUserDao.getBySessionId(session.getSessionId()); @@ -407,6 +408,9 @@ MonitoringSummaryUserDTO monitoringUser = new MonitoringSummaryUserDTO(user.getUid(), user.getUserId().intValue(), user.getLastName() + " " + user.getFirstName(), user.getLoginName()); List> records = getDacoAnswersByUserUid(user.getUid()); + /* If the user provided as "userUid" matches current user UID, the summary is filled with additional data. + * NULL matches all users. UID < 0 matches no users, so only the brief description of users is filled in. + */ if (userUid == null || userUid.equals(user.getUid())) { monitoringUser.setRecords(records); NotebookEntry entry = getEntry(session.getSessionId(), CoreNotebookConstants.NOTEBOOK_TOOL, @@ -429,12 +433,16 @@ public List getQuestionSummaries(Long userUid) { List result = new ArrayList(); DacoUser user = (DacoUser) dacoUserDao.getObject(DacoUser.class, userUid); - + //Blank structure is created Set questions = user.getDaco().getDacoQuestions(); if (questions.size() > 0) { for (DacoQuestion question : questions) { switch (question.getType()) { case DacoConstants.QUESTION_TYPE_NUMBER: { + /* + * For numbers, first "single answer" is a summary for the whole question. + * Other "single answers" are summaries for the real answers provided by a learner. + */ QuestionSummaryDTO summary = new QuestionSummaryDTO(); summary.addUserSummarySingleAnswer(0, new QuestionSummarySingleAnswerDTO()); summary.addGroupSummarySingleAnswer(0, new QuestionSummarySingleAnswerDTO()); Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/IDacoService.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/IDacoService.java,v diff -u -r1.5 -r1.6 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/IDacoService.java 8 Aug 2008 08:10:22 -0000 1.5 +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/service/IDacoService.java 12 Aug 2008 01:43:04 -0000 1.6 @@ -29,6 +29,7 @@ import org.apache.struts.upload.FormFile; import org.lamsfoundation.lams.contentrepository.IVersionedNode; import org.lamsfoundation.lams.notebook.model.NotebookEntry; +import org.lamsfoundation.lams.tool.daco.dao.DacoAnswerDAO; import org.lamsfoundation.lams.tool.daco.dto.MonitoringSummarySessionDTO; import org.lamsfoundation.lams.tool.daco.dto.QuestionSummaryDTO; import org.lamsfoundation.lams.tool.daco.model.Daco; @@ -227,17 +228,56 @@ */ DacoUser getUser(Long uid); + /** + * Gets a message from resource bundle. Same as in JSP pages. + * @param key key of the message + * @param args arguments for the message + * @return message content + */ public String getLocalisedMessage(String key, Object[] args); + /** + * Returns summaries for particular questions. A list of {@link QuestionSummaryDTO question summaries} is created, + * one for each question. They are filled with default, blank data. + * Then the proper summaries are {@link DacoAnswerDAO#getQuestionSummaries(Long, List) read} from the database. + * @param userUid user for who the summary should be created + * @return list of question summaries + */ public List getQuestionSummaries(Long userUid); + /** + * Removes a Daco object and all of its Questions from Hibernate cache. + * It is required to avoid errors when same object was read from the database twice and one of the copies is being saved. + * @param daco object to release + */ public void releaseDacoFromCache(Daco daco); + /** + * Removes Answers from Hibernate cache. + * It is required to avoid errors when same object was read from the database twice and one of the copies is being saved. + * @param answers collection of answers to remove from cache + */ void releaseAnswersFromCache(Collection answers); + /** + * Gets the number of records in the group. It uses database connection. + * @param sessionId session ID of the group + * @return number of records in that group + */ Integer getGroupRecordCount(Long sessionId); + /** + * Gets the number of records in the group. It uses provided monitoring summary. + * @param monitoringSummary summary which will be iterated through and the records counted + * @return number of records in that group + */ Integer getGroupRecordCount(MonitoringSummarySessionDTO monitoringSummary); + /** + * Creates summary that is later used in the monitoring. + * @param contentId ID of Daco for which the summary should be created + * @param userUid ID of the user for who the summary details should be created; null if the summary details should be created for all users; < 0 if the summary details should be created for noone + * @return list of monitoring summaries, one for each session + */ List getMonitoringSummary(Long contentId, Long userUid); } Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/AuthoringAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/AuthoringAction.java,v diff -u -r1.5 -r1.6 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/AuthoringAction.java 8 Aug 2008 08:10:22 -0000 1.5 +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/AuthoringAction.java 12 Aug 2008 01:43:04 -0000 1.6 @@ -80,7 +80,7 @@ import org.springframework.web.context.support.WebApplicationContextUtils; /** - * @author Steve.Ni + * @author Marcin Cieslak * @version $Revision$ */ public class AuthoringAction extends Action { @@ -184,10 +184,6 @@ return removeAnswerOption(mapping, form, request); } - if (param.equals("removeQuestionAttachment")) { - return removeQuestionAttachment(mapping, form, request, response); - } - return mapping.findForward(DacoConstants.ERROR); } @@ -474,7 +470,7 @@ * @return */ protected List getAttachmentList(SessionMap sessionMap) { - return getListFromSession(sessionMap, DacoConstants.ATT_ATTACHMENT_LIST); + return getListFromSession(sessionMap, DacoConstants.ATTR_ATTACHMENT_LIST); } // ************************************************************************************* @@ -758,22 +754,6 @@ } /** - * Remove daco question attachment, such as single file, learning object ect. It is a ajax call and just temporarily remove - * from page, all permenant change will happen only when user sumbit this daco question again. - * - * @param mapping - * @param form - * @param request - * @param response - * @return - */ - protected ActionForward removeQuestionAttachment(ActionMapping mapping, ActionForm form, HttpServletRequest request, - HttpServletResponse response) { - request.setAttribute("questionAttachment", null); - return mapping.findForward(DacoConstants.SUCCESS); - } - - /** * This method will get necessary information from daco question form and save or update into HttpSession * DacoQuestionList. 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. Index: lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/LearningAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/LearningAction.java,v diff -u -r1.7 -r1.8 --- lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/LearningAction.java 8 Aug 2008 08:10:22 -0000 1.7 +++ lams_tool_daco/src/java/org/lamsfoundation/lams/tool/daco/web/action/LearningAction.java 12 Aug 2008 01:43:04 -0000 1.8 @@ -25,6 +25,7 @@ package org.lamsfoundation.lams.tool.daco.web.action; import java.io.IOException; +import java.text.ParseException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -80,7 +81,7 @@ /** * - * @author Steve.Ni + * @author Marcin Cieslak * * @version $Revision$ */ @@ -365,11 +366,12 @@ recordForm.getAnswer(formAnswerNumber++), recordForm.getAnswer(formAnswerNumber) }; if (!(StringUtils.isBlank(dateParts[0]) || StringUtils.isBlank(dateParts[1]) || StringUtils .isBlank(dateParts[2]))) { + Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Integer.parseInt(dateParts[2]), Integer.parseInt(dateParts[1]) - 1, Integer .parseInt(dateParts[0])); - answer.setAnswer(calendar.getTime().toString()); + answer.setAnswer(DacoConstants.DEFAULT_DATE_FORMAT.format(calendar.getTime())); } else { answer.setAnswer(null); @@ -975,13 +977,23 @@ checkboxes = null; } if (questionType == DacoConstants.QUESTION_TYPE_DATE) { - String[] dateParts = null; + String[] dateParts = new String[3]; if (answer.getAnswer() != null) { - dateParts = answer.getAnswer().split(DacoConstants.DATE_PART_DELIMETER); + Calendar calendar = Calendar.getInstance(); + calendar.clear(); + + try { + calendar.setTime(DacoConstants.DEFAULT_DATE_FORMAT.parse(answer.getAnswer())); + } + catch (ParseException e) { + LearningAction.log.error(e.getMessage()); + e.printStackTrace(); + } + + dateParts[0] = String.valueOf(calendar.get(Calendar.DAY_OF_YEAR)); + dateParts[1] = String.valueOf(calendar.get(Calendar.MONTH) + 1); + dateParts[2] = String.valueOf(calendar.get(Calendar.YEAR)); } - else { - dateParts = new String[] { null, null, null }; - } recordForm.setAnswer(formAnswerNumber++, dateParts[0]); recordForm.setAnswer(formAnswerNumber++, dateParts[1]); recordForm.setAnswer(formAnswerNumber++, dateParts[2]); Index: lams_tool_daco/web/pages/authoring/advanced.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_daco/web/pages/authoring/advanced.jsp,v diff -u -r1.3 -r1.4 --- lams_tool_daco/web/pages/authoring/advanced.jsp 8 Aug 2008 08:10:22 -0000 1.3 +++ lams_tool_daco/web/pages/authoring/advanced.jsp 12 Aug 2008 01:43:04 -0000 1.4 @@ -1,8 +1,6 @@ <%@ include file="/common/taglibs.jsp"%> - - + <%-- In some cases record list is passed as an attribute, in other - in session map. --%> @@ -59,6 +63,7 @@ + <%-- Indenting is different depending on the page this page is included to. --%>

: ${fn:length(recordList)} @@ -73,6 +78,7 @@ + <%-- Horizontal view creates a table with question list and one large cell where iframe with records is displayed --%> @@ -81,15 +87,17 @@ @@ -104,13 +112,15 @@
+ <%-- Link that displayes the horizontal record list --%> - +
+ <%-- Vertical view displays records as separate tables of answers. --%> + <%-- If the record can be edited, display these links. --%>
${recordStatus.index+1} " @@ -127,6 +137,9 @@ + <%-- "Generated" means that the table for a long/lat question was already generated + and the current answer only needs to be filled in in the existing textfield. + --%> @@ -136,6 +149,9 @@ + <%-- Display the links for external maps, + where the longitude and latitude can be marked and shown. + Strange syntax of this var (mapLinks) comes from later usage in a javascript.--%> '${selectedMap.answerOption}
'+ @@ -153,10 +169,12 @@
@@ -174,10 +192,11 @@