Index: lams_monitoring/web/css/_tblmonitor_base.scss =================================================================== diff -u -r5cd635b1e7e6678759b54371d006415b8dd87ac3 -reef0b919074e388a593fb6d3e97ec35b60ffdcb5 --- lams_monitoring/web/css/_tblmonitor_base.scss (.../_tblmonitor_base.scss) (revision 5cd635b1e7e6678759b54371d006415b8dd87ac3) +++ lams_monitoring/web/css/_tblmonitor_base.scss (.../_tblmonitor_base.scss) (revision eef0b919074e388a593fb6d3e97ec35b60ffdcb5) @@ -386,6 +386,20 @@ background-color: $brand-success; } +span.user-response { + padding: 1px 3px; + color: white; + border-radius: 3px; +} + +span.successful-response { + background-color: $brand-success; +} + +span.wrong-response { + background-color: $brand-danger; +} + #closeBranchingButton { font-weight: inherit !important; margin-left: 7px; Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieAnswerVisitDAO.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -reef0b919074e388a593fb6d3e97ec35b60ffdcb5 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieAnswerVisitDAO.java (.../ScratchieAnswerVisitDAO.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/ScratchieAnswerVisitDAO.java (.../ScratchieAnswerVisitDAO.java) (revision eef0b919074e388a593fb6d3e97ec35b60ffdcb5) @@ -25,7 +25,6 @@ import java.util.List; -import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswer; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswerVisitLog; public interface ScratchieAnswerVisitDAO extends DAO { @@ -38,6 +37,4 @@ List getLogsBySession(Long sessionId); - ScratchieAnswer getFirstScratchedAnswerBySessionAndItem(Long sessionId, Long itemUid); - } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieAnswerVisitDAOHibernate.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -reef0b919074e388a593fb6d3e97ec35b60ffdcb5 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieAnswerVisitDAOHibernate.java (.../ScratchieAnswerVisitDAOHibernate.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dao/hibernate/ScratchieAnswerVisitDAOHibernate.java (.../ScratchieAnswerVisitDAOHibernate.java) (revision eef0b919074e388a593fb6d3e97ec35b60ffdcb5) @@ -41,10 +41,6 @@ private static final String FIND_BY_SESSION_AND_ITEM = "from " + ScratchieAnswerVisitLog.class.getName() + " as r where r.sessionId=? and r.scratchieAnswer.scratchieItem.uid = ? order by r.accessDate asc"; - private static final String FIND_FIRST_SCRATCHED_ANSWER_BY_SESSION_AND_ITEM = "SELECT r.scratchieAnswer from " - + ScratchieAnswerVisitLog.class.getName() - + " as r where r.sessionId=? and r.scratchieAnswer.scratchieItem.uid = ? order by r.accessDate asc"; - private static final String FIND_BY_SESSION = "from " + ScratchieAnswerVisitLog.class.getName() + " as r where r.sessionId=? order by r.accessDate asc"; @@ -81,13 +77,4 @@ return (List) doFind(FIND_BY_SESSION, new Object[] { sessionId }); } - @Override - public ScratchieAnswer getFirstScratchedAnswerBySessionAndItem(Long sessionId, Long itemUid) { - Query q = getSession().createQuery(FIND_FIRST_SCRATCHED_ANSWER_BY_SESSION_AND_ITEM); - q.setParameter(0, sessionId); - q.setParameter(1, itemUid); - q.setMaxResults(1); - return (ScratchieAnswer) q.uniqueResult(); - } - } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/GroupSummary.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -reef0b919074e388a593fb6d3e97ec35b60ffdcb5 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/GroupSummary.java (.../GroupSummary.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/GroupSummary.java (.../GroupSummary.java) (revision eef0b919074e388a593fb6d3e97ec35b60ffdcb5) @@ -26,7 +26,6 @@ import java.util.Collection; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswer; -import org.lamsfoundation.lams.tool.scratchie.model.ScratchieItem; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieSession; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieUser; @@ -36,9 +35,10 @@ private String sessionName; private int mark; private int totalAttempts; + private String totalPercentage; private Collection users; - private Collection items; + private Collection itemDtos; private Collection answers; public GroupSummary() { @@ -90,17 +90,25 @@ public void setTotalAttempts(int totalAttempts) { this.totalAttempts = totalAttempts; } + + public String getTotalPercentage() { + return totalPercentage; + } + public void setTotalPercentage(String totalPercentage) { + this.totalPercentage = totalPercentage; + } + public Collection getUsers() { return users; } - public void setItems(Collection items) { - this.items = items; + public void setItemDtos(Collection itemDtos) { + this.itemDtos = itemDtos; } - public Collection getItems() { - return items; + public Collection getItemDtos() { + return itemDtos; } public void setUsers(Collection users) { Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/ScratchieItemDTO.java =================================================================== diff -u --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/ScratchieItemDTO.java (revision 0) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/ScratchieItemDTO.java (revision eef0b919074e388a593fb6d3e97ec35b60ffdcb5) @@ -0,0 +1,96 @@ +package org.lamsfoundation.lams.tool.scratchie.dto; + +import java.util.HashSet; +import java.util.Set; + +import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswer; + +/** + * ScratchieItem's DTO. + * + * @author Andrey Balan + */ +public class ScratchieItemDTO implements Cloneable { + + private Long uid; + private String title; + private Set answers; + private boolean unraveledOnFirstAttempt; + private int userMark; + private int userAttempts; + //sequence of answers selected by user in the form of "X, Y, Z" + private String answersSequence; + + /** + * Default contruction method. + */ + public ScratchieItemDTO() { + answers = new HashSet(); + } + + // ********************************************************** + // Get/Set methods + // ********************************************************** + public Long getUid() { + return uid; + } + + public void setUid(Long userID) { + this.uid = userID; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Set getAnswers() { + return answers; + } + + public void setAnswers(Set answers) { + this.answers = answers; + } + + public boolean isUnraveledOnFirstAttempt() { + return unraveledOnFirstAttempt; + } + + public void setUnraveledOnFirstAttempt(boolean isUnraveledOnFirstAttempt) { + this.unraveledOnFirstAttempt = isUnraveledOnFirstAttempt; + } + + public int getUserMark() { + return userMark; + } + + public void setUserMark(int userMark) { + this.userMark = userMark; + } + + public int getUserAttempts() { + return userAttempts; + } + + public void setUserAttempts(int userAttempts) { + this.userAttempts = userAttempts; + } + + /** + * @return sequence of answers selected by user in the form of "X, Y, Z" + */ + public String getAnswersSequence() { + return answersSequence; + } + + /** + * @param answersSequence sequence of answers selected by user in the form of "X, Y, Z" + */ + public void setAnswersSequence(String answersSequence) { + this.answersSequence = answersSequence; + } +} + Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/Summary.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -reef0b919074e388a593fb6d3e97ec35b60ffdcb5 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/Summary.java (.../Summary.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dto/Summary.java (.../Summary.java) (revision eef0b919074e388a593fb6d3e97ec35b60ffdcb5) @@ -30,18 +30,8 @@ import org.lamsfoundation.lams.tool.scratchie.model.ScratchieItem; /** - * List contains following element:
+ * ScratchieSession DTO * - *
  • session_id
  • - *
  • session_name
  • - *
  • ScratchieItem.uid
  • - *
  • ScratchieItem.item_type
  • - *
  • ScratchieItem.create_by_author
  • - *
  • ScratchieItem.is_hide
  • - *
  • ScratchieItem.title
  • - *
  • User.login_name
  • - *
  • count(scratchie_item_uid)
  • - * * @author Andrey Balan */ public class Summary { Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java =================================================================== diff -u -rbeb150b1b726c122ccc5af1ba95083105f9948b8 -reef0b919074e388a593fb6d3e97ec35b60ffdcb5 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java (.../ScratchieItem.java) (revision beb150b1b726c122ccc5af1ba95083105f9948b8) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java (.../ScratchieItem.java) (revision eef0b919074e388a593fb6d3e97ec35b60ffdcb5) @@ -56,11 +56,6 @@ // *********************************************** // DTO fields: private boolean isUnraveled; - - private String correctAnswer; - private int userMark; - private int userAttempts; - private String firstChoiceAnswerLetter; private String burningQuestion; /** @@ -116,11 +111,7 @@ public void setUid(Long userID) { this.uid = userID; } - - /** - * - * @return - */ + public String getTitle() { return title; } @@ -129,10 +120,6 @@ this.title = title; } - /** - * - * @return - */ public String getDescription() { return description; } @@ -141,10 +128,6 @@ this.description = description; } - /** - * - * @return - */ public Date getCreateDate() { return createDate; } @@ -153,10 +136,6 @@ this.createDate = createDate; } - /** - * - * @return - */ public boolean isCreateByAuthor() { return isCreateByAuthor; } @@ -165,10 +144,6 @@ this.isCreateByAuthor = isCreateByAuthor; } - /** - * - * @return - */ public Integer getOrderId() { return orderId; } @@ -177,13 +152,6 @@ this.orderId = orderId; } - /** - * - * - * - * - * @return - */ public Set getAnswers() { return answers; } @@ -200,38 +168,6 @@ this.isUnraveled = isUnraveled; } - public String getCorrectAnswer() { - return correctAnswer; - } - - public void setCorrectAnswer(String correctAnswer) { - this.correctAnswer = correctAnswer; - } - - public int getUserMark() { - return userMark; - } - - public void setUserMark(int userMark) { - this.userMark = userMark; - } - - public int getUserAttempts() { - return userAttempts; - } - - public void setUserAttempts(int userAttempts) { - this.userAttempts = userAttempts; - } - - public String getFirstChoiceAnswerLetter() { - return firstChoiceAnswerLetter; - } - - public void setFirstChoiceAnswerLetter(String firstChoiceAnswerLetter) { - this.firstChoiceAnswerLetter = firstChoiceAnswerLetter; - } - public String getBurningQuestion() { return burningQuestion; } Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== diff -u -rba6d2394558dc6e82f56561d0913c9e75d000e89 -reef0b919074e388a593fb6d3e97ec35b60ffdcb5 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision ba6d2394558dc6e82f56561d0913c9e75d000e89) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java (.../ScratchieServiceImpl.java) (revision eef0b919074e388a593fb6d3e97ec35b60ffdcb5) @@ -85,6 +85,7 @@ import org.lamsfoundation.lams.tool.scratchie.dto.GroupSummary; import org.lamsfoundation.lams.tool.scratchie.dto.LeaderResultsDTO; import org.lamsfoundation.lams.tool.scratchie.dto.ReflectDTO; +import org.lamsfoundation.lams.tool.scratchie.dto.ScratchieItemDTO; import org.lamsfoundation.lams.tool.scratchie.model.Scratchie; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswer; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswerVisitLog; @@ -817,6 +818,9 @@ return mark; } + /** + * Returns number of scraches user done for the specified item. + */ private int calculateItemAttempts(List userLogs, ScratchieItem item) { int itemAttempts = 0; @@ -1096,12 +1100,12 @@ row[columnCount++] = new ExcelCell(summary.getSessionName(), true); int numberOfFirstChoiceEvents = 0; - for (ScratchieItem item : summary.getItems()) { - int attempts = item.getUserAttempts(); + for (ScratchieItemDTO itemDto : summary.getItemDtos()) { + int attempts = itemDto.getUserAttempts(); String isFirstChoice; IndexedColors color; - if (item.getCorrectAnswer().equals(Boolean.TRUE.toString())) { + if (itemDto.isUnraveledOnFirstAttempt()) { isFirstChoice = getMessage("label.correct"); color = IndexedColors.GREEN; numberOfFirstChoiceEvents++; @@ -1178,14 +1182,14 @@ row[columnCount++] = new ExcelCell(summary.getSessionName(), false); int numberOfFirstChoiceEvents = 0; - for (ScratchieItem item : summary.getItems()) { + for (ScratchieItemDTO itemDto : summary.getItemDtos()) { IndexedColors color = null; - if (item.getCorrectAnswer().equals(Boolean.TRUE.toString())) { + if (itemDto.isUnraveledOnFirstAttempt()) { color = IndexedColors.GREEN; numberOfFirstChoiceEvents++; } - row[columnCount++] = new ExcelCell(item.getFirstChoiceAnswerLetter(), color); + row[columnCount++] = new ExcelCell(itemDto.getAnswersSequence(), color); } row[columnCount++] = new ExcelCell(new Integer(numberOfFirstChoiceEvents), false); int percentage = (numberOfItems == 0) ? 0 : (100 * numberOfFirstChoiceEvents) / numberOfItems; @@ -1274,12 +1278,12 @@ row[columnCount++] = new ExcelCell(summary.getSessionName(), false); - for (ScratchieItem item : summary.getItems()) { - int attempts = item.getUserAttempts(); + for (ScratchieItemDTO itemDto : summary.getItemDtos()) { + int attempts = itemDto.getUserAttempts(); String isFirstChoice; IndexedColors color; - if (item.getCorrectAnswer().equals(Boolean.TRUE.toString())) { + if (itemDto.isUnraveledOnFirstAttempt()) { isFirstChoice = getMessage("label.correct"); color = IndexedColors.GREEN; } else if (attempts == 0) { @@ -1291,7 +1295,7 @@ } row[columnCount++] = new ExcelCell(isFirstChoice, color); row[columnCount++] = new ExcelCell(new Long(attempts), color); - Long mark = (item.getUserMark() == -1) ? null : new Long(item.getUserMark()); + Long mark = (itemDto.getUserMark() == -1) ? null : new Long(itemDto.getUserMark()); row[columnCount++] = new ExcelCell(mark, false); } rowList.add(row); @@ -1516,15 +1520,12 @@ for (GroupSummary summary : summaryByTeam) { Long sessionId = summary.getSessionId(); - - ScratchieSession session = getScratchieSessionBySessionId(sessionId); - ScratchieUser groupLeader = session.getGroupLeader(); List users = scratchieUserDao.getBySessionID(sessionId); for (ScratchieUser user : users) { int questionCount = 1; - for (ScratchieItem item : summary.getItems()) { + for (ScratchieItemDTO itemDto : summary.getItemDtos()) { row = new ExcelCell[10 + (maxAnswers * 2)]; columnCount = 0; @@ -1537,11 +1538,11 @@ // question number row[columnCount++] = new ExcelCell(new Long(questionCount++), false); // question title - row[columnCount++] = new ExcelCell(item.getTitle(), false); + row[columnCount++] = new ExcelCell(itemDto.getTitle(), false); // correct answer String correctAnswer = ""; - Set answers = item.getAnswers(); + Set answers = itemDto.getAnswers(); for (ScratchieAnswer answer : answers) { if (answer.isCorrect()) { correctAnswer = removeHtmlMarkup(answer.getDescription()); @@ -1550,9 +1551,9 @@ row[columnCount++] = new ExcelCell(correctAnswer, false); // isFirstChoice - int attempts = item.getUserAttempts(); + int attempts = itemDto.getUserAttempts(); String isFirstChoice; - if (item.getCorrectAnswer().equals(Boolean.TRUE.toString())) { + if (itemDto.isUnraveledOnFirstAttempt()) { isFirstChoice = getMessage("label.correct"); } else if (attempts == 0) { isFirstChoice = null; @@ -1563,12 +1564,12 @@ // attempts row[columnCount++] = new ExcelCell(new Long(attempts), false); // mark - Object mark = (item.getUserMark() == -1) ? "" : new Long(item.getUserMark()); + Object mark = (itemDto.getUserMark() == -1) ? "" : new Long(itemDto.getUserMark()); row[columnCount++] = new ExcelCell(mark, false); // Answers selected List logs = scratchieAnswerVisitDao.getLogsBySessionAndItem(sessionId, - item.getUid()); + itemDto.getUid()); if (logs == null) { logs = new ArrayList<>(); } @@ -1577,7 +1578,7 @@ String answer = removeHtmlMarkup(log.getScratchieAnswer().getDescription()); row[columnCount++] = new ExcelCell(answer, false); } - for (int i = logs.size(); i < item.getAnswers().size(); i++) { + for (int i = logs.size(); i < itemDto.getAnswers().size(); i++) { row[columnCount++] = new ExcelCell(getMessage("label.none"), false); } for (int i = answers.size(); i < maxAnswers; i++) { @@ -1705,64 +1706,80 @@ Long sessionId = session.getSessionId(); // one new summary for one session. GroupSummary groupSummary = new GroupSummary(session); - ArrayList items = new ArrayList<>(); + ArrayList itemDtos = new ArrayList<>(); ScratchieUser groupLeader = session.getGroupLeader(); List answerLogs = scratchieAnswerVisitDao.getLogsBySession(sessionId); for (ScratchieItem item : sortedItems) { - ScratchieItem newItem = new ScratchieItem(); + ScratchieItemDTO itemDto = new ScratchieItemDTO(); int numberOfAttempts = 0; int mark = -1; - boolean isFirstChoice = false; - String firstChoiceAnswerLetter = ""; + boolean isUnraveledOnFirstAttempt = false; + String answersSequence = ""; // if there is no group leader don't calculate numbers - there aren't any if (groupLeader != null) { + + //create a list of attempts user done for the current item + List itemAttempts = new ArrayList<>(); + for (ScratchieAnswerVisitLog answerLog : answerLogs) { + if (answerLog.getScratchieAnswer().getScratchieItem().getUid().equals(item.getUid())) { + itemAttempts.add(answerLog); + } + } + numberOfAttempts = itemAttempts.size(); - numberOfAttempts = calculateItemAttempts(answerLogs, item); - // for displaying purposes if there is no attemps we assign -1 which will be shown as "-" mark = (numberOfAttempts == 0) ? -1 : getUserMarkPerItem(scratchie, item, answerLogs, presetMarks); - isFirstChoice = (numberOfAttempts == 1) && isItemUnraveled(item, answerLogs); + isUnraveledOnFirstAttempt = (numberOfAttempts == 1) && isItemUnraveled(item, answerLogs); - if (numberOfAttempts > 0) { - ScratchieAnswer firstChoiceAnswer = scratchieAnswerVisitDao - .getFirstScratchedAnswerBySessionAndItem(sessionId, item.getUid()); - - // find out the correct answer's sequential letter - A,B,C... - int answerCount = 1; - for (ScratchieAnswer answer : (Set) item.getAnswers()) { - if (answer.getUid().equals(firstChoiceAnswer.getUid())) { - firstChoiceAnswerLetter = String.valueOf((char) ((answerCount + 'A') - 1)); - break; - } - answerCount++; - } + // find out answers' sequential letters - A,B,C... + for (ScratchieAnswerVisitLog itemAttempt : itemAttempts) { + String sequencialLetter = getSequencialLetter(item, itemAttempt.getScratchieAnswer()); + answersSequence += answersSequence.isEmpty() ? sequencialLetter : ", " + sequencialLetter; } } - newItem.setUid(item.getUid()); - newItem.setTitle(item.getTitle()); - newItem.setAnswers(item.getAnswers()); - newItem.setUserAttempts(numberOfAttempts); - newItem.setUserMark(mark); - newItem.setCorrectAnswer("" + isFirstChoice); - newItem.setFirstChoiceAnswerLetter(firstChoiceAnswerLetter); + itemDto.setUid(item.getUid()); + itemDto.setTitle(item.getTitle()); + itemDto.setAnswers(item.getAnswers()); + itemDto.setUserAttempts(numberOfAttempts); + itemDto.setUserMark(mark); + itemDto.setUnraveledOnFirstAttempt(isUnraveledOnFirstAttempt); + itemDto.setAnswersSequence(answersSequence); - items.add(newItem); + itemDtos.add(itemDto); } - groupSummary.setItems(items); + groupSummary.setItemDtos(itemDtos); groupSummaries.add(groupSummary); } return groupSummaries; } + + /** + * Return specified answer's sequential letter (e.g. A,B,C) among other possible answers + */ + private static String getSequencialLetter(ScratchieItem item, ScratchieAnswer asnwer) { + String sequencialLetter = ""; + int answerCount = 1; + for (ScratchieAnswer answer : (Set) item.getAnswers()) { + if (answer.getUid().equals(asnwer.getUid())) { + sequencialLetter = String.valueOf((char) ((answerCount + 'A') - 1)); + break; + } + answerCount++; + } + + return sequencialLetter; + } + private Scratchie getDefaultScratchie() throws ScratchieApplicationException { Long defaultScratchieId = getToolDefaultContentIdBySignature(ScratchieConstants.TOOL_SIGNATURE); Scratchie defaultScratchie = getScratchieByContentId(defaultScratchieId); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/TblMonitorAction.java =================================================================== diff -u -r5d1d1bc2d08ed13455ca34ceb5ab94e5f918855d -reef0b919074e388a593fb6d3e97ec35b60ffdcb5 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/TblMonitorAction.java (.../TblMonitorAction.java) (revision 5d1d1bc2d08ed13455ca34ceb5ab94e5f918855d) +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/TblMonitorAction.java (.../TblMonitorAction.java) (revision eef0b919074e388a593fb6d3e97ec35b60ffdcb5) @@ -30,6 +30,7 @@ import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -50,7 +51,10 @@ import org.lamsfoundation.lams.tool.scratchie.ScratchieConstants; import org.lamsfoundation.lams.tool.scratchie.dto.BurningQuestionDTO; import org.lamsfoundation.lams.tool.scratchie.dto.BurningQuestionItemDTO; +import org.lamsfoundation.lams.tool.scratchie.dto.GroupSummary; +import org.lamsfoundation.lams.tool.scratchie.dto.ScratchieItemDTO; import org.lamsfoundation.lams.tool.scratchie.model.Scratchie; +import org.lamsfoundation.lams.tool.scratchie.model.ScratchieAnswer; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieItem; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieUser; import org.lamsfoundation.lams.tool.scratchie.service.IScratchieService; @@ -122,6 +126,10 @@ long toolContentId = WebUtil.readLongParam(request, AttributeNames.PARAM_TOOL_CONTENT_ID); Scratchie scratchie = scratchieService.getScratchieByContentId(toolContentId); + Set items = new TreeSet(new ScratchieItemComparator()); + items.addAll(scratchie.getScratchieItems()); + request.setAttribute("items", items); + //find second page in excel file LinkedHashMap excelDoc = scratchieService.exportExcel(toolContentId); ExcelCell[][] secondPageData = null; @@ -136,21 +144,55 @@ } } + //correct answers ExcelCell[] correctAnswersRow = secondPageData[4]; request.setAttribute("correctAnswers", correctAnswersRow); + //prepare data for displaying user answers table int groupsSize = scratchieService.countSessionsByContentId(toolContentId); - ArrayList groupRows = new ArrayList(); + ArrayList sessionDtos = new ArrayList<>(); for (int groupCount = 0; groupCount < groupsSize; groupCount++) { ExcelCell[] groupRow = secondPageData[6 + groupCount]; - groupRows.add(groupRow); + + GroupSummary groupSummary = new GroupSummary(); + String sessionName = groupRow[0].getCellValue().toString(); + groupSummary.setSessionName(sessionName); + + Collection itemDtos = new ArrayList<>(); + for (int i = 1; i <= items.size(); i++) { + ScratchieItemDTO itemDto = new ScratchieItemDTO(); + String answersSequence = groupRow[i].getCellValue().toString(); + String[] answerLetters = answersSequence.split(", "); + + Set answers = new LinkedHashSet<>(); + for (int j = 0; j < answerLetters.length; j++) { + String answerLetter = answerLetters[j]; + String correctAnswerLetter = correctAnswersRow[i].getCellValue().toString(); + + ScratchieAnswer answer = new ScratchieAnswer(); + answer.setDescription(answerLetter); + answer.setCorrect(correctAnswerLetter.equals(answerLetter)); + + answers.add(answer); + } + + itemDto.setAnswers(answers); + itemDtos.add(itemDto); + } + groupSummary.setItemDtos(itemDtos); + + if (!itemDtos.isEmpty()) { + int total = (Integer) groupRow[itemDtos.size()+1].getCellValue(); + groupSummary.setMark(total); + + String totalPercentage = groupRow[itemDtos.size()+2].getCellValue().toString(); + groupSummary.setTotalPercentage(totalPercentage); + } + + sessionDtos.add(groupSummary); } - request.setAttribute("groupRows", groupRows); + request.setAttribute("sessionDtos", sessionDtos); - Set items = new TreeSet(new ScratchieItemComparator()); - items.addAll(scratchie.getScratchieItems()); - request.setAttribute("items", items); - request.setAttribute(AttributeNames.PARAM_TOOL_CONTENT_ID, toolContentId); return mapping.findForward("traStudentChoices"); } Index: lams_tool_scratchie/web/pages/tblmonitoring/traStudentChoices.jsp =================================================================== diff -u -r5d1d1bc2d08ed13455ca34ceb5ab94e5f918855d -reef0b919074e388a593fb6d3e97ec35b60ffdcb5 --- lams_tool_scratchie/web/pages/tblmonitoring/traStudentChoices.jsp (.../traStudentChoices.jsp) (revision 5d1d1bc2d08ed13455ca34ceb5ab94e5f918855d) +++ lams_tool_scratchie/web/pages/tblmonitoring/traStudentChoices.jsp (.../traStudentChoices.jsp) (revision eef0b919074e388a593fb6d3e97ec35b60ffdcb5) @@ -90,25 +90,39 @@ - + - ${groupRow[0].cellValue} + ${sessionDto.sessionName} - + + - - success" - > - ${groupRow[j].cellValue} + + + + + successful-response wrong-response"> + + + + + + + ${sessionDto.mark} + + + + ${sessionDto.totalPercentage} +