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/09/13 17:16:25 UTC

[3/3] openmeetings git commit: [OPENMEETINGS-1671] DB related part of work seems to be done

[OPENMEETINGS-1671] DB related part of work seems to be done


Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo
Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/7b5cd392
Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/7b5cd392
Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/7b5cd392

Branch: refs/heads/OPENMEETINGS-1671-room-files
Commit: 7b5cd392ae57443d898cb00bb134e6acfbd6bdc5
Parents: da7a4ff
Author: Maxim Solodovnik <so...@gmail.com>
Authored: Thu Sep 14 00:16:12 2017 +0700
Committer: Maxim Solodovnik <so...@gmail.com>
Committed: Thu Sep 14 00:16:12 2017 +0700

----------------------------------------------------------------------
 .../core/converter/DocumentConverter.java       |   4 +-
 .../core/converter/FlvExplorerConverter.java    |  10 +-
 .../core/converter/ImageConverter.java          |   4 +-
 .../core/data/file/FileProcessor.java           |  11 +-
 .../LoadLibraryPresentationToObject.java        |  12 +-
 .../core/remote/ConferenceLibrary.java          |  12 +-
 .../core/remote/RecordingService.java           |   2 +-
 .../core/remote/ScopeApplicationAdapter.java    |  12 +-
 .../db/dao/file/FileExplorerItemDao.java        | 337 -----------------
 .../openmeetings/db/dao/file/FileItemDao.java   | 338 ++++++++++++++++++
 .../db/dao/file/FileItemLogDao.java             |  10 +-
 .../db/dto/file/FileExplorerItemDTO.java        | 205 -----------
 .../db/dto/file/FileExplorerObject.java         |  22 +-
 .../openmeetings/db/dto/file/FileItemDTO.java   | 205 +++++++++++
 .../db/dto/file/PresentationObject.java         |  24 +-
 .../db/entity/file/BaseFileItem.java            | 357 +++++++++++++++++++
 .../db/entity/file/FileExplorerItem.java        | 108 ------
 .../openmeetings/db/entity/file/FileItem.java   | 343 +++---------------
 .../db/entity/file/FileItemLog.java             |   2 +-
 .../db/entity/record/Recording.java             |  35 +-
 .../openmeetings/db/entity/room/Room.java       |   2 +-
 .../openmeetings/db/entity/room/RoomFile.java   |  42 ++-
 .../conference/whiteboard/dynamicFileName.lzx   |   2 +-
 .../openmeetings/backup/BackupExport.java       |   8 +-
 .../openmeetings/backup/BackupImport.java       |  38 +-
 .../java/org/apache/openmeetings/cli/Admin.java |   4 +-
 .../apache/openmeetings/cli/CleanupHelper.java  |  10 +-
 .../openmeetings/web/admin/AdminPanel.html      |  12 -
 .../openmeetings/web/admin/AdminPanel.java      |  12 +
 .../openmeetings/web/admin/rooms/RoomForm.java  |   1 +
 .../web/admin/rooms/RoomsPanel.html             |   9 +
 .../web/common/tree/ConvertingErrorsDialog.java |  12 +-
 .../web/common/tree/DownloadMenuItem.java       |  10 +-
 .../web/common/tree/FileItemPanel.java          |   8 +-
 .../web/common/tree/FileItemTree.java           |  30 +-
 .../web/common/tree/FileTreePanel.java          |  54 +--
 .../web/common/tree/FolderPanel.java            |  32 +-
 .../web/common/tree/OmTreeProvider.java         |  48 +--
 .../web/room/RoomFileResourceReference.java     |   8 +-
 .../apache/openmeetings/web/room/RoomPanel.java |  16 +-
 .../web/room/RoomPdfResourceReference.java      |   8 +-
 .../web/room/RoomResourceReference.java         |  22 +-
 .../web/room/sidebar/RoomFilePanel.java         |   8 +-
 .../web/room/sidebar/UploadDialog.java          |  10 +-
 .../dashboard/admin/AdminCleanupInfoDialog.java |   4 +-
 .../user/record/RecordingResourceReference.java |   2 +-
 .../web/user/record/RecordingsPanel.java        |   4 +-
 .../openmeetings/web/user/record/VideoInfo.java |   6 +-
 .../web/user/record/VideoPlayer.java            |   4 +-
 .../web/util/FileItemResourceReference.java     |   4 +-
 .../classes/META-INF/db2_persistence.xml        |  34 +-
 .../classes/META-INF/derby_persistence.xml      |  34 +-
 .../classes/META-INF/mssql_persistence.xml      |  34 +-
 .../classes/META-INF/mysql_persistence.xml      |  34 +-
 .../classes/META-INF/oracle_persistence.xml     |  34 +-
 .../classes/META-INF/postgresql_persistence.xml |  34 +-
 .../WEB-INF/classes/applicationContext.xml      |   2 +-
 .../test/webservice/TestFileService.java        |  14 +-
 .../openmeetings/webservice/FileWebService.java |  58 +--
 59 files changed, 1409 insertions(+), 1352 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java
index 499d69b..e790b6d 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/DocumentConverter.java
@@ -26,7 +26,7 @@ import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
 import java.io.File;
 
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
-import org.apache.openmeetings.db.entity.file.FileExplorerItem;
+import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.util.StoredFile;
 import org.apache.openmeetings.util.process.ConverterProcessResult;
 import org.apache.openmeetings.util.process.ConverterProcessResultList;
