This is an automated email from the ASF dual-hosted git repository.
solomax pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openmeetings.git
The following commit(s) were added to refs/heads/master by this push:
new 3642e0b [OPENMEETINGS-2177] more work on import
3642e0b is described below
commit 3642e0b88bbcf60fb7123984800ecf8cadf5350a
Author: Maxim Solodovnik <[email protected]>
AuthorDate: Thu Mar 5 12:40:19 2020 +0700
[OPENMEETINGS-2177] more work on import
---
.../core/converter/VideoConverter.java | 2 +-
.../openmeetings/core/data/file/FileProcessor.java | 16 +-
.../org/apache/openmeetings/core/remote/KRoom.java | 2 +-
.../org/apache/openmeetings/db/bind/Constants.java | 2 +
.../db/bind/adapter/FileTypeAdapter.java | 48 ++++++
.../db/bind/adapter/RecordingStatusAdapter.java | 55 +++++++
.../openmeetings/db/dao/file/FileItemDao.java | 14 +-
.../openmeetings/db/dto/room/Whiteboard.java | 2 +-
.../openmeetings/db/entity/file/BaseFileItem.java | 70 ++++++---
.../openmeetings/db/entity/record/Recording.java | 46 +++---
.../db/entity/record/RecordingChunk.java | 31 ++--
.../org/apache/openmeetings/db/util/XmlHelper.java | 4 +
.../apache/openmeetings/backup/BackupImport.java | 31 ++--
.../openmeetings/backup/converter/WbConverter.java | 6 +-
.../web/common/tree/ConvertingErrorsDialog.java | 4 +-
.../web/common/tree/FileItemPanel.java | 2 +-
.../openmeetings/web/common/tree/FileItemTree.java | 2 +-
.../web/common/tree/FileTreePanel.java | 10 +-
.../openmeetings/web/common/tree/FolderPanel.java | 20 +--
.../web/common/tree/OmTreeProvider.java | 6 +-
.../web/room/RoomPreviewResourceReference.java | 2 +-
.../web/room/RoomResourceReference.java | 12 +-
.../web/room/sidebar/UploadDialog.java | 2 +-
.../apache/openmeetings/web/room/wb/WbPanel.java | 12 +-
.../web/room/wb/WbWebSocketHelper.java | 12 +-
.../user/record/RecordingResourceReference.java | 2 +-
.../org/apache/openmeetings/backup/TestImport.java | 11 ++
.../openmeetings/core/file/TestFileProcessor.java | 4 +-
.../openmeetings/webservice/TestFileService.java | 4 +-
.../openmeetings/webservice/TestRoomService.java | 2 +-
.../openmeetings/backup/file/flvRecordings.xml | 165 +++++++++++++++++++++
31 files changed, 462 insertions(+), 139 deletions(-)
diff --git
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/VideoConverter.java
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/VideoConverter.java
index 156e4bb..741be97 100644
---
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/VideoConverter.java
+++
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/converter/VideoConverter.java
@@ -49,7 +49,7 @@ public class VideoConverter extends BaseConverter {
public void convertVideo(FileItem f, StoredFile sf, ProcessResultList
logs, Optional<DoubleConsumer> progress) {
try {
final File mp4 = f.getFile(EXTENSION_MP4);
- f.setType(Type.Video);
+ f.setType(Type.VIDEO);
final String ext = sf.getExt();
String input = f.getFile(ext).getCanonicalPath();
boolean sameExt = EXTENSION_MP4.equals(ext);
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 f3dcd60..901f7d0 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
@@ -76,13 +76,13 @@ public class FileProcessor {
log.debug("isAsIs: {}", sf.isAsIs());
if (sf.isImage()) {
- f.setType(Type.Image);
+ f.setType(Type.IMAGE);
} else if (sf.isVideo()) {
- f.setType(Type.Video);
+ f.setType(Type.VIDEO);
} else if (sf.isChart()) {
- f.setType(Type.PollChart);
+ f.setType(Type.POLL_CHART);
} else if (sf.isPdf() || sf.isOffice()) {
- f.setType(Type.Presentation);
+ f.setType(Type.PRESENTATION);
} else {
throw new UnsupportedFormatException("The file
type cannot be converted :: " + f.getName());
}
@@ -109,22 +109,22 @@ public class FileProcessor {
return;
}
switch(f.getType()) {
- case Presentation:
+ case PRESENTATION:
log.debug("Office document: {}", file);
copyFile(temp, file);
// convert to pdf, thumbs, swf and
xml-description
docConverter.convertPDF(f, sf, logs,
progress);
break;
- case PollChart:
+ case POLL_CHART:
log.debug("uploaded chart file"); //
NOT implemented yet
break;
- case Image:
+ case IMAGE:
// convert it to PNG
log.debug("##### convert it to PNG: ");
copyFile(temp, file);
imageConverter.convertImage(f, sf,
progress);
break;
- case Video:
+ case VIDEO:
copyFile(temp, file);
videoConverter.convertVideo(f, sf,
logs, progress);
break;
diff --git
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
index 9da2117..3e42b7e 100644
---
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
+++
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
@@ -160,7 +160,7 @@ public class KRoom {
recordingUser.put("started", now.getTime());
Long ownerId = User.Type.CONTACT == u.getType() ?
u.getOwnerId() : u.getId();
rec.setInsertedBy(ownerId);
- rec.setType(BaseFileItem.Type.Recording);
+ rec.setType(BaseFileItem.Type.RECORDING);
rec.setInterview(interview);
rec.setRoomId(roomId);
diff --git
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/Constants.java
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/Constants.java
index 6001863..3639fe6 100644
---
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/Constants.java
+++
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/Constants.java
@@ -43,4 +43,6 @@ public class Constants {
public static final String APPOINTMENT_NODE = "appointment";
public static final String MMEMBER_LIST_NODE = "meetingmembers";
public static final String MMEMBER_NODE = "meetingmember";
+ public static final String RECORDING_LIST_NODE = "flvrecordings";
+ public static final String RECORDING_NODE = "flvrecording";
}
diff --git
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/FileTypeAdapter.java
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/FileTypeAdapter.java
new file mode 100644
index 0000000..315e543
--- /dev/null
+++
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/FileTypeAdapter.java
@@ -0,0 +1,48 @@
+/*
+ * 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.bind.adapter;
+
+import static org.apache.openmeetings.db.bind.adapter.CDATAAdapter.CDATA_BEGIN;
+import static org.apache.openmeetings.db.bind.adapter.CDATAAdapter.CDATA_END;
+
+import java.util.Locale;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+import org.apache.openmeetings.db.entity.file.BaseFileItem;
+import org.apache.wicket.util.string.Strings;
+
+public class FileTypeAdapter extends XmlAdapter<String, BaseFileItem.Type> {
+
+ @Override
+ public String marshal(BaseFileItem.Type v) throws Exception {
+ return CDATA_BEGIN + v.name().toUpperCase(Locale.ROOT) +
CDATA_END;
+ }
+
+ @Override
+ public BaseFileItem.Type unmarshal(String v) throws Exception {
+ if ("PollChart".equalsIgnoreCase(v)) {
+ return BaseFileItem.Type.POLL_CHART;
+ }
+ if ("WmlFile".equalsIgnoreCase(v)) {
+ return BaseFileItem.Type.WML_FILE;
+ }
+ return Strings.isEmpty(v) ? null :
BaseFileItem.Type.valueOf(v.toUpperCase(Locale.ROOT));
+ }
+}
diff --git
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RecordingStatusAdapter.java
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RecordingStatusAdapter.java
new file mode 100644
index 0000000..48ebd92
--- /dev/null
+++
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/bind/adapter/RecordingStatusAdapter.java
@@ -0,0 +1,55 @@
+/*
+ * 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.bind.adapter;
+
+import static org.apache.openmeetings.db.bind.adapter.CDATAAdapter.CDATA_BEGIN;
+import static org.apache.openmeetings.db.bind.adapter.CDATAAdapter.CDATA_END;
+
+import javax.xml.bind.annotation.adapters.XmlAdapter;
+
+import org.apache.openmeetings.db.entity.record.Recording;
+import org.apache.openmeetings.db.entity.record.Recording.Status;
+import org.apache.wicket.util.string.Strings;
+
+public class RecordingStatusAdapter extends XmlAdapter<String,
Recording.Status> {
+
+ @Override
+ public String marshal(Recording.Status v) throws Exception {
+ return CDATA_BEGIN + (v == null
+ ? Recording.Status.NONE.name()
+ : v.name())
+ + CDATA_END;
+ }
+
+ @Override
+ public Recording.Status unmarshal(String v) throws Exception {
+ if ("PROCESSING".equalsIgnoreCase(v)) {
+ return Recording.Status.CONVERTING;
+ }
+ Recording.Status result = Status.NONE;
+ if (!Strings.isEmpty(v)) {
+ try {
+ result = Recording.Status.valueOf(v);
+ } catch (Exception e) {
+ //no-op
+ }
+ }
+ return result;
+ }
+}
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 64ce52b..7c80bff 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
@@ -161,7 +161,7 @@ public class FileItemDao extends BaseFileItemDao {
child.setOwnerId(f.getOwnerId());
child.setRoomId(f.getRoomId());
update(child);
- if (Type.Folder == f.getType()) {
+ if (Type.FOLDER == f.getType()) {
updateChilds(child);
}
}
@@ -198,7 +198,7 @@ public class FileItemDao extends BaseFileItemDao {
f.setParentId(parentId);
f.setOwnerId(null);
}
- if (Type.Folder == f.getType()) {
+ if (Type.FOLDER == f.getType()) {
updateChilds(f);
}
return update(f);
@@ -206,7 +206,7 @@ public class FileItemDao extends BaseFileItemDao {
public List<BaseFileItem> getAllRoomFiles(String search, long start,
long count, Long roomId/*, Long ownerId*/, List<Group> groups) {
return setLimits(em.createNamedQuery("getAllFileItemsForRoom",
BaseFileItem.class)
- .setParameter("folder", Type.Folder)
+ .setParameter("folder", Type.FOLDER)
.setParameter("roomId", roomId)
.setParameter("groups",
groups.parallelStream().map(Group::getId).collect(Collectors.toList()))
.setParameter("name",
String.format("%%%s%%", search == null ? "" : search))
@@ -241,9 +241,9 @@ public class FileItemDao extends BaseFileItemDao {
if (f.exists()) {
File base = OmFileHelper.getUploadFilesDir();
switch (f.getType()) {
- case Image:
- case Presentation:
- case Video:
+ case IMAGE:
+ case PRESENTATION:
+ case VIDEO:
File tFolder = new File(base,
f.getHash());
if (tFolder.exists()) {
@@ -254,7 +254,7 @@ public class FileItemDao extends BaseFileItemDao {
break;
}
}
- if (Type.Folder == f.getType()) {
+ if (Type.FOLDER == f.getType()) {
for (FileItem child : getByParent(f.getId())) {
size += getSize(child);
}
diff --git
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
index eae53c1..07f7b2e 100644
---
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
+++
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
@@ -137,7 +137,7 @@ public class Whiteboard implements Serializable {
JSONArray arr = new JSONArray();
roomItems.entrySet().removeIf(e -> {
JSONObject o = new JSONObject(e.getValue());
- boolean match =
!FileItem.Type.Presentation.name().equals(o.optString(ATTR_FILE_TYPE)) &&
o.optInt(ATTR_SLIDE, -1) == slide;
+ boolean match =
!FileItem.Type.PRESENTATION.name().equals(o.optString(ATTR_FILE_TYPE)) &&
o.optInt(ATTR_SLIDE, -1) == slide;
if (match) {
arr.put(e);
}
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 ffda12b..68b458b 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
@@ -49,11 +49,17 @@ import javax.persistence.InheritanceType;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Transient;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.openmeetings.db.bind.adapter.CDATAAdapter;
+import org.apache.openmeetings.db.bind.adapter.FileTypeAdapter;
+import org.apache.openmeetings.db.bind.adapter.IntAdapter;
+import org.apache.openmeetings.db.bind.adapter.LongAdapter;
import org.apache.openmeetings.db.entity.HistoricalEntity;
import org.apache.openmeetings.util.OmFileHelper;
-import org.simpleframework.xml.Element;
@Entity
@NamedQuery(name = "getFileById", query = "SELECT f FROM BaseFileItem f WHERE
f.deleted = false AND f.id = :id")
@@ -78,7 +84,13 @@ public abstract class BaseFileItem extends HistoricalEntity {
@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
+ FOLDER
+ , IMAGE
+ , POLL_CHART
+ , PRESENTATION
+ , RECORDING
+ , VIDEO
+ , WML_FILE
}
@Id
@@ -87,61 +99,75 @@ public abstract class BaseFileItem extends HistoricalEntity
{
private Long id;
@Column(name = "name")
- @Element(name = "fileName", data = true, required = false)
+ @XmlElement(name = "fileName", required = false)
+ @XmlJavaTypeAdapter(CDATAAdapter.class)
private String name;
@Column(name = "hash")
- @Element(name = "fileHash", data = true, required = false)
+ @XmlElement(name = "fileHash", required = false)
+ @XmlJavaTypeAdapter(CDATAAdapter.class)
private String hash;
@Column(name = "parent_item_id")
- @Element(data = true, name = "parentFileExplorerItemId", required =
false)
+ @XmlElement(name = "parentFileExplorerItemId", required = false)
+ @XmlJavaTypeAdapter(LongAdapter.class)
private Long parentId;
@Column(name = "room_id")
- @Element(data = true, required = false, name = "room_id")
+ @XmlElement(name = "room_id", required = false)
+ @XmlJavaTypeAdapter(LongAdapter.class)
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)
+ @XmlElement(name = "ownerId", required = false)
+ @XmlJavaTypeAdapter(LongAdapter.class)
private Long ownerId;
@Column(name = "inserted_by")
- @Element(data = true, required = false)
+ @XmlElement(name = "insertedBy", required = false)
+ @XmlJavaTypeAdapter(LongAdapter.class)
private Long insertedBy;
@Column(name = "width")
- @Element(data = true, required = false)
+ @XmlElement(name = "width", required = false)
+ @XmlJavaTypeAdapter(IntAdapter.class)
private Integer width;
@Column(name = "height")
- @Element(data = true, required = false)
+ @XmlElement(name = "height", required = false)
+ @XmlJavaTypeAdapter(IntAdapter.class)
private Integer height;
@Column(name = "type")
- @Element(data = true, required = false)
@Enumerated(EnumType.STRING)
+ @XmlElement(name = "type", required = false)
+ @XmlJavaTypeAdapter(FileTypeAdapter.class)
private Type type;
@Column(name = "group_id")
- @Element(data = true, required = false)
+ @XmlElement(name = "groupId", required = false)
+ @XmlJavaTypeAdapter(LongAdapter.class)
private Long groupId;
@Column(name = "page_count", nullable = false)
- @Element(data = true, required = false)
+ @XmlElement(name = "count", required = false)
+ @XmlJavaTypeAdapter(value = IntAdapter.class, type = int.class)
private int count = 1;
@Column(name = "external_type")
- @Element(data = true, required = false)
+ @XmlElement(name = "externalType", required = false)
+ @XmlJavaTypeAdapter(CDATAAdapter.class)
private String externalType;
// Not Mapped
@Transient
+ @XmlTransient
private List<FileItemLog> log;
@Transient
+ @XmlTransient
private boolean readOnly;
@Override
@@ -279,10 +305,10 @@ public abstract class BaseFileItem extends
HistoricalEntity {
if (!isDeleted() && getHash() != null) {
File d = new File(getUploadFilesDir(), getHash());
switch (getType()) {
- case WmlFile:
+ case WML_FILE:
f = new File(getUploadWmlDir(),
String.format(FILE_NAME_FMT, getHash(), ext == null ? EXTENSION_WML : ext));
break;
- case Image:
+ case IMAGE:
if (ext == null) {
f = new File(d,
String.format(FILE_NAME_FMT, getHash(), EXTENSION_PNG));
if (!f.exists()) {
@@ -292,13 +318,13 @@ public abstract class BaseFileItem extends
HistoricalEntity {
f = new File(d,
String.format(FILE_NAME_FMT, getHash(), ext));
}
break;
- case Recording:
+ case RECORDING:
f = new File(getStreamsHibernateDir(),
String.format(FILE_NAME_FMT, getHash(), ext == null ? EXTENSION_MP4 : ext));
break;
- case Video:
+ case VIDEO:
f = new File(d,
String.format(FILE_NAME_FMT, getHash(), ext == null ? EXTENSION_MP4 : ext));
break;
- case Presentation:
+ case PRESENTATION:
int slide;
if (ext == null) {
slide = 0;
@@ -311,8 +337,8 @@ public abstract class BaseFileItem extends HistoricalEntity
{
f = new File(d,
String.format(FILE_NAME_FMT, getHash(), ext == null ? EXTENSION_PDF : ext));
}
break;
- case PollChart:
- case Folder:
+ case POLL_CHART:
+ case FOLDER:
default:
}
}
@@ -385,7 +411,7 @@ public abstract class BaseFileItem extends HistoricalEntity
{
OriginalFilter() {
exclusions.add(EXTENSION_PNG);
exclusions.add("swf");
- if (Type.Presentation == getType()) {
+ if (Type.PRESENTATION == getType()) {
exclusions.add(EXTENSION_PDF);
}
}
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 72d9c0c..913bb37 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
@@ -18,6 +18,7 @@
*/
package org.apache.openmeetings.db.entity.record;
+import static org.apache.openmeetings.db.bind.Constants.RECORDING_NODE;
import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4;
import static org.apache.openmeetings.util.OmFileHelper.RECORDING_FILE_NAME;
@@ -33,15 +34,18 @@ import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
-import javax.xml.bind.annotation.XmlAccessType;
-import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
+import org.apache.openmeetings.db.bind.adapter.BooleanAdapter;
+import org.apache.openmeetings.db.bind.adapter.CDATAAdapter;
+import org.apache.openmeetings.db.bind.adapter.DateAdapter;
+import org.apache.openmeetings.db.bind.adapter.LongAdapter;
+import org.apache.openmeetings.db.bind.adapter.RecordingStatusAdapter;
import org.apache.openmeetings.db.entity.file.BaseFileItem;
-import org.simpleframework.xml.Element;
-import org.simpleframework.xml.ElementList;
-import org.simpleframework.xml.Root;
/**
* An item in the file explorer in the recording section. Can be either:
@@ -87,9 +91,7 @@ import org.simpleframework.xml.Root;
+ " OR r.ownerId IN (SELECT gu.user.id FROM GroupUser gu
WHERE gu.group.id = :groupId)"
+ " OR r.roomId IN (SELECT rg.room.id FROM RoomGroup rg
WHERE rg.group.id = :groupId)"
+ " ) order by r.inserted ASC")
-@Root(name = "flvrecording")
-@XmlRootElement
-@XmlAccessorType(XmlAccessType.FIELD)
+@XmlRootElement(name = RECORDING_NODE)
public class Recording extends BaseFileItem {
private static final long serialVersionUID = 1L;
@@ -103,47 +105,55 @@ public class Recording extends BaseFileItem {
}
@Column(name = "comment")
- @Element(data = true, required = false)
+ @XmlElement(name = "comment", required = false)
+ @XmlJavaTypeAdapter(CDATAAdapter.class)
private String comment;
@Column(name = "record_start")
- @Element(data = true, required = false)
+ @XmlElement(name = "recordStart", required = false)
+ @XmlJavaTypeAdapter(DateAdapter.class)
private Date recordStart;
@Column(name = "record_end")
- @Element(data = true, required = false)
+ @XmlElement(name = "recordEnd", required = false)
+ @XmlJavaTypeAdapter(DateAdapter.class)
private Date recordEnd;
@Column(name = "duration")
- @Element(data = true, required = false)
+ @XmlElement(name = "duration", required = false)
+ @XmlJavaTypeAdapter(CDATAAdapter.class)
private String duration;
@Column(name = "is_interview")
- @Element(data = true, required = false)
+ @XmlElement(name = "interview", required = false)
+ @XmlJavaTypeAdapter(value = BooleanAdapter.class, type = boolean.class)
private boolean interview = false;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "recording_id")
- @ElementList(name = "flvrecordingmetadatas", required = false)
+ @XmlElementWrapper(name = "flvrecordingmetadatas", required = false)
+ @XmlElement(name = "flvrecordingmetadata", required = false)
private List<RecordingChunk> chunks;
@Column(name = "status")
@Enumerated(value = EnumType.STRING)
- @Element(data = true, required = false)
+ @XmlElement(name = "status", required = false)
+ @XmlJavaTypeAdapter(RecordingStatusAdapter.class)
private Status status = Status.NONE;
@Column(name = "notified")
- @Element(data = true, required = false)
+ @XmlElement(name = "notified", required = false)
+ @XmlJavaTypeAdapter(value = BooleanAdapter.class, type = boolean.class)
private boolean notified = false;
@Override
- @Element(data = true, name = "flvRecordingId")
public Long getId() {
return super.getId();
}
@Override
- @Element(data = true, name = "flvRecordingId")
+ @XmlElement(name = "flvRecordingId")
+ @XmlJavaTypeAdapter(LongAdapter.class)
public void setId(Long id) {
super.setId(id);
}
diff --git
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java
index 94d8f60..b22f150 100644
---
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java
+++
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/record/RecordingChunk.java
@@ -32,12 +32,17 @@ import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.apache.openjpa.persistence.jdbc.ForeignKey;
+import org.apache.openmeetings.db.bind.adapter.CDATAAdapter;
+import org.apache.openmeetings.db.bind.adapter.DateAdapter;
+import org.apache.openmeetings.db.bind.adapter.LongAdapter;
import org.apache.openmeetings.db.entity.HistoricalEntity;
-import org.simpleframework.xml.Element;
-import org.simpleframework.xml.Root;
/**
* contains data about each stream, for example if it is a screen sharing or
@@ -55,7 +60,7 @@ import org.simpleframework.xml.Root;
+ "AND c.type <> :screen AND c.streamStatus <> :none")
@NamedQuery(name = "getScreenChunkByRecording", query = "SELECT c FROM
RecordingChunk c WHERE c.recording.id = :recordingId AND c.type = :screen")
@Table(name = "recording_chunk")
-@Root(name = "flvrecordingmetadata")
+@XmlRootElement(name = "flvrecordingmetadata")
public class RecordingChunk extends HistoricalEntity {
private static final long serialVersionUID = 1L;
@XmlType(namespace="org.apache.openmeetings.record.chunk")
@@ -76,41 +81,47 @@ public class RecordingChunk extends HistoricalEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
- @Element(name = "flvRecordingMetaDataId", data = true, required = false)
+ @XmlElement(name = "flvRecordingMetaDataId", required = false)
+ @XmlJavaTypeAdapter(LongAdapter.class)
private Long id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "recording_id", nullable = true)
@ForeignKey(enabled = true)
+ @XmlTransient
private Recording recording;
@Column(name = "start")
- @Element(name = "recordStart", data = true)
+ @XmlElement(name = "recordStart")
+ @XmlJavaTypeAdapter(DateAdapter.class)
private Date start;
@Column(name = "end")
- @Element(name = "recordEnd", data = true, required = false)
+ @XmlElement(name = "recordEnd", required = false)
+ @XmlJavaTypeAdapter(DateAdapter.class)
private Date end;
@Column(name = "stream_name")
- @Element(data = true)
+ @XmlElement(name = "streamName")
+ @XmlJavaTypeAdapter(CDATAAdapter.class)
private String streamName;
@Column(name = "sid")
- @Element(data = true, required = false)
+ @XmlElement(name = "sid", required = false)
+ @XmlJavaTypeAdapter(CDATAAdapter.class)
private String sid;
@Column(name = "type")
- @Element(data = true, required = false)
@Enumerated(EnumType.STRING)
+ @XmlElement(name = "type", required = false)
private Type type;
/**
* this is only STOPPED when the asynchronous stream writer's have
completed to write packets to the file.
*/
@Column(name = "stream_status")
- @Element(data = true, required = false)
@Enumerated(EnumType.STRING)
+ @XmlElement(name = "streamStatus", required = false)
private Status streamStatus = Status.NONE;
@Override
diff --git
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/XmlHelper.java
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/XmlHelper.java
index 38b3b94..61b59d7 100644
---
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/XmlHelper.java
+++
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/util/XmlHelper.java
@@ -20,7 +20,9 @@ package org.apache.openmeetings.db.util;
import static javax.xml.stream.XMLInputFactory.IS_NAMESPACE_AWARE;
import static javax.xml.stream.XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES;
+import static javax.xml.stream.XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES;
import static javax.xml.stream.XMLInputFactory.IS_VALIDATING;
+import static javax.xml.stream.XMLInputFactory.SUPPORT_DTD;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
@@ -48,6 +50,8 @@ public class XmlHelper {
inputFactory.setProperty(IS_REPLACING_ENTITY_REFERENCES, false);
inputFactory.setProperty(IS_VALIDATING, false);
inputFactory.setProperty(IS_NAMESPACE_AWARE, false);
+ inputFactory.setProperty(IS_SUPPORTING_EXTERNAL_ENTITIES,
false);
+ inputFactory.setProperty(SUPPORT_DTD, false);
return inputFactory;
}
}
diff --git
a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
index e7ee2f6..4595d7d 100644
---
a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
+++
b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
@@ -33,6 +33,8 @@ import static
org.apache.openmeetings.db.bind.Constants.MMEMBER_LIST_NODE;
import static org.apache.openmeetings.db.bind.Constants.MMEMBER_NODE;
import static org.apache.openmeetings.db.bind.Constants.OAUTH_LIST_NODE;
import static org.apache.openmeetings.db.bind.Constants.OAUTH_NODE;
+import static org.apache.openmeetings.db.bind.Constants.RECORDING_LIST_NODE;
+import static org.apache.openmeetings.db.bind.Constants.RECORDING_NODE;
import static org.apache.openmeetings.db.bind.Constants.ROOM_GRP_LIST_NODE;
import static org.apache.openmeetings.db.bind.Constants.ROOM_GRP_NODE;
import static org.apache.openmeetings.db.bind.Constants.ROOM_LIST_NODE;
@@ -156,7 +158,6 @@ import org.apache.commons.text.WordUtils;
import org.apache.openmeetings.backup.converter.BaseFileItemConverter;
import org.apache.openmeetings.backup.converter.DateConverter;
import org.apache.openmeetings.backup.converter.PollTypeConverter;
-import org.apache.openmeetings.backup.converter.RecordingStatusConverter;
import org.apache.openmeetings.backup.converter.RoomConverter;
import org.apache.openmeetings.backup.converter.UserConverter;
import org.apache.openmeetings.backup.converter.WbConverter;
@@ -452,11 +453,11 @@ public class BackupImport {
if (bfi.isDeleted()) {
continue;
}
- if (BaseFileItem.Type.Presentation ==
bfi.getType()) {
+ if (BaseFileItem.Type.PRESENTATION ==
bfi.getType()) {
convertOldPresentation((FileItem)bfi);
fileItemDao.updateBase(bfi);
}
- if (BaseFileItem.Type.WmlFile == bfi.getType())
{
+ if (BaseFileItem.Type.WML_FILE ==
bfi.getType()) {
try {
Whiteboard wb =
WbConverter.convert((FileItem)bfi);
wb.save(bfi.getFile().toPath());
@@ -837,8 +838,7 @@ public class BackupImport {
}
private <T extends BaseFileItem> void saveTree(
- Serializer ser
- , File baseDir
+ File baseDir
, String fileName
, String listNodeName
, String nodeName
@@ -848,7 +848,7 @@ public class BackupImport {
)
{
TreeMap<Long, T> items = new TreeMap<>();
- readList(null, baseDir, fileName, listNodeName, nodeName,
clazz, f -> {
+ readList(baseDir, fileName, listNodeName, nodeName, clazz, f ->
{
items.put(f.getId(), f);
}, false);
FileTree<T> tree = new FileTree<>();
@@ -875,19 +875,10 @@ public class BackupImport {
/*
* ##################### Import Recordings
*/
- private void importRecordings(File base) throws Exception {
+ void importRecordings(File base) throws Exception {
log.info("Meeting members import complete, starting recordings
server import");
- Registry registry = new Registry();
- Strategy strategy = new RegistryStrategy(registry);
- RegistryMatcher matcher = new RegistryMatcher();
- Serializer ser = new Persister(strategy, matcher);
-
- matcher.bind(Long.class, LongTransform.class);
- matcher.bind(Integer.class, IntegerTransform.class);
- registry.bind(Date.class, DateConverter.class);
- registry.bind(Recording.Status.class,
RecordingStatusConverter.class);
final Map<Long, Long> folders = new HashMap<>();
- saveTree(ser, base, "flvRecordings.xml", "flvrecordings",
"flvrecording", Recording.class, folders, r -> {
+ saveTree(base, "flvRecordings.xml", RECORDING_LIST_NODE,
RECORDING_NODE, Recording.class, folders, r -> {
Long recId = r.getId();
r.setId(null);
if (r.getChunks() != null) {
@@ -905,7 +896,7 @@ public class BackupImport {
}
checkHash(r, recordingDao);
r = recordingDao.update(r);
- if (BaseFileItem.Type.Folder == r.getType()) {
+ if (BaseFileItem.Type.FOLDER == r.getType()) {
folders.put(recId, r.getId());
}
fileItemMap.put(recId, r.getId());
@@ -1010,13 +1001,13 @@ public class BackupImport {
matcher.bind(Integer.class, IntegerTransform.class);
registry.bind(Date.class, DateConverter.class);
final Map<Long, Long> folders = new HashMap<>();
- saveTree(null, base, "fileExplorerItems.xml",
"fileExplorerItems", "fileExplorerItem", FileItem.class, folders, file -> {
+ saveTree(base, "fileExplorerItems.xml", "fileExplorerItems",
"fileExplorerItem", FileItem.class, folders, file -> {
Long fId = file.getId();
// We need to reset this as openJPA reject to store
them otherwise
file.setId(null);
checkHash(file, fileItemDao);
file = fileItemDao.update(file);
- if (BaseFileItem.Type.Folder == file.getType()) {
+ if (BaseFileItem.Type.FOLDER == file.getType()) {
folders.put(fId, file.getId());
}
result.add(file);
diff --git
a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/converter/WbConverter.java
b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/converter/WbConverter.java
index 028869e..a6cf301 100644
---
a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/converter/WbConverter.java
+++
b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/converter/WbConverter.java
@@ -225,7 +225,7 @@ public class WbConverter {
}
add(wb, init(wb, props)
.put(ATTR_TYPE, TYPE_IMAGE)
- .put(ATTR_FILE_TYPE,
BaseFileItem.Type.Image.name())
+ .put(ATTR_FILE_TYPE,
BaseFileItem.Type.IMAGE.name())
.put(ATTR_FILE_ID, fileId));
}
@@ -239,7 +239,7 @@ public class WbConverter {
}
add(wb, init(wb, props, false)
.put(ATTR_TYPE, TYPE_IMAGE)
- .put(ATTR_FILE_TYPE,
BaseFileItem.Type.Presentation.name())
+ .put(ATTR_FILE_TYPE,
BaseFileItem.Type.PRESENTATION.name())
.put(ATTR_FILE_ID, fileId));
}
@@ -249,7 +249,7 @@ public class WbConverter {
}
add(wb, init(wb, props)
.put(ATTR_TYPE, TYPE_IMAGE)
- .put(ATTR_FILE_TYPE,
BaseFileItem.Type.Video.name())
+ .put(ATTR_FILE_TYPE,
BaseFileItem.Type.VIDEO.name())
.put(ATTR_FILE_ID, props.get(1)));
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/ConvertingErrorsDialog.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/ConvertingErrorsDialog.java
index cd8b0de..473da66 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/ConvertingErrorsDialog.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/ConvertingErrorsDialog.java
@@ -86,7 +86,7 @@ public class ConvertingErrorsDialog extends
Modal<BaseFileItem> {
@Override
public Modal<BaseFileItem> show(IPartialPageRequestHandler handler) {
BaseFileItem f = getModelObject();
- headerLabel.setDefaultModel(new ResourceModel(f.getType() ==
BaseFileItem.Type.Recording ? "887" : "convert.errors.file"));
+ headerLabel.setDefaultModel(new ResourceModel(f.getType() ==
BaseFileItem.Type.RECORDING ? "887" : "convert.errors.file"));
List<FileItemLog> logs = fileLogDao.get(f);
if (f.getHash() == null) {
@@ -94,7 +94,7 @@ public class ConvertingErrorsDialog extends
Modal<BaseFileItem> {
message.setDefaultModelObject(getString("888"));
} else if (!f.exists()) {
message.setVisible(true);
- message.setDefaultModelObject(getString(f.getType() ==
BaseFileItem.Type.Recording ? "1595" : "convert.errors.file.missing"));
+ message.setDefaultModelObject(getString(f.getType() ==
BaseFileItem.Type.RECORDING ? "1595" : "convert.errors.file.missing"));
} else {
message.setVisible(false);
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java
index a212b88..b236482 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemPanel.java
@@ -41,7 +41,7 @@ public class FileItemPanel extends FolderPanel {
BaseFileItem f = model.getObject();
long errorCount = fileLogDao.countErrors(f);
boolean visible = errorCount != 0;
- if (BaseFileItem.Type.Recording == f.getType()) {
+ if (BaseFileItem.Type.RECORDING == f.getType()) {
Recording r = (Recording)f;
visible |= (Status.RECORDING != r.getStatus() &&
Status.CONVERTING != r.getStatus() && !f.exists());
} else {
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
index 52614d4..508f965 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileItemTree.java
@@ -53,7 +53,7 @@ public class FileItemTree extends
DefaultNestedTree<BaseFileItem> {
@Override
protected Component newContentComponent(String id, IModel<BaseFileItem>
lm) {
BaseFileItem r = lm.getObject();
- return Type.Folder == r.getType() || r.getId() == null
+ return Type.FOLDER == r.getType() || r.getId() == null
? new FolderPanel(id, lm, treePanel)
: new FileItemPanel(id, lm, treePanel);
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
index 25ca161..09a1a47 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
@@ -158,7 +158,7 @@ public abstract class FileTreePanel extends Panel {
public void onDownlownClick(AjaxRequestTarget target, String
ext) {
BaseFileItem fi = getLastSelected();
- File f = ext == null && (Type.Image == fi.getType() ||
Type.Presentation == fi.getType())
+ File f = ext == null && (Type.IMAGE == fi.getType() ||
Type.PRESENTATION == fi.getType())
? fi.getOriginal() : fi.getFile(ext);
if (f != null && f.exists()) {
dwnldFile = f;
@@ -359,11 +359,11 @@ public abstract class FileTreePanel extends Panel {
f.setHash(randomUUID().toString());
f.setInsertedBy(getUserId());
f.setInserted(new Date());
- f.setType(Type.Folder);
+ f.setType(Type.FOLDER);
f.setOwnerId(p.getOwnerId());
f.setGroupId(p.getGroupId());
f.setRoomId(p.getRoomId());
- f.setParentId(Type.Folder == p.getType() ? p.getId() : null);
+ f.setParentId(Type.FOLDER == p.getType() ? p.getId() : null);
if (isRecording) {
recDao.update((Recording)f);
} else {
@@ -399,7 +399,7 @@ public abstract class FileTreePanel extends Panel {
void updateNode(AjaxRequestTarget target, BaseFileItem fi) {
if (fi != null && !fi.isDeleted() && target != null) {
- if (Type.Folder == fi.getType()) {
+ if (Type.FOLDER == fi.getType()) {
tree.updateBranch(fi, target);
} else {
tree.updateNode(fi, target);
@@ -429,7 +429,7 @@ public abstract class FileTreePanel extends Panel {
}
private static boolean isDownloadable(BaseFileItem f) {
- return !f.isReadOnly() && (f.getType() == Type.Presentation ||
f.getType() == Type.Image);
+ return !f.isReadOnly() && (f.getType() == Type.PRESENTATION ||
f.getType() == Type.IMAGE);
}
public void select(BaseFileItem fi, AjaxRequestTarget target, boolean
shift, boolean ctrl) {
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
index 8391cc5..9ba67ab 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FolderPanel.java
@@ -79,7 +79,7 @@ public class FolderPanel extends Panel implements
IDraggableListener, IDroppable
final BaseFileItem f = (BaseFileItem)getDefaultModelObject();
boolean editable = treePanel.isEditable() && !f.isReadOnly();
final String selector = JQueryWidget.getSelector(this);
- if (f.getType() == Type.Folder && editable) {
+ if (f.getType() == Type.FOLDER && editable) {
add(new DroppableBehavior(
selector
, new Options()
@@ -171,7 +171,7 @@ public class FolderPanel extends Panel implements
IDraggableListener, IDroppable
ctrl = o.optBoolean(PARAM_CTRL);
}
treePanel.select(f, target, shift, ctrl);
- if (Type.Folder == f.getType() && treePanel.tree.getState(f) ==
State.COLLAPSED) {
+ if (Type.FOLDER == f.getType() && treePanel.tree.getState(f) ==
State.COLLAPSED) {
treePanel.tree.expand(f);
} else {
treePanel.update(target, f);
@@ -185,24 +185,24 @@ public class FolderPanel extends Panel implements
IDraggableListener, IDroppable
if (f.getId() == null) {
style.append(CSS_CLASS_FILE).append(f.getHash().indexOf("my") > -1 ? "my " :
"public ");
} else {
- if (BaseFileItem.Type.Folder != f.getType() &&
!f.exists()) {
+ if (BaseFileItem.Type.FOLDER != f.getType() &&
!f.exists()) {
style.append("broken ");
}
switch(f.getType()) {
- case Folder:
+ case FOLDER:
style.append(CSS_CLASS_FILE).append(open ? "folder-open " : "folder ");
break;
- case Image:
+ case IMAGE:
style.append(CSS_CLASS_FILE).append("image ");
break;
- case PollChart:
+ case POLL_CHART:
style.append(CSS_CLASS_FILE).append("chart ");
break;
- case WmlFile:
+ case WML_FILE:
style.append(CSS_CLASS_FILE).append("wml ");
break;
- case Video:
- case Recording:
+ case VIDEO:
+ case RECORDING:
{
style.append("recording ");
if (f instanceof Recording) {
@@ -213,7 +213,7 @@ public class FolderPanel extends Panel implements
IDraggableListener, IDroppable
}
}
break;
- case Presentation:
+ case PRESENTATION:
style.append(CSS_CLASS_FILE).append("doc ");
break;
default:
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
index 24cc33e..e8e9351 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/OmTreeProvider.java
@@ -45,7 +45,7 @@ import org.apache.wicket.spring.injection.annot.SpringBean;
public class OmTreeProvider implements ITreeProvider<BaseFileItem> {
private static final long serialVersionUID = 1L;
- private static final List<Type> VIDEO_TYPES =
Arrays.asList(Type.Folder, Type.Video);
+ private static final List<Type> VIDEO_TYPES =
Arrays.asList(Type.FOLDER, Type.VIDEO);
public static final String RECORDINGS_MY = "recordings-my";
public static final String RECORDINGS_PUBLIC = "recordings-public";
public static final String RECORDINGS_GROUP = "recordings-group-%s";
@@ -121,7 +121,7 @@ public class OmTreeProvider implements
ITreeProvider<BaseFileItem> {
static BaseFileItem createRoot(String name, String hash, boolean rec) {
BaseFileItem f = rec ? new Recording() : new FileItem();
- f.setType(Type.Folder);
+ f.setType(Type.FOLDER);
f.setName(name);
f.setHash(hash);
return f;
@@ -181,7 +181,7 @@ public class OmTreeProvider implements
ITreeProvider<BaseFileItem> {
@Override
public boolean hasChildren(BaseFileItem node) {
- return node.getId() == null || Type.Folder == node.getType();
+ return node.getId() == null || Type.FOLDER == node.getType();
}
@Override
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPreviewResourceReference.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPreviewResourceReference.java
index 4405ef2..b0bbae9 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPreviewResourceReference.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomPreviewResourceReference.java
@@ -46,7 +46,7 @@ public class RoomPreviewResourceReference extends
RoomResourceReference {
@Override
protected FileItem getFileItem(Attributes attr) {
FileItem f = super.getFileItem(attr);
- if (f != null && FileItem.Type.Video == f.getType()) {
+ if (f != null && FileItem.Type.VIDEO == f.getType()) {
return f;
}
return null;
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
index 2d73204..1e81778 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/RoomResourceReference.java
@@ -73,16 +73,16 @@ public class RoomResourceReference extends
FileItemResourceReference<FileItem> {
protected String getMimeType(FileItem r) {
String mime;
switch (r.getType()) {
- case WmlFile:
- mime = "application/xml";
+ case WML_FILE:
+ mime = "application/json";
break;
- case Image:
+ case IMAGE:
mime = PNG_MIME_TYPE;
break;
- case Presentation:
+ case PRESENTATION:
mime = PNG_MIME_TYPE;
break;
- case Video:
+ case VIDEO:
mime = MP4_MIME_TYPE;
break;
default:
@@ -140,7 +140,7 @@ public class RoomResourceReference extends
FileItemResourceReference<FileItem> {
@Override
protected File getFile(FileItem f, Attributes attr) {
- String ext = f.getType() == FileItem.Type.Presentation
+ String ext = f.getType() == FileItem.Type.PRESENTATION
?
attr.getParameters().get(ATTR_SLIDE).toString() : null;
return getFile(f, ext);
}
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
index c147201..10668c0 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/UploadDialog.java
@@ -248,7 +248,7 @@ public class UploadDialog extends Modal<String> {
f.setOwnerId(parent.getOwnerId());
f.setGroupId(parent.getGroupId());
if (parent.getId() != null) {
-
f.setParentId(BaseFileItem.Type.Folder == parent.getType() ? parent.getId() :
parent.getParentId());
+
f.setParentId(BaseFileItem.Type.FOLDER == parent.getType() ? parent.getId() :
parent.getParentId());
}
}
f.setInsertedBy(getUserId());
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
index 6b25e65..4d9b78f 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
@@ -252,7 +252,7 @@ public class WbPanel extends AbstractWbPanel {
Whiteboard wb = entry.getValue();
for (JSONObject o : wb.list()) {
String ft =
o.optString(ATTR_FILE_TYPE);
- if
(BaseFileItem.Type.Recording.name().equals(ft) ||
BaseFileItem.Type.Video.name().equals(ft)) {
+ if
(BaseFileItem.Type.RECORDING.name().equals(ft) ||
BaseFileItem.Type.VIDEO.name().equals(ft)) {
JSONObject status =
o.optJSONObject(PARAM_STATUS);
if (status == null) {
continue;
@@ -530,10 +530,10 @@ public class WbPanel extends AbstractWbPanel {
return;
}
switch (fi.getType()) {
- case Folder:
+ case FOLDER:
//do nothing
break;
- case WmlFile:
+ case WML_FILE:
{
File f = fi.getFile();
if (f.exists() && f.isFile()) {
@@ -555,7 +555,7 @@ public class WbPanel extends AbstractWbPanel {
}
}
break;
- case PollChart:
+ case POLL_CHART:
break;
default:
{
@@ -571,7 +571,7 @@ public class WbPanel extends AbstractWbPanel {
.put("uid", wuid)
.put(ATTR_SLIDE,
wb.getSlide())
;
- if (FileItem.Type.Video == fi.getType()
|| FileItem.Type.Recording == fi.getType()) {
+ if (FileItem.Type.VIDEO == fi.getType()
|| FileItem.Type.RECORDING == fi.getType()) {
file.put(ATTR_OMTYPE, "Video");
file.put(PARAM_STATUS, new
JSONObject()
.put("paused",
true)
@@ -639,7 +639,7 @@ public class WbPanel extends AbstractWbPanel {
public String saveWb(Long roomId, Long wbId, String name) {
Whiteboard wb = wbm.get(roomId).get(wbId);
FileItem f = new FileItem();
- f.setType(BaseFileItem.Type.WmlFile);
+ f.setType(BaseFileItem.Type.WML_FILE);
f.setRoomId(roomId);
f.setHash(randomUUID().toString());
f.setName(name);
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbWebSocketHelper.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbWebSocketHelper.java
index f2c271a..16a7f4b 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbWebSocketHelper.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbWebSocketHelper.java
@@ -108,17 +108,17 @@ public class WbWebSocketHelper extends WebSocketHelper {
}
file.put("deleted", !fi.exists());
switch (fi.getType()) {
- case Video:
+ case VIDEO:
ref = new RoomResourceReference();
file.put(PARAM__SRC, urlFor(ref, pp));
file.put(PARAM__POSTER, urlFor(new
RoomPreviewResourceReference(), pp));
break;
- case Recording:
+ case RECORDING:
ref = new Mp4RecordingResourceReference();
file.put(PARAM__SRC, urlFor(ref, pp));
file.put(PARAM__POSTER, urlFor(new
PngRecordingResourceReference(), pp));
break;
- case Presentation:
+ case PRESENTATION:
ref = new RoomResourceReference();
file.put(PARAM__SRC, urlFor(ref, pp));
break;
@@ -142,15 +142,15 @@ public class WbWebSocketHelper extends WebSocketHelper {
private static JSONObject patchUrls(BaseFileItem fi, Client c,
JSONObject _f) {
JSONObject f = new JSONObject(_f.toString()); // deep copy to
ensure thread safety
switch (fi.getType()) {
- case Video:
+ case VIDEO:
f.put(PARAM__SRC,
patchUrl(f.getString(PARAM__SRC), c));
f.put(PARAM__POSTER,
patchUrl(f.getString(PARAM__POSTER), c));
break;
- case Recording:
+ case RECORDING:
f.put(PARAM__SRC,
patchUrl(f.getString(PARAM__SRC), c));
f.put(PARAM__POSTER,
patchUrl(f.getString(PARAM__POSTER), c));
break;
- case Presentation:
+ case PRESENTATION:
f.put(PARAM__SRC,
patchUrl(f.getString(PARAM__SRC), c));
break;
default:
diff --git
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
index a682ccb..b39faca 100644
---
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
+++
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/user/record/RecordingResourceReference.java
@@ -92,7 +92,7 @@ public abstract class RecordingResourceReference extends
FileItemResourceReferen
private Recording getRecording(Long id, String ruid, String uid) {
log.debug("Recording with id {} is requested", id);
Recording r = recDao.get(id);
- if (r == null || r.getType() == Type.Folder || r.isDeleted()) {
+ if (r == null || r.getType() == Type.FOLDER || r.isDeleted()) {
return null;
}
if (id.equals(getRecordingId())) {
diff --git
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
index e202355..0fdaae1 100644
---
a/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
+++
b/openmeetings-web/src/test/java/org/apache/openmeetings/backup/TestImport.java
@@ -24,6 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.File;
import org.apache.openmeetings.db.dao.basic.ChatDao;
+import org.apache.openmeetings.db.dao.record.RecordingDao;
import org.apache.openmeetings.db.dao.server.LdapConfigDao;
import org.apache.openmeetings.db.dao.server.OAuth2Dao;
import org.apache.openmeetings.db.entity.basic.Configuration;
@@ -38,6 +39,8 @@ public class TestImport extends AbstractTestImport {
private OAuth2Dao oauthDao;
@Autowired
private ChatDao chatDao;
+ @Autowired
+ private RecordingDao recDao;
@Test
public void importVersionNE() throws Exception {
@@ -100,4 +103,12 @@ public class TestImport extends AbstractTestImport {
backupImport.importChat(chats.getParentFile());
assertEquals(chatCount + 3, chatDao.get(0,
Integer.MAX_VALUE).size(), "Chat messages should be added");
}
+
+ @Test
+ public void importRecordings() throws Exception {
+ long recCount = recDao.get().size();
+ File recs = new
File(getClass().getClassLoader().getResource("org/apache/openmeetings/backup/file/flvRecordings.xml").toURI());
+ backupImport.importRecordings(recs.getParentFile());
+ assertEquals(recCount + 4, recDao.get().size(), "Recordings
should be added");
+ }
}
diff --git
a/openmeetings-web/src/test/java/org/apache/openmeetings/core/file/TestFileProcessor.java
b/openmeetings-web/src/test/java/org/apache/openmeetings/core/file/TestFileProcessor.java
index 2de540c..3670c99 100644
---
a/openmeetings-web/src/test/java/org/apache/openmeetings/core/file/TestFileProcessor.java
+++
b/openmeetings-web/src/test/java/org/apache/openmeetings/core/file/TestFileProcessor.java
@@ -49,11 +49,11 @@ public class TestFileProcessor extends
AbstractJUnitDefaults {
FileItem f = new FileItemDTO()
.setName(String.format(FILE_NAME_FMT,
FILE_NAME, ext))
.setHash(randomUUID().toString())
-
.setType(BaseFileItem.Type.Recording).get();
+
.setType(BaseFileItem.Type.RECORDING).get();
try (InputStream is = new
FileInputStream(getDefaultProfilePicture())) {
ProcessResultList result =
processor.processFile(f, is, Optional.empty());
assertFalse(result.hasError(), "Conversion
should be successful");
- assertEquals(BaseFileItem.Type.Image,
f.getType(), "Type should be image");
+ assertEquals(BaseFileItem.Type.IMAGE,
f.getType(), "Type should be image");
}
}
}
diff --git
a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestFileService.java
b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestFileService.java
index abb2277..e106ada 100644
---
a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestFileService.java
+++
b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestFileService.java
@@ -49,8 +49,8 @@ public class TestFileService extends AbstractWebServiceTest {
Graphics g = image.getGraphics();
g.drawString("Hello World!!!", 10, 20);
ImageIO.write(image, "jpg", img);
- CallResult<FileItemDTO> cr = createVerifiedFile(img,
"test.txt", BaseFileItem.Type.Presentation);
- assertEquals(BaseFileItem.Type.Image,
cr.getObj().getType(), "Type should be Image");
+ CallResult<FileItemDTO> cr = createVerifiedFile(img,
"test.txt", BaseFileItem.Type.PRESENTATION);
+ assertEquals(BaseFileItem.Type.IMAGE,
cr.getObj().getType(), "Type should be Image");
assertEquals(width, cr.getObj().getWidth(), "Width
should be determined");
assertEquals(height, cr.getObj().getHeight(), "Height
should be Image");
} finally {
diff --git
a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestRoomService.java
b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestRoomService.java
index 3cb09d3..520cbdc 100644
---
a/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestRoomService.java
+++
b/openmeetings-web/src/test/java/org/apache/openmeetings/webservice/TestRoomService.java
@@ -121,7 +121,7 @@ public class TestRoomService extends AbstractWebServiceTest
{
@Test
public void testCreateWithFiles2() throws IOException {
//lets create real file
- CallResult<FileItemDTO> fileCall =
createVerifiedFile(getDefaultProfilePicture(), "img.png",
BaseFileItem.Type.Image);
+ CallResult<FileItemDTO> fileCall =
createVerifiedFile(getDefaultProfilePicture(), "img.png",
BaseFileItem.Type.IMAGE);
Room.Type type = Room.Type.PRESENTATION;
String name = "Unit Test Ext Room4";
diff --git
a/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/file/flvRecordings.xml
b/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/file/flvRecordings.xml
new file mode 100644
index 0000000..aca316d
--- /dev/null
+++
b/openmeetings-web/src/test/resources/org/apache/openmeetings/backup/file/flvRecordings.xml
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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.
+
+-->
+<!-- ###############################################
+This File is auto-generated by the Backup Tool
+you should use the BackupPanel to modify or change this file
+see http://openmeetings.apache.org/Upgrade.html for Details
+###############################################
+ --><root>
+ <flvrecordings>
+ <flvrecording>
+ <fileName><![CDATA[Recording 2017.08.11 11:45:30]]></fileName>
+ <fileHash><![CDATA[flvRecording_1.flv]]></fileHash>
+ <insertedBy><![CDATA[1]]></insertedBy>
+ <inserted class="java.util.Date"><![CDATA[1502426730324]]></inserted>
+ <updated class="java.util.Date"><![CDATA[1502427106022]]></updated>
+ <deleted><![CDATA[false]]></deleted>
+ <flvWidth><![CDATA[1440]]></flvWidth>
+ <flvHeight><![CDATA[816]]></flvHeight>
+ <previewImage><![CDATA[flvRecording_1.jpg]]></previewImage>
+ <type><![CDATA[Recording]]></type>
+ <flvRecordingId><![CDATA[1]]></flvRecordingId>
+ <alternateDownload><![CDATA[flvRecording_1.avi]]></alternateDownload>
+ <comment><![CDATA[]]></comment>
+ <recordStart
class="java.util.Date"><![CDATA[1502426730323]]></recordStart>
+ <recordEnd
class="java.util.Date"><![CDATA[1502426951792]]></recordEnd>
+ <width><![CDATA[1440]]></width>
+ <height><![CDATA[816]]></height>
+ <duration><![CDATA[00:03:41.469]]></duration>
+ <interview><![CDATA[false]]></interview>
+ <progressPostProcessing><![CDATA[0]]></progressPostProcessing>
+ <flvrecordingmetadatas
class="org.apache.openjpa.util.java$util$ArrayList$proxy">
+ <flvrecordingmetadata>
+ <flvRecordingMetaDataId><![CDATA[3]]></flvRecordingMetaDataId>
+ <recordStart
class="java.util.Date"><![CDATA[1502426829302]]></recordStart>
+ <recordEnd
class="java.util.Date"><![CDATA[1502426951583]]></recordEnd>
+
<streamName><![CDATA[rec_1_stream_2_2017_08_11_11_47_09]]></streamName>
+ <freeTextUserName><![CDATA[James Bond]]></freeTextUserName>
+ <isAudioOnly><![CDATA[false]]></isAudioOnly>
+ <isVideoOnly><![CDATA[false]]></isVideoOnly>
+ <isScreenData><![CDATA[false]]></isScreenData>
+ <inserted
class="java.util.Date"><![CDATA[1502426829303]]></inserted>
+
<wavAudioData><![CDATA[rec_1_stream_2_2017_08_11_11_47_09_WAVE.wav]]></wavAudioData>
+ <audioIsValid><![CDATA[false]]></audioIsValid>
+ <interiewPodId><![CDATA[-1]]></interiewPodId>
+ </flvrecordingmetadata>
+ <flvrecordingmetadata>
+ <flvRecordingMetaDataId><![CDATA[2]]></flvRecordingMetaDataId>
+ <recordStart
class="java.util.Date"><![CDATA[1502426734208]]></recordStart>
+ <recordEnd
class="java.util.Date"><![CDATA[1502426951733]]></recordEnd>
+
<streamName><![CDATA[rec_1_stream_c846c7d3-4746-4aa6-b989-9982e77ed436_2017_08_11_11_45_30]]></streamName>
+ <freeTextUserName><![CDATA[Vasiliy
Degtyarev]]></freeTextUserName>
+ <isAudioOnly><![CDATA[false]]></isAudioOnly>
+ <isVideoOnly><![CDATA[false]]></isVideoOnly>
+ <isScreenData><![CDATA[true]]></isScreenData>
+ <inserted
class="java.util.Date"><![CDATA[1502426730719]]></inserted>
+
<fullWavAudioData><![CDATA[rec_1_stream_c846c7d3-4746-4aa6-b989-9982e77ed436_2017_08_11_11_45_30_FINAL_WAVE.wav]]></fullWavAudioData>
+ <audioIsValid><![CDATA[false]]></audioIsValid>
+ </flvrecordingmetadata>
+ <flvrecordingmetadata>
+ <flvRecordingMetaDataId><![CDATA[1]]></flvRecordingMetaDataId>
+ <recordStart
class="java.util.Date"><![CDATA[1502426730803]]></recordStart>
+ <recordEnd
class="java.util.Date"><![CDATA[1502426951779]]></recordEnd>
+
<streamName><![CDATA[rec_1_stream_1_2017_08_11_11_45_30]]></streamName>
+ <freeTextUserName><![CDATA[Vasiliy
Degtyarev]]></freeTextUserName>
+ <isAudioOnly><![CDATA[false]]></isAudioOnly>
+ <isVideoOnly><![CDATA[false]]></isVideoOnly>
+ <isScreenData><![CDATA[false]]></isScreenData>
+ <inserted
class="java.util.Date"><![CDATA[1502426730443]]></inserted>
+
<wavAudioData><![CDATA[rec_1_stream_1_2017_08_11_11_45_30_WAVE.wav]]></wavAudioData>
+
<fullWavAudioData><![CDATA[rec_1_stream_1_2017_08_11_11_45_30_FULL_WAVE.wav]]></fullWavAudioData>
+ <audioIsValid><![CDATA[true]]></audioIsValid>
+ <interiewPodId><![CDATA[-1]]></interiewPodId>
+ </flvrecordingmetadata>
+ </flvrecordingmetadatas>
+ <status><![CDATA[PROCESSED]]></status>
+ </flvrecording>
+ <flvrecording>
+ <fileName><![CDATA[Recording 2017.08.11 16:00:49]]></fileName>
+ <fileHash><![CDATA[bc0acd29-7ec7-4db0-9366-595e87aa15b2]]></fileHash>
+ <insertedBy><![CDATA[1]]></insertedBy>
+ <inserted class="java.util.Date"><![CDATA[1502442049021]]></inserted>
+ <updated class="java.util.Date"><![CDATA[1502442351441]]></updated>
+ <deleted><![CDATA[false]]></deleted>
+ <width><![CDATA[1440]]></width>
+ <height><![CDATA[816]]></height>
+ <type><![CDATA[Recording]]></type>
+ <flvRecordingId><![CDATA[2]]></flvRecordingId>
+ <comment><![CDATA[]]></comment>
+ <recordStart
class="java.util.Date"><![CDATA[1502442049020]]></recordStart>
+ <recordEnd
class="java.util.Date"><![CDATA[1502442328250]]></recordEnd>
+ <duration><![CDATA[00:04:39.230]]></duration>
+ <interview><![CDATA[false]]></interview>
+ <status><![CDATA[PROCESSED]]></status>
+ <notified><![CDATA[false]]></notified>
+ </flvrecording>
+ <flvrecording>
+ <fileName><![CDATA[TEST]]></fileName>
+ <insertedBy><![CDATA[1]]></insertedBy>
+ <inserted class="java.util.Date"><![CDATA[1502442049021]]></inserted>
+ <updated class="java.util.Date"><![CDATA[1502442351441]]></updated>
+ <deleted><![CDATA[false]]></deleted>
+ <type><![CDATA[Folder]]></type>
+ <flvRecordingId><![CDATA[3]]></flvRecordingId>
+ <comment><![CDATA[]]></comment>
+ <interview><![CDATA[false]]></interview>
+ </flvrecording>
+ <flvrecording>
+ <fileName><![CDATA[Recording 2017.08.11 16:00:49]]></fileName>
+ <fileHash><![CDATA[bc0acd29-7ec7-4db0-9366-595e87aa15b3]]></fileHash>
+ <insertedBy><![CDATA[1]]></insertedBy>
+ <inserted class="java.util.Date"><![CDATA[1502442049021]]></inserted>
+ <updated class="java.util.Date"><![CDATA[1502442351441]]></updated>
+ <deleted><![CDATA[true]]></deleted>
+ <width><![CDATA[1440]]></width>
+ <height><![CDATA[816]]></height>
+ <type><![CDATA[Recording]]></type>
+ <flvRecordingId><![CDATA[4]]></flvRecordingId>
+ <comment><![CDATA[]]></comment>
+ <recordStart
class="java.util.Date"><![CDATA[1502442049020]]></recordStart>
+ <recordEnd
class="java.util.Date"><![CDATA[1502442328250]]></recordEnd>
+ <duration><![CDATA[00:04:39.230]]></duration>
+ <interview><![CDATA[false]]></interview>
+ <status><![CDATA[PROCESSED]]></status>
+ <notified><![CDATA[false]]></notified>
+ </flvrecording>
+ <flvrecording>
+ <fileName><![CDATA[Recording 2017.08.11 16:00:49]]></fileName>
+ <fileHash><![CDATA[bc0acd29-7ec7-4db0-9366-595e87aa15b4]]></fileHash>
+ <insertedBy><![CDATA[1]]></insertedBy>
+ <inserted class="java.util.Date"><![CDATA[1502442049021]]></inserted>
+ <updated class="java.util.Date"><![CDATA[1502442351441]]></updated>
+ <deleted><![CDATA[false]]></deleted>
+ <width><![CDATA[1440]]></width>
+ <height><![CDATA[816]]></height>
+ <type><![CDATA[Recording]]></type>
+ <flvRecordingId><![CDATA[5]]></flvRecordingId>
+ <parentFileExplorerItemId>3</parentFileExplorerItemId>
+ <comment><![CDATA[]]></comment>
+ <recordStart
class="java.util.Date"><![CDATA[1502442049020]]></recordStart>
+ <recordEnd
class="java.util.Date"><![CDATA[1502442328250]]></recordEnd>
+ <duration><![CDATA[00:04:39.230]]></duration>
+ <interview><![CDATA[false]]></interview>
+ <status><![CDATA[PROCESSED]]></status>
+ <notified><![CDATA[false]]></notified>
+ </flvrecording>
+ </flvrecordings>
+</root>