You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2017/02/20 15:43:50 UTC

svn commit: r1783779 - in /openmeetings/application: branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/ branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ branches/3.2.x/openmeetings-...

Author: solomax
Date: Mon Feb 20 15:43:49 2017
New Revision: 1783779

URL: http://svn.apache.org/viewvc?rev=1783779&view=rev
Log:
[OPENMEETINGS-1570] room video conversion should be fixed, room clean-up is added

Modified:
    openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
    openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
    openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
    openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
    openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java
    openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
    openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
    openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
    openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
    openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java
    openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml

Modified: openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java Mon Feb 20 15:43:49 2017
@@ -60,14 +60,14 @@ public class FileProcessor {
 	//FIXME TODO this method need to be refactored to throw exceptions
 	public ConverterProcessResultList processFile(Long userId, FileExplorerItem f, InputStream is) throws Exception {
 		ConverterProcessResultList returnError = new ConverterProcessResultList();
-		
+
 		// Generate a random string to prevent any problems with
 		// foreign characters and duplicates
 		String hash = UUID.randomUUID().toString();
 
 		String ext = getFileExt(f.getName());
 		log.debug("file extension: " + ext);
-		StoredFile storedFile = new StoredFile(hash, ext); 
+		StoredFile storedFile = new StoredFile(hash, ext);
 
 		// Check variable to see if this file is a presentation
 		// check if this is a a file that can be converted by
@@ -109,7 +109,7 @@ public class FileProcessor {
 		}
 		FileUtils.copyInputStreamToFile(is, file);
 
-		
+
 		log.debug("canBeConverted: " + canBeConverted);
 		if (canBeConverted || isPdf) {
 			// convert to pdf, thumbs, swf and xml-description
@@ -125,18 +125,18 @@ public class FileProcessor {
 			returnError.addItem("processThumb", processThumb);
 		} else if (isVideo) {
 			List<ConverterProcessResult> returnList = flvExplorerConverter.convertToMP4(f, ext);
-			
+
 			int i = 0;
 			for (ConverterProcessResult returnMap : returnList) {
-				returnError.addItem("processFLV " + i, returnMap);
+				returnError.addItem("processVideo " + i++, returnMap);
 			}
 		}
-		
+
 		// has to happen at the end, otherwise it will be overwritten
 		//cause the variable is new initialized
 		returnError.setCompleteName(file.getName());
 		returnError.setFileItemId(f.getId());
-		
+
 		return returnError;
 	}
 }

Modified: openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java Mon Feb 20 15:43:49 2017
@@ -56,9 +56,9 @@ import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
- * 
+ *
  * @author swagner
- * 
+ *
  */
 public class ConferenceLibrary implements IPendingServiceCallback {
 	private static final Logger log = Red5LoggerFactory.getLogger(ConferenceLibrary.class, webAppRootKey);
@@ -102,9 +102,9 @@ public class ConferenceLibrary implement
 	}
 
 	/**
-	 * 
+	 *
 	 * Save an Object to the library and returns the file-explorer Id
-	 * 
+	 *
 	 * @param sid
 	 * @param roomId
 	 * @param fileName
@@ -140,7 +140,7 @@ public class ConferenceLibrary implement
 	/**
 	 * Loads a Object from the library into the whiteboard of all participant of
 	 * the current room
-	 * 
+	 *
 	 * @param uid - uid of the client performing operation
 	 * @param wbId - id of whiteboard
 	 * @param fi - FileItem of the Wml being loaded
@@ -185,9 +185,9 @@ public class ConferenceLibrary implement
 	}
 
 	/**
-	 * 
+	 *
 	 * Loads a chart object
-	 * 
+	 *
 	 * @param sid
 	 * @param room_id
 	 * @param fileName
@@ -229,7 +229,7 @@ public class ConferenceLibrary implement
 
 					File target = new File(targetFolder, mp4.getName());
 					if (mp4.exists() && !target.exists()) {
-						FileUtils.copyFile(mp4, target);
+						FileUtils.copyFile(mp4, target, false);
 					}
 					return 1L;
 				}

Modified: openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java Mon Feb 20 15:43:49 2017
@@ -19,14 +19,22 @@
 package org.apache.openmeetings.service.quartz.scheduler;
 
 import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
+import static org.apache.openmeetings.util.OmFileHelper.TEST_SETUP_PREFIX;
+import static org.apache.openmeetings.util.OmFileHelper.getStreamsDir;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
 import java.io.File;
 import java.io.FileFilter;
+import java.util.Map;
 
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.apache.openmeetings.core.data.whiteboard.WhiteBoardObjectListManagerById;
+import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
+import org.apache.openmeetings.db.dto.room.WhiteboardObject;
+import org.apache.openmeetings.db.dto.room.WhiteboardObjectList;
 import org.apache.openmeetings.util.InitializationContainer;
-import org.apache.openmeetings.util.OmFileHelper;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,9 +43,14 @@ public class CleanupJob extends Abstract
 	private static Logger log = Red5LoggerFactory.getLogger(CleanupJob.class, webAppRootKey);
 	private long sessionTimeout = 30 * 60 * 1000L;
 	private long testSetupTimeout = 60 * 60 * 1000L; // 1 hour
+	private long roomFilesTtl = 60 * 60 * 1000L; // 1 hour
 
 	@Autowired
-	private SessiondataDao sessiondataDao;
+	private SessiondataDao sessionDao;
+	@Autowired
+	private SessionManager sessionManager;
+	@Autowired
+	private WhiteBoardObjectListManagerById wbManager;
 
 	public long getSessionTimeout() {
 		return sessionTimeout;
@@ -55,24 +68,31 @@ public class CleanupJob extends Abstract
 		this.testSetupTimeout = testSetupTimeout;
 	}
 
+	public long getRoomFilesTtl() {
+		return roomFilesTtl;
+	}
+
+	public void setRoomFilesTtl(long roomFilesTtl) {
+		this.roomFilesTtl = roomFilesTtl;
+	}
+
 	public void cleanTestSetup() {
-		log.debug("CleanupJob.execute");
+		log.debug("CleanupJob.cleanTestSetup");
 		if (!InitializationContainer.initComplete) {
 			return;
 		}
 		try {
 			//FIXME need to move all these staff to helper
-			File[] folders = OmFileHelper.getStreamsDir().listFiles();
+			File[] folders = getStreamsDir().listFiles();
 			if (folders != null) {
 				for (File folder : folders) {
 					if (folder.isDirectory()) {
 						File[] files = folder.listFiles(new FileFilter() {
 							@Override
 							public boolean accept(File file) {
-								return file.getName().startsWith("TEST_SETUP_");
+								return file.getName().startsWith(TEST_SETUP_PREFIX);
 							}
 						});
-						//TODO need to rework this and remove hardcodings
 						if (files != null) {
 							for (File file : files) {
 								if (file.isFile() && file.lastModified() + testSetupTimeout < System.currentTimeMillis()) {
@@ -89,6 +109,47 @@ public class CleanupJob extends Abstract
 		}
 	}
 
+	public void cleanRoomFiles() {
+		log.debug("CleanupJob.cleanRoomFiles");
+		if (!InitializationContainer.initComplete) {
+			return;
+		}
+		try {
+			//FIXME need to move all these staff to helper
+			File[] folders = getStreamsDir().listFiles();
+			if (folders != null) {
+				for (File folder : folders) {
+					Long roomId = null;
+					if (NumberUtils.isCreatable(folder.getName())) {
+						roomId = Long.valueOf(folder.getName());
+						WhiteboardObjectList wbList = wbManager.getWhiteBoardObjectListByRoomId(roomId);
+						for (Map.Entry<Long, WhiteboardObject> e : wbList.getWhiteboardObjects().entrySet()) {
+							if (!e.getValue().getRoomItems().isEmpty()) {
+								roomId = null;
+								break;
+							}
+						}
+					}
+					if (folder.isDirectory() && roomId != null && sessionManager.getClientListByRoom(roomId).isEmpty()) {
+						File[] files = folder.listFiles();
+						//TODO need to rework this and remove hardcodings
+						if (files != null) {
+							for (File file : files) {
+								if (file.isFile() && file.lastModified() + roomFilesTtl < System.currentTimeMillis()) {
+									log.debug("Room files are too old and no users in the room: " + roomId);
+									FileUtils.deleteDirectory(folder);
+									break;
+								}
+							}
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			log.error("Unexpected exception while processing tests setup videous.", e);
+		}
+	}
+
 	public void cleanSessions() {
 		log.trace("CleanupJob.cleanSessions");
 		if (!InitializationContainer.initComplete) {
@@ -96,7 +157,7 @@ public class CleanupJob extends Abstract
 		}
 		try {
 			// TODO Generate report
-			sessiondataDao.clearSessionTable(sessionTimeout);
+			sessionDao.clearSessionTable(sessionTimeout);
 		} catch (Exception err){
 			log.error("execute",err);
 		}

Modified: openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java Mon Feb 20 15:43:49 2017
@@ -59,6 +59,7 @@ public class OmFileHelper {
 	public static final String recordingFileName = "flvRecording_";
 	public static final String profileImagePrefix = "_profile_";
 	public static final String thumbImagePrefix = "_thumb_";
+	public static final String TEST_SETUP_PREFIX = "TEST_SETUP_";
 	public static final String dashboardFile = "dashboard.xml";
 	public static final String EXTENSION_WML = "wml";
 	public static final String EXTENSION_FLV = "flv";
@@ -175,7 +176,7 @@ public class OmFileHelper {
 	}
 
 	public static File getStreamsSubDir(Long id) {
-		return getDir(getStreamsDir(), id.toString());
+		return getStreamsSubDir("" + id);
 	}
 
 	public static File getStreamsSubDir(String name) {

Modified: openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java Mon Feb 20 15:43:49 2017
@@ -28,11 +28,11 @@ import java.util.Map.Entry;
 import org.slf4j.Logger;
 
 /**
- * 
+ *
  * Collects all results of conversion jobs
- * 
+ *
  * @author sebawagner
- * 
+ *
  */
 public class ConverterProcessResultList {
 	private static final Logger log = getLogger(ConverterProcessResultList.class, webAppRootKey);
@@ -60,7 +60,7 @@ public class ConverterProcessResultList
 
 	public ConverterProcessResult addItem(String name, ConverterProcessResult processResult) {
 		if (jobs.containsKey(name)) {
-			log.error("Duplicate key in jobslist");
+			log.error("Duplicate key in jobslist:: " + name);
 			return null;
 		}
 		return jobs.put(name, processResult);
@@ -68,7 +68,7 @@ public class ConverterProcessResultList
 
 	/**
 	 * returns true if there was an job with exitValue "-1"
-	 * 
+	 *
 	 * @return
 	 */
 	public boolean hasError() {
@@ -82,7 +82,7 @@ public class ConverterProcessResultList
 
 	/**
 	 * converts all job results into a human readable format
-	 * 
+	 *
 	 * @return
 	 */
 	public String getLogMessage() {

Modified: openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml (original)
+++ openmeetings/application/branches/3.2.x/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml Mon Feb 20 15:43:49 2017
@@ -24,6 +24,7 @@
 	xmlns:context="http://www.springframework.org/schema/context"
 	xmlns:jaxrs="http://cxf.apache.org/jaxrs"
 	xmlns:jaxws="http://cxf.apache.org/jaxws"
+	xmlns:p="http://www.springframework.org/schema/p"
 	xsi:schemaLocation="
 		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
 		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
@@ -91,91 +92,58 @@
 	<bean id="openmeetings.RecordingConverter" class="org.apache.openmeetings.core.converter.RecordingConverter" />
 	<bean id="openmeetings.SlaveHTTPConnectionManager" class="org.apache.openmeetings.webservice.cluster.SlaveHTTPConnectionManager" />
 
-	<bean id="cleanupJob" class="org.apache.openmeetings.service.quartz.scheduler.CleanupJob">
-		<property name="sessionTimeout" value="1800000"/><!-- 30 minutes -->
-		<property name="testSetupTimeout" value="3600000"/><!-- 1 hour -->
-	</bean>
-	<bean id="cleanSessionsJobDetails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="cleanupJob" />
-		<property name="targetMethod" value="cleanSessions" />
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerCleanSessions" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="cleanSessionsJobDetails" />
-		<property name="startDelay" value="5000"/><!-- 5 seconds -->
-		<property name="repeatInterval" value="300000" /><!-- repeat every 300 seconds == 5 minutes -->
-	</bean>
-	<bean id="cleanTestSetupJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="cleanupJob" />
-		<property name="targetMethod" value="cleanTestSetup"/>
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerCleanTestSetup" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="cleanTestSetupJobDetail" />
-		<property name="startDelay" value="1800000"/><!-- 30 minutes --> 
-		<property name="repeatInterval" value="1800000"/> <!-- 30 minutes -->
-	</bean>
-	<bean id="cleanExpiredRecJobDetails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="cleanupJob" />
-		<property name="targetMethod" value="cleanExpiredRecordings" />
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerCleanExpiredRec" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="cleanExpiredRecJobDetails" />
-		<property name="startDelay" value="5000"/><!-- 5 seconds -->
-		<property name="repeatInterval" value="3600000" /><!-- 1 hour -->
-	</bean>
+	 <!--	1800000 == 30 min
+	 		3600000 == 1 hour
+	 		5000	== 5 sec
+	 		300000	== 5 min
+	 		900000	== 15 min
+	 -->
+	<bean id="cleanupJob" class="org.apache.openmeetings.service.quartz.scheduler.CleanupJob"
+			p:sessionTimeout="1800000" p:testSetupTimeout="3600000" p:roomFilesTtl="3600000" />
+	<bean id="cleanSessionsJobDetails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="cleanupJob" p:targetMethod="cleanSessions" p:concurrent="false" />
+	<bean id="triggerCleanSessions" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="cleanSessionsJobDetails" p:startDelay="5000" p:repeatInterval="300000" />
+	<bean id="cleanTestSetupJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="cleanupJob" p:targetMethod="cleanTestSetup" p:concurrent="false" />
+	<bean id="triggerCleanTestSetup" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="cleanTestSetupJobDetail" p:startDelay="1800000" p:repeatInterval="1800000" />
+	<bean id="cleanRoomFilesJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="cleanupJob" p:targetMethod="cleanRoomFiles" p:concurrent="false" />
+	<bean id="triggerCleanRoomFiles" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="cleanRoomFilesJobDetail" p:startDelay="10000" p:repeatInterval="1800000" /> <!-- p:startDelay="1800000" -->
+	<bean id="cleanExpiredRecJobDetails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="cleanupJob" p:targetMethod="cleanExpiredRecordings" p:concurrent="false" />
+	<bean id="triggerCleanExpiredRec" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="cleanExpiredRecJobDetails" p:startDelay="5000" p:repeatInterval="3600000" />
 
 	<bean id="reminderJob" class="org.apache.openmeetings.service.quartz.scheduler.ReminderJob"/>
-	<bean id="meetingReminderJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="reminderJob" />
-		<property name="targetMethod" value="remindMeetings"/>
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerMeetingReminder" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="meetingReminderJobDetail" />
-		<property name="startDelay" value="5000"/><!-- 5 seconds -->
-		<property name="repeatInterval" value="100000"/><!-- repeat every 100 seconds -->
-	</bean>
-	<bean id="expiringRecordingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="reminderJob" />
-		<property name="targetMethod" value="remindExpiringRecordings"/>
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerExpiringRecording" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="expiringRecordingJobDetail" />
-		<property name="startDelay" value="5000"/><!-- 5 seconds -->
-		<property name="repeatInterval" value="3600000"/><!-- repeat every 1 hour -->
-	</bean>
+	<bean id="meetingReminderJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="reminderJob" p:targetMethod="remindMeetings" p:concurrent="false" />
+	<bean id="triggerMeetingReminder" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="meetingReminderJobDetail" p:startDelay="5000" p:repeatInterval="100000"/>
+	<bean id="expiringRecordingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="reminderJob" p:targetMethod="remindExpiringRecordings" p:concurrent="false" />
+	<bean id="triggerExpiringRecording" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="expiringRecordingJobDetail" p:startDelay="5000" p:repeatInterval="3600000"/>
 
 	<!-- Mail related jobs -->
 	<bean id="mailHandler" class="org.apache.openmeetings.core.mail.MailHandler" />
-	<bean id="resetSendingMailStatus" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="mailHandler" />
-		<property name="targetMethod" value="resetSendingStatus"/>
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerResetSendingMailStatus" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="resetSendingMailStatus" />
-		<property name="startDelay" value="60000"/> <!-- 1 minute -->
-		<property name="repeatInterval" value="900000"/> <!-- 15 minutes -->
-	</bean>
-	<bean id="sendMails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="mailHandler" />
-		<property name="targetMethod" value="sendMails"/>
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerSendMails" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="sendMails" />
-		<property name="startDelay" value="60000"/> <!-- 1 minute -->
-		<property name="repeatInterval" value="60000"/> <!-- 1 minute -->
-	</bean>
+	<bean id="resetSendingMailStatus" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="mailHandler" p:targetMethod="resetSendingStatus" p:concurrent="false" />
+	<bean id="triggerResetSendingMailStatus" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="resetSendingMailStatus" p:startDelay="60000" p:repeatInterval="900000" />
+	<bean id="sendMails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="mailHandler" p:targetMethod="sendMails" p:concurrent="false" />
+	<bean id="triggerSendMails" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="sendMails" p:startDelay="60000" p:repeatInterval="60000" />
 	
 	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 		<property name="triggers">
 			<list>
 				<ref bean="triggerCleanSessions" />
 				<ref bean="triggerCleanTestSetup" />
+				<ref bean="triggerCleanRoomFiles" />
 				<ref bean="triggerCleanExpiredRec" />
 				<ref bean="triggerMeetingReminder" />
 				<ref bean="triggerExpiringRecording" />

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java Mon Feb 20 15:43:49 2017
@@ -60,14 +60,14 @@ public class FileProcessor {
 	//FIXME TODO this method need to be refactored to throw exceptions
 	public ConverterProcessResultList processFile(Long userId, FileExplorerItem f, InputStream is) throws Exception {
 		ConverterProcessResultList returnError = new ConverterProcessResultList();
-		
+
 		// Generate a random string to prevent any problems with
 		// foreign characters and duplicates
 		String hash = UUID.randomUUID().toString();
 
 		String ext = getFileExt(f.getName());
 		log.debug("file extension: " + ext);
-		StoredFile storedFile = new StoredFile(hash, ext); 
+		StoredFile storedFile = new StoredFile(hash, ext);
 
 		// Check variable to see if this file is a presentation
 		// check if this is a a file that can be converted by
@@ -109,7 +109,7 @@ public class FileProcessor {
 		}
 		FileUtils.copyInputStreamToFile(is, file);
 
-		
+
 		log.debug("canBeConverted: " + canBeConverted);
 		if (canBeConverted || isPdf) {
 			// convert to pdf, thumbs, swf and xml-description
@@ -125,18 +125,18 @@ public class FileProcessor {
 			returnError.addItem("processThumb", processThumb);
 		} else if (isVideo) {
 			List<ConverterProcessResult> returnList = flvExplorerConverter.convertToMP4(f, ext);
-			
+
 			int i = 0;
 			for (ConverterProcessResult returnMap : returnList) {
-				returnError.addItem("processFLV " + i, returnMap);
+				returnError.addItem("processVideo " + i++, returnMap);
 			}
 		}
-		
+
 		// has to happen at the end, otherwise it will be overwritten
 		//cause the variable is new initialized
 		returnError.setCompleteName(file.getName());
 		returnError.setFileItemId(f.getId());
-		
+
 		return returnError;
 	}
 }

Modified: openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java (original)
+++ openmeetings/application/trunk/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java Mon Feb 20 15:43:49 2017
@@ -56,9 +56,9 @@ import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
- * 
+ *
  * @author swagner
- * 
+ *
  */
 public class ConferenceLibrary implements IPendingServiceCallback {
 	private static final Logger log = Red5LoggerFactory.getLogger(ConferenceLibrary.class, webAppRootKey);
@@ -102,9 +102,9 @@ public class ConferenceLibrary implement
 	}
 
 	/**
-	 * 
+	 *
 	 * Save an Object to the library and returns the file-explorer Id
-	 * 
+	 *
 	 * @param sid
 	 * @param roomId
 	 * @param fileName
@@ -140,7 +140,7 @@ public class ConferenceLibrary implement
 	/**
 	 * Loads a Object from the library into the whiteboard of all participant of
 	 * the current room
-	 * 
+	 *
 	 * @param uid - uid of the client performing operation
 	 * @param wbId - id of whiteboard
 	 * @param fi - FileItem of the Wml being loaded
@@ -185,9 +185,9 @@ public class ConferenceLibrary implement
 	}
 
 	/**
-	 * 
+	 *
 	 * Loads a chart object
-	 * 
+	 *
 	 * @param sid
 	 * @param room_id
 	 * @param fileName
@@ -229,7 +229,7 @@ public class ConferenceLibrary implement
 
 					File target = new File(targetFolder, mp4.getName());
 					if (mp4.exists() && !target.exists()) {
-						FileUtils.copyFile(mp4, target);
+						FileUtils.copyFile(mp4, target, false);
 					}
 					return 1L;
 				}

Modified: openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java (original)
+++ openmeetings/application/trunk/openmeetings-service/src/main/java/org/apache/openmeetings/service/quartz/scheduler/CleanupJob.java Mon Feb 20 15:43:49 2017
@@ -19,14 +19,22 @@
 package org.apache.openmeetings.service.quartz.scheduler;
 
 import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
+import static org.apache.openmeetings.util.OmFileHelper.TEST_SETUP_PREFIX;
+import static org.apache.openmeetings.util.OmFileHelper.getStreamsDir;
 import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 
 import java.io.File;
 import java.io.FileFilter;
+import java.util.Map;
 
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.apache.openmeetings.core.data.whiteboard.WhiteBoardObjectListManagerById;
+import org.apache.openmeetings.core.session.SessionManager;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
+import org.apache.openmeetings.db.dto.room.WhiteboardObject;
+import org.apache.openmeetings.db.dto.room.WhiteboardObjectList;
 import org.apache.openmeetings.util.InitializationContainer;
-import org.apache.openmeetings.util.OmFileHelper;
 import org.red5.logging.Red5LoggerFactory;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -35,9 +43,14 @@ public class CleanupJob extends Abstract
 	private static Logger log = Red5LoggerFactory.getLogger(CleanupJob.class, webAppRootKey);
 	private long sessionTimeout = 30 * 60 * 1000L;
 	private long testSetupTimeout = 60 * 60 * 1000L; // 1 hour
+	private long roomFilesTtl = 60 * 60 * 1000L; // 1 hour
 
 	@Autowired
-	private SessiondataDao sessiondataDao;
+	private SessiondataDao sessionDao;
+	@Autowired
+	private SessionManager sessionManager;
+	@Autowired
+	private WhiteBoardObjectListManagerById wbManager;
 
 	public long getSessionTimeout() {
 		return sessionTimeout;
@@ -55,24 +68,31 @@ public class CleanupJob extends Abstract
 		this.testSetupTimeout = testSetupTimeout;
 	}
 
+	public long getRoomFilesTtl() {
+		return roomFilesTtl;
+	}
+
+	public void setRoomFilesTtl(long roomFilesTtl) {
+		this.roomFilesTtl = roomFilesTtl;
+	}
+
 	public void cleanTestSetup() {
-		log.debug("CleanupJob.execute");
+		log.debug("CleanupJob.cleanTestSetup");
 		if (!InitializationContainer.initComplete) {
 			return;
 		}
 		try {
 			//FIXME need to move all these staff to helper
-			File[] folders = OmFileHelper.getStreamsDir().listFiles();
+			File[] folders = getStreamsDir().listFiles();
 			if (folders != null) {
 				for (File folder : folders) {
 					if (folder.isDirectory()) {
 						File[] files = folder.listFiles(new FileFilter() {
 							@Override
 							public boolean accept(File file) {
-								return file.getName().startsWith("TEST_SETUP_");
+								return file.getName().startsWith(TEST_SETUP_PREFIX);
 							}
 						});
-						//TODO need to rework this and remove hardcodings
 						if (files != null) {
 							for (File file : files) {
 								if (file.isFile() && file.lastModified() + testSetupTimeout < System.currentTimeMillis()) {
@@ -89,6 +109,47 @@ public class CleanupJob extends Abstract
 		}
 	}
 
+	public void cleanRoomFiles() {
+		log.debug("CleanupJob.cleanRoomFiles");
+		if (!InitializationContainer.initComplete) {
+			return;
+		}
+		try {
+			//FIXME need to move all these staff to helper
+			File[] folders = getStreamsDir().listFiles();
+			if (folders != null) {
+				for (File folder : folders) {
+					Long roomId = null;
+					if (NumberUtils.isCreatable(folder.getName())) {
+						roomId = Long.valueOf(folder.getName());
+						WhiteboardObjectList wbList = wbManager.getWhiteBoardObjectListByRoomId(roomId);
+						for (Map.Entry<Long, WhiteboardObject> e : wbList.getWhiteboardObjects().entrySet()) {
+							if (!e.getValue().getRoomItems().isEmpty()) {
+								roomId = null;
+								break;
+							}
+						}
+					}
+					if (folder.isDirectory() && roomId != null && sessionManager.getClientListByRoom(roomId).isEmpty()) {
+						File[] files = folder.listFiles();
+						//TODO need to rework this and remove hardcodings
+						if (files != null) {
+							for (File file : files) {
+								if (file.isFile() && file.lastModified() + roomFilesTtl < System.currentTimeMillis()) {
+									log.debug("Room files are too old and no users in the room: " + roomId);
+									FileUtils.deleteDirectory(folder);
+									break;
+								}
+							}
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			log.error("Unexpected exception while processing tests setup videous.", e);
+		}
+	}
+
 	public void cleanSessions() {
 		log.trace("CleanupJob.cleanSessions");
 		if (!InitializationContainer.initComplete) {
@@ -96,7 +157,7 @@ public class CleanupJob extends Abstract
 		}
 		try {
 			// TODO Generate report
-			sessiondataDao.clearSessionTable(sessionTimeout);
+			sessionDao.clearSessionTable(sessionTimeout);
 		} catch (Exception err){
 			log.error("execute",err);
 		}

Modified: openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java (original)
+++ openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/OmFileHelper.java Mon Feb 20 15:43:49 2017
@@ -59,6 +59,7 @@ public class OmFileHelper {
 	public static final String recordingFileName = "flvRecording_";
 	public static final String profileImagePrefix = "_profile_";
 	public static final String thumbImagePrefix = "_thumb_";
+	public static final String TEST_SETUP_PREFIX = "TEST_SETUP_";
 	public static final String dashboardFile = "dashboard.xml";
 	public static final String EXTENSION_WML = "wml";
 	public static final String EXTENSION_FLV = "flv";
@@ -175,7 +176,7 @@ public class OmFileHelper {
 	}
 
 	public static File getStreamsSubDir(Long id) {
-		return getDir(getStreamsDir(), id.toString());
+		return getStreamsSubDir("" + id);
 	}
 
 	public static File getStreamsSubDir(String name) {

Modified: openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java (original)
+++ openmeetings/application/trunk/openmeetings-util/src/main/java/org/apache/openmeetings/util/process/ConverterProcessResultList.java Mon Feb 20 15:43:49 2017
@@ -28,11 +28,11 @@ import java.util.Map.Entry;
 import org.slf4j.Logger;
 
 /**
- * 
+ *
  * Collects all results of conversion jobs
- * 
+ *
  * @author sebawagner
- * 
+ *
  */
 public class ConverterProcessResultList {
 	private static final Logger log = getLogger(ConverterProcessResultList.class, webAppRootKey);
@@ -60,7 +60,7 @@ public class ConverterProcessResultList
 
 	public ConverterProcessResult addItem(String name, ConverterProcessResult processResult) {
 		if (jobs.containsKey(name)) {
-			log.error("Duplicate key in jobslist");
+			log.error("Duplicate key in jobslist:: " + name);
 			return null;
 		}
 		return jobs.put(name, processResult);
@@ -68,7 +68,7 @@ public class ConverterProcessResultList
 
 	/**
 	 * returns true if there was an job with exitValue "-1"
-	 * 
+	 *
 	 * @return
 	 */
 	public boolean hasError() {
@@ -82,7 +82,7 @@ public class ConverterProcessResultList
 
 	/**
 	 * converts all job results into a human readable format
-	 * 
+	 *
 	 * @return
 	 */
 	public String getLogMessage() {

Modified: openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml
URL: http://svn.apache.org/viewvc/openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml?rev=1783779&r1=1783778&r2=1783779&view=diff
==============================================================================
--- openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml (original)
+++ openmeetings/application/trunk/openmeetings-web/src/main/webapp/WEB-INF/classes/openmeetings-applicationContext.xml Mon Feb 20 15:43:49 2017
@@ -24,6 +24,7 @@
 	xmlns:context="http://www.springframework.org/schema/context"
 	xmlns:jaxrs="http://cxf.apache.org/jaxrs"
 	xmlns:jaxws="http://cxf.apache.org/jaxws"
+	xmlns:p="http://www.springframework.org/schema/p"
 	xsi:schemaLocation="
 		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
 		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
@@ -89,91 +90,58 @@
 	<bean id="openmeetings.RecordingConverter" class="org.apache.openmeetings.core.converter.RecordingConverter" />
 	<bean id="openmeetings.SlaveHTTPConnectionManager" class="org.apache.openmeetings.webservice.cluster.SlaveHTTPConnectionManager" />
 
-	<bean id="cleanupJob" class="org.apache.openmeetings.service.quartz.scheduler.CleanupJob">
-		<property name="sessionTimeout" value="1800000"/><!-- 30 minutes -->
-		<property name="testSetupTimeout" value="3600000"/><!-- 1 hour -->
-	</bean>
-	<bean id="cleanSessionsJobDetails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="cleanupJob" />
-		<property name="targetMethod" value="cleanSessions" />
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerCleanSessions" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="cleanSessionsJobDetails" />
-		<property name="startDelay" value="5000"/><!-- 5 seconds -->
-		<property name="repeatInterval" value="300000" /><!-- repeat every 300 seconds == 5 minutes -->
-	</bean>
-	<bean id="cleanTestSetupJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="cleanupJob" />
-		<property name="targetMethod" value="cleanTestSetup"/>
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerCleanTestSetup" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="cleanTestSetupJobDetail" />
-		<property name="startDelay" value="1800000"/><!-- 30 minutes --> 
-		<property name="repeatInterval" value="1800000"/> <!-- 30 minutes -->
-	</bean>
-	<bean id="cleanExpiredRecJobDetails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="cleanupJob" />
-		<property name="targetMethod" value="cleanExpiredRecordings" />
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerCleanExpiredRec" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="cleanExpiredRecJobDetails" />
-		<property name="startDelay" value="5000"/><!-- 5 seconds -->
-		<property name="repeatInterval" value="3600000" /><!-- 1 hour -->
-	</bean>
+	 <!--	1800000 == 30 min
+	 		3600000 == 1 hour
+	 		5000	== 5 sec
+	 		300000	== 5 min
+	 		900000	== 15 min
+	 -->
+	<bean id="cleanupJob" class="org.apache.openmeetings.service.quartz.scheduler.CleanupJob"
+			p:sessionTimeout="1800000" p:testSetupTimeout="3600000" p:roomFilesTtl="3600000" />
+	<bean id="cleanSessionsJobDetails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="cleanupJob" p:targetMethod="cleanSessions" p:concurrent="false" />
+	<bean id="triggerCleanSessions" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="cleanSessionsJobDetails" p:startDelay="5000" p:repeatInterval="300000" />
+	<bean id="cleanTestSetupJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="cleanupJob" p:targetMethod="cleanTestSetup" p:concurrent="false" />
+	<bean id="triggerCleanTestSetup" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="cleanTestSetupJobDetail" p:startDelay="1800000" p:repeatInterval="1800000" />
+	<bean id="cleanRoomFilesJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="cleanupJob" p:targetMethod="cleanRoomFiles" p:concurrent="false" />
+	<bean id="triggerCleanRoomFiles" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="cleanRoomFilesJobDetail" p:startDelay="10000" p:repeatInterval="1800000" /> <!-- p:startDelay="1800000" -->
+	<bean id="cleanExpiredRecJobDetails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="cleanupJob" p:targetMethod="cleanExpiredRecordings" p:concurrent="false" />
+	<bean id="triggerCleanExpiredRec" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="cleanExpiredRecJobDetails" p:startDelay="5000" p:repeatInterval="3600000" />
 
 	<bean id="reminderJob" class="org.apache.openmeetings.service.quartz.scheduler.ReminderJob"/>
-	<bean id="meetingReminderJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="reminderJob" />
-		<property name="targetMethod" value="remindMeetings"/>
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerMeetingReminder" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="meetingReminderJobDetail" />
-		<property name="startDelay" value="5000"/><!-- 5 seconds -->
-		<property name="repeatInterval" value="100000"/><!-- repeat every 100 seconds -->
-	</bean>
-	<bean id="expiringRecordingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="reminderJob" />
-		<property name="targetMethod" value="remindExpiringRecordings"/>
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerExpiringRecording" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="expiringRecordingJobDetail" />
-		<property name="startDelay" value="5000"/><!-- 5 seconds -->
-		<property name="repeatInterval" value="3600000"/><!-- repeat every 1 hour -->
-	</bean>
+	<bean id="meetingReminderJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="reminderJob" p:targetMethod="remindMeetings" p:concurrent="false" />
+	<bean id="triggerMeetingReminder" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="meetingReminderJobDetail" p:startDelay="5000" p:repeatInterval="100000"/>
+	<bean id="expiringRecordingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="reminderJob" p:targetMethod="remindExpiringRecordings" p:concurrent="false" />
+	<bean id="triggerExpiringRecording" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="expiringRecordingJobDetail" p:startDelay="5000" p:repeatInterval="3600000"/>
 
 	<!-- Mail related jobs -->
 	<bean id="mailHandler" class="org.apache.openmeetings.core.mail.MailHandler" />
-	<bean id="resetSendingMailStatus" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="mailHandler" />
-		<property name="targetMethod" value="resetSendingStatus"/>
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerResetSendingMailStatus" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="resetSendingMailStatus" />
-		<property name="startDelay" value="60000"/> <!-- 1 minute -->
-		<property name="repeatInterval" value="900000"/> <!-- 15 minutes -->
-	</bean>
-	<bean id="sendMails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
-		<property name="targetObject" ref="mailHandler" />
-		<property name="targetMethod" value="sendMails"/>
-		<property name="concurrent" value="false" />
-	</bean>
-	<bean id="triggerSendMails" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
-		<property name="jobDetail" ref="sendMails" />
-		<property name="startDelay" value="60000"/> <!-- 1 minute -->
-		<property name="repeatInterval" value="60000"/> <!-- 1 minute -->
-	</bean>
+	<bean id="resetSendingMailStatus" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="mailHandler" p:targetMethod="resetSendingStatus" p:concurrent="false" />
+	<bean id="triggerResetSendingMailStatus" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="resetSendingMailStatus" p:startDelay="60000" p:repeatInterval="900000" />
+	<bean id="sendMails" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"
+			p:targetObject-ref="mailHandler" p:targetMethod="sendMails" p:concurrent="false" />
+	<bean id="triggerSendMails" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"
+			p:jobDetail-ref="sendMails" p:startDelay="60000" p:repeatInterval="60000" />
 	
 	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 		<property name="triggers">
 			<list>
 				<ref bean="triggerCleanSessions" />
 				<ref bean="triggerCleanTestSetup" />
+				<ref bean="triggerCleanRoomFiles" />
 				<ref bean="triggerCleanExpiredRec" />
 				<ref bean="triggerMeetingReminder" />
 				<ref bean="triggerExpiringRecording" />