Index: lams_bb_integration/WEB-INF/bb-manifest.xml =================================================================== diff -u -rd3e34164d824f21be08f1d26e4b991eacfa82b32 -r615a2ef7e23ebd72fd36a62324e12a82fe2e1ac1 --- lams_bb_integration/WEB-INF/bb-manifest.xml (.../bb-manifest.xml) (revision d3e34164d824f21be08f1d26e4b991eacfa82b32) +++ lams_bb_integration/WEB-INF/bb-manifest.xml (.../bb-manifest.xml) (revision 615a2ef7e23ebd72fd36a62324e12a82fe2e1ac1) @@ -25,9 +25,9 @@ - - - + + + Index: lams_bb_integration/WEB-INF/tlds/c.tld =================================================================== diff -u --- lams_bb_integration/WEB-INF/tlds/c.tld (revision 0) +++ lams_bb_integration/WEB-INF/tlds/c.tld (revision 615a2ef7e23ebd72fd36a62324e12a82fe2e1ac1) @@ -0,0 +1,563 @@ + + + + + JSTL 1.1 core library + JSTL core + 1.1 + c + http://java.sun.com/jsp/jstl/core + + + + Provides core validation features for JSTL tags. + + + org.apache.taglibs.standard.tlv.JstlCoreTLV + + + + + + Catches any Throwable that occurs in its body and optionally + exposes it. + + catch + org.apache.taglibs.standard.tag.common.core.CatchTag + JSP + + +Name of the exported scoped variable for the +exception thrown from a nested action. The type of the +scoped variable is the type of the exception thrown. + + var + false + false + + + + + + Simple conditional tag that establishes a context for + mutually exclusive conditional operations, marked by + <when> and <otherwise> + + choose + org.apache.taglibs.standard.tag.common.core.ChooseTag + JSP + + + + + Simple conditional tag, which evalutes its body if the + supplied condition is true and optionally exposes a Boolean + scripting variable representing the evaluation of this condition + + if + org.apache.taglibs.standard.tag.rt.core.IfTag + JSP + + +The test condition that determines whether or +not the body content should be processed. + + test + true + true + boolean + + + +Name of the exported scoped variable for the +resulting value of the test condition. The type +of the scoped variable is Boolean. + + var + false + false + + + +Scope for var. + + scope + false + false + + + + + + Retrieves an absolute or relative URL and exposes its contents + to either the page, a String in 'var', or a Reader in 'varReader'. + + import + org.apache.taglibs.standard.tag.rt.core.ImportTag + org.apache.taglibs.standard.tei.ImportTEI + JSP + + +The URL of the assessment to import. + + url + true + true + + + +Name of the exported scoped variable for the +assessment's content. The type of the scoped +variable is String. + + var + false + false + + + +Scope for var. + + scope + false + false + + + +Name of the exported scoped variable for the +assessment's content. The type of the scoped +variable is Reader. + + varReader + false + false + + + +Name of the context when accessing a relative +URL assessment that belongs to a foreign +context. + + context + false + true + + + +Character encoding of the content at the input +assessment. + + charEncoding + false + true + + + + + + The basic iteration tag, accepting many different + collection types and supporting subsetting and other + functionality + + forEach + org.apache.taglibs.standard.tag.rt.core.ForEachTag + org.apache.taglibs.standard.tei.ForEachTEI + JSP + + +Collection of items to iterate over. + + items + false + true + java.lang.Object + + + +If items specified: +Iteration begins at the item located at the +specified index. First item of the collection has +index 0. +If items not specified: +Iteration begins with index set at the value +specified. + + begin + false + true + int + + + +If items specified: +Iteration ends at the item located at the +specified index (inclusive). +If items not specified: +Iteration ends when index reaches the value +specified. + + end + false + true + int + + + +Iteration will only process every step items of +the collection, starting with the first one. + + step + false + true + int + + + +Name of the exported scoped variable for the +current item of the iteration. This scoped +variable has nested visibility. Its type depends +on the object of the underlying collection. + + var + false + false + + + +Name of the exported scoped variable for the +status of the iteration. Object exported is of type +javax.servlet.jsp.jstl.core.LoopTagStatus. This scoped variable has nested +visibility. + + varStatus + false + false + + + + + + Iterates over tokens, separated by the supplied delimeters + + forTokens + org.apache.taglibs.standard.tag.rt.core.ForTokensTag + JSP + + +String of tokens to iterate over. + + items + true + true + java.lang.String + + + +The set of delimiters (the characters that +separate the tokens in the string). + + delims + true + true + java.lang.String + + + +Iteration begins at the token located at the +specified index. First token has index 0. + + begin + false + true + int + + + +Iteration ends at the token located at the +specified index (inclusive). + + end + false + true + int + + + +Iteration will only process every step tokens +of the string, starting with the first one. + + step + false + true + int + + + +Name of the exported scoped variable for the +current item of the iteration. This scoped +variable has nested visibility. + + var + false + false + + + +Name of the exported scoped variable for the +status of the iteration. Object exported is of +type +javax.servlet.jsp.jstl.core.LoopTag +Status. This scoped variable has nested +visibility. + + varStatus + false + false + + + + + + Like <%= ... >, but for expressions. + + out + org.apache.taglibs.standard.tag.rt.core.OutTag + JSP + + +Expression to be evaluated. + + value + true + true + + + +Default value if the resulting value is null. + + default + false + true + + + +Determines whether characters <,>,&,'," in the +resulting string should be converted to their +corresponding character entity codes. Default value is +true. + + escapeXml + false + true + + + + + + + Subtag of <choose> that follows <when> tags + and runs only if all of the prior conditions evaluated to + 'false' + + otherwise + org.apache.taglibs.standard.tag.common.core.OtherwiseTag + JSP + + + + + Adds a parameter to a containing 'import' tag's URL. + + param + org.apache.taglibs.standard.tag.rt.core.ParamTag + JSP + + +Name of the query string parameter. + + name + true + true + + + +Value of the parameter. + + value + false + true + + + + + + Redirects to a new URL. + + redirect + org.apache.taglibs.standard.tag.rt.core.RedirectTag + JSP + + +The URL of the assessment to redirect to. + + url + false + true + + + +Name of the context when redirecting to a relative URL +assessment that belongs to a foreign context. + + context + false + true + + + + + + Removes a scoped variable (from a particular scope, if specified). + + remove + org.apache.taglibs.standard.tag.common.core.RemoveTag + empty + + +Name of the scoped variable to be removed. + + var + true + false + + + +Scope for var. + + scope + false + false + + + + + + Sets the result of an expression evaluation in a 'scope' + + set + org.apache.taglibs.standard.tag.rt.core.SetTag + JSP + + +Name of the exported scoped variable to hold the value +specified in the action. The type of the scoped variable is +whatever type the value expression evaluates to. + + var + false + false + + + +Expression to be evaluated. + + value + false + true + + + +Target object whose property will be set. Must evaluate to +a JavaBeans object with setter property property, or to a +java.util.Map object. + + target + false + true + + + +Name of the property to be set in the target object. + + property + false + true + + + +Scope for var. + + scope + false + false + + + + + + Creates a URL with optional query parameters. + + url + org.apache.taglibs.standard.tag.rt.core.UrlTag + JSP + + +Name of the exported scoped variable for the +processed url. The type of the scoped variable is +String. + + var + false + false + + + +Scope for var. + + scope + false + false + + + +URL to be processed. + + value + false + true + + + +Name of the context when specifying a relative URL +assessment that belongs to a foreign context. + + context + false + true + + + + + + Subtag of <choose> that includes its body if its + condition evalutes to 'true' + + when + org.apache.taglibs.standard.tag.rt.core.WhenTag + JSP + + +The test condition that determines whether or not the +body content should be processed. + + test + true + true + boolean + + + + Index: lams_bb_integration/WEB-INF/web.xml =================================================================== diff -u -rdcd309de058219ef41f76000936b9136eedb0d70 -r615a2ef7e23ebd72fd36a62324e12a82fe2e1ac1 --- lams_bb_integration/WEB-INF/web.xml (.../web.xml) (revision dcd309de058219ef41f76000936b9136eedb0d70) +++ lams_bb_integration/WEB-INF/web.xml (.../web.xml) (revision 615a2ef7e23ebd72fd36a62324e12a82fe2e1ac1) @@ -1,9 +1,4 @@ - - - - + UserDataServlet @@ -42,6 +37,10 @@ org.lamsfoundation.ld.integration.blackboard.GradebookSyncServlet + LessonManagerServlet + org.lamsfoundation.ld.integration.blackboard.LessonManagerServlet + + OpenLamsPageServlet org.lamsfoundation.ld.integration.blackboard.OpenLamsPageServlet @@ -50,10 +49,6 @@ org.lamsfoundation.ld.integration.blackboard.RenderDesignImageServlet - StartLessonServlet - org.lamsfoundation.ld.integration.blackboard.StartLessonServlet - - StartLessonAjaxServlet org.lamsfoundation.ld.integration.blackboard.StartLessonAjaxServlet @@ -97,6 +92,10 @@ GradebookSyncServlet /GradebookSync + + + LessonManagerServlet + /LessonManager OpenLamsPageServlet @@ -105,18 +104,21 @@ RenderDesignImageServlet /RenderImage - + - StartLessonServlet - /StartLessonServlet - - StartLessonAjaxServlet /StartLesson UpdateServerUrlServlet /UpdateServerUrl - + + + + /tags-core + /WEB-INF/tlds/c.tld + + + Index: lams_bb_integration/src/org/lamsfoundation/ld/integration/blackboard/LessonManagerServlet.java =================================================================== diff -u --- lams_bb_integration/src/org/lamsfoundation/ld/integration/blackboard/LessonManagerServlet.java (revision 0) +++ lams_bb_integration/src/org/lamsfoundation/ld/integration/blackboard/LessonManagerServlet.java (revision 615a2ef7e23ebd72fd36a62324e12a82fe2e1ac1) @@ -0,0 +1,301 @@ +package org.lamsfoundation.ld.integration.blackboard; +/**************************************************************** + * 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 + * **************************************************************** + */ + +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.parsers.ParserConfigurationException; + +import org.apache.log4j.Logger; +import org.lamsfoundation.ld.integration.util.BlackboardUtil; +import org.lamsfoundation.ld.integration.util.LamsSecurityUtil; +import org.lamsfoundation.ld.integration.util.LineitemUtil; +import org.xml.sax.SAXException; + +import blackboard.base.FormattedText; +import blackboard.base.InitializationException; +import blackboard.data.ValidationException; +import blackboard.data.content.Content; +import blackboard.data.content.CourseDocument; +import blackboard.data.course.Course; +import blackboard.data.user.User; +import blackboard.persist.BbPersistenceManager; +import blackboard.persist.Container; +import blackboard.persist.Id; +import blackboard.persist.PersistenceException; +import blackboard.persist.PkId; +import blackboard.persist.content.ContentDbLoader; +import blackboard.persist.content.ContentDbPersister; +import blackboard.persist.gradebook.LineitemDbPersister; +import blackboard.platform.BbServiceException; +import blackboard.platform.BbServiceManager; +import blackboard.platform.context.Context; +import blackboard.platform.context.ContextManager; +import blackboard.platform.persistence.PersistenceServiceFactory; +import blackboard.platform.plugin.PlugInException; +import blackboard.platform.plugin.PlugInUtil; +import blackboard.portal.data.ExtraInfo; +import blackboard.portal.data.PortalExtraInfo; +import blackboard.portal.servlet.PortalUtil; + +/** + * Launches LAMS pages: author, learner and monitor one. + */ +public class LessonManagerServlet extends HttpServlet { + + private static final long serialVersionUID = -351131323404991332L; + private static Logger logger = Logger.getLogger(LessonManagerServlet.class); + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + process(request, response); + } + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + process(request, response); + } + + private void process(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + // Authorise current user for Course Control Panel (automatic redirect) + try { + if (!PlugInUtil.authorizeForCourseControlPanel(request, response)) + return; + } catch (PlugInException e) { + throw new RuntimeException(e); + } + + ContextManager ctxMgr = null; + try { + // get Blackboard context + ctxMgr = (ContextManager) BbServiceManager.lookupService(ContextManager.class); + Context ctx = ctxMgr.getContext(); + + String method = request.getParameter("method"); + // -----------------------Assessment Author functions --------------------------- + if (method.equals("configureLessonStart")) { + configureLessonStart(request, response, ctx); + + } else if (method.equals("start")) { + start(request, response, ctx); + + } else if (method.equals("configureLessonModification")) { + configureLessonModification(request, response, ctx); + + } else if (method.equals("modify")) { + modify(request, response, ctx); + + } else if (method.equals("delete")) { + delete(request, response, ctx); + } + + } catch (InitializationException e) { + throw new ServletException(e); + } catch (BbServiceException e) { + throw new ServletException(e); + } catch (PersistenceException e) { + throw new ServletException(e); + } catch (ParseException e) { + throw new ServletException(e); + } catch (ValidationException e) { + throw new ServletException(e); + } catch (ParserConfigurationException e) { + throw new ServletException(e); + } catch (SAXException e) { + throw new ServletException(e); + } + +// // important. make sure context is not released as otherwise tag will throw an exception +// finally { +// if (ctxMgr != null) { +// ctxMgr.releaseContext(); +// } +// } + } + + /** + * Shows preparation page with available learning designs. Preview is available. + */ + private void configureLessonStart(HttpServletRequest request, HttpServletResponse response, Context ctx) + throws InitializationException, BbServiceException, PersistenceException, IOException, ServletException { + + String lamsServerUrl = LamsSecurityUtil.getServerAddress(); + request.setAttribute("lamsServerUrl", lamsServerUrl); + + // get all user accessible folders and LD descriptions as JSON + String learningDesigns = LamsSecurityUtil.getLearningDesigns(ctx, ctx.getCourse().getCourseId(), null); + request.setAttribute("learningDesigns", learningDesigns); + + request.getRequestDispatcher("/modules/create.jsp").forward(request, response); + } + + /** + * Starts preview lesson on LAMS server. Launches it. + */ + private void start(HttpServletRequest request, HttpServletResponse response, Context ctx) throws IOException, ServletException, PersistenceException, ParseException, ValidationException, ParserConfigurationException, SAXException { + + BbPersistenceManager bbPm = PersistenceServiceFactory.getInstance().getDbPersistenceManager(); + + //store newly created LAMS lesson + User user = ctx.getUser(); + BlackboardUtil.storeBlackboardContent(request, response, user); + + // constuct strReturnUrl + String courseIdStr = request.getParameter("course_id"); + String contentIdStr = request.getParameter("content_id"); + // internal Blackboard IDs for the course and parent content item + Id courseId = bbPm.generateId(Course.DATA_TYPE, courseIdStr); + Id folderId = bbPm.generateId(CourseDocument.DATA_TYPE, contentIdStr); + String returnUrl = PlugInUtil.getEditableContentReturnURL(folderId, courseId); + request.setAttribute("returnUrl", returnUrl); + + request.getRequestDispatcher("/modules/startLessonSuccess.jsp").forward(request, response); + } + + private void configureLessonModification(HttpServletRequest request, HttpServletResponse response, Context ctx) + throws InitializationException, BbServiceException, PersistenceException, IOException, ServletException { + + // retrive the LAMS lesson + BbPersistenceManager bbPm = PersistenceServiceFactory.getInstance().getDbPersistenceManager(); + Container bbContainer = bbPm.getContainer(); + Id contentId = new PkId(bbContainer, CourseDocument.DATA_TYPE, request.getParameter("content_id")); + ContentDbLoader courseDocumentLoader = (ContentDbLoader) bbPm.getLoader(ContentDbLoader.TYPE); + Content bbContent = (Content) courseDocumentLoader.loadById(contentId); + + // get LAMS lessons's properties + Calendar startDate = bbContent.getStartDate(); + Calendar endDate = bbContent.getEndDate(); + FormattedText description = bbContent.getBody(); + + request.setAttribute("bbContent", bbContent); + request.setAttribute("startDate", startDate); + request.setAttribute("endDate", endDate); + request.setAttribute("description", description); + + request.getRequestDispatcher("/modules/modify.jsp").forward(request, response); + } + + private void modify(HttpServletRequest request, HttpServletResponse response, Context ctx) + throws InitializationException, BbServiceException, PersistenceException, IOException, ValidationException, + ServletException, ParserConfigurationException, SAXException, ParseException { + + String courseIdStr = request.getParameter("course_id"); + String contentIdStr = request.getParameter("content_id"); + + // Retrieve the Db persistence manager from the persistence service + BbPersistenceManager bbPm = PersistenceServiceFactory.getInstance().getDbPersistenceManager(); + Container bbContainer = bbPm.getContainer(); + + // Internal Blackboard IDs for the course and parent content item + Id courseId = bbPm.generateId(Course.DATA_TYPE, courseIdStr); + Id contentId = new PkId( bbContainer, CourseDocument.DATA_TYPE, contentIdStr); + + // Load the content item + ContentDbLoader courseDocumentLoader = (ContentDbLoader) bbPm.getLoader( ContentDbLoader.TYPE ); + Content bbContent = (Content)courseDocumentLoader.loadById( contentId ); + + // Get the form parameters and convert into correct data types + // TODO: Use bb text area instead + String strTitle = request.getParameter("title").trim(); + String strDescription = request.getParameter("descriptiontext").trim(); + FormattedText description = new FormattedText(strDescription, FormattedText.Type.HTML); + + String strIsAvailable = request.getParameter("isAvailable"); + String strIsGradecenter = request.getParameter("isGradecenter"); + String strIsTracked = request.getParameter("isTracked"); + boolean isAvailable = strIsAvailable.equals("true")?true:false; + boolean isGradecenter = strIsGradecenter.equals("true")?true:false; + boolean isTracked = strIsTracked.equals("true")?true:false; + + String strStartDate = request.getParameter("lessonAvailability_start_datetime"); + String strEndDate = request.getParameter("lessonAvailability_end_datetime"); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Calendar startDate = Calendar.getInstance(); + Calendar endDate = Calendar.getInstance(); + startDate.setTime(formatter.parse(strStartDate)); + endDate.setTime(formatter.parse(strEndDate)); + + String strStartDateCheckbox = request.getParameter("lessonAvailability_start_checkbox"); + String strEndDateCheckbox = request.getParameter("lessonAvailability_end_checkbox"); + + //if teacher turned Gradecenter option ON (and it was OFF previously) - create lineitem + if (!bbContent.getIsDescribed() && isGradecenter) { + + String username = ctx.getUser().getUserName(); + LineitemUtil.createLineitem(bbContent, username); + + //if teacher turned Gradecenter option OFF (and it was ON previously) - remove lineitem + } else if (bbContent.getIsDescribed() && !isGradecenter) { + LineitemUtil.removeLineitem(contentIdStr, courseIdStr); + + //change existing lineitem's name if lesson name has been changed + } else if (isGradecenter && !strTitle.equals(bbContent.getTitle())) { + LineitemUtil.changeLineitemName(contentIdStr, courseIdStr, strTitle); + } + + // Set LAMS content data in Blackboard + bbContent.setTitle(strTitle); + bbContent.setIsAvailable(isAvailable); + bbContent.setIsDescribed(isGradecenter);//isDescribed field is used for storing isGradecenter parameter + bbContent.setIsTracked(isTracked); + bbContent.setBody(description); + + // Set Availability Dates + // Clear the date (set to null) if the checkbox is unchecked + // Start Date + if (strStartDateCheckbox != null){ + if (strStartDateCheckbox.equals("1")){ + bbContent.setStartDate(startDate); + } else { + bbContent.setStartDate(null); + } + } else { + bbContent.setStartDate(null); + } + // End Date + if (strEndDateCheckbox != null){ + if (strEndDateCheckbox.equals("1")){ + bbContent.setEndDate(endDate); + } else { + bbContent.setEndDate(null); + } + } else { + bbContent.setEndDate(null); + } + + //Persist the Modified Lesson Object in Blackboard + ContentDbPersister persister= (ContentDbPersister) bbPm.getPersister( ContentDbPersister.TYPE ); + persister.persist( bbContent ); + + String strReturnUrl = PlugInUtil.getEditableContentReturnURL(bbContent.getParentId(), courseId); + request.setAttribute("strReturnUrl", strReturnUrl); + + request.getRequestDispatcher("/modules/modifyLessonSuccess.jsp").forward(request, response); + } + +} Fisheye: Tag 615a2ef7e23ebd72fd36a62324e12a82fe2e1ac1 refers to a dead (removed) revision in file `lams_bb_integration/src/org/lamsfoundation/ld/integration/blackboard/StartLessonServlet.java'. Fisheye: No comparison available. Pass `N' to diff? Index: lams_bb_integration/web/modules/create.jsp =================================================================== diff -u -rdcd309de058219ef41f76000936b9136eedb0d70 -r615a2ef7e23ebd72fd36a62324e12a82fe2e1ac1 --- lams_bb_integration/web/modules/create.jsp (.../create.jsp) (revision dcd309de058219ef41f76000936b9136eedb0d70) +++ lams_bb_integration/web/modules/create.jsp (.../create.jsp) (revision 615a2ef7e23ebd72fd36a62324e12a82fe2e1ac1) @@ -1,17 +1,14 @@ - +<%@ page contentType="text/html; charset=utf-8" language="java"%> +<%@ page isELIgnored="false" %> + + <%-- - Original Version: 2007 LAMS Foundation - Updated for Blackboard 9.1 SP6 (including new bbNG tag library) 2011 - Richard Stals (www.stals.com.au) - Edith Cowan University, Western Australia ---%> -<%-- Step 1 For Creating a New LAMS Lesson Allows the user to (optionally) author a new LAMS lesson Then the user must select a LAMS lesson before proceeding to Step 2. Step 1 - create.jsp - Step 2 - /StartLessonServlet (StartLessonServlet.java) + Step 2 - /LessonManager?method=start --%> <%@ page import="blackboard.platform.plugin.PlugInUtil"%> <%@ page import="blackboard.platform.plugin.PlugInException"%> @@ -28,29 +25,14 @@ -<% - // Authorise current user for Course Control Panel (automatic redirect) - try{ - if (!PlugInUtil.authorizeForCourseControlPanel(request, response)) - return; - } catch(PlugInException e) { - throw new RuntimeException(e); - } - - String lamsServerUrl = LamsSecurityUtil.getServerAddress(); - - // get all user accessible folders and LD descriptions as JSON - String learningDesigns = LamsSecurityUtil.getLearningDesigns(ctx, ctx.getCourse().getCourseId(), null); -%> - - Index: lams_bb_integration/web/modules/modifyLessonSuccess.jsp =================================================================== diff -u --- lams_bb_integration/web/modules/modifyLessonSuccess.jsp (revision 0) +++ lams_bb_integration/web/modules/modifyLessonSuccess.jsp (revision 615a2ef7e23ebd72fd36a62324e12a82fe2e1ac1) @@ -0,0 +1,34 @@ +<%@ page contentType="text/html; charset=utf-8" language="java"%> +<%@ page isELIgnored="false" %> + + +<%-- + Step 2 For Modifing an existing LAMS Lesson + Process the data and persist to Blackboard + + Step 1 - modify.jsp + Step 2 - modify_proc.jsp +--%> +<%@ page errorPage="/error.jsp"%> +<%@ taglib uri="/bbNG" prefix="bbNG"%> + + + <%-- Breadcrumbs --%> + + + + + <%-- Page Header --%> + + + + + <%-- Receipt --%> + + Content successfully modified. + + + \ No newline at end of file Fisheye: Tag 615a2ef7e23ebd72fd36a62324e12a82fe2e1ac1 refers to a dead (removed) revision in file `lams_bb_integration/web/modules/modify_proc.jsp'. Fisheye: No comparison available. Pass `N' to diff?