Index: lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsCoreToolService.java =================================================================== diff -u -r97612142f4697066beb66064e83ff31fef1712b9 -r3bfbf85ce0639b4cd2957e34a978a22da5e7d66f --- lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsCoreToolService.java (.../LamsCoreToolService.java) (revision 97612142f4697066beb66064e83ff31fef1712b9) +++ lams_common/src/java/org/lamsfoundation/lams/tool/service/LamsCoreToolService.java (.../LamsCoreToolService.java) (revision 3bfbf85ce0639b4cd2957e34a978a22da5e7d66f) @@ -28,7 +28,6 @@ import java.util.List; import java.util.Set; import java.util.SortedMap; -import java.util.TreeMap; import org.apache.log4j.Logger; import org.lamsfoundation.lams.learningdesign.Activity; @@ -573,7 +572,7 @@ /** * @see org.lamsfoundation.lams.tool.service.ILamsCoreToolService#getToolLearnerProgressURL(java.lang.Long, org.lamsfoundation.lams.learningdesign.Activity, org.lamsfoundation.lams.usermanagement.User) */ - public String getToolLearnerProgressURL(Long lessonID, Activity activity,User learner) throws LamsToolServiceException + public String getToolLearnerProgressURL(Long lessonID, Activity activity, User learner) throws LamsToolServiceException { if ( activity.isToolActivity() ) { ToolActivity toolActivity = (ToolActivity) activity; @@ -583,7 +582,7 @@ } else if ( activity.isSystemToolActivity() ){ SystemTool sysTool = systemToolDAO.getSystemToolByActivityTypeId(activity.getActivityTypeId()); if ( sysTool != null ) { - return setupURLWithActivityLessonID(activity, lessonID, sysTool.getLearnerProgressUrl()); + return setupURLWithActivityLessonUserID(activity, lessonID, learner.getUserId(), sysTool.getLearnerProgressUrl()); } } return null; @@ -688,6 +687,16 @@ toolSession.getToolSessionId().toString()); } + public String setupURLWithActivityLessonUserID(Activity activity, Long lessonID, Integer userID, String learnerURL) { + String url = setupURLWithActivityLessonID(activity, lessonID, learnerURL); + if ( url!=null && userID != null ) { + url = WebUtil.appendParameterToURL(url, + AttributeNames.PARAM_USER_ID, + userID.toString()); + } + return url; + } + public String setupURLWithActivityLessonID(Activity activity, Long lessonID, String learnerURL) { String url = learnerURL; if ( url!=null && activity != null ) { Index: lams_monitoring/conf/language/lams/ApplicationResources.properties =================================================================== diff -u -rceb102f14e36845f9f95fbafc54d68f7b1ba7e48 -r3bfbf85ce0639b4cd2957e34a978a22da5e7d66f --- lams_monitoring/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision ceb102f14e36845f9f95fbafc54d68f7b1ba7e48) +++ lams_monitoring/conf/language/lams/ApplicationResources.properties (.../ApplicationResources.properties) (revision 3bfbf85ce0639b4cd2957e34a978a22da5e7d66f) @@ -66,6 +66,9 @@ label.branching.general.group.instructions =Place the groups in their branches. Initially you can add and remove groups, but once a participant starts one of the branches then you will not be able to remove groups from any branches. You will still be able to add groups to branches. label.branching.non.allocated.groups.heading =Groups without a Branch label.branching.allocated.groups.heading =Groups of the selected Branch +message.activity.parallel.noFrames = Your browser does not handle frames! +label.started = Started +label.not.started = Not Started #======= End labels: Exported 60 labels for en AU ===== Index: lams_monitoring/conf/language/lams/ApplicationResources_en_AU.properties =================================================================== diff -u -rceb102f14e36845f9f95fbafc54d68f7b1ba7e48 -r3bfbf85ce0639b4cd2957e34a978a22da5e7d66f --- lams_monitoring/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision ceb102f14e36845f9f95fbafc54d68f7b1ba7e48) +++ lams_monitoring/conf/language/lams/ApplicationResources_en_AU.properties (.../ApplicationResources_en_AU.properties) (revision 3bfbf85ce0639b4cd2957e34a978a22da5e7d66f) @@ -66,6 +66,9 @@ label.branching.general.group.instructions =Place the groups in their branches. Initially you can add and remove groups, but once a participant starts one of the branches then you will not be able to remove groups from any branches. You will still be able to add groups to branches. label.branching.non.allocated.groups.heading =Groups without a Branch label.branching.allocated.groups.heading =Groups of the selected Branch +message.activity.parallel.noFrames = Your browser does not handle frames! +label.started = Started +label.not.started = Not Started #======= End labels: Exported 60 labels for en AU ===== Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -r08be5501aa8570c5fa4c6e50aa615334c171ee58 -r3bfbf85ce0639b4cd2957e34a978a22da5e7d66f --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 08be5501aa8570c5fa4c6e50aa615334c171ee58) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 3bfbf85ce0639b4cd2957e34a978a22da5e7d66f) @@ -85,14 +85,14 @@ import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; import org.lamsfoundation.lams.usermanagement.util.LastNameAlphabeticComparator; -import org.lamsfoundation.lams.web.util.AttributeNames; import org.lamsfoundation.lams.util.Configuration; import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.audit.AuditService; import org.lamsfoundation.lams.util.wddx.FlashMessage; import org.lamsfoundation.lams.util.wddx.WDDXProcessor; import org.lamsfoundation.lams.util.wddx.WDDXProcessorConversionException; +import org.lamsfoundation.lams.web.util.AttributeNames; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; @@ -1416,12 +1416,22 @@ Activity activity = activityDAO.getActivityByActivityId(activityID); User learner = (User)baseDAO.find(User.class,learnerUserID); + String url = null; if(activity==null || learner==null){ log.error("getLearnerActivityURL activity or user missing. Activity ID "+activityID+" activity " +activity+" userID "+learnerUserID+" user "+learner); - } else if ( activity.isToolActivity() || activity.isSystemToolActivity() ){ - return lamsCoreToolService.getToolLearnerProgressURL(lessonID, activity,learner); + } else if ( activity.isToolActivity() ){ + url = lamsCoreToolService.getToolLearnerProgressURL(lessonID, activity, learner); + } else if (activity.isOptionsActivity() || activity.isParallelActivity()) { + url = "monitoring/complexProgress.do?" + + AttributeNames.PARAM_ACTIVITY_ID + "=" + activityID + "&" + + AttributeNames.PARAM_LESSON_ID + "=" + lessonID + "&" + + AttributeNames.PARAM_USER_ID + "=" + learnerUserID; + } else if (activity.isBranchingActivity()) { + activity = (BranchingActivity)activity; + url = lamsCoreToolService.getToolLearnerProgressURL(lessonID, activity, learner); } - return null; + log.debug("url: "+url); + return url; } /** * (non-Javadoc) Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/ComplexLearnerProgressAction.java =================================================================== diff -u --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/ComplexLearnerProgressAction.java (revision 0) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/ComplexLearnerProgressAction.java (revision 3bfbf85ce0639b4cd2957e34a978a22da5e7d66f) @@ -0,0 +1,148 @@ +/**************************************************************** + * Copyright (C) 2005 LAMS Foundation (http://lamsfoundation.org) + * ============================================================= + * License Information: http://lamsfoundation.org/licensing/lams/2.0/ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2.0 + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA + * + * http://www.gnu.org/licenses/gpl.txt + * **************************************************************** + */ + +/* $Id$ */ +package org.lamsfoundation.lams.monitoring.web; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.apache.struts.action.Action; +import org.apache.struts.action.ActionForm; +import org.apache.struts.action.ActionForward; +import org.apache.struts.action.ActionMapping; +import org.lamsfoundation.lams.learningdesign.Activity; +import org.lamsfoundation.lams.learningdesign.ComplexActivity; +import org.lamsfoundation.lams.learningdesign.ParallelActivity; +import org.lamsfoundation.lams.learningdesign.SequenceActivity; +import org.lamsfoundation.lams.monitoring.service.IMonitoringService; +import org.lamsfoundation.lams.monitoring.service.MonitoringServiceProxy; +import org.lamsfoundation.lams.usermanagement.User; +import org.lamsfoundation.lams.usermanagement.dto.UserDTO; +import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; +import org.lamsfoundation.lams.util.WebUtil; +import org.lamsfoundation.lams.web.session.SessionManager; +import org.lamsfoundation.lams.web.util.AttributeNames; +import org.springframework.web.context.support.WebApplicationContextUtils; + +/** + * @author jliew + * + * @struts:action path="/complexProgress" + * validate="false" + * @struts.action-forward name = "complexProgress" path = ".complexProgress" + * @struts.action-forward name = "parallelProgress" path = "/parallelProgress.jsp" + */ +public class ComplexLearnerProgressAction extends Action { + + private static Logger log = Logger.getLogger(ComplexLearnerProgressAction.class); + + public ActionForward execute(ActionMapping mapping, + ActionForm form, + HttpServletRequest request, + HttpServletResponse response) throws IOException, ServletException { + + Long activityID = WebUtil.readLongParam(request, AttributeNames.PARAM_ACTIVITY_ID, false); + Long lessonID = WebUtil.readLongParam(request, AttributeNames.PARAM_LESSON_ID, false); + Integer userID = WebUtil.readIntParam(request, AttributeNames.PARAM_USER_ID, false); + + IMonitoringService monitoringService = MonitoringServiceProxy.getMonitoringService(getServlet().getServletContext()); + Activity activity = monitoringService.getActivityById(activityID); + + IUserManagementService userService = (IUserManagementService)WebApplicationContextUtils + .getRequiredWebApplicationContext(getServlet().getServletContext()).getBean("userManagementService"); + User learner = (User)userService.findById(User.class, userID); + + HttpSession ss = SessionManager.getSession(); + UserDTO user = (UserDTO) ss.getAttribute(AttributeNames.USER); + + if (activity.isOptionsActivity() || activity.isBranchingActivity()) { + HashMap startedMap = new HashMap(); + HashMap urlMap = new HashMap(); + + ComplexActivity complexActivity = (ComplexActivity)activity; + Set subActivities = complexActivity.getActivities(); + Iterator i = subActivities.iterator(); + + // iterate through each optional or branching activity + while (i.hasNext()) { + Activity a = (Activity)i.next(); + List users = monitoringService.getLearnersHaveAttemptedActivity(a); + startedMap.put(a.getActivityId(), ( users.contains(learner) ? true : false ) ); + if (a.isSequenceActivity()) { + request.setAttribute("hasSequenceActivity", true); + // map learner progress urls of each activity in the sequence + SequenceActivity sequenceActivity = (SequenceActivity)a; + Set set = sequenceActivity.getActivities(); + Iterator iterator = set.iterator(); + while (iterator.hasNext()) { + Activity child = (Activity)iterator.next(); + users = monitoringService.getLearnersHaveAttemptedActivity(child); + boolean hasAttempted = users.contains(learner); + startedMap.put(child.getActivityId(), ( hasAttempted ? true : false ) ); + if (hasAttempted) { + // learner progress url + urlMap.put(child.getActivityId(), + monitoringService.getLearnerActivityURL(lessonID, child.getActivityId(), userID, user.getUserID())); + } + } + } + } + + // learner progress urls for children of the sequence activities + request.setAttribute("urlMap", urlMap); + // boolean flags for whether an activity is started + request.setAttribute("startedMap", startedMap); + // set of child activities + request.setAttribute("subActivities", subActivities); + // main activity title + request.setAttribute("activityTitle", activity.getTitle()); + + return mapping.findForward("complexProgress"); + } else if (activity.isParallelActivity()) { + ArrayList urls = new ArrayList(); + ParallelActivity parallelActivity = (ParallelActivity)activity; + Set parallels = parallelActivity.getActivities(); + Iterator i = parallels.iterator(); + while (i.hasNext()) { + Activity a = (Activity)i.next(); + // get learner progress url for this parallel activity + urls.add(monitoringService.getLearnerActivityURL(lessonID, a.getActivityId(), userID, user.getUserID())); + } + request.setAttribute("parallelUrls", urls); + return mapping.findForward("parallelProgress"); + } + + return null; + } +} + \ No newline at end of file Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java =================================================================== diff -u -rb7cec35daf3ceab433021f88c904e707b4512061 -r3bfbf85ce0639b4cd2957e34a978a22da5e7d66f --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision b7cec35daf3ceab433021f88c904e707b4512061) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/web/MonitoringAction.java (.../MonitoringAction.java) (revision 3bfbf85ce0639b4cd2957e34a978a22da5e7d66f) @@ -721,8 +721,8 @@ HttpServletResponse response)throws IOException,LamsToolServiceException{ IMonitoringService monitoringService = MonitoringServiceProxy.getMonitoringService(getServlet().getServletContext()); - Integer learnerUserID = new Integer(WebUtil.readIntParam(request,"userID")); - Long activityID = new Long(WebUtil.readLongParam(request,"activityID")); + Integer learnerUserID = new Integer(WebUtil.readIntParam(request,AttributeNames.PARAM_USER_ID)); + Long activityID = new Long(WebUtil.readLongParam(request,AttributeNames.PARAM_ACTIVITY_ID)); Long lessonID = new Long(WebUtil.readLongParam(request,AttributeNames.PARAM_LESSON_ID)); String url = monitoringService.getLearnerActivityURL(lessonID,activityID,learnerUserID,getUserId()); Index: lams_monitoring/web/WEB-INF/struts/tiles-defs.xml =================================================================== diff -u -r3a4c502dd96ac40fd96827f36bc450158b145113 -r3bfbf85ce0639b4cd2957e34a978a22da5e7d66f --- lams_monitoring/web/WEB-INF/struts/tiles-defs.xml (.../tiles-defs.xml) (revision 3a4c502dd96ac40fd96827f36bc450158b145113) +++ lams_monitoring/web/WEB-INF/struts/tiles-defs.xml (.../tiles-defs.xml) (revision 3bfbf85ce0639b4cd2957e34a978a22da5e7d66f) @@ -53,4 +53,8 @@ + + + + \ No newline at end of file Index: lams_monitoring/web/complexProgress.jsp =================================================================== diff -u --- lams_monitoring/web/complexProgress.jsp (revision 0) +++ lams_monitoring/web/complexProgress.jsp (revision 3bfbf85ce0639b4cd2957e34a978a22da5e7d66f) @@ -0,0 +1,48 @@ +<%@ taglib uri="tags-fmt" prefix="fmt" %> +<%@ taglib uri="tags-core" prefix="c" %> +<%@ taglib uri="tags-lams" prefix="lams" %> + +
+ +

+ + + + + + + + + + +
+ +
+
+ + + + +

+ - + - +

+
    + + +
  • + + "> + + + + +
  • +
    +
+
+
+ +
+ + Index: lams_monitoring/web/parallelProgress.jsp =================================================================== diff -u --- lams_monitoring/web/parallelProgress.jsp (revision 0) +++ lams_monitoring/web/parallelProgress.jsp (revision 3bfbf85ce0639b4cd2957e34a978a22da5e7d66f) @@ -0,0 +1,28 @@ +<%@ taglib uri="tags-fmt" prefix="fmt" %> +<%@ taglib uri="tags-core" prefix="c" %> +<%@ taglib uri="tags-lams" prefix="lams" %> + + + + + + + + + + " + name="TaskFrame" + frameborder="" bordercolor="#E0E7EB" + id="lamsDynamicFrame"> + + + + + <body> + <fmt:message key="message.activity.parallel.noFrames" /> + </body> + + + + \ No newline at end of file