Index: lams_build/lib/lams/lams.jar =================================================================== RCS file: /usr/local/cvsroot/lams_build/lib/lams/lams.jar,v diff -u -r1.396 -r1.397 Binary files differ Index: lams_common/src/java/org/lamsfoundation/lams/toolApplicationContext.xml =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/toolApplicationContext.xml,v diff -u -r1.11 -r1.12 --- lams_common/src/java/org/lamsfoundation/lams/toolApplicationContext.xml 12 Dec 2013 12:41:44 -0000 1.11 +++ lams_common/src/java/org/lamsfoundation/lams/toolApplicationContext.xml 6 Jan 2014 12:08:48 -0000 1.12 @@ -66,7 +66,8 @@ - + + Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/ILamsToolService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/tool/service/ILamsToolService.java,v diff -u -r1.24 -r1.25 --- lams_common/src/java/org/lamsfoundation/lams/tool/service/ILamsToolService.java 29 Jul 2013 23:12:15 -0000 1.24 +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/ILamsToolService.java 6 Jan 2014 12:08:48 -0000 1.25 @@ -87,4 +87,9 @@ * @return */ Boolean isGroupedActivity(long toolContentID); + + /** + * Returns leader's UserId from the nearest Leader Selection Tool, null if none available. + */ + Long getLeaderUserId(Long toolSessionId, Integer learnerId); } Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java =================================================================== RCS file: /usr/local/cvsroot/lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java,v diff -u -r1.26 -r1.27 --- lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java 29 Jul 2013 23:12:15 -0000 1.26 +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsToolService.java 6 Jan 2014 12:08:48 -0000 1.27 @@ -29,10 +29,14 @@ import java.util.Set; import org.apache.log4j.Logger; +import org.hibernate.Hibernate; +import org.hibernate.proxy.HibernateProxy; import org.lamsfoundation.lams.learningdesign.Activity; -import org.lamsfoundation.lams.lesson.Lesson; +import org.lamsfoundation.lams.learningdesign.ToolActivity; +import org.lamsfoundation.lams.learningdesign.Transition; import org.lamsfoundation.lams.tool.IToolVO; import org.lamsfoundation.lams.tool.Tool; +import org.lamsfoundation.lams.tool.ToolOutput; import org.lamsfoundation.lams.tool.ToolSession; import org.lamsfoundation.lams.tool.dao.IToolContentDAO; import org.lamsfoundation.lams.tool.dao.IToolDAO; @@ -52,10 +56,15 @@ */ public class LamsToolService implements ILamsToolService { private static Logger log = Logger.getLogger(LamsToolService.class); + + //Leader selection tool Constants + private static final String LEADER_SELECTION_TOOL_SIGNATURE = "lalead11"; + private static final String LEADER_SELECTION_TOOL_OUTPUT_NAME_LEADER_USERID = "leader.user.id"; public IToolDAO toolDAO; public IToolSessionDAO toolSessionDAO; public IToolContentDAO toolContentDAO; + private ILamsCoreToolService lamsCoreToolService; @Override public Set getAllPotentialLearners(long toolSessionId) throws LamsToolServiceException { @@ -134,8 +143,75 @@ return null; } } + + @Override + public Long getLeaderUserId(Long toolSessionId, Integer learnerId) { + Long leaderUserId = null; + + ToolSession toolSession = this.getToolSession(toolSessionId); + ToolActivity mcqActivity = toolSession.getToolActivity(); + Activity leaderSelectionActivity = getNearestLeaderSelectionActivity(mcqActivity); + // check if there is leaderSelectionTool available + if (leaderSelectionActivity != null) { + User learner = (User) toolContentDAO.find(User.class, learnerId); + String outputName = LEADER_SELECTION_TOOL_OUTPUT_NAME_LEADER_USERID; + ToolSession leaderSelectionSession = toolSessionDAO.getToolSessionByLearner(learner, + leaderSelectionActivity); + ToolOutput output = lamsCoreToolService.getOutputFromTool(outputName, leaderSelectionSession, null); + + // check if tool produced output + if (output != null && output.getValue() != null) { + leaderUserId = output.getValue().getLong(); + } + } + + return leaderUserId; + } + /** + * Finds the nearest Leader Select activity. Works recursively. Tries to find Leader Select activity in the previous + * activities set first, and then inside the parent set. + */ + private static Activity getNearestLeaderSelectionActivity(Activity activity) { + + // check if current activity is Leader Select one. if so - stop searching and return it. + Class activityClass = Hibernate.getClass(activity); + if (activityClass.equals(ToolActivity.class)) { + ToolActivity toolActivity; + + // activity is loaded as proxy due to lazy loading and in order to prevent quering DB we just re-initialize + // it here again + Hibernate.initialize(activity); + if (activity instanceof HibernateProxy) { + toolActivity = (ToolActivity) ((HibernateProxy) activity).getHibernateLazyInitializer() + .getImplementation(); + } else { + toolActivity = (ToolActivity) activity; + } + + if (LEADER_SELECTION_TOOL_SIGNATURE.equals(toolActivity.getTool().getToolSignature())) { + return activity; + } + } + + // check previous activity + Transition transitionTo = activity.getTransitionTo(); + if (transitionTo != null) { + Activity fromActivity = transitionTo.getFromActivity(); + return getNearestLeaderSelectionActivity(fromActivity); + } + + // check parent activity + Activity parent = activity.getParentActivity(); + if (parent != null) { + return getNearestLeaderSelectionActivity(parent); + } + + return null; + } + + /** * @return Returns the toolDAO. */ public IToolDAO getToolDAO() { @@ -173,4 +249,12 @@ public void setToolContentDAO(IToolContentDAO toolContentDAO) { this.toolContentDAO = toolContentDAO; } + + /** + * + * @param toolContentDAO + */ + public void setLamsCoreToolService(ILamsCoreToolService lamsCoreToolService) { + this.lamsCoreToolService = lamsCoreToolService; + } }