Index: lams_tool_lamc/conf/hibernate/mappings/org/lamsfoundation/lams/tool/mc/pojos/McContent.hbm.xml =================================================================== diff -u -rc7798d2b81a0595194a5e905ef6c33e372ad8007 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/conf/hibernate/mappings/org/lamsfoundation/lams/tool/mc/pojos/McContent.hbm.xml (.../McContent.hbm.xml) (revision c7798d2b81a0595194a5e905ef6c33e372ad8007) +++ lams_tool_lamc/conf/hibernate/mappings/org/lamsfoundation/lams/tool/mc/pojos/McContent.hbm.xml (.../McContent.hbm.xml) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -175,8 +175,15 @@ column="pass_mark" length="1" /> - + + + + + + Index: lams_tool_lamc/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -r42d2cb5b3e64704ff403a6292242b0f04c7c242e -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 42d2cb5b3e64704ff403a6292242b0f04c7c242e) +++ lams_tool_lamc/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -214,5 +214,8 @@ error.loaderror =There was an error loading the grid. If this problem persists, please contact your system administrator. label.ok =OK +label.enable.confidence.levels =Enable confidence levels +label.what.is.your.confidence.level =How confident you are answering this question? +label.confidence =Confidence #======= End labels: Exported 207 labels for en AU ===== Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcQueContentDAO.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcQueContentDAO.java (.../IMcQueContentDAO.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcQueContentDAO.java (.../IMcQueContentDAO.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -69,15 +69,6 @@ /** *

- * updates McQueContent with the given identifier mcQueContent - *

