Repository: openmeetings
Updated Branches:
  refs/heads/master a38d35a11 -> 1d55047cf


[OPENMEETINGS-1671] room files can be specified via web service


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

Branch: refs/heads/master
Commit: 1d55047cfc60a0b0cfc5dfc4554a01065e0a1ac0
Parents: a38d35a
Author: Maxim Solodovnik <[email protected]>
Authored: Wed Sep 27 17:45:15 2017 +0700
Committer: Maxim Solodovnik <[email protected]>
Committed: Wed Sep 27 17:52:32 2017 +0700

----------------------------------------------------------------------
 .../db/dao/file/BaseFileItemDao.java            |  93 +++++++++++++++
 .../openmeetings/db/dao/file/FileItemDao.java   |  51 ++------
 .../db/dao/file/FileItemLogDao.java             |   7 +-
 .../db/dao/record/RecordingDao.java             |  71 ++---------
 .../db/dto/calendar/AppointmentDTO.java         |   5 +-
 .../openmeetings/db/dto/room/RoomDTO.java       |  25 +++-
 .../openmeetings/db/dto/room/RoomFileDTO.java   | 119 +++++++++++++++++++
 .../db/entity/file/BaseFileItem.java            |   4 +-
 .../openmeetings/db/entity/file/FileItem.java   |   2 -
 .../db/entity/file/FileItemLog.java             |  22 +---
 .../db/entity/record/Recording.java             |   4 +-
 .../test/webservice/AbstractWebServiceTest.java |  50 ++++++++
 .../test/webservice/TestFileService.java        |  34 +-----
 .../test/webservice/TestRoomService.java        | 115 +++++++++++++++++-
 .../openmeetings/webservice/BaseWebService.java |   5 +
 .../webservice/CalendarWebService.java          |   2 +-
 .../openmeetings/webservice/FileWebService.java |  18 ++-
 .../openmeetings/webservice/RoomWebService.java |  29 ++++-
 18 files changed, 469 insertions(+), 187 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java
new file mode 100644
index 0000000..b3d76bb
--- /dev/null
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java
@@ -0,0 +1,93 @@
+/*
+ * 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.OpenmeetingsVariables.webAppRootKey;
+
+import java.util.Date;
+
+import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.PersistenceContext;
+import javax.persistence.TypedQuery;
+
+import org.apache.openmeetings.db.entity.file.BaseFileItem;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+@Repository
+@Transactional
+public class BaseFileItemDao {
+       private static final Logger log = 
Red5LoggerFactory.getLogger(BaseFileItemDao.class, webAppRootKey);
+       @PersistenceContext
+       protected EntityManager em;
+
+       public BaseFileItem get(String hash) {
+               log.debug("getByHash() started");
+               BaseFileItem f = null;
+               TypedQuery<BaseFileItem> query = 
em.createNamedQuery("getFileByHash", BaseFileItem.class);
+               query.setParameter("hash", hash);
+
+               try {
+                       f = query.getSingleResult();
+               } catch (NoResultException ex) {
+                       //no-op
+               }
+               return f;
+       }
+
+       public BaseFileItem get(Long id) {
+               BaseFileItem f = null;
+               if (id != null && id > 0) {
+                       TypedQuery<BaseFileItem> query = 
em.createNamedQuery("getFileById", BaseFileItem.class)
+                                       .setParameter("id", id);
+
+                       try {
+                               f = query.getSingleResult();
+                       } catch (NoResultException ex) {
+                       }
+               } else {
+                       log.info("[get] " + "Info: No id given");
+               }
+               return f;
+       }
+
+       public void delete(BaseFileItem f) {
+               if (f == null || f.getId() == null) {
+                       return;
+               }
+               f.setDeleted(true);
+               f.setUpdated(new Date());
+
+               _update(f);
+       }
+
+       public BaseFileItem _update(BaseFileItem f) {
+               if (f.getId() == null) {
+                       f.setInserted(new Date());
+                       em.persist(f);
+               } else {
+                       f.setUpdated(new Date());
+                       f = em.merge(f);
+               }
+               return f;
+       }
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/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
index 5d2c544..10ed939 100644
--- 
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
@@ -27,9 +27,7 @@ import java.util.List;
 import java.util.UUID;
 import java.util.stream.Collectors;
 
-import javax.persistence.EntityManager;
 import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
 import javax.persistence.TypedQuery;
 
 import org.apache.openmeetings.db.entity.file.BaseFileItem;
@@ -48,10 +46,8 @@ import 
org.springframework.transaction.annotation.Transactional;
  */
 @Repository
 @Transactional