@@ -49,7 +49,7 @@ public class DocumentConverter {
 	@Autowired
 	private ImageConverter imageConverter;
 
-	public ConverterProcessResultList convertPDF(FileExplorerItem f, StoredFile sf) throws Exception {
+	public ConverterProcessResultList convertPDF(FileItem f, StoredFile sf) throws Exception {
 		ConverterProcessResultList result = new ConverterProcessResultList();
 
 		boolean fullProcessing = !sf.isPdf();

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/FlvExplorerConverter.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/FlvExplorerConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/FlvExplorerConverter.java
index 60ae550..2079be9 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/FlvExplorerConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/FlvExplorerConverter.java
@@ -29,9 +29,9 @@ import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
-import org.apache.openmeetings.db.entity.file.FileExplorerItem;
-import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.dao.file.FileItemDao;
+import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
 import org.apache.openmeetings.util.process.ConverterProcessResult;
 import org.apache.openmeetings.util.process.ProcessHelper;
 import org.red5.logging.Red5LoggerFactory;
@@ -43,9 +43,9 @@ public class FlvExplorerConverter extends BaseConverter {
 
 	// Spring loaded Beans
 	@Autowired
-	private FileExplorerItemDao fileDao;
+	private FileItemDao fileDao;
 
-	public List<ConverterProcessResult> convertToMP4(FileExplorerItem f, String ext) {
+	public List<ConverterProcessResult> convertToMP4(FileItem f, String ext) {
 		List<ConverterProcessResult> logs = new ArrayList<>();
 		try {
 			File mp4 = f.getFile(EXTENSION_MP4);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java
index df62bb2..e9fe235 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/ImageConverter.java
@@ -31,7 +31,7 @@ import java.io.IOException;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.util.OmFileHelper;
 import org.apache.openmeetings.util.StoredFile;
@@ -48,7 +48,7 @@ public class ImageConverter extends BaseConverter {
 	@Autowired
 	private UserDao userDao;
 
-	public ConverterProcessResultList convertImage(FileItem f, StoredFile sf) throws IOException {
+	public ConverterProcessResultList convertImage(BaseFileItem f, StoredFile sf) throws IOException {
 		ConverterProcessResultList returnMap = new ConverterProcessResultList();
 
 		File jpg = f.getFile(EXTENSION_JPG);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
index 8c4b620..170dbbc 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/file/FileProcessor.java
@@ -31,9 +31,9 @@ import java.util.UUID;
 import org.apache.openmeetings.core.converter.DocumentConverter;
 import org.apache.openmeetings.core.converter.FlvExplorerConverter;
 import org.apache.openmeetings.core.converter.ImageConverter;
-import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
-import org.apache.openmeetings.db.entity.file.FileExplorerItem;
-import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.dao.file.FileItemDao;
+import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
+import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.util.StoredFile;
 import org.apache.openmeetings.util.process.ConverterProcessResult;
 import org.apache.openmeetings.util.process.ConverterProcessResultList;
@@ -48,14 +48,14 @@ public class FileProcessor {
 	@Autowired
 	private FlvExplorerConverter flvExplorerConverter;
 	@Autowired
-	private FileExplorerItemDao fileDao;
+	private FileItemDao fileDao;
 	@Autowired
 	private ImageConverter imageConverter;
 	@Autowired
 	private DocumentConverter generatePDF;
 
 	//FIXME TODO this method need to be refactored to throw exceptions
-	public ConverterProcessResultList processFile(FileExplorerItem f, InputStream is) throws Exception {
+	public ConverterProcessResultList processFile(FileItem f, InputStream is) throws Exception {
 		ConverterProcessResultList result = new ConverterProcessResultList();
 		// Generate a random string to prevent any problems with
 		// foreign characters and duplicates
@@ -136,6 +136,7 @@ public class FileProcessor {
 			result.setCompleteName(file.getName());
 			result.setFileItemId(f.getId());
 		} catch (Exception e) {
+			log.debug("Error while processing the file", e);
 			result.addItem("exception", new ConverterProcessResult("Unexpected exception: " + e.getMessage()));
 			throw e;
 		} finally {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-core/src/main/java/org/apache/openmeetings/core/documents/LoadLibraryPresentationToObject.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/documents/LoadLibraryPresentationToObject.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/documents/LoadLibraryPresentationToObject.java
index 581d333..89ec1c5 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/documents/LoadLibraryPresentationToObject.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/documents/LoadLibraryPresentationToObject.java
@@ -21,7 +21,7 @@ package org.apache.openmeetings.core.documents;
 import java.util.Iterator;
 import java.util.LinkedList;
 
-import org.apache.openmeetings.db.dto.file.FileExplorerItemDTO;
+import org.apache.openmeetings.db.dto.file.FileItemDTO;
 import org.apache.openmeetings.db.dto.file.PresentationObject;
 import org.apache.openmeetings.util.OpenmeetingsVariables;
 import org.dom4j.Document;
@@ -81,11 +81,11 @@ public class LoadLibraryPresentationToObject {
 		}
 	}
 
-	public FileExplorerItemDTO createListObjectLibraryByFileDocument(Element fileElement){
+	public FileItemDTO createListObjectLibraryByFileDocument(Element fileElement){
 		try {
 
 			log.info("createListObjectLibraryByFileDocument"+fileElement);
-			FileExplorerItemDTO fileObject = new FileExplorerItemDTO();
+			FileItemDTO fileObject = new FileItemDTO();
 			fileObject.setName(fileElement.getText());
 			//FIXME TODO fileObject.setLastModified(fileElement.attribute("lastmod").getText());
 			//FIXME TODO fileObject.setSize(fileElement.attribute("size").getText());
@@ -96,15 +96,15 @@ public class LoadLibraryPresentationToObject {
 		return null;
 	}
 
-	public LinkedList<FileExplorerItemDTO> createListObjectLibraryByFileDocumentThumbs(Element fileElement){
+	public LinkedList<FileItemDTO> createListObjectLibraryByFileDocumentThumbs(Element fileElement){
 		try {
 
-			LinkedList<FileExplorerItemDTO> thumbMap = new LinkedList<>();
+			LinkedList<FileItemDTO> thumbMap = new LinkedList<>();
 
 			for (Iterator<Element> i = fileElement.elementIterator(); i.hasNext(); ) {
 				Element thumbElement = i.next();
 				log.info("createListObjectLibraryByFileDocumentThumbs"+thumbElement);
-				FileExplorerItemDTO singleThumb = new FileExplorerItemDTO();
+				FileItemDTO singleThumb = new FileItemDTO();
 				singleThumb.setName(thumbElement.getName());
 				//FIXME TODO singleThumb.setFileNamePure(thumbElement.getText());
 				//FIXME TODO singleThumb.setLastModified(thumbElement.attribute("lastmod").getText());

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
index ca77ff9..da8c6c9 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java
@@ -29,13 +29,13 @@ import org.apache.openmeetings.core.data.whiteboard.WhiteboardManager;
 import org.apache.openmeetings.core.documents.LibraryChartLoader;
 import org.apache.openmeetings.core.documents.LibraryDocumentConverter;
 import org.apache.openmeetings.core.documents.LibraryWmlLoader;
-import org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
+import org.apache.openmeetings.db.dao.file.FileItemDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.file.FileExplorerItem;
 import org.apache.openmeetings.db.entity.file.FileItem;
-import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.file.BaseFileItem;
+import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
 import org.apache.openmeetings.db.entity.room.StreamClient;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
@@ -61,7 +61,7 @@ public class ConferenceLibrary implements IPendingServiceCallback {
 	@Autowired
 	private UserDao userDao;
 	@Autowired
-	private FileExplorerItemDao fileDao;
+	private FileItemDao fileDao;
 	@Autowired
 	private WhiteboardManager whiteboardManager;
 	@Autowired
@@ -92,7 +92,7 @@ public class ConferenceLibrary implements IPendingServiceCallback {
 
 				log.debug("saveAsObject" + tObject.size());
 
-				FileExplorerItem file = fileDao.add(fileName, null, null, roomId, sd.getUserId(), Type.WmlFile, "", "");
+				FileItem file = fileDao.add(fileName, null, null, roomId, sd.getUserId(), Type.WmlFile, "", "");
 				LibraryDocumentConverter.writeToLocalFolder(file.getHash(), tObject);
 
 				return file.getId();
@@ -111,7 +111,7 @@ public class ConferenceLibrary implements IPendingServiceCallback {
 	 * @param wbId - id of whiteboard
 	 * @param fi - FileItem of the Wml being loaded
 	 */
-	public void sendToWhiteboard(String uid, Long wbId, FileItem fi) {
+	public void sendToWhiteboard(String uid, Long wbId, BaseFileItem fi) {
 		StreamClient client = sessionManager.get(uid);
 		if (client == null) {
 			log.warn("No client was found to send Wml:: {}", uid);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
index c6ebddc..a7d7985 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/RecordingService.java
@@ -36,7 +36,7 @@ import org.apache.openmeetings.db.dao.record.RecordingMetaDataDao;
 import org.apache.openmeetings.db.dao.record.RecordingMetaDeltaDao;
 import org.apache.openmeetings.db.dao.server.ISessionManager;
 import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
 import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.record.RecordingMetaData;
 import org.apache.openmeetings.db.entity.record.RecordingMetaData.Status;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
----------------------------------------------------------------------
diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
index 47cc25e..8c28f6c 100644
--- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
+++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ScopeApplicationAdapter.java
@@ -63,7 +63,7 @@ import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.room.BrowserStatus;
 import org.apache.openmeetings.db.dto.room.RoomStatus;
 import org.apache.openmeetings.db.entity.basic.Client;
-import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.db.entity.log.ConferenceLog;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
@@ -1125,7 +1125,7 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 		}
 	}
 
-	private static Point getSize(FileItem fi) {
+	private static Point getSize(BaseFileItem fi) {
 		Point result = new Point(0, 0);
 		if (fi.getWidth() != null && fi.getHeight() != null) {
 			result.x = fi.getWidth();
@@ -1134,7 +1134,7 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 		return result;
 	}
 
-	private static List<?> getWbObject(FileItem fi, String url) {
+	private static List<?> getWbObject(BaseFileItem fi, String url) {
 		Point size = getSize(fi);
 		String type = "n/a";
 		switch (fi.getType()) {
@@ -1178,7 +1178,7 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 				);
 	}
 
-	private static List<?> getMp4WbObject(FileItem fi, String url) {
+	private static List<?> getMp4WbObject(BaseFileItem fi, String url) {
 		Point size = getSize(fi);
 		return Arrays.asList(
 				"flv" // 0: 'flv'
@@ -1198,7 +1198,7 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 				);
 	}
 
-	private static void copyFileToRoom(Long roomId, FileItem f) {
+	private static void copyFileToRoom(Long roomId, BaseFileItem f) {
 		try {
 			if (roomId != null && f != null) {
 				File mp4 = f.getFile(EXTENSION_MP4);
@@ -1215,7 +1215,7 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp
 		}
 	}
 
-	public void sendToWhiteboard(String uid, Long wbId, FileItem fi, String url, boolean clean) {
+	public void sendToWhiteboard(String uid, Long wbId, BaseFileItem fi, String url, boolean clean) {
 		StreamClient client = sessionManager.get(uid);
 
 		List<?> wbObject = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileExplorerItemDao.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileExplorerItemDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileExplorerItemDao.java
deleted file mode 100644
index de6c582..0000000
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileExplorerItemDao.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.db.dao.file;
-
-import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_JPG;
-import static org.apache.openmeetings.util.OmFileHelper.thumbImagePrefix;
-import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
-
-import java.io.File;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
-
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
-import javax.persistence.TypedQuery;
-
-import org.apache.openmeetings.db.entity.file.FileExplorerItem;
-import org.apache.openmeetings.db.entity.file.FileItem.Type;
-import org.apache.openmeetings.util.OmFileHelper;
-import org.red5.logging.Red5LoggerFactory;
-import org.slf4j.Logger;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * @author sebastianwagner
- *
- */
-@Transactional
-public class FileExplorerItemDao {
-	private static final Logger log = Red5LoggerFactory.getLogger(FileExplorerItemDao.class, webAppRootKey);
-	@PersistenceContext
-	private EntityManager em;
-
-	public FileExplorerItem add(String fileName, Long parentId, Long ownerId, Long roomId, Long insertedBy,
-			Type type, String externalId, String externalType) {
-		log.debug(".add(): adding file " + fileName + " roomID: " + roomId);
-		try {
-			FileExplorerItem fileItem = new FileExplorerItem();
-			fileItem.setName(fileName);
-			fileItem.setHash(UUID.randomUUID().toString());
-			fileItem.setDeleted(false);
-			fileItem.setParentId(parentId);
-			fileItem.setOwnerId(ownerId);
-			fileItem.setRoomId(roomId);
-			fileItem.setInserted(new Date());
-			fileItem.setInsertedBy(insertedBy);
-			fileItem.setType(type);
-			fileItem.setUpdated(new Date());
-			fileItem.setExternalId(externalId);
-			fileItem.setExternalType(externalType);
-
-			fileItem = em.merge(fileItem);
-
-			log.debug(".add(): file " + fileName + " added as " + fileItem.getId());
-			return fileItem;
-		} catch (Exception ex2) {
-			log.error(".add(): ", ex2);
-		}
-		return null;
-	}
-
-	public List<FileExplorerItem> getFileExplorerItemsByRoomAndOwner(Long roomId, Long ownerId) {
-		log.debug(".getFileExplorerItemsByRoomAndOwner() started");
-		try {
-			TypedQuery<FileExplorerItem> query = em.createNamedQuery("getFilesByRoomAndOwner", FileExplorerItem.class);
-			query.setParameter("roomId", roomId);
-			query.setParameter("ownerId", ownerId);
-
-			List<FileExplorerItem> fileExplorerList = query.getResultList();
-
-			return fileExplorerList;
-		} catch (Exception ex2) {
-			log.error("[getFileExplorerItemsByRoomAndOwner]: ", ex2);
-		}
-		return null;
-	}
-
-	public List<FileExplorerItem> getByRoom(Long roomId) {
-		log.debug("getFileExplorerItemsByRoom roomId :: " + roomId);
-		return em.createNamedQuery("getFilesByRoom", FileExplorerItem.class).setParameter("roomId", roomId).getResultList();
-	}
-
-	public List<FileExplorerItem> getByOwner(Long ownerId) {
-		log.debug("getByOwner() started");
-		TypedQuery<FileExplorerItem> query = em.createNamedQuery("getFilesByOwner", FileExplorerItem.class);
-		query.setParameter("ownerId", ownerId);
-
-		return query.getResultList();
-	}
-
-	public List<FileExplorerItem> getByGroup(Long groupId) {
-		log.debug("getByGroup() started");
-		return em.createNamedQuery("getFileByGroup", FileExplorerItem.class)
-				.setParameter("groupId", groupId)
-				.getResultList();
-	}
-
-	public List<FileExplorerItem> getByGroup(Long groupId, List<Type> filter) {
-		if (filter == null) {
-			return getByGroup(groupId);
-		}
-		log.debug("getByGroup() started");
-		return em.createNamedQuery("getFileFilteredByGroup", FileExplorerItem.class)
-				.setParameter("filter", filter)
-				.setParameter("groupId", groupId)
-				.getResultList();
-	}
-
-	public List<FileExplorerItem> getByParent(Long parentId) {
-		log.debug("getByParent() started");
-		return em.createNamedQuery("getFilesByParent", FileExplorerItem.class)
-				.setParameter("parentId", parentId)
-				.getResultList();
-	}
-
-	public List<FileExplorerItem> getByParent(Long parentId, List<Type> filter) {
-		if (filter == null) {
-			return getByParent(parentId);
-		}
-		log.debug("getByParent(filter) started");
-		return em.createNamedQuery("getFilesFilteredByParent", FileExplorerItem.class)
-				.setParameter("filter", filter)
-				.setParameter("parentId", parentId)
-				.getResultList();
-	}
-
-	public FileExplorerItem getByHash(String hash) {
-		log.debug("getByHash() started");
-		FileExplorerItem f = null;
-		TypedQuery<FileExplorerItem> query = em.createNamedQuery("getFileByHash", FileExplorerItem.class);
-		query.setParameter("hash", hash);
-
-		try {
-			f = query.getSingleResult();
-		} catch (NoResultException ex) {
-			//no-op
-		}
-		return f;
-	}
-
-	public FileExplorerItem get(Long id) {
-		FileExplorerItem f = null;
-		if (id != null && id > 0) {
-			TypedQuery<FileExplorerItem> query = em.createNamedQuery("getFileById", FileExplorerItem.class)
-					.setParameter("id", id);
-
-			try {
-				f = query.getSingleResult();
-			} catch (NoResultException ex) {
-			}
-		} else {
-			log.info("[get] " + "Info: No id given");
-		}
-		return f;
-	}
-
-	public FileExplorerItem get(String externalId, String externalType) {
-		FileExplorerItem f = null;
-		log.debug("get started");
-
-		try {
-			TypedQuery<FileExplorerItem> query = em.createNamedQuery("getFileExternal", FileExplorerItem.class)
-					.setParameter("externalFileId", externalId).setParameter("externalType", externalType);
-
-			try {
-				f = query.getSingleResult();
-			} catch (NoResultException ex) {
-			}
-
-		} catch (Exception ex2) {
-			log.error("[get]: ", ex2);
-		}
-		return f;
-	}
-
-	public List<FileExplorerItem> get() {
-		log.debug("get started");
-
-		return em.createNamedQuery("getAllFiles", FileExplorerItem.class).getResultList();
-	}
-
-	public void delete(FileExplorerItem f) {
-		f.setDeleted(true);
-		f.setUpdated(new Date());
-
-		update(f);
-	}
-
-	public void delete(String externalId, String externalType) {
-		log.debug("delete started");
-
-		delete(get(externalId, externalType));
-	}
-
-	/**
-	 * @param id
-	 * @param name
-	 */
-	public FileExplorerItem rename(Long id, String name) {
-		log.debug("rename started");
-
-		FileExplorerItem f = get(id);
-		if (f == null) {
-			return null;
-		}
-		f.setName(name);
-		return update(f);
-	}
-
-	public FileExplorerItem update(FileExplorerItem f) {
-		if (f.getId() == null) {
-			f.setInserted(new Date());
-			em.persist(f);
-		} else {
-			f.setUpdated(new Date());
-			f = em.merge(f);
-		}
-		return f;
-	}
-
-	private void updateChilds(FileExplorerItem f) {
-		for (FileExplorerItem child : getByParent(f.getId())) {
-			child.setOwnerId(f.getOwnerId());
-			child.setRoomId(f.getRoomId());
-			update(child);
-			if (Type.Folder == f.getType()) {
-				updateChilds(child);
-			}
-		}
-	}
-
-	/**
-	 * @param id
-	 * @param newParentFileExplorerItemId
-	 * @param isOwner
-	 */
-	public FileExplorerItem move(long id, long parentId, long ownerId, long roomId) {
-		log.debug(".move() started");
-
-		FileExplorerItem f = get(id);
-		if (f == null) {
-			return null;
-		}
-
-		if (parentId < 0) {
-			if (parentId == -1) {
-				// move to personal Folder
-				f.setOwnerId(ownerId);
-				f.setRoomId(null);
-			} else {
-				// move to public room folder
-				f.setOwnerId(null);
-				f.setRoomId(roomId);
-			}
-			f.setParentId(null);
-		} else {
-			f.setParentId(parentId);
-			f.setOwnerId(null);
-		}
-		if (Type.Folder == f.getType()) {
-			updateChilds(f);
-		}
-		return update(f);
-	}
-
-	public long getOwnSize(Long userId) {
-		return getSize(getByOwner(userId));
-	}
-
-	public long getRoomSize(Long roomId) {
-		return getSize(getByRoom(roomId));
-	}
-
-	public long getSize(List<FileExplorerItem> list) {
-		long size = 0;
-		for (FileExplorerItem f : list) {
-			size += getSize(f);
-		}
-		return size;
-	}
-
-	public long getSize(FileExplorerItem f) {
-		long size = 0;
-		try {
-			if (f.exists()) {
-				File base = OmFileHelper.getUploadFilesDir();
-				if (Type.Image == f.getType()) {
-					size += f.getFile().length();
-					File thumbFile = new File(base, String.format("%s%s.%s", thumbImagePrefix, f.getHash(), EXTENSION_JPG));
-					if (thumbFile.exists()) {
-						size += thumbFile.length();
-					}
-				}
-				if (Type.Presentation == f.getType()) {
-					File tFolder = new File(base, f.getHash());
-
-					if (tFolder.exists()) {
-						size += OmFileHelper.getSize(tFolder);
-					}
-				}
-				if (Type.Video == f.getType()) {
-					size += f.getFile().length();
-					File thumb = f.getFile(EXTENSION_JPG);
-					if (thumb.exists()) {
-						size += thumb.length();
-					}
-				}
-			}
-			if (Type.Folder == f.getType()) {
-				for (FileExplorerItem child : getByParent(f.getId())) {
-					size += getSize(child);
-				}
-			}
-		} catch (Exception err) {
-			log.error("[getSize] ", err);
-		}
-		return size;
-	}
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java
new file mode 100644
index 0000000..14c8ce9
--- /dev/null
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemDao.java
@@ -0,0 +1,338 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.db.dao.file;
+
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_JPG;
+import static org.apache.openmeetings.util.OmFileHelper.thumbImagePrefix;
+import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey;
+
+import java.io.File;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+
+import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
+import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.util.OmFileHelper;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @author sebastianwagner
+ *
+ */
+@Transactional
+public class FileItemDao {
+	private static final Logger log = Red5LoggerFactory.getLogger(FileItemDao.class, webAppRootKey);
+	@PersistenceContext
+	private EntityManager em;
+
+	public FileItem add(String fileName, Long parentId, Long ownerId, Long roomId, Long insertedBy,
+			Type type, String externalId, String externalType) {
+		log.debug(".add(): adding file " + fileName + " roomID: " + roomId);
+		try {
+			FileItem fileItem = new FileItem();
+			fileItem.setName(fileName);
+			fileItem.setHash(UUID.randomUUID().toString());
+			fileItem.setDeleted(false);
+			fileItem.setParentId(parentId);
+			fileItem.setOwnerId(ownerId);
+			fileItem.setRoomId(roomId);
+			fileItem.setInserted(new Date());
+			fileItem.setInsertedBy(insertedBy);
+			fileItem.setType(type);
+			fileItem.setUpdated(new Date());
+			fileItem.setExternalId(externalId);
+			fileItem.setExternalType(externalType);
+
+			fileItem = em.merge(fileItem);
+
+			log.debug(".add(): file " + fileName + " added as " + fileItem.getId());
+			return fileItem;
+		} catch (Exception ex2) {
+			log.error(".add(): ", ex2);
+		}
+		return null;
+	}
+
+	public List<FileItem> getByRoomAndOwner(Long roomId, Long ownerId) {
+		log.debug(".getByRoomAndOwner() started");
+		try {
+			TypedQuery<FileItem> query = em.createNamedQuery("getFilesByRoomAndOwner", FileItem.class);
+			query.setParameter("roomId", roomId);
+			query.setParameter("ownerId", ownerId);
+
+			List<FileItem> fileExplorerList = query.getResultList();
+
+			return fileExplorerList;
+		} catch (Exception ex2) {
+			log.error("[getByRoomAndOwner]: ", ex2);
+		}
+		return null;
+	}
+
+	public List<FileItem> getByRoom(Long roomId) {
+		log.debug("getByRoom roomId :: " + roomId);
+		return em.createNamedQuery("getFilesByRoom", FileItem.class).setParameter("roomId", roomId).getResultList();
+	}
+
+	public List<FileItem> getByOwner(Long ownerId) {
+		log.debug("getByOwner() started");
+		TypedQuery<FileItem> query = em.createNamedQuery("getFilesByOwner", FileItem.class);
+		query.setParameter("ownerId", ownerId);
+
+		return query.getResultList();
+	}
+
+	public List<FileItem> getByGroup(Long groupId) {
+		log.debug("getByGroup() started");
+		return em.createNamedQuery("getFileByGroup", FileItem.class)
+				.setParameter("groupId", groupId)
+				.getResultList();
+	}
+
+	public List<FileItem> getByGroup(Long groupId, List<Type> filter) {
+		if (filter == null) {
+			return getByGroup(groupId);
+		}
+		log.debug("getByGroup() started");
+		return em.createNamedQuery("getFileFilteredByGroup", FileItem.class)
+				.setParameter("filter", filter)
+				.setParameter("groupId", groupId)
+				.getResultList();
+	}
+
+	public List<FileItem> getByParent(Long parentId) {
+		log.debug("getByParent() started");
+		return em.createNamedQuery("getFilesByParent", FileItem.class)
+				.setParameter("parentId", parentId)
+				.getResultList();
+	}
+
+	public List<FileItem> getByParent(Long parentId, List<Type> filter) {
+		if (filter == null) {
+			return getByParent(parentId);
+		}
+		log.debug("getByParent(filter) started");
+		return em.createNamedQuery("getFilesFilteredByParent", FileItem.class)
+				.setParameter("filter", filter)
+				.setParameter("parentId", parentId)
+				.getResultList();
+	}
+
+	public FileItem getByHash(String hash) {
+		log.debug("getByHash() started");
+		FileItem f = null;
+		TypedQuery<FileItem> query = em.createNamedQuery("getFileByHash", FileItem.class);
+		query.setParameter("hash", hash);
+
+		try {
+			f = query.getSingleResult();
+		} catch (NoResultException ex) {
+			//no-op
+		}
+		return f;
+	}
+
+	public FileItem get(Long id) {
+		FileItem f = null;
+		if (id != null && id > 0) {
+			TypedQuery<FileItem> query = em.createNamedQuery("getFileById", FileItem.class)
+					.setParameter("id", id);
+
+			try {
+				f = query.getSingleResult();
+			} catch (NoResultException ex) {
+			}
+		} else {
+			log.info("[get] " + "Info: No id given");
+		}
+		return f;
+	}
+
+	public FileItem get(String externalId, String externalType) {
+		FileItem f = null;
+		log.debug("get started");
+
+		try {
+			TypedQuery<FileItem> query = em.createNamedQuery("getFileExternal", FileItem.class)
+					.setParameter("externalFileId", externalId).setParameter("externalType", externalType);
+
+			try {
+				f = query.getSingleResult();
+			} catch (NoResultException ex) {
+			}
+
+		} catch (Exception ex2) {
+			log.error("[get]: ", ex2);
+		}
+		return f;
+	}
+
+	public List<FileItem> get() {
+		log.debug("get started");
+
+		return em.createNamedQuery("getAllFiles", FileItem.class).getResultList();
+	}
+
+	public void delete(FileItem f) {
+		f.setDeleted(true);
+		f.setUpdated(new Date());
+
+		update(f);
+	}
+
+	public void delete(String externalId, String externalType) {
+		log.debug("delete started");
+
+		delete(get(externalId, externalType));
+	}
+
+	/**
+	 * @param id
+	 * @param name
+	 */
+	public FileItem rename(Long id, String name) {
+		log.debug("rename started");
+
+		FileItem f = get(id);
+		if (f == null) {
+			return null;
+		}
+		f.setName(name);
+		return update(f);
+	}
+
+	public FileItem update(FileItem f) {
+		if (f.getId() == null) {
+			f.setInserted(new Date());
+			em.persist(f);
+		} else {
+			f.setUpdated(new Date());
+			f = em.merge(f);
+		}
+		return f;
+	}
+
+	private void updateChilds(FileItem f) {
+		for (FileItem child : getByParent(f.getId())) {
+			child.setOwnerId(f.getOwnerId());
+			child.setRoomId(f.getRoomId());
+			update(child);
+			if (Type.Folder == f.getType()) {
+				updateChilds(child);
+			}
+		}
+	}
+
+	/**
+	 * @param id
+	 * @param parentId
+	 * @param isOwner
+	 * @param roomId
+	 */
+	public FileItem move(long id, long parentId, long ownerId, long roomId) {
+		log.debug(".move() started");
+
+		FileItem f = get(id);
+		if (f == null) {
+			return null;
+		}
+
+		if (parentId < 0) {
+			if (parentId == -1) {
+				// move to personal Folder
+				f.setOwnerId(ownerId);
+				f.setRoomId(null);
+			} else {
+				// move to public room folder
+				f.setOwnerId(null);
+				f.setRoomId(roomId);
+			}
+			f.setParentId(null);
+		} else {
+			f.setParentId(parentId);
+			f.setOwnerId(null);
+		}
+		if (Type.Folder == f.getType()) {
+			updateChilds(f);
+		}
+		return update(f);
+	}
+
+	public long getOwnSize(Long userId) {
+		return getSize(getByOwner(userId));
+	}
+
+	public long getRoomSize(Long roomId) {
+		return getSize(getByRoom(roomId));
+	}
+
+	public long getSize(List<FileItem> list) {
+		long size = 0;
+		for (FileItem f : list) {
+			size += getSize(f);
+		}
+		return size;
+	}
+
+	public long getSize(FileItem f) {
+		long size = 0;
+		try {
+			if (f.exists()) {
+				File base = OmFileHelper.getUploadFilesDir();
+				if (Type.Image == f.getType()) {
+					size += f.getFile().length();
+					File thumbFile = new File(base, String.format("%s%s.%s", thumbImagePrefix, f.getHash(), EXTENSION_JPG));
+					if (thumbFile.exists()) {
+						size += thumbFile.length();
+					}
+				}
+				if (Type.Presentation == f.getType()) {
+					File tFolder = new File(base, f.getHash());
+
+					if (tFolder.exists()) {
+						size += OmFileHelper.getSize(tFolder);
+					}
+				}
+				if (Type.Video == f.getType()) {
+					size += f.getFile().length();
+					File thumb = f.getFile(EXTENSION_JPG);
+					if (thumb.exists()) {
+						size += thumb.length();
+					}
+				}
+			}
+			if (Type.Folder == f.getType()) {
+				for (FileItem child : getByParent(f.getId())) {
+					size += getSize(child);
+				}
+			}
+		} catch (Exception err) {
+			log.error("[getSize] ", err);
+		}
+		return size;
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemLogDao.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemLogDao.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemLogDao.java
index eb2b225..652e2a3 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemLogDao.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/FileItemLogDao.java
@@ -26,7 +26,7 @@ import java.util.List;
 import javax.persistence.EntityManager;
 import javax.persistence.PersistenceContext;
 
-import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.db.entity.file.FileItemLog;
 import org.apache.openmeetings.util.process.ConverterProcessResult;
 import org.red5.logging.Red5LoggerFactory;
@@ -39,22 +39,22 @@ public class FileItemLogDao {
 	@PersistenceContext
 	private EntityManager em;
 
-	public long countErrors(FileItem f) {
+	public long countErrors(BaseFileItem f) {
 		return em.createNamedQuery("countErrorFileLogsByFile", Long.class).setParameter("fileId", f.getId())
 				.setParameter("type", f.getType()).getSingleResult();
 	}
 
-	public List<FileItemLog> get(FileItem f) {
+	public List<FileItemLog> get(BaseFileItem f) {
 		return em.createNamedQuery("getFileLogsByFile", FileItemLog.class).setParameter("fileId", f.getId())
 				.setParameter("type", f.getType()).getResultList();
 	}
 
-	public void delete(FileItem f) {
+	public void delete(BaseFileItem f) {
 		em.createNamedQuery("deleteErrorFileLogsByFile").setParameter("fileId", f.getId())
 				.setParameter("type", f.getType()).executeUpdate();
 	}
 
-	public FileItemLog add(String name, FileItem f, ConverterProcessResult returnMap) {
+	public FileItemLog add(String name, BaseFileItem f, ConverterProcessResult returnMap) {
 		log.trace("Adding log: {}, {}, {}", name, f, returnMap);
 		FileItemLog log = new FileItemLog();
 		log.setInserted(new Date());

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
deleted file mode 100644
index 49f7b23..0000000
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.db.dto.file;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
-import javax.xml.bind.annotation.XmlRootElement;
-
-import org.apache.openmeetings.db.entity.file.FileExplorerItem;
-import org.apache.openmeetings.db.entity.file.FileItem.Type;
-
-/**
- * This Object will represent a File on the File-System
- *
- * @author sebastianwagner
- *
- */
-@XmlRootElement
-@XmlAccessorType(XmlAccessType.FIELD)
-public class FileExplorerItemDTO implements Serializable {
-	private static final long serialVersionUID = 1L;
-	private Long id;
-	private String name;
-	private String hash;
-	private Long parentId;
-	private Long roomId;
-	private Long groupId;
-	private Long ownerId;
-	private Long size;
-	private String externalId;
-	private String externalType;
-	private Type type;
-	private Integer width;
-	private Integer height;
-
-	public FileExplorerItemDTO() {}
-
-	public FileExplorerItemDTO(FileExplorerItem f) {
-		id = f.getId();
-		name = f.getName();
-		hash = f.getHash();
-		parentId = f.getParentId();
-		roomId = f.getRoomId();
-		groupId = f.getGroupId();
-		ownerId = f.getOwnerId();
-		size = f.getSize();
-		externalId = f.getExternalId();
-		externalType = f.getExternalType();
-		type = f.getType();
-		width = f.getWidth();
-		height = f.getHeight();
-	}
-
-	public FileExplorerItem get() {
-		FileExplorerItem f = new FileExplorerItem();
-		f.setId(id);
-		f.setName(name);
-		f.setHash(hash);
-		f.setParentId(parentId != null && parentId > 0 ? parentId : null);
-		f.setRoomId(roomId != null && roomId > 0 ? roomId : null);
-		f.setRoomId(groupId != null && groupId > 0 ? groupId : null);
-		f.setOwnerId(ownerId != null && ownerId > 0 ? ownerId : null);
-		f.setSize(size);
-		f.setExternalId(externalId);
-		f.setExternalType(externalType);
-		f.setType(type);
-		f.setWidth(width);
-		f.setHeight(height);
-		return f;
-	}
-
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public String getHash() {
-		return hash;
-	}
-
-	public void setHash(String hash) {
-		this.hash = hash;
-	}
-
-	public Long getParentId() {
-		return parentId;
-	}
-
-	public void setParentId(Long parentId) {
-		this.parentId = parentId;
-	}
-
-	public Long getRoomId() {
-		return roomId;
-	}
-
-	public void setRoomId(Long roomId) {
-		this.roomId = roomId;
-	}
-
-	public Long getGroupId() {
-		return groupId;
-	}
-
-	public void setGroupId(Long groupId) {
-		this.groupId = groupId;
-	}
-
-	public Long getOwnerId() {
-		return ownerId;
-	}
-
-	public void setOwnerId(Long ownerId) {
-		this.ownerId = ownerId;
-	}
-
-	public Long getSize() {
-		return size;
-	}
-
-	public void setSize(Long size) {
-		this.size = size;
-	}
-
-	public String getExternalId() {
-		return externalId;
-	}
-
-	public void setExternalId(String externalId) {
-		this.externalId = externalId;
-	}
-
-	public String getExternalType() {
-		return externalType;
-	}
-
-	public void setExternalType(String externalType) {
-		this.externalType = externalType;
-	}
-
-	public Type getType() {
-		return type;
-	}
-
-	public void setType(Type type) {
-		this.type = type;
-	}
-
-	public Integer getWidth() {
-		return width;
-	}
-
-	public void setWidth(Integer width) {
-		this.width = width;
-	}
-
-	public Integer getHeight() {
-		return height;
-	}
-
-	public void setHeight(Integer height) {
-		this.height = height;
-	}
-
-	public static List<FileExplorerItemDTO> list(List<FileExplorerItem> l) {
-		List<FileExplorerItemDTO> list = new ArrayList<>();
-		if (l != null) {
-			for (FileExplorerItem f : l) {
-				list.add(new FileExplorerItemDTO(f));
-			}
-		}
-		return list;
-	}
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerObject.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerObject.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerObject.java
index d461fd8..3501183 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerObject.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerObject.java
@@ -25,7 +25,7 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
-import org.apache.openmeetings.db.entity.file.FileExplorerItem;
+import org.apache.openmeetings.db.entity.file.FileItem;
 
 /**
  * @author sebastianwagner
@@ -36,36 +36,36 @@ import org.apache.openmeetings.db.entity.file.FileExplorerItem;
 public class FileExplorerObject implements Serializable {
 	private static final long serialVersionUID = 1L;
 	
-	private List<FileExplorerItemDTO> userHome;
-	private List<FileExplorerItemDTO> roomHome;
+	private List<FileItemDTO> userHome;
+	private List<FileItemDTO> roomHome;
 	private Long userHomeSize;
 	private Long roomHomeSize;
 
 	public FileExplorerObject() {}
 
-	public List<FileExplorerItemDTO> getUserHome() {
+	public List<FileItemDTO> getUserHome() {
 		return userHome;
 	}
 
-	public void setUserHome(List<FileExplorerItemDTO> userHome) {
+	public void setUserHome(List<FileItemDTO> userHome) {
 		this.userHome = userHome;
 	}
 
-	public void setUser(List<FileExplorerItem> list, long size) {
-		this.userHome = FileExplorerItemDTO.list(list);
+	public void setUser(List<FileItem> list, long size) {
+		this.userHome = FileItemDTO.list(list);
 		this.userHomeSize = size;
 	}
 
-	public List<FileExplorerItemDTO> getRoomHome() {
+	public List<FileItemDTO> getRoomHome() {
 		return roomHome;
 	}
 
-	public void setRoomHome(List<FileExplorerItemDTO> roomHome) {
+	public void setRoomHome(List<FileItemDTO> roomHome) {
 		this.roomHome = roomHome;
 	}
 
-	public void setRoom(List<FileExplorerItem> list, long size) {
-		this.roomHome = FileExplorerItemDTO.list(list);
+	public void setRoom(List<FileItem> list, long size) {
+		this.roomHome = FileItemDTO.list(list);
 		this.roomHomeSize = size;
 	}
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileItemDTO.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileItemDTO.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileItemDTO.java
new file mode 100644
index 0000000..563eafe
--- /dev/null
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileItemDTO.java
@@ -0,0 +1,205 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.db.dto.file;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlRootElement;
+
+import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
+
+/**
+ * This Object will represent a File on the File-System
+ *
+ * @author sebastianwagner
+ *
+ */
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class FileItemDTO implements Serializable {
+	private static final long serialVersionUID = 1L;
+	private Long id;
+	private String name;
+	private String hash;
+	private Long parentId;
+	private Long roomId;
+	private Long groupId;
+	private Long ownerId;
+	private Long size;
+	private String externalId;
+	private String externalType;
+	private Type type;
+	private Integer width;
+	private Integer height;
+
+	public FileItemDTO() {}
+
+	public FileItemDTO(FileItem f) {
+		id = f.getId();
+		name = f.getName();
+		hash = f.getHash();
+		parentId = f.getParentId();
+		roomId = f.getRoomId();
+		groupId = f.getGroupId();
+		ownerId = f.getOwnerId();
+		size = f.getSize();
+		externalId = f.getExternalId();
+		externalType = f.getExternalType();
+		type = f.getType();
+		width = f.getWidth();
+		height = f.getHeight();
+	}
+
+	public FileItem get() {
+		FileItem f = new FileItem();
+		f.setId(id);
+		f.setName(name);
+		f.setHash(hash);
+		f.setParentId(parentId != null && parentId > 0 ? parentId : null);
+		f.setRoomId(roomId != null && roomId > 0 ? roomId : null);
+		f.setRoomId(groupId != null && groupId > 0 ? groupId : null);
+		f.setOwnerId(ownerId != null && ownerId > 0 ? ownerId : null);
+		f.setSize(size);
+		f.setExternalId(externalId);
+		f.setExternalType(externalType);
+		f.setType(type);
+		f.setWidth(width);
+		f.setHeight(height);
+		return f;
+	}
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getHash() {
+		return hash;
+	}
+
+	public void setHash(String hash) {
+		this.hash = hash;
+	}
+
+	public Long getParentId() {
+		return parentId;
+	}
+
+	public void setParentId(Long parentId) {
+		this.parentId = parentId;
+	}
+
+	public Long getRoomId() {
+		return roomId;
+	}
+
+	public void setRoomId(Long roomId) {
+		this.roomId = roomId;
+	}
+
+	public Long getGroupId() {
+		return groupId;
+	}
+
+	public void setGroupId(Long groupId) {
+		this.groupId = groupId;
+	}
+
+	public Long getOwnerId() {
+		return ownerId;
+	}
+
+	public void setOwnerId(Long ownerId) {
+		this.ownerId = ownerId;
+	}
+
+	public Long getSize() {
+		return size;
+	}
+
+	public void setSize(Long size) {
+		this.size = size;
+	}
+
+	public String getExternalId() {
+		return externalId;
+	}
+
+	public void setExternalId(String externalId) {
+		this.externalId = externalId;
+	}
+
+	public String getExternalType() {
+		return externalType;
+	}
+
+	public void setExternalType(String externalType) {
+		this.externalType = externalType;
+	}
+
+	public Type getType() {
+		return type;
+	}
+
+	public void setType(Type type) {
+		this.type = type;
+	}
+
+	public Integer getWidth() {
+		return width;
+	}
+
+	public void setWidth(Integer width) {
+		this.width = width;
+	}
+
+	public Integer getHeight() {
+		return height;
+	}
+
+	public void setHeight(Integer height) {
+		this.height = height;
+	}
+
+	public static List<FileItemDTO> list(List<FileItem> l) {
+		List<FileItemDTO> list = new ArrayList<>();
+		if (l != null) {
+			for (FileItem f : l) {
+				list.add(new FileItemDTO(f));
+			}
+		}
+		return list;
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/PresentationObject.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/PresentationObject.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/PresentationObject.java
index 88e7ebb..23285d5 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/PresentationObject.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/PresentationObject.java
@@ -26,35 +26,35 @@ import java.util.LinkedList;
  */
 public class PresentationObject {
 	
-	private FileExplorerItemDTO originalDocument;
-	private FileExplorerItemDTO pdfDocument;
-	private FileExplorerItemDTO swfDocument;
-	LinkedList<FileExplorerItemDTO> thumbs;
+	private FileItemDTO originalDocument;
+	private FileItemDTO pdfDocument;
+	private FileItemDTO swfDocument;
+	LinkedList<FileItemDTO> thumbs;
 
 	public PresentationObject() {}
 	
-	public FileExplorerItemDTO getOriginalDocument() {
+	public FileItemDTO getOriginalDocument() {
 		return originalDocument;
 	}
-	public void setOriginalDocument(FileExplorerItemDTO originalDocument) {
+	public void setOriginalDocument(FileItemDTO originalDocument) {
 		this.originalDocument = originalDocument;
 	}
-	public FileExplorerItemDTO getPdfDocument() {
+	public FileItemDTO getPdfDocument() {
 		return pdfDocument;
 	}
-	public void setPdfDocument(FileExplorerItemDTO pdfDocument) {
+	public void setPdfDocument(FileItemDTO pdfDocument) {
 		this.pdfDocument = pdfDocument;
 	}
-	public FileExplorerItemDTO getSwfDocument() {
+	public FileItemDTO getSwfDocument() {
 		return swfDocument;
 	}
-	public void setSwfDocument(FileExplorerItemDTO swfDocument) {
+	public void setSwfDocument(FileItemDTO swfDocument) {
 		this.swfDocument = swfDocument;
 	}
-	public LinkedList<FileExplorerItemDTO> getThumbs() {
+	public LinkedList<FileItemDTO> getThumbs() {
 		return thumbs;
 	}
-	public void setThumbs(LinkedList<FileExplorerItemDTO> thumbs) {
+	public void setThumbs(LinkedList<FileItemDTO> thumbs) {
 		this.thumbs = thumbs;
 	}
 	

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
new file mode 100644
index 0000000..c439664
--- /dev/null
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
@@ -0,0 +1,357 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License") +  you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openmeetings.db.entity.file;
+
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_JPG;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_SWF;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_WML;
+import static org.apache.openmeetings.util.OmFileHelper.getStreamsHibernateDir;
+import static org.apache.openmeetings.util.OmFileHelper.getUploadFilesDir;
+import static org.apache.openmeetings.util.OmFileHelper.getUploadWmlDir;
+
+import java.io.File;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlType;
+
+import org.apache.openmeetings.db.entity.IDataProviderEntity;
+import org.simpleframework.xml.Element;
+
+@Entity
+@Table(name = "file")
+@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+public abstract class BaseFileItem implements IDataProviderEntity {
+	private static final long serialVersionUID = 1L;
+
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	@Column(name = "id")
+	private Long id;
+
+	@XmlType(namespace = "org.apache.openmeetings.file")
+	public enum Type {
+		// Folder need to be alphabetically first, for correct sorting
+		Folder, Image, PollChart, Presentation, Recording, Video, WmlFile
+	}
+
+	@Column(name = "name")
+	@Element(name = "fileName", data = true, required = false)
+	private String name;
+
+	@Column(name = "hash")
+	@Element(name = "fileHash", data = true, required = false)
+	private String hash;
+
+	@Column(name = "parent_item_id")
+	@Element(data = true, name = "parentFileExplorerItemId", required = false)
+	private Long parentId;
+
+	@Column(name = "room_id")
+	@Element(data = true, required = false, name = "room_id")
+	private Long roomId;
+
+	// OwnerID => only set if its directly root in Owner Directory, other Folders and Files
+	// maybe are also in a Home directory but just because their parent is
+	@Column(name = "owner_id")
+	@Element(data = true, required = false)
+	private Long ownerId;
+
+	@Column(name = "inserted_by")
+	@Element(data = true, required = false)
+	private Long insertedBy;
+
+	@Column(name = "inserted")
+	@Element(data = true, required = false)
+	private Date inserted;
+
+	@Column(name = "updated")
+	@Element(data = true, required = false)
+	private Date updated;
+
+	@Column(name = "deleted", nullable = false)
+	@Element(data = true)
+	private boolean deleted;
+
+	@Column(name = "flv_width")
+	@Element(data = true, required = false)
+	private Integer width;
+
+	@Column(name = "flv_height")
+	@Element(data = true, required = false)
+	private Integer height;
+
+	@Column(name = "type")
+	@Element(data = true, required = false)
+	@Enumerated(EnumType.STRING)
+	private Type type;
+
+	@Column(name = "group_id")
+	@Element(data = true, required = false)
+	private Long groupId;
+
+	// Not Mapped
+	@Transient
+	private List<FileItemLog> log;
+
+	@Transient
+	private boolean readOnly;
+
+	@Override
+	public Long getId() {
+		return id;
+	}
+
+	@Override
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getHash() {
+		return hash;
+	}
+
+	public void setHash(String hash) {
+		this.hash = hash;
+	}
+
+	public Long getParentId() {
+		return parentId;
+	}
+
+	public void setParentId(Long parentId) {
+		this.parentId = parentId;
+	}
+
+	public Long getRoomId() {
+		return roomId;
+	}
+
+	public void setRoomId(Long roomId) {
+		this.roomId = roomId;
+	}
+
+	public Long getOwnerId() {
+		return ownerId;
+	}
+
+	public void setOwnerId(Long ownerId) {
+		this.ownerId = ownerId;
+	}
+
+	public Long getInsertedBy() {
+		return insertedBy;
+	}
+
+	public void setInsertedBy(Long insertedBy) {
+		this.insertedBy = insertedBy;
+	}
+
+	public Date getInserted() {
+		return inserted;
+	}
+
+	public void setInserted(Date inserted) {
+		this.inserted = inserted;
+	}
+
+	public Date getUpdated() {
+		return updated;
+	}
+
+	public void setUpdated(Date updated) {
+		this.updated = updated;
+	}
+
+	public boolean isDeleted() {
+		return deleted;
+	}
+
+	public void setDeleted(boolean deleted) {
+		this.deleted = deleted;
+	}
+
+	public Integer getWidth() {
+		return width;
+	}
+
+	public void setWidth(Integer flvWidth) {
+		this.width = flvWidth;
+	}
+
+	public Integer getHeight() {
+		return height;
+	}
+
+	public void setHeight(Integer flvHeight) {
+		this.height = flvHeight;
+	}
+
+	public Type getType() {
+		return type;
+	}
+
+	public void setType(Type type) {
+		this.type = type;
+	}
+
+	public List<FileItemLog> getLog() {
+		return log;
+	}
+
+	public void setLog(List<FileItemLog> log) {
+		this.log = log;
+	}
+
+	public String getFileName(String ext) {
+		return ext == null ? name : String.format("%s.%s", name, ext);
+	}
+
+	public File getFile() {
+		return getFile(null);
+	}
+
+	public Long getGroupId() {
+		return groupId;
+	}
+
+	public void setGroupId(Long groupId) {
+		this.groupId = groupId;
+	}
+
+	public boolean isReadOnly() {
+		return readOnly;
+	}
+
+	public void setReadOnly(boolean readOnly) {
+		this.readOnly = readOnly;
+	}
+
+	public final File getFile(String ext) {
+		File f = null;
+		if (getHash() != null) {
+			File d = new File(getUploadFilesDir(), getHash());
+			switch (getType()) {
+				case WmlFile:
+					f = new File(getUploadWmlDir(), String.format("%s.%s", getHash(), ext == null ? EXTENSION_WML : ext));
+					break;
+				case Image:
+					f = new File(d, String.format("%s.%s", getHash(), ext == null ? EXTENSION_JPG : ext));
+					break;
+				case Recording:
+					f = new File(getStreamsHibernateDir(), String.format("%s.%s", getHash(), ext == null ? EXTENSION_MP4 : ext));
+					break;
+				case Video:
+					f = new File(d, String.format("%s.%s", getHash(), ext == null ? EXTENSION_MP4 : ext));
+					break;
+				case Presentation:
+					f = new File(d, String.format("%s.%s", getHash(), ext == null ? EXTENSION_SWF : ext));
+					break;
+				case PollChart:
+				case Folder:
+				default:
+			}
+		}
+		return f;
+	}
+
+	public final boolean exists() {
+		return exists(null);
+	}
+
+	public final boolean exists(String ext) {
+		if (getId() != null && !isDeleted()) {
+			File f = getFile(ext);
+			return f != null && f.exists() && f.isFile();
+		}
+		return false;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((hash == null) ? 0 : hash.hashCode());
+		result = prime * result + ((name == null) ? 0 : name.hashCode());
+		result = prime * result + ((ownerId == null) ? 0 : ownerId.hashCode());
+		result = prime * result + ((parentId == null) ? 0 : parentId.hashCode());
+		result = prime * result + ((roomId == null) ? 0 : roomId.hashCode());
+		result = prime * result + ((type == null) ? 0 : type.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		BaseFileItem other = (BaseFileItem) obj;
+		if (hash == null) {
+			if (other.hash != null)
+				return false;
+		} else if (!hash.equals(other.hash))
+			return false;
+		if (name == null) {
+			if (other.name != null)
+				return false;
+		} else if (!name.equals(other.name))
+			return false;
+		if (ownerId == null) {
+			if (other.ownerId != null)
+				return false;
+		} else if (!ownerId.equals(other.ownerId))
+			return false;
+		if (parentId == null) {
+			if (other.parentId != null)
+				return false;
+		} else if (!parentId.equals(other.parentId))
+			return false;
+		if (roomId == null) {
+			if (other.roomId != null)
+				return false;
+		} else if (!roomId.equals(other.roomId))
+			return false;
+		if (type != other.type)
+			return false;
+		return true;
+	}
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileExplorerItem.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileExplorerItem.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileExplorerItem.java
deleted file mode 100644
index 10dcf0d..0000000
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileExplorerItem.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License") +  you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.openmeetings.db.entity.file;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-
-import org.simpleframework.xml.Element;
-import org.simpleframework.xml.Root;
-
-@Entity
-@NamedQueries({
-	@NamedQuery(name = "getAllFiles", query = "SELECT f FROM FileExplorerItem f ORDER BY f.id")
-	, @NamedQuery(name = "getFileById", query = "SELECT f FROM FileExplorerItem f WHERE f.id = :id")
-	, @NamedQuery(name = "getFileByHash", query = "SELECT f FROM FileExplorerItem f WHERE f.hash = :hash")
-	, @NamedQuery(name = "getFilesByRoom", query = "SELECT f FROM FileExplorerItem f WHERE f.deleted = false AND f.roomId = :roomId " +
-			"AND f.ownerId IS NULL AND f.parentId IS NULL ORDER BY f.type ASC, f.name ")
-	, @NamedQuery(name = "getFilesByOwner", query = "SELECT f FROM FileExplorerItem f WHERE f.deleted = false AND f.ownerId = :ownerId "
-			+ "AND f.parentId IS NULL ORDER BY f.type ASC, f.name ")
-	, @NamedQuery(name = "getFilesByParent", query = "SELECT f FROM FileExplorerItem f WHERE f.deleted = false "
-			+ "AND f.parentId = :parentId ORDER BY f.type ASC, f.name ")
-	, @NamedQuery(name = "getFilesFilteredByParent", query = "SELECT f FROM FileExplorerItem f WHERE f.deleted = false "
-			+ "AND f.parentId = :parentId AND f.type IN :filter ORDER BY f.type ASC, f.name ")
-	, @NamedQuery(name = "getFileExternal", query = "SELECT f FROM FileExplorerItem f WHERE f.externalId = :externalId AND f.externalType LIKE :externalType")
-	, @NamedQuery(name = "getFileByGroup", query = "SELECT f FROM FileExplorerItem f WHERE f.deleted = false AND f.ownerId IS NULL "
-			+ "AND f.groupId = :groupId AND f.parentId IS NULL "
-			+ "ORDER BY f.type ASC, f.name")
-	, @NamedQuery(name = "getFileFilteredByGroup", query = "SELECT f FROM FileExplorerItem f WHERE f.deleted = false AND f.ownerId IS NULL "
-			+ "AND f.groupId = :groupId AND f.parentId IS NULL AND f.type IN :filter "
-			+ "ORDER BY f.type ASC, f.name")
-})
-@Table(name = "fileexploreritem")
-@Root
-public class FileExplorerItem extends FileItem {
-	private static final long serialVersionUID = 1L;
-
-	@Id
-	@GeneratedValue(strategy = GenerationType.IDENTITY)
-	@Column(name = "id")
-	@Element(data = true, name = "fileExplorerItemId")
-	private Long id;
-
-	@Column(name = "filesize")
-	@Element(data = true, required = false)
-	private Long size;
-
-	@Column(name = "external_id")
-	private String externalId;
-
-	@Column(name = "external_type")
-	private String externalType;
-
-	@Override
-	public Long getId() {
-		return id;
-	}
-
-	@Override
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public Long getSize() {
-		return size;
-	}
-
-	public void setSize(Long fileSize) {
-		this.size = fileSize;
-	}
-
-	public String getExternalId() {
-		return externalId;
-	}
-
-	public void setExternalId(String externalId) {
-		this.externalId = externalId;
-	}
-
-	public String getExternalType() {
-		return externalType;
-	}
-
-	public void setExternalType(String externalType) {
-		this.externalType = externalType;
-	}
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
index 04745e6..06e5d6e 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItem.java
@@ -18,317 +18,82 @@
  */
 package org.apache.openmeetings.db.entity.file;
 
-import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_JPG;
-import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
-import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_SWF;
-import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_WML;
-import static org.apache.openmeetings.util.OmFileHelper.getStreamsHibernateDir;
-import static org.apache.openmeetings.util.OmFileHelper.getUploadFilesDir;
-import static org.apache.openmeetings.util.OmFileHelper.getUploadWmlDir;
-
-import java.io.File;
-import java.util.Date;
-import java.util.List;
-
 import javax.persistence.Column;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.Transient;
-import javax.xml.bind.annotation.XmlType;
+import javax.persistence.Entity;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 
-import org.apache.openmeetings.db.entity.IDataProviderEntity;
 import org.simpleframework.xml.Element;
-
-@MappedSuperclass
-public abstract class FileItem implements IDataProviderEntity {
+import org.simpleframework.xml.Root;
+
+@Entity
+@NamedQueries({
+	@NamedQuery(name = "getAllFiles", query = "SELECT f FROM FileItem f ORDER BY f.id")
+	, @NamedQuery(name = "getFileById", query = "SELECT f FROM FileItem f WHERE f.id = :id")
+	, @NamedQuery(name = "getFileByHash", query = "SELECT f FROM FileItem f WHERE f.hash = :hash")
+	, @NamedQuery(name = "getFilesByRoom", query = "SELECT f FROM FileItem f WHERE f.deleted = false AND f.roomId = :roomId " +
+			"AND f.ownerId IS NULL AND f.parentId IS NULL ORDER BY f.type ASC, f.name ")
+	, @NamedQuery(name = "getFilesByOwner", query = "SELECT f FROM FileItem f WHERE f.deleted = false AND f.ownerId = :ownerId "
+			+ "AND f.parentId IS NULL ORDER BY f.type ASC, f.name ")
+	, @NamedQuery(name = "getFilesByParent", query = "SELECT f FROM FileItem f WHERE f.deleted = false "
+			+ "AND f.parentId = :parentId ORDER BY f.type ASC, f.name ")
+	, @NamedQuery(name = "getFilesFilteredByParent", query = "SELECT f FROM FileItem f WHERE f.deleted = false "
+			+ "AND f.parentId = :parentId AND f.type IN :filter ORDER BY f.type ASC, f.name ")
+	, @NamedQuery(name = "getFileExternal", query = "SELECT f FROM FileItem f WHERE f.externalId = :externalId AND f.externalType LIKE :externalType")
+	, @NamedQuery(name = "getFileByGroup", query = "SELECT f FROM FileItem f WHERE f.deleted = false AND f.ownerId IS NULL "
+			+ "AND f.groupId = :groupId AND f.parentId IS NULL "
+			+ "ORDER BY f.type ASC, f.name")
+	, @NamedQuery(name = "getFileFilteredByGroup", query = "SELECT f FROM FileItem f WHERE f.deleted = false AND f.ownerId IS NULL "
+			+ "AND f.groupId = :groupId AND f.parentId IS NULL AND f.type IN :filter "
+			+ "ORDER BY f.type ASC, f.name")
+})
+@Root
+public class FileItem extends BaseFileItem {
 	private static final long serialVersionUID = 1L;
 
-	@XmlType(namespace = "org.apache.openmeetings.file")
-	public enum Type {
-		// Folder need to be alphabetically first, for correct sorting
-		Folder, Image, PollChart, Presentation, Recording, Video, WmlFile
-	}
-
-	@Column(name = "name")
-	@Element(name = "fileName", data = true, required = false)
-	private String name;
-
-	@Column(name = "hash")
-	@Element(name = "fileHash", data = true, required = false)
-	private String hash;
-
-	@Column(name = "parent_item_id")
-	@Element(data = true, name = "parentFileExplorerItemId", required = false)
-	private Long parentId;
-
-	@Column(name = "room_id")
-	@Element(data = true, required = false, name = "room_id")
-	private Long roomId;
-
-	// OwnerID => only set if its directly root in Owner Directory, other Folders and Files
-	// maybe are also in a Home directory but just because their parent is
-	@Column(name = "owner_id")
-	@Element(data = true, required = false)
-	private Long ownerId;
-
-	@Column(name = "inserted_by")
-	@Element(data = true, required = false)
-	private Long insertedBy;
-
-	@Column(name = "inserted")
-	@Element(data = true, required = false)
-	private Date inserted;
-
-	@Column(name = "updated")
-	@Element(data = true, required = false)
-	private Date updated;
-
-	@Column(name = "deleted", nullable = false)
-	@Element(data = true)
-	private boolean deleted;
-
-	@Column(name = "flv_width")
-	@Element(data = true, required = false)
-	private Integer width;
-
-	@Column(name = "flv_height")
-	@Element(data = true, required = false)
-	private Integer height;
-
-	@Column(name = "type")
+	@Column(name = "filesize")
 	@Element(data = true, required = false)
-	@Enumerated(EnumType.STRING)
-	private Type type;
-
-	@Column(name = "group_id")
-	@Element(data = true, required = false)
-	private Long groupId;
-
-	// Not Mapped
-	@Transient
-	private List<FileItemLog> log;
-
-	@Transient
-	private boolean readOnly;
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public String getHash() {
-		return hash;
-	}
-
-	public void setHash(String hash) {
-		this.hash = hash;
-	}
-
-	public Long getParentId() {
-		return parentId;
-	}
-
-	public void setParentId(Long parentId) {
-		this.parentId = parentId;
-	}
-
-	public Long getRoomId() {
-		return roomId;
-	}
-
-	public void setRoomId(Long roomId) {
-		this.roomId = roomId;
-	}
-
-	public Long getOwnerId() {
-		return ownerId;
-	}
-
-	public void setOwnerId(Long ownerId) {
-		this.ownerId = ownerId;
-	}
-
-	public Long getInsertedBy() {
-		return insertedBy;
-	}
-
-	public void setInsertedBy(Long insertedBy) {
-		this.insertedBy = insertedBy;
-	}
-
-	public Date getInserted() {
-		return inserted;
-	}
-
-	public void setInserted(Date inserted) {
-		this.inserted = inserted;
-	}
+	private Long size;
 
-	public Date getUpdated() {
-		return updated;
-	}
-
-	public void setUpdated(Date updated) {
-		this.updated = updated;
-	}
+	@Column(name = "external_id")
+	private String externalId;
 
-	public boolean isDeleted() {
-		return deleted;
-	}
-
-	public void setDeleted(boolean deleted) {
-		this.deleted = deleted;
-	}
+	@Column(name = "external_type")
+	private String externalType;
 
-	public Integer getWidth() {
-		return width;
-	}
-
-	public void setWidth(Integer flvWidth) {
-		this.width = flvWidth;
-	}
-
-	public Integer getHeight() {
-		return height;
-	}
-
-	public void setHeight(Integer flvHeight) {
-		this.height = flvHeight;
-	}
-
-	public Type getType() {
-		return type;
-	}
-
-	public void setType(Type type) {
-		this.type = type;
-	}
-
-	public List<FileItemLog> getLog() {
-		return log;
-	}
-
-	public void setLog(List<FileItemLog> log) {
-		this.log = log;
-	}
-
-	public String getFileName(String ext) {
-		return ext == null ? name : String.format("%s.%s", name, ext);
-	}
-
-	public File getFile() {
-		return getFile(null);
-	}
-
-	public Long getGroupId() {
-		return groupId;
-	}
-
-	public void setGroupId(Long groupId) {
-		this.groupId = groupId;
+	@Override
+	@Element(data = true, name = "fileExplorerItemId")
+	public Long getId() {
+		return super.getId();
 	}
 
-	public boolean isReadOnly() {
-		return readOnly;
+	@Override
+	@Element(data = true, name = "fileExplorerItemId")
+	public void setId(Long id) {
+		super.setId(id);
 	}
 
-	public void setReadOnly(boolean readOnly) {
-		this.readOnly = readOnly;
+	public Long getSize() {
+		return size;
 	}
 
-	public final File getFile(String ext) {
-		File f = null;
-		if (getHash() != null) {
-			File d = new File(getUploadFilesDir(), getHash());
-			switch (getType()) {
-				case WmlFile:
-					f = new File(getUploadWmlDir(), String.format("%s.%s", getHash(), ext == null ? EXTENSION_WML : ext));
-					break;
-				case Image:
-					f = new File(d, String.format("%s.%s", getHash(), ext == null ? EXTENSION_JPG : ext));
-					break;
-				case Recording:
-					f = new File(getStreamsHibernateDir(), String.format("%s.%s", getHash(), ext == null ? EXTENSION_MP4 : ext));
-					break;
-				case Video:
-					f = new File(d, String.format("%s.%s", getHash(), ext == null ? EXTENSION_MP4 : ext));
-					break;
-				case Presentation:
-					f = new File(d, String.format("%s.%s", getHash(), ext == null ? EXTENSION_SWF : ext));
-					break;
-				case PollChart:
-				case Folder:
-				default:
-			}
-		}
-		return f;
+	public void setSize(Long fileSize) {
+		this.size = fileSize;
 	}
 
-	public final boolean exists() {
-		return exists(null);
+	public String getExternalId() {
+		return externalId;
 	}
 
-	public final boolean exists(String ext) {
-		if (getId() != null && !isDeleted()) {
-			File f = getFile(ext);
-			return f != null && f.exists() && f.isFile();
-		}
-		return false;
+	public void setExternalId(String externalId) {
+		this.externalId = externalId;
 	}
 
-	@Override
-	public int hashCode() {
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((hash == null) ? 0 : hash.hashCode());
-		result = prime * result + ((name == null) ? 0 : name.hashCode());
-		result = prime * result + ((ownerId == null) ? 0 : ownerId.hashCode());
-		result = prime * result + ((parentId == null) ? 0 : parentId.hashCode());
-		result = prime * result + ((roomId == null) ? 0 : roomId.hashCode());
-		result = prime * result + ((type == null) ? 0 : type.hashCode());
-		return result;
+	public String getExternalType() {
+		return externalType;
 	}
 
-	@Override
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		FileItem other = (FileItem) obj;
-		if (hash == null) {
-			if (other.hash != null)
-				return false;
-		} else if (!hash.equals(other.hash))
-			return false;
-		if (name == null) {
-			if (other.name != null)
-				return false;
-		} else if (!name.equals(other.name))
-			return false;
-		if (ownerId == null) {
-			if (other.ownerId != null)
-				return false;
-		} else if (!ownerId.equals(other.ownerId))
-			return false;
-		if (parentId == null) {
-			if (other.parentId != null)
-				return false;
-		} else if (!parentId.equals(other.parentId))
-			return false;
-		if (roomId == null) {
-			if (other.roomId != null)
-				return false;
-		} else if (!roomId.equals(other.roomId))
-			return false;
-		if (type != other.type)
-			return false;
-		return true;
+	public void setExternalType(String externalType) {
+		this.externalType = externalType;
 	}
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItemLog.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItemLog.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItemLog.java
index 2e1a0aa..dc47fba 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItemLog.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/FileItemLog.java
@@ -36,7 +36,7 @@ import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
 import org.apache.openmeetings.db.entity.IDataProviderEntity;
-import org.apache.openmeetings.db.entity.file.FileItem.Type;
+import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
 
 @Entity
 @NamedQueries({

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/7b5cd392/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
----------------------------------------------------------------------
diff --git a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
index c1e13dc..e188afd 100644
--- a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
+++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/Recording.java
@@ -30,20 +30,16 @@ import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
-import javax.persistence.Table;
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
-import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.simpleframework.xml.Element;
 import org.simpleframework.xml.ElementList;
 import org.simpleframework.xml.Root;
@@ -97,11 +93,10 @@ import org.simpleframework.xml.Root;
 			+ "    OR rec.roomId IN (SELECT rg.room.id FROM RoomGroup rg WHERE rg.group.id = :groupId)"
 			+ "  ) order by rec.inserted ASC")
 })
-@Table(name = "recording")
 @Root(name = "flvrecording")
 @XmlRootElement
 @XmlAccessorType(XmlAccessType.FIELD)
-public class Recording extends FileItem {
+public class Recording extends BaseFileItem {
 	private static final long serialVersionUID = 1L;
 
 	@XmlType(namespace="org.apache.openmeetings.record")
@@ -113,12 +108,6 @@ public class Recording extends FileItem {
 		, ERROR
 	}
 
-	@Id
-	@GeneratedValue(strategy = GenerationType.IDENTITY)
-	@Column(name = "id")
-	@Element(data = true, name = "flvRecordingId")
-	private Long id;
-
 	@Column(name = "comment")
 	@Element(data = true, required = false)
 	private String comment;
@@ -139,9 +128,9 @@ public class Recording extends FileItem {
 	@Element(data = true, required = false)
 	private String recorderStreamId;
 
-	@Column(name = "is_interview", nullable = false)
+	@Column(name = "is_interview")
 	@Element(data = true, required = false)
-	private boolean interview;
+	private Boolean interview = false;
 
 	@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
 	@JoinColumn(name = "recording_id")
@@ -153,18 +142,20 @@ public class Recording extends FileItem {
 	@Element(data = true, required = false)
 	private Status status = Status.NONE;
 
-	@Column(name = "notified", nullable = false)
+	@Column(name = "notified")
 	@Element(data = true, required = false)
-	private boolean notified = false;
+	private Boolean notified = false;
 
 	@Override
+	@Element(data = true, name = "flvRecordingId")
 	public Long getId() {
-		return id;
+		return super.getId();
 	}
 
 	@Override
+	@Element(data = true, name = "flvRecordingId")
 	public void setId(Long id) {
-		this.id = id;
+		super.setId(id);
 	}
 
 	public String getComment() {
@@ -216,7 +207,7 @@ public class Recording extends FileItem {
 	}
 
 	public boolean isInterview() {
-		return interview;
+		return Boolean.TRUE.equals(interview);
 	}
 
 	public void setInterview(boolean interview) {
@@ -232,7 +223,7 @@ public class Recording extends FileItem {
 	}
 
 	public boolean isNotified() {
-		return notified;
+		return Boolean.TRUE.equals(notified);
 	}
 
 	public void setNotified(boolean notified) {
@@ -241,6 +232,6 @@ public class Recording extends FileItem {
 
 	@Override
 	public String getFileName(String ext) {
-		return String.format("%s%s.%s", recordingFileName, id, ext == null ? EXTENSION_MP4 : ext);
+		return String.format("%s%s.%s", recordingFileName, getId(), ext == null ? EXTENSION_MP4 : ext);
 	}
 }