- * - * @param mcQueContent - */ - void updateMcQueContent(McQueContent mcQueContent); - - /** - *

* saves McQueContent with the given identifier mcQueContent *

* Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUserDAO.java =================================================================== diff -u -r729f1d10a1efd78ec420b373a7af23ee66ec3454 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUserDAO.java (.../IMcUserDAO.java) (revision 729f1d10a1efd78ec420b373a7af23ee66ec3454) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUserDAO.java (.../IMcUserDAO.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -49,6 +49,8 @@ McQueUsr getMcUserByUID(Long uid); McQueUsr getMcUserBySession(Long userId, Long sessionUid); + + List getUsersWithPortraitsBySessionID(Long sessionId); void saveMcUser(McQueUsr mcUser); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUsrAttemptDAO.java =================================================================== diff -u -r1d3ff83fba3454c6e0e4139dc15ad6cecdfa389c -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUsrAttemptDAO.java (.../IMcUsrAttemptDAO.java) (revision 1d3ff83fba3454c6e0e4139dc15ad6cecdfa389c) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/IMcUsrAttemptDAO.java (.../IMcUsrAttemptDAO.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -79,6 +79,22 @@ * @return */ List getFinalizedUserAttempts(Long queUserUid); + + /** + * Returns attempts and portraitUiids left by all users in the specified session. It's used only by ToolSessionManager.getConfidenceLevels(). + * + * @param sessionId + * @return + */ + List getFinalizedAttemptsBySessionId(final Long sessionId); + + /** + * Returns attempts and portraitUiids left by all leaders in the specified activity. It's used only by ToolSessionManager.getConfidenceLevels(). + * + * @param contentId + * @return + */ + List getLeadersFinalizedAttemptsByContentId(final Long contentId); /** * Get the highest attempt order for a user for a particular question Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McQueContentDAO.java =================================================================== diff -u -r1ac047247117455cf3ca4073958e4e2103def960 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McQueContentDAO.java (.../McQueContentDAO.java) (revision 1ac047247117455cf3ca4073958e4e2103def960) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McQueContentDAO.java (.../McQueContentDAO.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -96,11 +96,6 @@ } @Override - public void updateMcQueContent(McQueContent mcQueContent) { - this.getSession().saveOrUpdate(mcQueContent); - } - - @Override public List getAllQuestionEntriesSorted(final long mcContentId) { List list = getSessionFactory().getCurrentSession().createQuery(SORT_QUESTION_CONTENT_BY_DISPLAY_ORDER) .setLong("mcContentId", mcContentId).list(); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUserDAO.java =================================================================== diff -u -r729f1d10a1efd78ec420b373a7af23ee66ec3454 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUserDAO.java (.../McUserDAO.java) (revision 729f1d10a1efd78ec420b373a7af23ee66ec3454) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUserDAO.java (.../McUserDAO.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -86,7 +86,37 @@ } return null; } + + @Override + @SuppressWarnings("unchecked") + public List getUsersWithPortraitsBySessionID(Long sessionId) { + final String LOAD_USERS_WITH_PORTRAITS_BY_SESSION_ID = "SELECT user.user_id, luser.portrait_uuid portraitId FROM tl_lamc11_que_usr user " + + " INNER JOIN tl_lamc11_session session ON user.mc_session_id=session.uid" + + " INNER JOIN lams_user luser ON luser.user_id = user.que_usr_id" + + " WHERE session.mc_session_id = :sessionId"; + + SQLQuery query = getSession().createSQLQuery(LOAD_USERS_WITH_PORTRAITS_BY_SESSION_ID); + query.setLong("sessionId", sessionId); + List list = query.list(); + ArrayList userDtos = new ArrayList(); + if (list != null && list.size() > 0) { + for (Object[] element : list) { + + Long userId = ((Number) element[0]).longValue(); + Long portraitId = element[1] == null ? null : ((Number) element[1]).longValue(); + + Object[] userDto = new Object[2]; + userDto[0] = userId; + userDto[0] = portraitId; + userDtos.add(userDto); + } + + } + + return userDtos; + } + @Override public void saveMcUser(McQueUsr mcUser) { this.getSession().save(mcUser); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUsrAttemptDAO.java =================================================================== diff -u -r1ac047247117455cf3ca4073958e4e2103def960 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUsrAttemptDAO.java (.../McUsrAttemptDAO.java) (revision 1ac047247117455cf3ca4073958e4e2103def960) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dao/hibernate/McUsrAttemptDAO.java (.../McUsrAttemptDAO.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -30,6 +30,7 @@ import org.lamsfoundation.lams.tool.mc.dto.ToolOutputDTO; import org.lamsfoundation.lams.tool.mc.pojos.McQueUsr; import org.lamsfoundation.lams.tool.mc.pojos.McUsrAttempt; +import org.lamsfoundation.lams.usermanagement.User; import org.springframework.stereotype.Repository; /** @@ -76,8 +77,29 @@ return getSessionFactory().getCurrentSession().createQuery(LOAD_ALL_QUESTION_ATTEMPTS) .setLong("queUsrUid", userUid.longValue()).list(); } + + @Override + public List getFinalizedAttemptsBySessionId(final Long sessionId) { + final String LOAD_QUESTION_ATTEMPTS_BY_SESSION_ID = "SELECT attempt, u.portraitUuid FROM " + McUsrAttempt.class.getName() + + " AS attempt, " + User.class.getName() + " as u WHERE attempt.mcQueUsr.mcSession.mcSessionId=:sessionId" + + " AND attempt.mcQueUsr.responseFinalised = true AND u.userId=attempt.mcQueUsr.queUsrId"; + return getSessionFactory().getCurrentSession().createQuery(LOAD_QUESTION_ATTEMPTS_BY_SESSION_ID) + .setLong("sessionId", sessionId).list(); + } + @Override + public List getLeadersFinalizedAttemptsByContentId(final Long contentId) { + final String LOAD_QUESTION_ATTEMPTS_BY_SESSION_ID = "SELECT attempt, u.portraitUuid FROM " + McUsrAttempt.class.getName() + + " AS attempt, " + User.class.getName() + " as u WHERE attempt.mcQueUsr=attempt.mcQueUsr.mcSession.groupLeader " + + " AND attempt.mcQueContent.mcContent.mcContentId=:contentId " + + " AND attempt.mcQueUsr.responseFinalised = true AND u.userId=attempt.mcQueUsr.queUsrId"; + + return getSessionFactory().getCurrentSession().createQuery(LOAD_QUESTION_ATTEMPTS_BY_SESSION_ID) + .setLong("contentId", contentId).list(); + } + + @Override public int getUserTotalMark(final Long userUid) { List list = getSessionFactory().getCurrentSession().createQuery(FIND_USER_TOTAL_MARK) .setLong("userUid", userUid.longValue()).list(); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dbupdates/patch20171031.sql =================================================================== diff -u --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dbupdates/patch20171031.sql (revision 0) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dbupdates/patch20171031.sql (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -0,0 +1,23 @@ +-- Turn off autocommit, so nothing is committed if there is an error +SET AUTOCOMMIT = 0; +SET FOREIGN_KEY_CHECKS=0; +----------------------Put all sql statements below here------------------------- + +-- LDEV-4451 add 'Enable Confidence levels' advanced setting +ALTER TABLE tl_lamc11_content ADD COLUMN enable_confidence_levels TINYINT(1) NOT NULL DEFAULT 0; + +--add questions' hashes in order to be able to search for the similar questions with the same title and question +ALTER TABLE tl_lamc11_que_content ADD COLUMN question_hash CHAR(40); +UPDATE tl_lamc11_que_content SET question_hash = SHA1(question); + +--add confidence level property to tl_laasse10_question_result +ALTER TABLE tl_lamc11_usr_attempt ADD COLUMN confidence_level int; + +UPDATE lams_tool SET tool_version='20171031' WHERE tool_signature='lamc11'; + +----------------------Put all sql statements above here------------------------- + +-- If there were no errors, commit and restore autocommit to on +COMMIT; +SET AUTOCOMMIT = 1; +SET FOREIGN_KEY_CHECKS=1; \ No newline at end of file Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/AnswerDTO.java =================================================================== diff -u -r289926a27bdbc9bd2519e3064a85f489fc1845ec -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/AnswerDTO.java (.../AnswerDTO.java) (revision 289926a27bdbc9bd2519e3064a85f489fc1845ec) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/dto/AnswerDTO.java (.../AnswerDTO.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -54,6 +54,8 @@ protected String feedbackCorrect; protected String feedback; + + private int confidenceLevel; /** * @return Returns the answerOption. @@ -221,4 +223,12 @@ public void setFeedback(String feedback) { this.feedback = feedback; } + + public int getConfidenceLevel() { + return confidenceLevel; + } + + public void setConfidenceLevel(int confidenceLevel) { + this.confidenceLevel = confidenceLevel; + } } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/pojos/McContent.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/pojos/McContent.java (.../McContent.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/pojos/McContent.java (.../McContent.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -90,6 +90,8 @@ /** nullable persistent field */ private Integer passMark; + + private boolean enableConfidenceLevels; private String reflectionSubject; @@ -101,10 +103,10 @@ /** full constructor */ public McContent(Long mcContentId, String title, String instructions, boolean defineLater, Date creationDate, - Date updateDate, boolean questionsSequenced, long createdBy, Integer passMark, boolean showReport, - boolean randomize, boolean displayAnswers, boolean showMarks, boolean useSelectLeaderToolOuput, - boolean prefixAnswersWithLetters, boolean retries, boolean reflect, String reflectionSubject, - Set mcQueContents, Set mcSessions) { + Date updateDate, boolean questionsSequenced, long createdBy, Integer passMark, + boolean enableConfidenceLevels, boolean showReport, boolean randomize, boolean displayAnswers, + boolean showMarks, boolean useSelectLeaderToolOuput, boolean prefixAnswersWithLetters, boolean retries, + boolean reflect, String reflectionSubject, Set mcQueContents, Set mcSessions) { this.mcContentId = mcContentId; this.title = title; @@ -118,6 +120,7 @@ this.reflectionSubject = reflectionSubject; this.reflect = reflect; this.passMark = passMark; + this.enableConfidenceLevels = enableConfidenceLevels; this.showReport = showReport; this.randomize = randomize; this.displayAnswers = displayAnswers; @@ -154,9 +157,10 @@ public static McContent newInstance(McContent mc, Long newContentId) { McContent newContent = new McContent(newContentId, mc.getTitle(), mc.getInstructions(), mc.isDefineLater(), mc.getCreationDate(), mc.getUpdateDate(), mc.isQuestionsSequenced(), mc.getCreatedBy(), - mc.getPassMark(), mc.isShowReport(), mc.isRandomize(), mc.isDisplayAnswers(), mc.isShowMarks(), - mc.isUseSelectLeaderToolOuput(), mc.isPrefixAnswersWithLetters(), mc.isRetries(), mc.isReflect(), - mc.getReflectionSubject(), new TreeSet(), new TreeSet()); + mc.getPassMark(), mc.isEnableConfidenceLevels(), mc.isShowReport(), mc.isRandomize(), + mc.isDisplayAnswers(), mc.isShowMarks(), mc.isUseSelectLeaderToolOuput(), + mc.isPrefixAnswersWithLetters(), mc.isRetries(), mc.isReflect(), mc.getReflectionSubject(), + new TreeSet(), new TreeSet()); newContent.setMcQueContents(mc.deepCopyMcQueContent(newContent)); return newContent; @@ -252,7 +256,19 @@ public void setPassMark(Integer passMark) { this.passMark = passMark; } + + /** + * + * @return + */ + public boolean isEnableConfidenceLevels() { + return enableConfidenceLevels; + } + public void setEnableConfidenceLevels(boolean enableConfidenceLevels) { + this.enableConfidenceLevels = enableConfidenceLevels; + } + public Set getMcQueContents() { if (this.mcQueContents == null) { setMcQueContents(new HashSet()); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/pojos/McQueContent.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/pojos/McQueContent.java (.../McQueContent.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/pojos/McQueContent.java (.../McQueContent.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -43,11 +43,16 @@ /** identifier field */ private Long uid; - /** persistent field */ + /** Stores mcQueContent.uid, despite of what the name says */ private Long mcQueContentId; /** nullable persistent field */ private String question; + + /** + * It stores sha1(question) value that allows us to search for the McQueContentc with the same question + */ + private String questionHash; /** nullable persistent field */ private Integer displayOrder; @@ -69,9 +74,10 @@ private String escapedQuestion; - public McQueContent(String question, Integer displayOrder, Integer mark, String feedback, McContent mcContent, + public McQueContent(String question, String questionHash, Integer displayOrder, Integer mark, String feedback, McContent mcContent, Set mcUsrAttempts, Set mcOptionsContents) { this.question = question; + this.questionHash = questionHash; this.displayOrder = displayOrder; this.mark = mark; this.feedback = feedback; @@ -93,7 +99,7 @@ * @return the new qa question content object */ public static McQueContent newInstance(McQueContent queContent, McContent newMcContent) { - McQueContent newQueContent = new McQueContent(queContent.getQuestion(), queContent.getDisplayOrder(), + McQueContent newQueContent = new McQueContent(queContent.getQuestion(), queContent.getQuestionHash(), queContent.getDisplayOrder(), queContent.getMark(), queContent.getFeedback(), newMcContent, new TreeSet(), new TreeSet()); newQueContent.setMcOptionsContents(queContent.deepCopyMcOptionsContent(newQueContent)); @@ -133,6 +139,16 @@ public void setQuestion(String question) { this.question = question; } + + /** + * Returns sha1(question) value that allows us to search for the McQueContent with the same question + */ + public String getQuestionHash() { + return questionHash; + } + public void setQuestionHash(String questionHash) { + this.questionHash = questionHash; + } public Integer getDisplayOrder() { return this.displayOrder; Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/pojos/McUsrAttempt.java =================================================================== diff -u -r2f725f8ef2aa09a2663b2335bf67213074426d11 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/pojos/McUsrAttempt.java (.../McUsrAttempt.java) (revision 2f725f8ef2aa09a2663b2335bf67213074426d11) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/pojos/McUsrAttempt.java (.../McUsrAttempt.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -63,16 +63,19 @@ /** persistent field */ private McOptsContent mcOptionsContent; + + private int confidenceLevel; public McUsrAttempt(Date attemptTime, McQueContent mcQueContent, McQueUsr mcQueUsr, McOptsContent mcOptionsContent, - Integer mark, boolean passed, boolean attemptCorrect) { + Integer mark, boolean passed, boolean attemptCorrect, int confidenceLevel) { this.attemptTime = attemptTime; this.mcQueContent = mcQueContent; this.mcQueUsr = mcQueUsr; this.mcOptionsContent = mcOptionsContent; this.mark = mark; this.passed = passed; this.attemptCorrect = attemptCorrect; + this.confidenceLevel = confidenceLevel; } /** default constructor */ @@ -228,7 +231,15 @@ public void setAttemptCorrect(boolean attemptCorrect) { this.attemptCorrect = attemptCorrect; } + + public int getConfidenceLevel() { + return confidenceLevel; + } + public void setConfidenceLevel(int confidenceLevel) { + this.confidenceLevel = confidenceLevel; + } + /** * Get the mark for displaying to the user. If retries or passmark is off, then just check whether or not answer is * correct If retries and passmark is on, then we only want the marks if the user has passed! Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java =================================================================== diff -u -rec381d32c228f460e0fd3ce3857aab14d4f6fd87 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java (.../IMcService.java) (revision ec381d32c228f460e0fd3ce3857aab14d4f6fd87) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/IMcService.java (.../IMcService.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -72,17 +72,14 @@ */ void copyAnswersFromLeader(McQueUsr user, McQueUsr leader); - void createMc(McContent mcContent) throws McApplicationException; + void createMc(McContent mcContent); - McContent getMcContent(Long toolContentId) throws McApplicationException; + McContent getMcContent(Long toolContentId); void setDefineLater(String strToolContentID, boolean value); - void updateQuestion(McQueContent mcQueContent) throws McApplicationException; + McQueContent getQuestionByDisplayOrder(final Long displayOrder, final Long mcContentUid); - McQueContent getQuestionByDisplayOrder(final Long displayOrder, final Long mcContentUid) - throws McApplicationException; - McQueUsr createMcUser(Long toolSessionId) throws McApplicationException; McQueUsr getMcUserBySession(final Long queUsrId, final Long mcSessionUid) throws McApplicationException; @@ -93,7 +90,7 @@ void removeMcQueContent(McQueContent mcQueContent) throws McApplicationException; - void saveOrUpdateMcQueContent(McQueContent mcQueContent) throws McApplicationException; + void saveOrUpdateMcQueContent(McQueContent mcQueContent); /** * persists the questions @@ -104,7 +101,7 @@ List refreshQuestionContent(final Long mcContentId) throws McApplicationException; - List getAllQuestionsSorted(final long mcContentId) throws McApplicationException; + List getAllQuestionsSorted(final long mcContentId); McQueContent getQuestionByUid(Long uid); @@ -117,7 +114,7 @@ String getLocalizedMessage(String key); - List getQuestionsByContentUid(final Long mcContentId) throws McApplicationException; + List getQuestionsByContentUid(final Long mcContentId); McSession getMcSessionById(Long mcSessionId) throws McApplicationException; @@ -127,13 +124,13 @@ List getOptionDtos(Long mcQueContentId) throws McApplicationException; - List getFinalizedUserAttempts(final McQueUsr user) throws McApplicationException; + List getFinalizedUserAttempts(final McQueUsr user); List findOptionsByQuestionUid(Long mcQueContentId) throws McApplicationException; void updateMcOptionsContent(McOptsContent mcOptsContent) throws McApplicationException; - McUsrAttempt getUserAttemptByQuestion(Long queUsrUid, Long mcQueContentId) throws McApplicationException; + McUsrAttempt getUserAttemptByQuestion(Long queUsrUid, Long mcQueContentId); List getLearnerMarksByContentId(Long toolContentId); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java =================================================================== diff -u -r64ee69765400783a3e284e7856aa91cdd01f4831 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 64ee69765400783a3e284e7856aa91cdd01f4831) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/service/McService.java (.../McService.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -104,6 +104,7 @@ import org.lamsfoundation.lams.usermanagement.dto.UserDTO; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.util.ExcelUtil; +import org.lamsfoundation.lams.util.HashUtil; import org.lamsfoundation.lams.util.JsonUtil; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.NumberUtil; @@ -198,12 +199,13 @@ if (userAttempt == null) { userAttempt = new McUsrAttempt(leaderAttempt.getAttemptTime(), question, user, leaderAttempt.getMcOptionsContent(), leaderAttempt.getMark(), leaderAttempt.isPassed(), - leaderAttempt.isAttemptCorrect()); + leaderAttempt.isAttemptCorrect(), leaderAttempt.getConfidenceLevel()); mcUsrAttemptDAO.saveMcUsrAttempt(userAttempt); - // if it's been changed by the leader + // if it's been changed by the leader } else if (leaderAttempt.getAttemptTime().compareTo(userAttempt.getAttemptTime()) != 0) { userAttempt.setMcOptionsContent(leaderAttempt.getMcOptionsContent()); + userAttempt.setConfidenceLevel(leaderAttempt.getConfidenceLevel()); userAttempt.setAttemptTime(leaderAttempt.getAttemptTime()); this.updateMcUsrAttempt(userAttempt); } @@ -216,21 +218,12 @@ @Override public void createMc(McContent mcContent) throws McApplicationException { - try { - mcContentDAO.saveMcContent(mcContent); - } catch (DataAccessException e) { - throw new McApplicationException("Exception occured when lams is creating mc content: " + e.getMessage(), - e); - } + mcContentDAO.saveMcContent(mcContent); } @Override public McContent getMcContent(Long toolContentId) throws McApplicationException { - try { - return mcContentDAO.findMcContentById(toolContentId); - } catch (DataAccessException e) { - throw new McApplicationException("Exception occured when lams is loading mc content: " + e.getMessage(), e); - } + return mcContentDAO.findMcContentById(toolContentId); } @Override @@ -244,48 +237,25 @@ } @Override - public void updateQuestion(McQueContent mcQueContent) throws McApplicationException { - try { - mcQueContentDAO.updateMcQueContent(mcQueContent); - } catch (DataAccessException e) { - throw new McApplicationException( - "Exception occured when lams is updating mc que content: " + e.getMessage(), e); - } - + public McQueContent getQuestionByDisplayOrder(final Long displayOrder, final Long mcContentUid) { + return mcQueContentDAO.getQuestionContentByDisplayOrder(displayOrder, mcContentUid); } @Override - public McQueContent getQuestionByDisplayOrder(final Long displayOrder, final Long mcContentUid) - throws McApplicationException { - try { - return mcQueContentDAO.getQuestionContentByDisplayOrder(displayOrder, mcContentUid); - } catch (DataAccessException e) { - throw new McApplicationException( - "Exception occured when lams is getting mc que content by display order: " + e.getMessage(), e); - } + public List getAllQuestionsSorted(final long mcContentId) { + return mcQueContentDAO.getAllQuestionEntriesSorted(mcContentId); } @Override - public List getAllQuestionsSorted(final long mcContentId) throws McApplicationException { - try { - return mcQueContentDAO.getAllQuestionEntriesSorted(mcContentId); - } catch (DataAccessException e) { - throw new McApplicationException( - "Exception occured when lams is getting all question entries: " + e.getMessage(), e); - } + public void saveOrUpdateMcQueContent(McQueContent mcQueContent) { + //update questions' hash + String newHash = mcQueContent.getQuestion() == null ? null : HashUtil.sha1(mcQueContent.getQuestion()); + mcQueContent.setQuestionHash(newHash); + + mcQueContentDAO.saveOrUpdateMcQueContent(mcQueContent); } @Override - public void saveOrUpdateMcQueContent(McQueContent mcQueContent) throws McApplicationException { - try { - mcQueContentDAO.saveOrUpdateMcQueContent(mcQueContent); - } catch (DataAccessException e) { - throw new McApplicationException( - "Exception occured when lams is updating mc que content: " + e.getMessage(), e); - } - } - - @Override public McContent createQuestions(List questionDTOs, McContent content) { int displayOrder = 0; @@ -309,8 +279,8 @@ // in case question doesn't exist if (question == null) { - question = new McQueContent(currentQuestionText, new Integer(displayOrder), new Integer(currentMark), - currentFeedback, content, null, null); + question = new McQueContent(currentQuestionText, null, new Integer(displayOrder), + new Integer(currentMark), currentFeedback, content, null, null); // adding a new question to content content.getMcQueContents().add(question); @@ -356,7 +326,7 @@ question.setMcOptionsContents(newOptions); // updating the existing question content - updateQuestion(question); + saveOrUpdateMcQueContent(question); } return content; @@ -453,6 +423,7 @@ Integer mark = answerDto.getMark(); boolean passed = user.isMarkPassed(mark); boolean isAttemptCorrect = answerDto.isAttemptCorrect(); + int confidenceLevel = answerDto.getConfidenceLevel(); McUsrAttempt userAttempt = this.getUserAttemptByQuestion(user.getUid(), questionUid); if (userAttempt != null) { @@ -470,12 +441,13 @@ userAttempt.setMark(mark); userAttempt.setPassed(passed); userAttempt.setAttemptCorrect(isAttemptCorrect); + userAttempt.setConfidenceLevel(confidenceLevel); } } else { // create new userAttempt userAttempt = new McUsrAttempt(attemptTime, question, user, answerOption, mark, passed, - isAttemptCorrect); + isAttemptCorrect, confidenceLevel); } mcUsrAttemptDAO.saveMcUsrAttempt(userAttempt); @@ -529,9 +501,10 @@ McUsrAttempt dbAttempt = this.getUserAttemptByQuestion(user.getUid(), questionUid); if (dbAttempt != null) { - Long selectedOptionUid = dbAttempt.getMcOptionsContent().getUid(); + answerDto.setConfidenceLevel(dbAttempt.getConfidenceLevel()); // mark selected option as selected + Long selectedOptionUid = dbAttempt.getMcOptionsContent().getUid(); for (McOptsContent option : answerDto.getOptions()) { if (selectedOptionUid.equals(option.getUid())) { option.setSelected(true); @@ -647,26 +620,12 @@ @Override public List getFinalizedUserAttempts(final McQueUsr user) throws McApplicationException { - try { - return mcUsrAttemptDAO.getFinalizedUserAttempts(user.getUid()); - } catch (DataAccessException e) { - throw new McApplicationException( - "Exception occured when lams is getting the learner's attempts by user id and que content id and attempt order: " - + e.getMessage(), - e); - } + return mcUsrAttemptDAO.getFinalizedUserAttempts(user.getUid()); } @Override public McUsrAttempt getUserAttemptByQuestion(Long queUsrUid, Long mcQueContentId) throws McApplicationException { - try { - return mcUsrAttemptDAO.getUserAttemptByQuestion(queUsrUid, mcQueContentId); - } catch (DataAccessException e) { - throw new McApplicationException( - "Exception occured when lams is getting the learner's attempts by user id and que content id and attempt order: " - + e.getMessage(), - e); - } + return mcUsrAttemptDAO.getUserAttemptByQuestion(queUsrUid, mcQueContentId); } @Override @@ -676,12 +635,7 @@ @Override public List getQuestionsByContentUid(final Long contentUid) throws McApplicationException { - try { - return mcQueContentDAO.getQuestionsByContentUid(contentUid.longValue()); - } catch (DataAccessException e) { - throw new McApplicationException( - "Exception occured when lams is getting by uid mc question content: " + e.getMessage(), e); - } + return mcQueContentDAO.getQuestionsByContentUid(contentUid.longValue()); } @Override @@ -1535,10 +1489,42 @@ public List getToolOutputs(String name, Long toolContentId) { return mcOutputFactory.getToolOutputs(name, this, toolContentId); } - + @Override public List getConfidenceLevels(Long toolSessionId) { - return null; + List confidenceLevelDtos = new ArrayList(); + if (toolSessionId == null) { + return confidenceLevelDtos; + } + + McContent content = getMcSessionById(toolSessionId).getMcContent(); + + //in case McContent is leader aware return all leaders confidences, otherwise - confidences from the users from the same group as requestor + List userAttemptsAndPortraits = content.isUseSelectLeaderToolOuput() + ? mcUsrAttemptDAO.getLeadersFinalizedAttemptsByContentId(content.getMcContentId()) + : mcUsrAttemptDAO.getFinalizedAttemptsBySessionId(toolSessionId); + + for (Object[] userAttemptAndPortraitIter : userAttemptsAndPortraits) { + McUsrAttempt userAttempt = (McUsrAttempt) userAttemptAndPortraitIter[0]; + Long portraitUuid = userAttemptAndPortraitIter[1] == null ? null + : ((Number) userAttemptAndPortraitIter[1]).longValue(); + Long userId = userAttempt.getQueUsrId(); + + //fill in question's and user answer's hashes + McQueContent question = userAttempt.getMcQueContent(); + String answer = userAttempt.getMcOptionsContent().getMcQueOptionText(); + + ConfidenceLevelDTO confidenceLevelDto = new ConfidenceLevelDTO(); + confidenceLevelDto.setUserId(userId.intValue()); + confidenceLevelDto.setPortraitUuid(portraitUuid); + confidenceLevelDto.setLevel(userAttempt.getConfidenceLevel()); + confidenceLevelDto.setQuestion(question.getQuestion()); + confidenceLevelDto.setAnswer(answer); + + confidenceLevelDtos.add(confidenceLevelDto); + } + + return confidenceLevelDtos; } @Override @@ -1912,6 +1898,7 @@ mcq.setShowMarks(JsonUtil.opt(toolContentJSON, "showMarks", Boolean.FALSE)); mcq.setPrefixAnswersWithLetters(JsonUtil.opt(toolContentJSON, "prefixAnswersWithLetters", Boolean.TRUE)); mcq.setPassMark(JsonUtil.opt(toolContentJSON, "passMark", 0)); + mcq.setEnableConfidenceLevels(JsonUtil.opt(toolContentJSON, "enableConfidenceLevels", Boolean.FALSE)); // submissionDeadline is set in monitoring createMc(mcq); @@ -1920,8 +1907,9 @@ JSONArray questions = toolContentJSON.getJSONArray(RestTags.QUESTIONS); for (int i = 0; i < questions.length(); i++) { JSONObject questionData = (JSONObject) questions.get(i); - McQueContent question = new McQueContent(questionData.getString(RestTags.QUESTION_TEXT), - questionData.getInt(RestTags.DISPLAY_ORDER), 1, "", mcq, null, new HashSet()); + String questionText = questionData.getString(RestTags.QUESTION_TEXT); + McQueContent question = new McQueContent(questionText, null, questionData.getInt(RestTags.DISPLAY_ORDER), 1, + "", mcq, null, new HashSet()); JSONArray optionsData = questionData.getJSONArray(RestTags.ANSWERS); for (int j = 0; j < optionsData.length(); j++) { Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/AuthoringUtil.java =================================================================== diff -u -r4170df8bc66e658ef4dcd47e99eceddec3c2673a -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/AuthoringUtil.java (.../AuthoringUtil.java) (revision 4170df8bc66e658ef4dcd47e99eceddec3c2673a) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/util/AuthoringUtil.java (.../AuthoringUtil.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -44,6 +44,7 @@ import org.lamsfoundation.lams.tool.mc.pojos.McQueContent; import org.lamsfoundation.lams.tool.mc.service.IMcService; import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; @@ -101,6 +102,7 @@ boolean prefixAnswersWithLettersBoolean = false; boolean retriesBoolean = false; boolean reflectBoolean = false; + boolean enableConfidenceLevels = WebUtil.readBooleanParam(request, "enableConfidenceLevels", false); if ((questionsSequenced != null) && (questionsSequenced.equalsIgnoreCase("1"))) { questionsSequencedBoolean = true; @@ -174,6 +176,7 @@ mcContent.setShowReport(slnBoolean); mcContent.setUseSelectLeaderToolOuput(useSelectLeaderToolOuputBoolean); mcContent.setPrefixAnswersWithLetters(prefixAnswersWithLettersBoolean); + mcContent.setEnableConfidenceLevels(enableConfidenceLevels); mcContent.setReflect(reflectBoolean); mcContent.setReflectionSubject(reflectionSubject); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McAction.java =================================================================== diff -u -r4170df8bc66e658ef4dcd47e99eceddec3c2673a -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McAction.java (.../McAction.java) (revision 4170df8bc66e658ef4dcd47e99eceddec3c2673a) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McAction.java (.../McAction.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -140,7 +140,7 @@ for (McQueContent question : sortedQuestions) { McQueContent existingQuestion = mcService.getQuestionByUid(question.getUid()); existingQuestion.setDisplayOrder(new Integer(displayOrder)); - mcService.updateQuestion(existingQuestion); + mcService.saveOrUpdateMcQueContent(existingQuestion); displayOrder++; } } Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McLearningAction.java =================================================================== diff -u -r4170df8bc66e658ef4dcd47e99eceddec3c2673a -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McLearningAction.java (.../McLearningAction.java) (revision 4170df8bc66e658ef4dcd47e99eceddec3c2673a) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McLearningAction.java (.../McLearningAction.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -196,7 +196,7 @@ /** * */ - protected List buildAnswerDtos(List answers, McContent content) { + protected List buildAnswerDtos(List answers, McContent content, HttpServletRequest request) { List answerDtos = new LinkedList(); @@ -233,9 +233,14 @@ answerDto.setFeedbackIncorrect(question.getFeedback()); answerDto.setMark(0); } + + //handle confidence levels + if (content.isEnableConfidenceLevels()) { + int confidenceLevel = WebUtil.readIntParam(request, "confidenceLevel" + question.getUid()); + answerDto.setConfidenceLevel(confidenceLevel); + } answerDtos.add(answerDto); - } return answerDtos; @@ -275,7 +280,7 @@ } /* process the answers */ - List answerDtos = buildAnswerDtos(answers, mcContent); + List answerDtos = buildAnswerDtos(answers, mcContent, request); mcService.saveUserAttempt(user, answerDtos); //calculate total learner mark @@ -328,7 +333,7 @@ sessionMap.put(McAppConstants.QUESTION_AND_CANDIDATE_ANSWERS_KEY, answers); //save user attempt - List answerDtos = buildAnswerDtos(answers, mcContent); + List answerDtos = buildAnswerDtos(answers, mcContent, request); mcService.saveUserAttempt(user, answerDtos); List learnerAnswersDTOList = mcService.getAnswersFromDatabase(mcContent, user); @@ -702,7 +707,7 @@ List answers = McLearningAction.parseLearnerAnswers(mcLearningForm, request, mcContent.isQuestionsSequenced()); - List answerDtos = buildAnswerDtos(answers, mcContent); + List answerDtos = buildAnswerDtos(answers, mcContent, request); mcService.saveUserAttempt(user, answerDtos); return null; Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McMonitoringAction.java =================================================================== diff -u -r729f1d10a1efd78ec420b373a7af23ee66ec3454 -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McMonitoringAction.java (.../McMonitoringAction.java) (revision 729f1d10a1efd78ec420b373a7af23ee66ec3454) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McMonitoringAction.java (.../McMonitoringAction.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -260,6 +260,7 @@ } } + request.setAttribute(McAppConstants.ATTR_CONTENT, user.getMcSession().getMcContent()); request.setAttribute(McAppConstants.USER_ATTEMPTS, userAttempts); request.setAttribute(McAppConstants.TOOL_SESSION_ID, user.getMcSession().getMcSessionId()); return (userAttempts == null || userAttempts.isEmpty()) ? null Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McMonitoringStarterAction.java =================================================================== diff -u -r4170df8bc66e658ef4dcd47e99eceddec3c2673a -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McMonitoringStarterAction.java (.../McMonitoringStarterAction.java) (revision 4170df8bc66e658ef4dcd47e99eceddec3c2673a) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McMonitoringStarterAction.java (.../McMonitoringStarterAction.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -106,6 +106,7 @@ request.setAttribute(McAppConstants.ATTR_CONTENT, mcContent); request.setAttribute("questionsSequenced", mcContent.isQuestionsSequenced()); + request.setAttribute("enableConfidenceLevels", mcContent.isEnableConfidenceLevels()); request.setAttribute("showMarks", mcContent.isShowMarks()); request.setAttribute("useSelectLeaderToolOuput", mcContent.isUseSelectLeaderToolOuput()); request.setAttribute("prefixAnswersWithLetters", mcContent.isPrefixAnswersWithLetters()); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McStarterAction.java =================================================================== diff -u -r4170df8bc66e658ef4dcd47e99eceddec3c2673a -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McStarterAction.java (.../McStarterAction.java) (revision 4170df8bc66e658ef4dcd47e99eceddec3c2673a) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/action/McStarterAction.java (.../McStarterAction.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -110,6 +110,7 @@ mcAuthoringForm.setReflectionSubject(mcContent.getReflectionSubject()); mcAuthoringForm.setTitle(mcContent.getTitle()); mcAuthoringForm.setInstructions(mcContent.getInstructions()); + mcAuthoringForm.setEnableConfidenceLevels(mcContent.isEnableConfidenceLevels()); List questionDtos = AuthoringUtil.buildDefaultQuestions(mcContent); sessionMap.put(McAppConstants.QUESTION_DTOS, questionDtos); Index: lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/form/McAuthoringForm.java =================================================================== diff -u -re4c72d9ff29d298b32927e0e1c0970b653acb86e -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/form/McAuthoringForm.java (.../McAuthoringForm.java) (revision e4c72d9ff29d298b32927e0e1c0970b653acb86e) +++ lams_tool_lamc/src/java/org/lamsfoundation/lams/tool/mc/web/form/McAuthoringForm.java (.../McAuthoringForm.java) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -55,6 +55,8 @@ protected String sln; protected String passmark; + + protected boolean enableConfidenceLevels; protected String questionsSequenced; @@ -199,7 +201,15 @@ public void setPassmark(String passmark) { this.passmark = passmark; } + + public boolean isEnableConfidenceLevels() { + return enableConfidenceLevels; + } + public void setEnableConfidenceLevels(boolean enableConfidenceLevels) { + this.enableConfidenceLevels = enableConfidenceLevels; + } + /** * @return Returns the sln. */ Index: lams_tool_lamc/web/authoring/AdvancedContent.jsp =================================================================== diff -u -r289926a27bdbc9bd2519e3064a85f489fc1845ec -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/web/authoring/AdvancedContent.jsp (.../AdvancedContent.jsp) (revision 289926a27bdbc9bd2519e3064a85f489fc1845ec) +++ lams_tool_lamc/web/authoring/AdvancedContent.jsp (.../AdvancedContent.jsp) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -66,6 +66,13 @@ + +
+ +
Index: lams_tool_lamc/web/learning/AnswersContent.jsp =================================================================== diff -u -r463f7b3dbb88ee41210f7170dc19dc25360cd26f -r3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa --- lams_tool_lamc/web/learning/AnswersContent.jsp (.../AnswersContent.jsp) (revision 463f7b3dbb88ee41210f7170dc19dc25360cd26f) +++ lams_tool_lamc/web/learning/AnswersContent.jsp (.../AnswersContent.jsp) (revision 3c88fe83de7aaf7bd9dbe9ea6e1cb0e43d099ffa) @@ -1,8 +1,6 @@ <%@ include file="/common/taglibs.jsp"%> - - - + @@ -14,20 +12,21 @@ <fmt:message key="activity.title" /> + + + - + + +