Index: lams_build/lib/lams/lams-monitoring.jar =================================================================== diff -u -rc9c56707245e3ad1149bf1a5338eb251c96c75d2 -r13f28765828c265f82ca9f6e3206d686a16b3e10 Binary files differ Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/batch/PreviewCleanup.java =================================================================== diff -u --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/batch/PreviewCleanup.java (revision 0) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/batch/PreviewCleanup.java (revision 13f28765828c265f82ca9f6e3206d686a16b3e10) @@ -0,0 +1,51 @@ +package org.lamsfoundation.lams.monitoring.batch; + +import org.lamsfoundation.lams.monitoring.service.IMonitoringService; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +/** + * Clean up the old preview files. + * + * Removes all preview lessons and learning designs older than the supplied number of days. + * + * Errors are written to system.error. Results are written to system.out + * + */ +public class PreviewCleanup { + + private ApplicationContext appContext; + + public PreviewCleanup() { + String[] contextPath = new String[] { + "/org/lamsfoundation/lams/applicationContext.xml", + "/org/lamsfoundation/lams/lesson/lessonApplicationContext.xml", + "/org/lamsfoundation/lams/tool/toolApplicationContext.xml", + "/org/lamsfoundation/lams/learning/learningApplicationContext.xml", + "/org/lamsfoundation/lams/authoring/authoringApplicationContext.xml", + "/org/lamsfoundation/lams/monitoring/monitoringApplicationContext.xml", + "/org/lamsfoundation/lams/tool/survey/applicationContext.xml"}; + + appContext = new ClassPathXmlApplicationContext(contextPath); + } + + /** + * @param args + */ + public static void main(String[] args) { + PreviewCleanup pc = new PreviewCleanup(); + pc.cleanup(); + + } + + private void cleanup() { + IMonitoringService monitoringService = (IMonitoringService)appContext.getBean("monitoringService"); + + if ( monitoringService != null ) { + int numDeleted = monitoringService.deleteAllOldPreviewLessons(); + System.out.println("PreviewCleanup: "+numDeleted+" preview lessons deleted."); + } else { + System.err.println("PreviewCleanup: unable to clean out old sessions as monitoring service cannot be accessed. There is likely to be a problem with the Spring context."); + } + } +} Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java =================================================================== diff -u -rc9c56707245e3ad1149bf1a5338eb251c96c75d2 -r13f28765828c265f82ca9f6e3206d686a16b3e10 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision c9c56707245e3ad1149bf1a5338eb251c96c75d2) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/IMonitoringService.java (.../IMonitoringService.java) (revision 13f28765828c265f82ca9f6e3206d686a16b3e10) @@ -424,12 +424,11 @@ public abstract void deletePreviewLesson(long lessonID); /** - * Remove all the "old" preview lessons. Removes all preview lessons older than numDays old. - * - * @param numDays Delete any preview lessons older than numDays + * Remove all the "old" preview lessons. Removes all preview lessons older than + * the number of days specified in the configuration file. * @return number of lessons deleted. */ - public abstract int deleteAllOldPreviewLessons(int numDays); + public abstract int deleteAllOldPreviewLessons(); /* TODO Dummy methods - to be removed */ public List getOrganisationsUsers(Integer userId); Index: lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java =================================================================== diff -u -rfe1357c8a7b5215967bb22c5f19fbb9788148bf9 -r13f28765828c265f82ca9f6e3206d686a16b3e10 --- lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision fe1357c8a7b5215967bb22c5f19fbb9788148bf9) +++ lams_monitoring/src/java/org/lamsfoundation/lams/monitoring/service/MonitoringService.java (.../MonitoringService.java) (revision 13f28765828c265f82ca9f6e3206d686a16b3e10) @@ -74,6 +74,8 @@ import org.lamsfoundation.lams.usermanagement.dao.IWorkspaceFolderDAO; import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; +import org.lamsfoundation.lams.util.Configuration; +import org.lamsfoundation.lams.util.ConfigurationKeys; import org.lamsfoundation.lams.util.MessageService; import org.lamsfoundation.lams.util.WebUtil; import org.lamsfoundation.lams.util.wddx.FlashMessage; @@ -132,7 +134,7 @@ //--------------------------------------------------------------------- // Inversion of Control Methods - Method injection //--------------------------------------------------------------------- - /** + /** * @param messageService the i18n Service bean. */ public void setMessageService(MessageService messageService) { @@ -278,7 +280,7 @@ destinationFolder = originalLearningDesign.getWorkspaceFolder(); } - return initializeLessonForPreview(lessonName, lessonDescription, originalLearningDesign, user, LearningDesign.COPY_TYPE_LESSON, destinationFolder); + return initializeLesson(lessonName, lessonDescription, originalLearningDesign, user, LearningDesign.COPY_TYPE_LESSON, destinationFolder); } @@ -298,10 +300,10 @@ } User user = (userID != null ? userManagementService.getUserById(userID) : null); - return initializeLessonForPreview(lessonName, lessonDescription, originalLearningDesign, user, LearningDesign.COPY_TYPE_PREVIEW, null); + return initializeLesson(lessonName, lessonDescription, originalLearningDesign, user, LearningDesign.COPY_TYPE_PREVIEW, null); } - public Lesson initializeLessonForPreview(String lessonName, + public Lesson initializeLesson(String lessonName, String lessonDescription, LearningDesign originalLearningDesign, User user, @@ -1551,7 +1553,26 @@ Lesson lesson = lessonDAO.getLesson(new Long(lessonID)); if ( lesson != null ) { if ( lesson.getLearningDesign().getCopyTypeID() != null && - LearningDesign.COPY_TYPE_PREVIEW == lesson.getLearningDesign().getCopyTypeID().intValue() ) { + LearningDesign.COPY_TYPE_PREVIEW == lesson.getLearningDesign().getCopyTypeID().intValue() ) { + + // get all the tool sessions for this lesson and remove all the tool session data + List toolSessions = lamsCoreToolService.getToolSessionsByLesson(lesson); + if ( toolSessions != null && toolSessions.size() > 0 ) { + Iterator iter = toolSessions.iterator(); + while ( iter.hasNext() ) { + ToolSession toolSession = (ToolSession) iter.next(); + lamsCoreToolService.deleteToolSession(toolSession); + } + } else { + log.debug("deletePreviewLesson: Removing tool sessions - none exist"); + } + + + // get the learning design for this lesson + LearningDesign ld = lesson.getLearningDesign(); + authoringService.deleteLearningDesign(ld); + + // remove the lesson. deleteLesson(lesson); } else { log.warn("Unable to delete lesson as lesson is not a preview lesson. Learning design copy type was "+lesson.getLearningDesign().getCopyTypeID()); @@ -1560,17 +1581,23 @@ } /* (non-Javadoc) - * @see org.lamsfoundation.lams.preview.service.IPreviewService#deleteAllOldPreviewLessons(int) + * @see org.lamsfoundation.lams.preview.service.IMonitoringService#deleteAllOldPreviewLessons(int) */ - public int deleteAllOldPreviewLessons(int numDays) { + public int deleteAllOldPreviewLessons() { + int numDays = Configuration.getAsInt(ConfigurationKeys.PREVIEW_CLEANUP_NUM_DAYS); + // Contract checking if ( numDays <= 0 ) { - log.error("deleteAllOldPreviewSessions: number of days invalid ("+numDays+"). Unable to delete any preview lessons"); + log.error("deleteAllOldPreviewSessions: number of days invalid (" + +numDays + +"). See configuration file (option " + +ConfigurationKeys.PREVIEW_CLEANUP_NUM_DAYS + +" Unable to delete any preview lessons"); return 0; } - int numDeleted = 0; + int numDeleted = 0; // calculate comparison date long newestDateToKeep = System.currentTimeMillis() - ( numDays * numMilliSecondsInADay); Index: lams_monitoring/test/java/org/lamsfoundation/lams/monitoring/service/TestMonitoringService.java =================================================================== diff -u -rc9c56707245e3ad1149bf1a5338eb251c96c75d2 -r13f28765828c265f82ca9f6e3206d686a16b3e10 --- lams_monitoring/test/java/org/lamsfoundation/lams/monitoring/service/TestMonitoringService.java (.../TestMonitoringService.java) (revision c9c56707245e3ad1149bf1a5338eb251c96c75d2) +++ lams_monitoring/test/java/org/lamsfoundation/lams/monitoring/service/TestMonitoringService.java (.../TestMonitoringService.java) (revision 13f28765828c265f82ca9f6e3206d686a16b3e10) @@ -21,6 +21,9 @@ package org.lamsfoundation.lams.monitoring.service; import java.io.IOException; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; import java.util.LinkedList; import javax.sql.DataSource; @@ -39,6 +42,8 @@ import org.lamsfoundation.lams.usermanagement.User; import org.lamsfoundation.lams.usermanagement.exception.UserAccessDeniedException; import org.lamsfoundation.lams.usermanagement.service.IUserManagementService; +import org.lamsfoundation.lams.util.Configuration; +import org.lamsfoundation.lams.util.ConfigurationKeys; import org.springframework.jdbc.core.JdbcTemplate; @@ -63,11 +68,12 @@ private final Integer TEST_LEARNER_ID = new Integer(2); private final Integer TEST_STAFF_ID = new Integer(3); // values when demo'ing the progress engine - private final long TEST_LEARNING_DESIGN_ID = 2; - private final long TEST_COPIED_LEARNING_DESIGN_ID = 3; + // private final long TEST_LEARNING_DESIGN_ID = 3; + // private final long TEST_COPIED_LEARNING_DESIGN_ID = 4; // values when testing the progress engine - //private final long TEST_LEARNING_DESIGN_ID = 1; - //private final long TEST_COPIED_LEARNING_DESIGN_ID = 2; + private final long TEST_LEARNING_DESIGN_ID = 1; + private final long TEST_LEARNING_DESIGN_SURVEY_ONLY_ID = 2; + private final long TEST_COPIED_LEARNING_DESIGN_ID = 3; private final Integer TEST_ORGANIZATION_ID = new Integer(1); private final Long TEST_SCHEDULE_GATE_ID = new Long(27); private final Long TEST_LESSION_ID = new Long(1); // "Test_Lesson" from insert_test_data script @@ -276,6 +282,7 @@ testLearner = usermanageService.getUserById(TEST_LEARNER_ID); testOrganisation = usermanageService.getOrganisationById(TEST_ORGANIZATION_ID); } + public void testGetActivityContributionURL() throws IOException{ String packet = monitoringService.getActivityContributionURL(new Long(29)); System.out.println(packet); @@ -332,7 +339,7 @@ private Lesson startLesson(String testName, String testDesc) { try { - Lesson previewLesson = monitoringService.initializeLessonForPreview(testName,testDesc,TEST_LEARNING_DESIGN_ID,TEST_USER_ID); + Lesson previewLesson = monitoringService.initializeLessonForPreview(testName,testDesc,TEST_LEARNING_DESIGN_SURVEY_ONLY_ID,TEST_USER_ID); assertNotNull("Lesson created",previewLesson); assertNotNull("Lesson has been saved - an id exists", previewLesson.getLessonId()); @@ -366,11 +373,27 @@ /* * Test method for 'org.lamsfoundation.lams.preview.service.PreviewService.deleteAllOldPreviewLessons(int)' - * Can't really test this properly - can't tell if deleted or not. Can only test that it doesn't fail */ public void testDeleteAllOldPreviewLessons() { - int lessonsDeleted = monitoringService.deleteAllOldPreviewLessons(1); - assertTrue("deleteAllOldPreviewLessons returns 0 or more", lessonsDeleted>=0); + // need to dummy up something to delete. Create a lesson and force it to be over 7 days old. + String testName = "LESSON TO DELETE By BATCH"; + String testDesc = "TO BE DELETED BY THE BATCH CALL"; + Lesson lesson = startLesson(testName, testDesc); + Long lessonId = lesson.getLessonId(); + + int numDays = Configuration.getAsInt(ConfigurationKeys.PREVIEW_CLEANUP_NUM_DAYS); + assertTrue("Number of days till the cleanup should be deleted is greater than zero (value is "+numDays+")", numDays > 0); + + //Configuration. + Calendar calendar = new GregorianCalendar(); + calendar.setTime(new Date()); + calendar.add(Calendar.DAY_OF_MONTH, -8); + lesson.setStartDateTime(calendar.getTime()); + int lessonsDeleted = monitoringService.deleteAllOldPreviewLessons(); + assertTrue("deleteAllOldPreviewLessons returns at least 1 lesson", lessonsDeleted>=1); + + Lesson deletedLesson = lessonDao.getLesson(lessonId); + assertNull("Batch deleted lesson cannot be found",deletedLesson); } }