Index: lams_tool_scratchie/conf/hibernate/mappings/org/lamsfoundation/lams/tool/scratchie/model/ScratchieSession.hbm.xml =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/conf/hibernate/mappings/org/lamsfoundation/lams/tool/scratchie/model/Attic/ScratchieSession.hbm.xml,v diff -u -r1.1.2.1 -r1.1.2.2 --- lams_tool_scratchie/conf/hibernate/mappings/org/lamsfoundation/lams/tool/scratchie/model/ScratchieSession.hbm.xml 27 Apr 2016 13:22:18 -0000 1.1.2.1 +++ lams_tool_scratchie/conf/hibernate/mappings/org/lamsfoundation/lams/tool/scratchie/model/ScratchieSession.hbm.xml 6 Dec 2016 09:02:25 -0000 1.1.2.2 @@ -33,6 +33,14 @@ insert="true" column="session_end_date" /> + + + @@ -137,6 +138,7 @@ PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception + PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception PROPAGATION_REQUIRED,-java.lang.Exception Fisheye: Tag 1.1 refers to a dead (removed) revision in file `lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/dbupdates/patch20161205.sql'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/BurningQuestionLike.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/BurningQuestionLike.java,v diff -u -r1.1.2.4 -r1.1.2.5 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/BurningQuestionLike.java 5 May 2016 08:09:28 -0000 1.1.2.4 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/BurningQuestionLike.java 6 Dec 2016 09:02:25 -0000 1.1.2.5 @@ -2,8 +2,6 @@ /** * @author Andrey Balan - * - * */ public class BurningQuestionLike { Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieAnswer.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieAnswer.java,v diff -u -r1.5.2.3 -r1.5.2.4 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieAnswer.java 11 May 2016 07:38:00 -0000 1.5.2.3 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieAnswer.java 6 Dec 2016 09:02:25 -0000 1.5.2.4 @@ -29,9 +29,6 @@ * Tool may contain several questions. Which in turn contain answers. * * @author Andrey Balan - * - * - * */ public class ScratchieAnswer implements Cloneable { private static final Logger log = Logger.getLogger(ScratchieAnswer.class); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieAnswerVisitLog.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieAnswerVisitLog.java,v diff -u -r1.2.2.3 -r1.2.2.4 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieAnswerVisitLog.java 11 May 2016 07:38:00 -0000 1.2.2.3 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieAnswerVisitLog.java 6 Dec 2016 09:02:25 -0000 1.2.2.4 @@ -30,9 +30,6 @@ * Scratchie * * @author Andrey Balan - * - * - * */ public class ScratchieAnswerVisitLog { Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieBurningQuestion.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieBurningQuestion.java,v diff -u -r1.1.2.6 -r1.1.2.7 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieBurningQuestion.java 11 May 2016 07:38:00 -0000 1.1.2.6 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieBurningQuestion.java 6 Dec 2016 09:02:25 -0000 1.1.2.7 @@ -29,9 +29,6 @@ * ScratchieBurningQuestion * * @author Andrey Balan - * - * - * */ public class ScratchieBurningQuestion { Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java,v diff -u -r1.6.2.4 -r1.6.2.5 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java 11 May 2016 07:38:00 -0000 1.6.2.4 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieItem.java 6 Dec 2016 09:02:25 -0000 1.6.2.5 @@ -34,9 +34,6 @@ * Tool may contain several questions. Which in turn contain answers. * * @author Andrey Balan - * - * - * */ public class ScratchieItem implements Cloneable { private static final Logger log = Logger.getLogger(ScratchieItem.class); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieSession.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieSession.java,v diff -u -r1.6.2.3 -r1.6.2.4 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieSession.java 11 May 2016 07:38:00 -0000 1.6.2.3 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieSession.java 6 Dec 2016 09:02:25 -0000 1.6.2.4 @@ -33,9 +33,6 @@ * Scratchie * * @author Andrey Balan - * - * - * */ public class ScratchieSession { @@ -47,6 +44,8 @@ private Scratchie scratchie; private Date sessionStartDate; private Date sessionEndDate; + //date when user has started activity (pressed start button) that has time limitation + private Date timeLimitLaunchedDate; // finish or not private int status; // scratchie Items @@ -84,7 +83,19 @@ /** * + * @return + */ + public Date getTimeLimitLaunchedDate() { + return timeLimitLaunchedDate; + } + + public void setTimeLimitLaunchedDate(Date timeLimitLaunchedDate) { + this.timeLimitLaunchedDate = timeLimitLaunchedDate; + } + + /** * + * * @return */ public Date getSessionStartDate() { Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieUser.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieUser.java,v diff -u -r1.9.2.3 -r1.9.2.4 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieUser.java 11 May 2016 07:38:00 -0000 1.9.2.3 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/model/ScratchieUser.java 6 Dec 2016 09:02:25 -0000 1.9.2.4 @@ -32,9 +32,6 @@ * Scratchie * * @author Andrey Balan - * - * - * */ public class ScratchieUser implements Cloneable, Comparable { private static final long serialVersionUID = -7043502180037866257L; Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java,v diff -u -r1.29.2.6 -r1.29.2.7 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java 7 Nov 2016 12:30:40 -0000 1.29.2.6 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/IScratchieService.java 6 Dec 2016 09:02:25 -0000 1.29.2.7 @@ -43,6 +43,7 @@ import org.lamsfoundation.lams.tool.scratchie.model.ScratchieSession; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieUser; import org.lamsfoundation.lams.util.ExcelCell; +import org.quartz.SchedulerException; /** * Interface that defines the contract that all ShareScratchie service provider must follow. @@ -66,6 +67,14 @@ * @param toolSessionId */ ScratchieUser checkLeaderSelectToolForSessionLeader(ScratchieUser user, Long toolSessionId); + + /** + * Stores date when user has started activity with time limit. + * + * @param sessionId + * @throws SchedulerException + */ + void launchTimeLimit(Long sessionId) throws SchedulerException; List getBurningQuestionsBySession(Long sessionId); Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java,v diff -u -r1.51.2.24 -r1.51.2.25 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java 7 Nov 2016 12:30:40 -0000 1.51.2.24 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/service/ScratchieServiceImpl.java 6 Dec 2016 09:02:25 -0000 1.51.2.25 @@ -28,8 +28,10 @@ import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; +import java.util.Calendar; import java.util.Collection; import java.util.Date; +import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; @@ -39,6 +41,7 @@ import java.util.Map; import java.util.Set; import java.util.SortedMap; +import java.util.TimeZone; import java.util.TreeSet; import org.apache.commons.lang.StringEscapeUtils; @@ -87,6 +90,7 @@ import org.lamsfoundation.lams.tool.scratchie.model.ScratchieItem; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieSession; import org.lamsfoundation.lams.tool.scratchie.model.ScratchieUser; +import org.lamsfoundation.lams.tool.scratchie.util.FinishScratchingJob; import org.lamsfoundation.lams.tool.scratchie.util.ScratchieAnswerComparator; import org.lamsfoundation.lams.tool.scratchie.util.ScratchieItemComparator; import org.lamsfoundation.lams.tool.scratchie.util.ScratchieToolContentHandler; @@ -99,6 +103,12 @@ import org.lamsfoundation.lams.util.JsonUtil; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.audit.IAuditService; +import org.quartz.JobBuilder; +import org.quartz.JobDetail; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.Trigger; +import org.quartz.TriggerBuilder; /** * @author Andrey Balan @@ -149,6 +159,8 @@ private IEventNotificationService eventNotificationService; private ScratchieOutputFactory scratchieOutputFactory; + + private Scheduler scheduler; // ******************************************************************************* // Service method @@ -256,6 +268,39 @@ } return leader; } + + @Override + public void launchTimeLimit(Long sessionId) throws SchedulerException { + ScratchieSession session = getScratchieSessionBySessionId(sessionId); + int timeLimit = session.getScratchie().getTimeLimit(); + if (timeLimit == 0) { + return; + } + + //store timeLimitLaunchedDate into DB + Date timeLimitLaunchedDate = new Date(); + session.setTimeLimitLaunchedDate(timeLimitLaunchedDate); + scratchieSessionDao.saveObject(session); + + //calculate timeLimit finish date + Calendar timeLimitFinishDate = new GregorianCalendar(TimeZone.getDefault()); + timeLimitFinishDate.setTime(timeLimitLaunchedDate); + timeLimitFinishDate.add(Calendar.MINUTE, timeLimit); + //adding 5 extra seconds to let leader auto-submit results and store them in DB + timeLimitFinishDate.add(Calendar.SECOND, 5); + + //start quartz job to notify non-leaders time is over + JobDetail finishScratchingJob = JobBuilder.newJob(FinishScratchingJob.class) + .withIdentity("finishScratching:" + sessionId) + .withDescription("Group name: " + session.getSessionName()) + .usingJobData("toolSessionId", sessionId).build(); + + Trigger fnishScratchingTrigger = TriggerBuilder.newTrigger() + .withIdentity("fnishScratchingTrigger:" + sessionId) + .startAt(timeLimitFinishDate.getTime()).build(); + + scheduler.scheduleJob(finishScratchingJob, fnishScratchingTrigger); + } @Override public void changeUserMark(Long userId, Long sessionId, Integer newMark) { @@ -2044,6 +2089,14 @@ public void setScratchieOutputFactory(ScratchieOutputFactory scratchieOutputFactory) { this.scratchieOutputFactory = scratchieOutputFactory; } + + /** + * @param scheduler + * The scheduler to set. + */ + public void setScheduler(Scheduler scheduler) { + this.scheduler = scheduler; + } // ****************** REST methods ************************* Fisheye: Tag 1.1 refers to a dead (removed) revision in file `lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/util/FinishScratchingJob.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningAction.java =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningAction.java,v diff -u -r1.44.2.16 -r1.44.2.17 --- lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningAction.java 7 Nov 2016 12:30:40 -0000 1.44.2.16 +++ lams_tool_scratchie/src/java/org/lamsfoundation/lams/tool/scratchie/web/action/LearningAction.java 6 Dec 2016 09:02:25 -0000 1.44.2.17 @@ -72,6 +72,7 @@ import org.lamsfoundation.lams.web.session.SessionManager; import org.lamsfoundation.lams.web.util.AttributeNames; import org.lamsfoundation.lams.web.util.SessionMap; +import org.quartz.SchedulerException; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; @@ -87,7 +88,7 @@ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) - throws IOException, ServletException, JSONException, ScratchieApplicationException { + throws IOException, ServletException, JSONException, ScratchieApplicationException, SchedulerException { String param = mapping.getParameter(); // -----------------------Scratchie Learner function --------------------------- @@ -97,6 +98,9 @@ if (param.equals("recordItemScratched")) { return recordItemScratched(mapping, form, request, response); } + if (param.equals("launchTimeLimit")) { + return launchTimeLimit(mapping, form, request, response); + } if (param.equals("finish")) { return finish(mapping, form, request, response); } @@ -176,6 +180,30 @@ return mapping.findForward("waitforleader"); } + // forwards to the waitForLeader time limit pages + if (!mode.isTeacher()) { + boolean isNonLeader = !user.getUserId().equals(groupLeader.getUserId()); + if (isNonLeader && scratchie.getTimeLimit() != 0 && !user.isSessionFinished()) { + + //show waitForLeaderLaunchTimeLimit page if the leader hasn't started activity or hasn't pressed OK button to launch time limit + if (toolSession.getTimeLimitLaunchedDate() == null) { + request.setAttribute(ScratchieConstants.ATTR_WAITING_MESSAGE_KEY, "label.waiting.for.leader.launch.time.limit"); + return mapping.findForward("waitForLeaderTimeLimit"); + } + + // check if the time limit is exceeded + boolean isTimeLimitExceeded = toolSession.getTimeLimitLaunchedDate().getTime() + + scratchie.getTimeLimit() * 60000 < System.currentTimeMillis(); + + // if the time is up and leader hasn't submitted response (as there will be a little delay between time + // is up and scratching is finished) - show waitForLeaderFinish page + if (isTimeLimitExceeded && !toolSession.isScratchingFinished()) { + request.setAttribute(ScratchieConstants.ATTR_WAITING_MESSAGE_KEY, "label.waiting.for.leader.finish"); + return mapping.findForward("waitForLeaderTimeLimit"); + } + } + } + // initial Session Map SessionMap sessionMap = new SessionMap(); request.getSession().setAttribute(sessionMap.getSessionID(), sessionMap); @@ -306,24 +334,40 @@ redirect.addParameter(ScratchieConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); return redirect; - // show leader notebook page + // show leader notebook page } else if (isUserLeader && isScratchingFinished && isWaitingForLeaderToSubmitNotebook) { ActionRedirect redirect = new ActionRedirect(mapping.findForwardConfig("newReflection")); redirect.addParameter(ScratchieConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); redirect.addParameter(AttributeNames.ATTR_MODE, mode); return redirect; - // show results page + // show results page } else if (isShowResults) { ActionRedirect redirect = new ActionRedirect(mapping.findForwardConfig("showResults")); redirect.addParameter(ScratchieConstants.ATTR_SESSION_MAP_ID, sessionMap.getSessionID()); redirect.addParameter(AttributeNames.ATTR_MODE, mode); return redirect; - // show learning.jsp page + // show learning.jsp page } else { + // time limit feature + boolean isTimeLimitEnabled = isUserLeader && !isScratchingFinished && scratchie.getTimeLimit() != 0; + boolean isTimeLimitNotLaunched = toolSession.getTimeLimitLaunchedDate() == null; + long secondsLeft = 1; + if (isTimeLimitEnabled) { + // if user has pressed OK button already - calculate remaining time, and full time otherwise + secondsLeft = isTimeLimitNotLaunched ? scratchie.getTimeLimit() * 60 + : scratchie.getTimeLimit() * 60 + - (System.currentTimeMillis() - toolSession.getTimeLimitLaunchedDate().getTime()) / 1000; + // change negative number or zero to 1 so it can autosubmit results + secondsLeft = Math.max(1, secondsLeft); + } + request.setAttribute(ScratchieConstants.ATTR_IS_TIME_LIMIT_ENABLED, isTimeLimitEnabled); + request.setAttribute(ScratchieConstants.ATTR_IS_TIME_LIMIT_NOT_LAUNCHED, isTimeLimitNotLaunched); + request.setAttribute(ScratchieConstants.ATTR_SECONDS_LEFT, secondsLeft); + // make non leaders also wait for burning questions submit isWaitingForLeaderToSubmitNotebook |= isWaitingForLeaderToSubmitBurningQuestions; @@ -351,7 +395,7 @@ ScratchieSession toolSession = service.getScratchieSessionBySessionId(toolSessionId); - ScratchieUser leader = this.getCurrentUser(toolSessionId); + ScratchieUser leader = getCurrentUser(toolSessionId); // only leader is allowed to scratch answers if (!toolSession.isUserGroupLeader(leader.getUid())) { return null; @@ -386,7 +430,32 @@ return null; } + + /** + * Stores date when user has started activity with time limit + * @throws ScratchieApplicationException + * @throws SchedulerException + */ + private ActionForward launchTimeLimit(ActionMapping mapping, ActionForm form, HttpServletRequest request, + HttpServletResponse response) throws ScratchieApplicationException, SchedulerException { + initializeScratchieService(); + String sessionMapID = WebUtil.readStrParam(request, ScratchieConstants.ATTR_SESSION_MAP_ID); + SessionMap sessionMap = (SessionMap) request.getSession() + .getAttribute(sessionMapID); + final Long toolSessionId = (Long) sessionMap.get(AttributeNames.PARAM_TOOL_SESSION_ID); + ScratchieSession toolSession = service.getScratchieSessionBySessionId(toolSessionId); + + ScratchieUser leader = getCurrentUser(toolSessionId); + // only leader is allowed to launch time limit + if (!toolSession.isUserGroupLeader(leader.getUid())) { + return null; + } + + service.launchTimeLimit(toolSessionId); + return null; + } + /** * Displays results page. When leader gets to this page, scratchingFinished column is set to true for all users. * Index: lams_tool_scratchie/web/WEB-INF/struts-config.xml =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/web/WEB-INF/Attic/struts-config.xml,v diff -u -r1.1.2.2 -r1.1.2.3 --- lams_tool_scratchie/web/WEB-INF/struts-config.xml 7 Nov 2016 12:47:02 -0000 1.1.2.2 +++ lams_tool_scratchie/web/WEB-INF/struts-config.xml 6 Dec 2016 09:02:25 -0000 1.1.2.3 @@ -205,6 +205,7 @@ parameter="start" > + @@ -215,6 +216,10 @@ type="org.lamsfoundation.lams.tool.scratchie.web.action.LearningAction" parameter="recordItemScratched" > + + Index: lams_tool_scratchie/web/pages/learning/learning.jsp =================================================================== RCS file: /usr/local/cvsroot/lams_tool_scratchie/web/pages/learning/learning.jsp,v diff -u -r1.18.2.9 -r1.18.2.10 --- lams_tool_scratchie/web/pages/learning/learning.jsp 7 Nov 2016 16:52:32 -0000 1.18.2.9 +++ lams_tool_scratchie/web/pages/learning/learning.jsp 6 Dec 2016 09:02:25 -0000 1.18.2.10 @@ -69,20 +69,38 @@ } //time limit feature - + $(document).ready(function(){ - //show confirmation dialog - $.blockUI({ - message: $('#timelimit-start-dialog'), - css: { width: '325px', height: '120px'}, - overlayCSS: { opacity: '.98'} - }); + + //show timelimit-start-dialog in order to start countdown + if (${isTimeLimitNotLaunched}) { - //once OK button pressed start countdown - $('#timelimit-start-ok').click(function() { - $.unblockUI(); - displayCountdown(); - }); + //show confirmation dialog + $.blockUI({ + message: $('#timelimit-start-dialog'), + css: { width: '325px', height: '120px'}, + overlayCSS: { opacity: '.98'} + }); + + //once OK button pressed start countdown + $('#timelimit-start-ok').click(function() { + + //store date when user has started activity with time limit + $.ajax({ + async: true, + url: '', + data: 'sessionMapID=${sessionMapID}', + type: 'post' + }); + + $.unblockUI(); + displayCountdown(); + }); + + } else { + displayCountdown(); + } + }); function displayCountdown(){ @@ -103,14 +121,14 @@ }); $('#countdown').countdown({ - until: '+${scratchie.timeLimit * 60}S', + until: '+${secondsLeft}S', format: 'hMS', compact: true, onTick: function(periods) { //check for 30 seconds if ((periods[4] == 0) && (periods[5] == 0) && (periods[6] <= 30)) { $('#countdown').css('color', '#FF3333'); - } + } }, onExpiry: function(periods) { $.blockUI({ message: '

' }); Fisheye: Tag 1.1 refers to a dead (removed) revision in file `lams_tool_scratchie/web/pages/learning/waitForLeaderTimeLimit.jsp'. Fisheye: No comparison available. Pass `N' to diff?