-public class FileItemDao {
+public class FileItemDao extends BaseFileItemDao {
        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) {
@@ -147,33 +143,14 @@ public class FileItemDao {
        }
 
        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;
+               BaseFileItem bf = super.get(hash);
+               return bf instanceof FileItem ? (FileItem)bf : null;
        }
 
+       @Override
        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;
+               BaseFileItem bf = super.get(id);
+               return bf instanceof FileItem ? (FileItem)bf : null;
        }
 
        public FileItem get(String externalId, String externalType) {
@@ -201,13 +178,6 @@ public class FileItemDao {
                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");
 
@@ -230,14 +200,7 @@ public class FileItemDao {
        }
 
        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;
+               return (FileItem)super._update(f);
        }
 
        private void updateChilds(FileItem f) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/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 40064b3..b6a2f29 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
@@ -43,17 +43,17 @@ public class FileItemLogDao {
 
        public long countErrors(BaseFileItem f) {
                return em.createNamedQuery("countErrorFileLogsByFile", 
Long.class).setParameter("fileId", f.getId())
-                               .setParameter("type", 
f.getType()).getSingleResult();
+                               .getSingleResult();
        }
 
        public List<FileItemLog> get(BaseFileItem f) {
                return em.createNamedQuery("getFileLogsByFile", 
FileItemLog.class).setParameter("fileId", f.getId())
-                               .setParameter("type", 
f.getType()).getResultList();
+                               .getResultList();
        }
 
        public void delete(BaseFileItem f) {
                
em.createNamedQuery("deleteErrorFileLogsByFile").setParameter("fileId", 
f.getId())
-                               .setParameter("type", 
f.getType()).executeUpdate();
+                               .executeUpdate();
        }
 
        public FileItemLog add(String name, BaseFileItem f, 
ConverterProcessResult returnMap) {
@@ -62,7 +62,6 @@ public class FileItemLogDao {
                log.setInserted(new Date());
                log.setExitCode(returnMap.getExitCode());
                log.setFileId(f.getId());
-               log.setFileType(f.getType());
                log.setMessage(returnMap.buildLogMessage());
                log.setName(name);
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
index e4b111e..8c313b1 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/record/RecordingDao.java
@@ -27,13 +27,12 @@ import java.time.Instant;
 import java.util.Date;
 import java.util.List;
 
-import javax.persistence.EntityManager;
-import javax.persistence.NoResultException;
-import javax.persistence.PersistenceContext;
 import javax.persistence.TypedQuery;
 
+import org.apache.openmeetings.db.dao.file.BaseFileItemDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.record.RecordingContainerData;
+import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.db.entity.record.Recording;
 import org.apache.openmeetings.db.entity.record.Recording.Status;
 import org.apache.openmeetings.db.entity.user.GroupUser;
@@ -49,45 +48,21 @@ import 
org.springframework.transaction.annotation.Transactional;
  */
 @Repository
 @Transactional
-public class RecordingDao {
+public class RecordingDao extends BaseFileItemDao {
        private static final Logger log = 
Red5LoggerFactory.getLogger(RecordingDao.class, webAppRootKey);
 
-       @PersistenceContext
-       private EntityManager em;
        @Autowired
        private UserDao userDao;
 
-       public Recording get(Long recordingId) {
-               try {
-                       TypedQuery<Recording> query = 
em.createNamedQuery("getRecordingById", Recording.class);
-                       query.setParameter("id", recordingId);
-
-                       Recording recording = null;
-                       try {
-                               recording = query.getSingleResult();
-                       } catch (NoResultException ex) {
-                       }
-                       return recording;
-               } catch (Exception ex2) {
-                       log.error("[get]: ", ex2);
-               }
-               return null;
+       @Override
+       public Recording get(Long id) {
+               BaseFileItem bf = super.get(id);
+               return bf instanceof Recording ? (Recording)bf : null;
        }
 
        public Recording getByHash(String hash) {
-               try {
-                       TypedQuery<Recording> query = 
em.createNamedQuery("getRecordingByHash", Recording.class);
-                       query.setParameter("hash", hash);
-
-                       try {
-                               return query.getSingleResult();
-                       } catch (NoResultException ex) {
-                               // noop
-                       }
-               } catch (Exception ex2) {
-                       log.error("[getByHash]: ", ex2);
-               }
-               return null;
+               BaseFileItem bf = super.get(hash);
+               return bf instanceof Recording ? (Recording)bf : null;
        }
 
        public List<Recording> getByExternalId(String externalId, String 
externalType) {
@@ -201,34 +176,8 @@ public class RecordingDao {
                }
        }
 
-       public boolean delete(Recording f) {
-               if (f == null || f.getId() == null) {
-                       return false;
-               }
-               f.setDeleted(true);
-               update(f);
-               return true;
-       }
-
        public Recording update(Recording f) {
-               try {
-                       if (f.getId() == null) {
-                               if (f.getInserted() == null) {
-                                       //required to preserve date while import
-                                       f.setInserted(new Date());
-                               }
-                               em.persist(f);
-                       } else {
-                               f.setUpdated(new Date());
-                               if (!em.contains(f)) {
-                                       f = em.merge(f);
-                               }
-                       }
-
-               } catch (Exception ex2) {
-                       log.error("[update]: ", ex2);
-               }
-               return f;
+               return (Recording)_update(f);
        }
 
        public void resetProcessingStatus() {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
index 9a73a10..e0ce566 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
@@ -30,6 +30,7 @@ import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
+import org.apache.openmeetings.db.dao.file.BaseFileItemDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.room.RoomDTO;
 import org.apache.openmeetings.db.dto.user.UserDTO;
@@ -94,7 +95,7 @@ public class AppointmentDTO implements Serializable {
                reminderEmailSend = a.isReminderEmailSend();
        }
 
-       public Appointment get(UserDao userDao, AppointmentDao appointmentDao, 
User u) {
+       public Appointment get(UserDao userDao, BaseFileItemDao fileDao, 
AppointmentDao appointmentDao, User u) {
                Appointment a = id == null ? new Appointment() : 
appointmentDao.get(id);
                a.setId(id);
                a.setTitle(title);
@@ -107,7 +108,7 @@ public class AppointmentDTO implements Serializable {
                a.setUpdated(updated);
                a.setDeleted(deleted);
                a.setReminder(reminder);
-               a.setRoom(room.get());
+               a.setRoom(room.get(fileDao));
                a.setIcalId(icalId);
                List<MeetingMember> mml = new ArrayList<>();
                for(MeetingMemberDTO mm : meetingMembers) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
index de7cea4..030d59b 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
@@ -33,9 +33,11 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
+import org.apache.openmeetings.db.dao.file.BaseFileItemDao;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 
+import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
 
 @XmlRootElement
@@ -62,6 +64,7 @@ public class RoomDTO implements Serializable {
        private boolean waitForRecording;
        private boolean audioOnly;
        private Set<RoomElement> hiddenElements = new HashSet<>();
+       private List<RoomFileDTO> files = new ArrayList<>();
 
        public RoomDTO() {}
 
@@ -86,9 +89,10 @@ public class RoomDTO implements Serializable {
                waitForRecording = r.isWaitForRecording();
                audioOnly = r.isAudioOnly();
                hiddenElements = r.getHiddenElements();
+               files = RoomFileDTO.get(r.getFiles());
        }
 
-       public Room get() {
+       public Room get(BaseFileItemDao fileDao) {
                Room r = new Room();
                r.setId(id);
                r.setName(name);
@@ -109,6 +113,7 @@ public class RoomDTO implements Serializable {
                r.setWaitForRecording(waitForRecording);
                r.setAudioOnly(audioOnly);
                r.setHiddenElements(hiddenElements);
+               r.setFiles(RoomFileDTO.get(id, files, fileDao));
                return r;
        }
 
@@ -272,6 +277,14 @@ public class RoomDTO implements Serializable {
                this.closed = closed;
        }
 
+       public List<RoomFileDTO> getFiles() {
+               return files;
+       }
+
+       public void setFiles(List<RoomFileDTO> files) {
+               this.files = files;
+       }
+
        public static List<RoomDTO> list(List<Room> l) {
                List<RoomDTO> rList = new ArrayList<>();
                if (l != null) {
@@ -302,8 +315,8 @@ public class RoomDTO implements Serializable {
                r.demo = o.optBoolean("demo", false);
                r.closed = o.optBoolean("closed", false);
                r.demoTime = optInt(o, "demoTime");
-               r.externalId = o.optString("externalId");
-               r.externalType = o.optString("externalType");
+               r.externalId = o.optString("externalId", null);
+               r.externalType = o.optString("externalType", null);
                r.redirectUrl = o.optString("redirectUrl");
                r.moderated = o.optBoolean("moderated", false);
                r.allowUserQuestions = o.optBoolean("allowUserQuestions", 
false);
@@ -311,6 +324,12 @@ public class RoomDTO implements Serializable {
                r.waitForRecording = o.optBoolean("waitForRecording", false);
                r.audioOnly = o.optBoolean("audioOnly", false);
                r.getHiddenElements().addAll(optEnumList(RoomElement.class, 
o.optJSONArray("hiddenElements")));
+               JSONArray fa = o.optJSONArray("files");
+               if (fa != null) {
+                       for (int i = 0; i < fa.length(); ++i) {
+                               
r.getFiles().add(RoomFileDTO.get(fa.getJSONObject(i)));
+                       }
+               }
                return r;
        }
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java
new file mode 100644
index 0000000..bb6cc7a
--- /dev/null
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java
@@ -0,0 +1,119 @@
+/*
+ * 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.room;
+
+import static org.apache.openmeetings.db.util.DtoHelper.optLong;
+
+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.dao.file.BaseFileItemDao;
+import org.apache.openmeetings.db.entity.room.RoomFile;
+
+import com.github.openjson.JSONObject;
+
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class RoomFileDTO implements Serializable {
+       private static final long serialVersionUID = 1L;
+       private Long id;
+       private long fileId;
+       private long wbIdx = 0;
+
+       public RoomFileDTO() {}
+
+       public RoomFileDTO(RoomFile rf) {
+               id = rf.getId();
+               fileId = rf.getFile().getId();
+               wbIdx = rf.getWbIdx();
+       }
+
+       public RoomFile get(BaseFileItemDao fileDao, Long roomId) {
+               RoomFile f = new RoomFile();
+               f.setId(id);
+               f.setRoomId(roomId);
+               f.setFile(fileDao.get(fileId));
+               f.setWbIdx(wbIdx);
+               return f;
+       }
+
+       public Long getId() {
+               return id;
+       }
+
+       public void setId(Long id) {
+               this.id = id;
+       }
+
+       public long getFileId() {
+               return fileId;
+       }
+
+       public void setFileId(long fileId) {
+               this.fileId = fileId;
+       }
+
+       public long getWbIdx() {
+               return wbIdx;
+       }
+
+       public void setWbIdx(long wbIdx) {
+               this.wbIdx = wbIdx;
+       }
+
+       public static List<RoomFileDTO> get(List<RoomFile> rfl) {
+               List<RoomFileDTO> r = new ArrayList<>();
+               if (rfl != null) {
+                       for (RoomFile rf : rfl) {
+                               r.add(new RoomFileDTO(rf));
+                       }
+               }
+               return r;
+       }
+
+       public static List<RoomFile> get(Long roomId, List<RoomFileDTO> rfl, 
BaseFileItemDao fileDao) {
+               List<RoomFile> r = new ArrayList<>();
+               if (rfl != null) {
+                       for (RoomFileDTO rf : rfl) {
+                               RoomFile f = rf.get(fileDao, roomId);
+                               if (f.getFile() == null) {
+                                       continue;
+                               }
+                               r.add(f);
+                       }
+               }
+               return r;
+       }
+
+       public static RoomFileDTO get(JSONObject o) {
+               if (o == null) {
+                       return null;
+               }
+               RoomFileDTO rf = new RoomFileDTO();
+               rf.id = optLong(o, "id");
+               rf.fileId = o.getLong("fileId");
+               rf.wbIdx = optLong(o, "wbIdx");
+               return rf;
+       }
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/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
index a7064a2..33f7e74 100644
--- 
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
@@ -52,7 +52,9 @@ import org.simpleframework.xml.Element;
 
 @Entity
 @NamedQueries({
-       @NamedQuery(name = "getAllFileItemsForRoom", query = "SELECT f FROM 
BaseFileItem f"
+       @NamedQuery(name = "getFileById", query = "SELECT f FROM BaseFileItem f 
WHERE f.deleted = false AND f.id = :id")
+       , @NamedQuery(name = "getFileByHash", query = "SELECT f FROM 
BaseFileItem f WHERE f.deleted = false AND f.hash = :hash")
+       , @NamedQuery(name = "getAllFileItemsForRoom", query = "SELECT f FROM 
BaseFileItem f"
                        + " WHERE f.deleted = false AND f.type <> :folder"
                        + " AND (f.roomId IS NULL OR f.roomId = :roomId)"
                        + " AND (f.groupId IS NULL OR f.groupId IN :groups)"

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/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 06e5d6e..3d286f6 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
@@ -29,8 +29,6 @@ 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 "

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/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 dc47fba..6b337e1 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
@@ -20,13 +20,12 @@ package org.apache.openmeetings.db.entity.file;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.openmeetings.util.process.ConverterProcessResult.ZERO;
+
 import java.util.Arrays;
 import java.util.Date;
 
 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;
@@ -36,13 +35,12 @@ import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
 import org.apache.openmeetings.db.entity.IDataProviderEntity;
-import org.apache.openmeetings.db.entity.file.BaseFileItem.Type;
 
 @Entity
 @NamedQueries({
-               @NamedQuery(name = "getFileLogsByFile", query = "SELECT fl FROM 
FileItemLog fl WHERE fl.fileId = :fileId AND fl.fileType = :type"),
-               @NamedQuery(name = "countErrorFileLogsByFile", query = "SELECT 
COUNT(fl) FROM FileItemLog fl WHERE fl.fileId = :fileId AND fl.fileType = :type 
AND fl.exitCode <> 0"),
-               @NamedQuery(name = "deleteErrorFileLogsByFile", query = "DELETE 
FROM FileItemLog fl WHERE fl.fileId = :fileId AND fl.fileType = :type") })
+               @NamedQuery(name = "getFileLogsByFile", query = "SELECT fl FROM 
FileItemLog fl WHERE fl.fileId = :fileId"),
+               @NamedQuery(name = "countErrorFileLogsByFile", query = "SELECT 
COUNT(fl) FROM FileItemLog fl WHERE fl.fileId = :fileId AND fl.exitCode <> 0"),
+               @NamedQuery(name = "deleteErrorFileLogsByFile", query = "DELETE 
FROM FileItemLog fl WHERE fl.fileId = :fileId") })
 @Table(name = "file_log")
 public class FileItemLog implements IDataProviderEntity {
        private static final long serialVersionUID = 1L;
@@ -55,10 +53,6 @@ public class FileItemLog implements IDataProviderEntity {
        @Column(name = "file_id")
        private Long fileId;
 
-       @Column(name = "file_type")
-       @Enumerated(EnumType.STRING)
-       private Type fileType;
-
        @Column(name = "inserted")
        private Date inserted;
 
@@ -90,14 +84,6 @@ public class FileItemLog implements IDataProviderEntity {
                this.fileId = fileId;
        }
 
-       public Type getFileType() {
-               return fileType;
-       }
-
-       public void setFileType(Type fileType) {
-               this.fileType = fileType;
-       }
-
        public Date getInserted() {
                return inserted;
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/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 e188afd..06ba134 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
@@ -61,9 +61,7 @@ import org.simpleframework.xml.Root;
  */
 @Entity
 @NamedQueries({
-       @NamedQuery(name = "getRecordingById", query = "SELECT f FROM Recording 
f WHERE f.id = :id")
-       , @NamedQuery(name = "getRecordingByHash", query = "SELECT f FROM 
Recording f WHERE f.hash = :hash")
-       , @NamedQuery(name = "getRecordingsByExternalUser", query = "SELECT c 
FROM Recording c, User u "
+       @NamedQuery(name = "getRecordingsByExternalUser", query = "SELECT c 
FROM Recording c, User u "
                        + "WHERE c.insertedBy = u.id AND u.externalId = 
:externalId  AND u.externalType = :externalType "
                        + "AND c.deleted = false")
        , @NamedQuery(name = "getRecordingsPublic", query = "SELECT f FROM 
Recording f WHERE f.deleted = false AND f.ownerId IS NULL "

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/AbstractWebServiceTest.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/AbstractWebServiceTest.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/AbstractWebServiceTest.java
index 846b7c2..0068c56 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/AbstractWebServiceTest.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/AbstractWebServiceTest.java
@@ -25,19 +25,28 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.nio.file.Files;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import java.util.UUID;
 
 import javax.ws.rs.core.Form;
+import javax.ws.rs.core.MediaType;
 
 import org.apache.catalina.LifecycleState;
 import org.apache.catalina.startup.Tomcat;
 import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.jaxrs.ext.multipart.Attachment;
 import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
 import org.apache.openmeetings.db.dto.basic.ServiceResult.Type;
+import org.apache.openmeetings.db.dto.file.FileItemDTO;
 import org.apache.openmeetings.db.dto.user.UserDTO;
+import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.test.AbstractJUnitDefaults;
 import org.apache.openmeetings.web.app.WebSession;
@@ -54,6 +63,7 @@ public class AbstractWebServiceTest extends 
AbstractJUnitDefaults {
        public final static String BASE_SERVICES_URL = "http://localhost:8080"; 
+ CONTEXT + "/services";
        public final static String USER_SERVICE_URL = BASE_SERVICES_URL + 
"/user";
        public final static String INFO_SERVICE_URL = BASE_SERVICES_URL + 
"/info";
+       public final static String FILE_SERVICE_URL = BASE_SERVICES_URL + 
"/file";
        public final static String UNIT_TEST_EXT_TYPE = "om_unit_tests";
        public final static long TIMEOUT = 5 * 60 * 1000;
        protected WicketTester tester;
@@ -133,4 +143,44 @@ public class AbstractWebServiceTest extends 
AbstractJUnitDefaults {
                Assert.assertNotNull(user.getId());
                u.setId(user.getId());
        }
+
+       public CallResult<FileItemDTO> createVerifiedFile(File fsFile) throws 
IOException {
+               ServiceResult r = login();
+
+               FileItemDTO f1 = null;
+               try (InputStream is = new FileInputStream(fsFile)) {
+                       FileItemDTO file = new FileItemDTO();
+                       file.setName("test.txt");
+                       file.setHash(UUID.randomUUID().toString());
+                       file.setType(BaseFileItem.Type.Presentation);
+                       List<Attachment> atts = new ArrayList<>();
+                       atts.add(new Attachment("file", 
MediaType.APPLICATION_JSON, file));
+                       atts.add(new Attachment("stream", 
MediaType.APPLICATION_OCTET_STREAM, is));
+                       f1 = getClient(FILE_SERVICE_URL)
+                                       .path("/")
+                                       .query("sid", r.getMessage())
+                                       
.type(MediaType.MULTIPART_FORM_DATA_TYPE).postCollection(atts, 
Attachment.class, FileItemDTO.class);
+                       assertNotNull("Valid FileItem should be returned", f1);
+                       assertNotNull("Valid FileItem should be returned", 
f1.getId());
+               }
+               return new CallResult<>(r.getMessage(), f1);
+       }
+
+       public static class CallResult<T> {
+               private final String sid;
+               private final T obj;
+
+               public CallResult(String sid, T obj) {
+                       this.sid = sid;
+                       this.obj = obj;
+               }
+
+               public String getSid() {
+                       return sid;
+               }
+
+               public T getObj() {
+                       return obj;
+               }
+       }
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestFileService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestFileService.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestFileService.java
index 70065ce..ef0bba2 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestFileService.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestFileService.java
@@ -19,23 +19,14 @@
 package org.apache.openmeetings.test.webservice;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 
 import java.awt.Graphics;
 import java.awt.image.BufferedImage;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
 
 import javax.imageio.ImageIO;
-import javax.ws.rs.core.MediaType;
 
-import org.apache.cxf.jaxrs.ext.multipart.Attachment;
-import org.apache.openmeetings.db.dto.basic.ServiceResult;
 import org.apache.openmeetings.db.dto.file.FileItemDTO;
 import org.apache.openmeetings.db.entity.file.BaseFileItem;
 import org.apache.openmeetings.util.NonJenkinsTests;
@@ -43,13 +34,10 @@ import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
 public class TestFileService extends AbstractWebServiceTest {
-       public final static String FILE_SERVICE_URL = BASE_SERVICES_URL + 
"/file";
 
        @Test
        @Category(NonJenkinsTests.class)
        public void addFileTest() throws IOException {
-               ServiceResult r = login();
-
                File img = null;
                try {
                        img = File.createTempFile("omtest", ".jpg");
@@ -59,24 +47,10 @@ public class TestFileService extends AbstractWebServiceTest 
{
                        Graphics g = image.getGraphics();
                        g.drawString("Hello World!!!", 10, 20);
                        ImageIO.write(image, "jpg", img);
-                       try (InputStream is = new FileInputStream(img)) {
-                               FileItemDTO file = new FileItemDTO();
-                               file.setName("test.txt");
-                               file.setHash(UUID.randomUUID().toString());
-                               file.setType(BaseFileItem.Type.Presentation);
-                               List<Attachment> atts = new ArrayList<>();
-                               atts.add(new Attachment("file", 
MediaType.APPLICATION_JSON, file));
-                               atts.add(new Attachment("stream", 
MediaType.APPLICATION_OCTET_STREAM, is));
-                               FileItemDTO f1 = getClient(FILE_SERVICE_URL)
-                                               .path("/")
-                                               .query("sid", r.getMessage())
-                                               
.type(MediaType.MULTIPART_FORM_DATA_TYPE).postCollection(atts, 
Attachment.class, FileItemDTO.class);
-                               assertNotNull("Valid FileItem should be 
returned", f1);
-                               assertNotNull("Valid FileItem should be 
returned", f1.getId());
-                               assertEquals("Type should be Image", 
BaseFileItem.Type.Image, f1.getType());
-                               assertEquals("Width should be determined", 
width, f1.getWidth());
-                               assertEquals("Height should be Image", height, 
f1.getHeight());
-                       }
+                       CallResult<FileItemDTO> cr = createVerifiedFile(img);
+                       assertEquals("Type should be Image", 
BaseFileItem.Type.Image, cr.getObj().getType());
+                       assertEquals("Width should be determined", width, 
cr.getObj().getWidth());
+                       assertEquals("Height should be Image", height, 
cr.getObj().getHeight());
                } finally {
                        if (img != null && img.exists()) {
                                img.delete();

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestRoomService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestRoomService.java
 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestRoomService.java
index 1c41777..7413615 100644
--- 
a/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestRoomService.java
+++ 
b/openmeetings-web/src/test/java/org/apache/openmeetings/test/webservice/TestRoomService.java
@@ -18,18 +18,28 @@
  */
 package org.apache.openmeetings.test.webservice;
 
+import static javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
+import java.io.IOException;
 import java.util.UUID;
 
+import javax.ws.rs.core.Form;
+
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
+import org.apache.openmeetings.db.dto.file.FileItemDTO;
 import org.apache.openmeetings.db.dto.room.RoomDTO;
+import org.apache.openmeetings.db.dto.room.RoomFileDTO;
 import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.util.OmFileHelper;
 import org.junit.Test;
 
 public class TestRoomService extends AbstractWebServiceTest {
        public final static String ROOM_SERVICE_URL = BASE_SERVICES_URL + 
"/room";
+       private final static long CAPACITY = 666L;
 
        @Test
        public void testExternal() {
@@ -38,12 +48,11 @@ public class TestRoomService extends AbstractWebServiceTest 
{
                Room.Type type = Room.Type.presentation;
                String name = "Unit Test Ext Room";
                String comment = "Unit Test Ext Room Comments";
-               long num = 666L;
                RoomDTO r = new RoomDTO();
                r.setType(type);
                r.setName(name);
                r.setComment(comment);
-               r.setCapacity(num);
+               r.setCapacity(CAPACITY);
                RoomDTO room = 
getClient(ROOM_SERVICE_URL).path(String.format("/%s/%s/%s", type, 
UNIT_TEST_EXT_TYPE, extId))
                                .query("sid", sr.getMessage())
                                .query("room", r.toString())
@@ -51,9 +60,109 @@ public class TestRoomService extends AbstractWebServiceTest 
{
                assertNotNull("Valid room should be returned", room);
                assertNotNull("Room ID should be not empty", room.getId());
 
-               RoomDTO room1 = 
getClient(ROOM_SERVICE_URL).path(String.format("/%s/%s/%s", 
Room.Type.presentation, UNIT_TEST_EXT_TYPE, extId)).query("sid", 
sr.getMessage())
+               RoomDTO room1 = 
getClient(ROOM_SERVICE_URL).path(String.format("/%s/%s/%s", 
Room.Type.presentation, UNIT_TEST_EXT_TYPE, extId))
+                               .query("sid", sr.getMessage())
                                .get(RoomDTO.class);
                assertNotNull("Valid room should be returned", room1);
                assertEquals("Same Room should be returned", room.getId(), 
room1.getId());
        }
+
+       private CallResult<RoomDTO> createAndValidate(RoomDTO r) {
+               return createAndValidate(null, r);
+       }
+
+       private CallResult<RoomDTO> createAndValidate(String sid, RoomDTO r) {
+               if (sid == null) {
+                       ServiceResult sr = login();
+                       sid = sr.getMessage();
+               }
+               RoomDTO room = getClient(ROOM_SERVICE_URL)
+                               .query("sid", sid)
+                               .type(APPLICATION_FORM_URLENCODED)
+                               .post(new Form().param("room", r.toString()), 
RoomDTO.class);
+               assertNotNull("Valid room should be returned", room);
+               assertNotNull("Room ID should be not empty", room.getId());
+
+               RoomDTO room1 = 
getClient(ROOM_SERVICE_URL).path(String.format("/%s", room.getId()))
+                               .query("sid", sid)
+                               .get(RoomDTO.class);
+               assertNotNull("Valid room should be returned", room1);
+               assertEquals("Room with same ID should be returned", 
room.getId(), room1.getId());
+               assertEquals("Room with same Name should be returned", 
r.getName(), room1.getName());
+               assertEquals("Room with same ExternalType should be returned", 
r.getExternalType(), room1.getExternalType());
+               assertEquals("Room with same ExternalId should be returned", 
r.getExternalId(), room1.getExternalId());
+               //TODO check other fields
+               return new CallResult<>(sid, room1);
+       }
+
+       @Test
+       public void testCreate1() {
+               String extId = UUID.randomUUID().toString();
+               Room.Type type = Room.Type.presentation;
+               String name = "Unit Test Ext Room1";
+               String comment = "Unit Test Ext Room Comments1";
+               RoomDTO r = new RoomDTO();
+               r.setType(type);
+               r.setName(name);
+               r.setComment(comment);
+               r.setCapacity(CAPACITY);
+               r.setExternalType(UNIT_TEST_EXT_TYPE);
+               r.setExternalId(extId);
+
+               createAndValidate(r);
+       }
+
+       @Test
+       public void testCreate2() {
+               Room.Type type = Room.Type.presentation;
+               String name = "Unit Test Ext Room2";
+               String comment = "Unit Test Ext Room Comments2";
+               RoomDTO r = new RoomDTO();
+               r.setType(type);
+               r.setName(name);
+               r.setComment(comment);
+               r.setCapacity(CAPACITY);
+
+               createAndValidate(r);
+       }
+
+       @Test
+       public void testCreateWithFiles1() {
+               Room.Type type = Room.Type.presentation;
+               String name = "Unit Test Ext Room3";
+               String comment = "Unit Test Ext Room Comments3";
+               RoomDTO r = new RoomDTO();
+               r.setType(type);
+               r.setName(name);
+               r.setComment(comment);
+               r.setCapacity(CAPACITY);
+               RoomFileDTO rf = new RoomFileDTO();
+               rf.setFileId(-666L); //not existent
+               r.getFiles().add(rf);
+
+               CallResult<RoomDTO> res = createAndValidate(r);
+               assertTrue("No room files should be added", 
res.getObj().getFiles().isEmpty());
+       }
+
+       @Test
+       public void testCreateWithFiles2() throws IOException {
+               //lets create real file
+               CallResult<FileItemDTO> fileCall = 
createVerifiedFile(OmFileHelper.getDefaultProfilePicture());
+
+               Room.Type type = Room.Type.presentation;
+               String name = "Unit Test Ext Room4";
+               String comment = "Unit Test Ext Room Comments4";
+               RoomDTO r = new RoomDTO();
+               r.setType(type);
+               r.setName(name);
+               r.setComment(comment);
+               r.setCapacity(CAPACITY);
+
+               RoomFileDTO rf = new RoomFileDTO();
+               rf.setFileId(fileCall.getObj().getId()); //not existent
+               r.getFiles().add(rf);
+
+               CallResult<RoomDTO> res = createAndValidate(fileCall.getSid(), 
r);
+               assertFalse("Room files should NOT be empty", 
res.getObj().getFiles().isEmpty());
+       }
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/BaseWebService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/BaseWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/BaseWebService.java
index 0f663db..616d309 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/BaseWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/BaseWebService.java
@@ -23,6 +23,7 @@ import static 
org.apache.openmeetings.util.OpenmeetingsVariables.wicketApplicati
 import java.util.Set;
 
 import org.apache.openmeetings.IApplication;
+import org.apache.openmeetings.db.dao.file.FileItemDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.dao.server.SessiondataDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
@@ -57,6 +58,10 @@ public abstract class BaseWebService {
                return getBean(RoomDao.class);
        }
 
+       static FileItemDao getFileDao() {
+               return getBean(FileItemDao.class);
+       }
+
        static Set<Right> getRights(Long id) {
                return getUserDao().getRights(id);
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
index f01512d..ef7f93d 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
@@ -298,7 +298,7 @@ public class CalendarWebService extends BaseWebService {
                        //TODO check if objects passed with IDs are correct
                        if (AuthLevelUtil.hasUserLevel(u.getRights())) {
                                AppointmentDao dao = getDao();
-                               Appointment a = appointment.get(userDao, dao, 
u);
+                               Appointment a = appointment.get(userDao, 
getFileDao(), dao, u);
                                if (a.getRoom().getId() != null) {
                                        if (a.getRoom().isAppointment()) {
                                                a.getRoom().setIspublic(false);

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
index 9d530f3..157e904 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/FileWebService.java
@@ -74,10 +74,6 @@ import org.springframework.stereotype.Service;
 public class FileWebService extends BaseWebService {
        private static final Logger log = 
Red5LoggerFactory.getLogger(FileWebService.class, webAppRootKey);
 
-       private static FileItemDao getDao() {
-               return getBean(FileItemDao.class);
-       }
-
        /**
         * deletes files or folders based on it id
         *
@@ -94,7 +90,7 @@ public class FileWebService extends BaseWebService {
                try {
                        Sessiondata sd = check(sid);
 
-                       FileItemDao dao = getDao();
+                       FileItemDao dao = getFileDao();
                        FileItem f = dao.get(id);
                        if (f == null) {
                                return new ServiceResult("Bad id", Type.ERROR);
@@ -137,7 +133,7 @@ public class FileWebService extends BaseWebService {
        {
                try {
                        if (AuthLevelUtil.hasWebServiceLevel(getRights(sid))) {
-                               FileItemDao dao = getDao();
+                               FileItemDao dao = getFileDao();
                                FileItem f = dao.get(externalId, externalType);
                                dao.delete(f);
                                return new ServiceResult("Deleted", 
Type.SUCCESS);
@@ -193,7 +189,7 @@ public class FileWebService extends BaseWebService {
                                                throw new 
ServiceException(result.getLogMessage());
                                        }
                                } else {
-                                       f = getDao().update(f);
+                                       f = getFileDao().update(f);
                                }
                                return new FileItemDTO(f);
                        } else {
@@ -231,7 +227,7 @@ public class FileWebService extends BaseWebService {
                        if (AuthLevelUtil.hasUserLevel(getRights(userId))) {
                                log.debug("roomId " + roomId);
 
-                               FileItemDao dao = getDao();
+                               FileItemDao dao = getFileDao();
                                FileExplorerObject fileExplorerObject = new 
FileExplorerObject();
 
                                // Home File List
@@ -282,7 +278,7 @@ public class FileWebService extends BaseWebService {
                        if (AuthLevelUtil.hasUserLevel(getRights(userId))) {
                                log.debug("getRoomByParent " + parentId);
 
-                               FileItemDao dao = getDao();
+                               FileItemDao dao = getFileDao();
                                List<FileItem> list = new ArrayList<>();
                                if (parentId < 0) {
                                        if (parentId == -1) {
@@ -330,7 +326,7 @@ public class FileWebService extends BaseWebService {
                                // FIXME TODO: check if this user is allowed to 
change this file
 
                                log.debug("rename " + id);
-                               FileItem f = getDao().rename(id, name);
+                               FileItem f = getFileDao().rename(id, name);
                                return f == null ? null : new FileItemDTO(f);
                        } else {
                                throw ServiceException.NO_PERMISSION;
@@ -369,7 +365,7 @@ public class FileWebService extends BaseWebService {
                        if (AuthLevelUtil.hasUserLevel(getRights(userId))) {
                                // FIXME TODO A test is required that checks if 
the user is allowed to move the file
                                log.debug("move " + id);
-                               FileItem f = getDao().move(id, parentId, 
userId, roomId);
+                               FileItem f = getFileDao().move(id, parentId, 
userId, roomId);
                                return f == null ? null : new FileItemDTO(f);
                        } else {
                                throw ServiceException.NO_PERMISSION;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/1d55047c/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
index 3b29664..25c3914 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
@@ -53,6 +53,7 @@ import org.apache.openmeetings.db.dto.room.RoomDTO;
 import org.apache.openmeetings.db.entity.room.Invitation;
 import org.apache.openmeetings.db.entity.room.Invitation.MessageType;
 import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.room.RoomFile;
 import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
@@ -129,6 +130,26 @@ public class RoomWebService extends BaseWebService {
                }
        }
 
+       /*
+        * This method is required to set additional fields on room sub-objects
+        * for ex: RoomFile.roomId
+        */
+       private Room updateRtoRoom(Room r, Long userId) {
+               if (r.getFiles() == null) {
+                       r.setFiles(new ArrayList<>());
+               }
+               RoomDao roomDao = getRoomDao();
+               if (r.getId() == null) {
+                       List<RoomFile> files = r.getFiles();
+                       r.setFiles(null);
+                       r = roomDao.update(r, userId);
+                       r.setFiles(files);
+               }
+               for (RoomFile rf : r.getFiles()) {
+                       rf.setRoomId(r.getId());
+               }
+               return roomDao.update(r, userId);
+       }
        /**
         * Checks if a room with this exteralRoomId + externalRoomType does 
exist,
         * if yes it returns the room id if not, it will create the room and 
then
@@ -167,10 +188,10 @@ public class RoomWebService extends BaseWebService {
                                        if (room == null) {
                                                return null;
                                        } else {
-                                               r = room.get();
+                                               r = room.get(getFileDao());
                                                r.setExternalType(externalType);
                                                r.setExternalId(externalId);
-                                               r = roomDao.update(r, userId);
+                                               r = updateRtoRoom(r, userId);
                                                return new RoomDTO(r);
                                        }
                                } else {
@@ -206,8 +227,8 @@ public class RoomWebService extends BaseWebService {
                        Sessiondata sd = check(sid);
                        Long userId = sd.getUserId();
                        if 
(AuthLevelUtil.hasWebServiceLevel(getRights(userId))) {
-                               Room r = room.get();
-                               r = getRoomDao().update(r, userId);
+                               Room r = room.get(getFileDao());
+                               r = updateRtoRoom(r, userId);;
                                return new RoomDTO(r);
                        } else {
                                throw NO_PERMISSION;

Reply via email to