[OPENMEETINGS-1601] drop recordings to WB seems to work
Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/a5d2b138 Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/a5d2b138 Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/a5d2b138 Branch: refs/heads/3.2.x Commit: a5d2b1384c16a46e6e6b56a0ab9cf06df7267ae8 Parents: ad627cc Author: Maxim Solodovnik <[email protected]> Authored: Tue Mar 14 16:52:27 2017 +0000 Committer: Maxim Solodovnik <[email protected]> Committed: Tue Mar 14 16:52:27 2017 +0000 ---------------------------------------------------------------------- .../WhiteBoardObjectListManagerById.java | 81 --- .../whiteboard/WhiteBoardObjectSyncManager.java | 98 ---- .../core/data/whiteboard/WhiteboardCache.java | 86 +++ .../core/data/whiteboard/WhiteboardManager.java | 58 +- .../whiteboard/WhiteboardObjectSyncManager.java | 98 ++++ .../core/remote/ConferenceLibrary.java | 72 +-- .../core/remote/WhiteBoardService.java | 560 ------------------- .../core/remote/WhiteboardService.java | 560 +++++++++++++++++++ .../remote/red5/ScopeApplicationAdapter.java | 50 +- .../openmeetings/db/dto/room/Whiteboard.java | 189 +++++++ .../db/dto/room/WhiteboardObject.java | 189 ------- .../db/dto/room/WhiteboardObjectList.java | 45 -- .../openmeetings/db/dto/room/Whiteboards.java | 51 ++ .../whiteboard/base/baseDrawObject.lzx | 118 ++-- .../whiteboard/base/whiteboardVideoPlayer.lzx | 146 +++-- .../service/quartz/scheduler/CleanupJob.java | 12 +- .../web/admin/labels/LangPanel.html | 1 - .../apache/openmeetings/web/room/RoomPanel.java | 21 +- .../web/room/RoomResourceReference.java | 19 +- .../web/room/sidebar/UploadDialog.java | 4 +- .../user/record/RecordingResourceReference.java | 31 +- .../classes/openmeetings-applicationContext.xml | 10 +- .../openmeetings/webservice/FileWebService.java | 42 -- 23 files changed, 1241 insertions(+), 1300 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectListManagerById.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectListManagerById.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectListManagerById.java deleted file mode 100644 index f348178..0000000 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectListManagerById.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.core.data.whiteboard; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; - -import org.apache.openmeetings.db.dto.room.WhiteboardObject; -import org.apache.openmeetings.db.dto.room.WhiteboardObjectList; - -/** - * Memory based cache, configured as singleton in spring configuration - * - * @author sebawagner - * - */ -public class WhiteBoardObjectListManagerById { - private Map<Long, WhiteboardObjectList> whiteBoardObjectList = new ConcurrentHashMap<>(); - - private volatile AtomicLong whiteboardId = new AtomicLong(0); - - public long getNewWhiteboardId(Long roomId, String name) { - long wbId = whiteboardId.getAndIncrement(); - setWhiteBoardObjectListRoomObjAndWhiteboardId(roomId, new WhiteboardObject(name), wbId); - return wbId; - } - - /* - * Room items a Whiteboard - */ - public WhiteboardObjectList getWhiteBoardObjectListByRoomId(Long roomId) { - if (whiteBoardObjectList.containsKey(roomId)) { - return whiteBoardObjectList.get(roomId); - } else { - WhiteboardObjectList whiteboardObjectList = new WhiteboardObjectList(); - whiteboardObjectList.setRoomId(roomId); - return whiteboardObjectList; - } - } - - public WhiteboardObject getWhiteBoardObjectListByRoomIdAndWhiteboard(Long roomId, Long whiteBoardId){ - WhiteboardObjectList whiteboardObjectList = getWhiteBoardObjectListByRoomId(roomId); - WhiteboardObject whiteboardObjects = whiteboardObjectList.getWhiteboardObjects().get(whiteBoardId); - if (whiteboardObjects == null) { - whiteboardObjects = new WhiteboardObject(); - } - return whiteboardObjects; - } - - /* - * Whiteboard Object List - * - */ - public void setWhiteBoardObjectListRoomObj(Long roomId, WhiteboardObjectList whiteboardObjectList){ - whiteBoardObjectList.put(roomId, whiteboardObjectList); - } - - public void setWhiteBoardObjectListRoomObjAndWhiteboardId(Long roomId, WhiteboardObject whiteboardObjects, long whiteBoardId) { - WhiteboardObjectList whiteboardObjectList = getWhiteBoardObjectListByRoomId(roomId); - whiteboardObjects.setWhiteBoardId(whiteBoardId); - whiteboardObjectList.getWhiteboardObjects().put(whiteBoardId, whiteboardObjects); - whiteBoardObjectList.put(roomId, whiteboardObjectList); - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectSyncManager.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectSyncManager.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectSyncManager.java deleted file mode 100644 index cd2f0b6..0000000 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteBoardObjectSyncManager.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.core.data.whiteboard; - -import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import org.apache.openmeetings.db.dto.room.WhiteboardSyncLockObject; -import org.red5.logging.Red5LoggerFactory; -import org.slf4j.Logger; - -/** - * Memory based, configured as singleton in spring configuration - * - * @author sebawagner - * - */ -public class WhiteBoardObjectSyncManager { - private Map<Long, Map<String, WhiteboardSyncLockObject>> whiteBoardSyncList = new ConcurrentHashMap<>(); - private Map<Long, Map<String, Map<String, WhiteboardSyncLockObject>>> whiteBoardObjectSyncList = new ConcurrentHashMap<>(); - - private static final Logger log = Red5LoggerFactory.getLogger(WhiteBoardObjectSyncManager.class, webAppRootKey); - - /* - * Initial Sync Process - */ - public void setWhiteBoardSyncListByRoomid(Long roomId, Map<String, WhiteboardSyncLockObject> mapObject) { - whiteBoardSyncList.put(roomId, mapObject); - } - - public Map<String, WhiteboardSyncLockObject> getWhiteBoardSyncListByRoomid(Long roomId) { - if (whiteBoardSyncList.containsKey(roomId)) { - return whiteBoardSyncList.get(roomId); - } else { - return new ConcurrentHashMap<>(); - } - } - - /* - * Image Sync Process - */ - public void setWhiteBoardImagesSyncListByRoomid(Long roomId, Map<String, Map<String, WhiteboardSyncLockObject>> mapObject) { - whiteBoardObjectSyncList.put(roomId, mapObject); - } - - public void setWhiteBoardImagesSyncListByRoomAndObjectId(Long roomId, String objectId, Map<String, WhiteboardSyncLockObject> imageSyncList) { - Map<String, Map<String, WhiteboardSyncLockObject>> roomList = getWhiteBoardObjectSyncListByRoomid(roomId); - if (imageSyncList.isEmpty()) { - roomList.remove(objectId); - } else { - roomList.put(objectId, imageSyncList); - } - setWhiteBoardImagesSyncListByRoomid(roomId, roomList); - } - - public Map<String, Map<String, WhiteboardSyncLockObject>> getWhiteBoardObjectSyncListByRoomid(Long roomId) { - if (whiteBoardObjectSyncList.containsKey(roomId)) { - return whiteBoardObjectSyncList.get(roomId); - } else { - return new ConcurrentHashMap<>(); - } - } - - public Map<String, WhiteboardSyncLockObject> getWhiteBoardObjectSyncListByRoomAndObjectId(Long roomId, String objectId) { - log.debug("getWhiteBoardImagesSyncListByRoomAndImageid roomId: " + roomId); - Map<String, Map<String, WhiteboardSyncLockObject>> roomList = getWhiteBoardObjectSyncListByRoomid(roomId); - if (log.isDebugEnabled()) { - log.debug("getWhiteBoardImagesSyncListByRoomAndImageid roomList: " + roomList); - log.debug("getWhiteBoardImagesSyncListByRoomAndImageid objectId: " + objectId); - if (roomList.size() == 1) { - log.debug("getWhiteBoardImagesSyncListByRoomAndImageid roomList Key imageId: " + roomList.keySet().iterator().next()); - } - } - Map<String, WhiteboardSyncLockObject> imageSyncList = roomList.get(objectId); - if (imageSyncList == null) { - imageSyncList = new ConcurrentHashMap<>(); - } - return imageSyncList; - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java new file mode 100644 index 0000000..0dd12ba --- /dev/null +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardCache.java @@ -0,0 +1,86 @@ +/* + * 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.core.data.whiteboard; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; + +import org.apache.openmeetings.db.dto.room.Whiteboard; +import org.apache.openmeetings.db.dto.room.Whiteboards; + +/** + * Memory based cache, configured as singleton in spring configuration + * + * @author sebawagner + * + */ +public class WhiteboardCache { + private Map<Long, Whiteboards> cache = new ConcurrentHashMap<>(); + + private volatile AtomicLong whiteboardId = new AtomicLong(0); + + public long getNewWhiteboardId(Long roomId, String name) { + long wbId = whiteboardId.getAndIncrement(); + set(roomId, new Whiteboard(name), wbId); + return wbId; + } + + /* + * Room items a Whiteboard + */ + public Whiteboards get(Long roomId) { + if (roomId == null) { + return null; + } + if (cache.containsKey(roomId)) { + return cache.get(roomId); + } else { + Whiteboards whiteboards = new Whiteboards(); + whiteboards.setRoomId(roomId); + set(roomId, whiteboards); + return whiteboards; + } + } + + public Whiteboard get(Long roomId, Long whiteBoardId) { + Whiteboards whiteboards = get(roomId); + Whiteboard wb = whiteboards.getWhiteboards().get(whiteBoardId); + if (wb == null) { + wb = new Whiteboard(); + set(roomId, wb, whiteBoardId); + } + return wb; + } + + /* + * Whiteboard Object List + * + */ + public void set(Long roomId, Whiteboards whiteboards) { + cache.put(roomId, whiteboards); + } + + public void set(Long roomId, Whiteboard wb, long whiteBoardId) { + Whiteboards whiteboards = get(roomId); + wb.setWhiteBoardId(whiteBoardId); + whiteboards.getWhiteboards().put(whiteBoardId, wb); + cache.put(roomId, whiteboards); + } +} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java index fc89b27..be488fc 100644 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardManager.java @@ -24,21 +24,21 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import org.apache.openmeetings.db.dto.room.WhiteboardObject; +import org.apache.openmeetings.db.dto.room.Whiteboard; import org.red5.logging.Red5LoggerFactory; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; public class WhiteboardManager { private static final Logger log = Red5LoggerFactory.getLogger(WhiteboardManager.class, webAppRootKey); - + @Autowired - private WhiteBoardObjectListManagerById wbListManagerById; + private WhiteboardCache whitebardCache; @SuppressWarnings("unchecked") - public void addWhiteBoardObjectById(Long roomId, Map<Integer, Object> whiteboardObj, Long whiteBoardId) { + public void add(Long roomId, Map<Integer, Object> whiteboardObj, Long whiteBoardId) { try { - log.debug("addWhiteBoardObjectById: ", whiteboardObj); + log.debug("add: ", whiteboardObj); String action = whiteboardObj.get(2).toString(); @@ -47,16 +47,11 @@ public class WhiteboardManager { List<Object> actionObject = (List<Object>) whiteboardObj.get(3); + Whiteboard wb = whitebardCache.get(roomId, whiteBoardId); if (action.equals("moveMap")) { - WhiteboardObject whiteboardObject = wbListManagerById.getWhiteBoardObjectListByRoomIdAndWhiteboard(roomId, whiteBoardId); - - whiteboardObject.setX(Integer.valueOf(actionObject.get(1).toString())); - whiteboardObject.setY(Integer.valueOf(actionObject.get(2).toString())); - - wbListManagerById.setWhiteBoardObjectListRoomObjAndWhiteboardId(roomId, whiteboardObject, whiteBoardId); + wb.setX(Integer.valueOf(actionObject.get(1).toString())); + wb.setY(Integer.valueOf(actionObject.get(2).toString())); } else if (action.equals("draw") || action.equals("redo")) { - WhiteboardObject whiteboardObject = wbListManagerById.getWhiteBoardObjectListByRoomIdAndWhiteboard(roomId, whiteBoardId); - // log.debug(actionObject); // log.debug(actionObject.size()-1); // log.debug(actionObject.get(actionObject.size()-1)); @@ -65,33 +60,26 @@ public class WhiteboardManager { if (!objectType.equals("pointerWhiteBoard")) { String objectOID = actionObject.get(actionObject.size() - 1).toString(); log.debug("objectOID: " + objectOID); - whiteboardObject.add(objectOID, actionObject); - wbListManagerById.setWhiteBoardObjectListRoomObjAndWhiteboardId(roomId, whiteboardObject, whiteBoardId); + wb.add(objectOID, actionObject); } } } else if (action.equals("clear")) { - WhiteboardObject whiteboardObject = wbListManagerById.getWhiteBoardObjectListByRoomIdAndWhiteboard(roomId, whiteBoardId); - whiteboardObject.clear(); - wbListManagerById.setWhiteBoardObjectListRoomObjAndWhiteboardId(roomId, whiteboardObject, whiteBoardId); + wb.clear(); } else if (action.equals("delete") || action.equals("undo")) { - WhiteboardObject whiteboardObject = wbListManagerById.getWhiteBoardObjectListByRoomIdAndWhiteboard(roomId, whiteBoardId); - whiteboardObject.remove(actionObject); - - wbListManagerById.setWhiteBoardObjectListRoomObjAndWhiteboardId(roomId, whiteboardObject, whiteBoardId); + wb.remove(actionObject); } else if (action.equals("size") || action.equals("editProp") || action.equals("editTextMindMapNode") || action.equals("editText") || action.equals("swf") || action.equals("flv") || action.equals("editTextMindMapColor") || action.equals("editTextMindMapFontColor")) { - WhiteboardObject whiteboardObject = wbListManagerById.getWhiteBoardObjectListByRoomIdAndWhiteboard(roomId, whiteBoardId); String objectOID = actionObject.get(actionObject.size() - 1).toString(); // List roomItem = roomList.get(objectOID); - List<Object> currentObject = whiteboardObject.get(objectOID); + List<Object> currentObject = wb.get(objectOID); if ("paint".equals(actionObject.get(0))) { actionObject.set(1, currentObject.get(1)); } - whiteboardObject.add(objectOID, actionObject); + wb.add(objectOID, actionObject); if (action.equals("swf")) { log.debug("actionObject " + actionObject); @@ -102,7 +90,7 @@ public class WhiteboardManager { log.debug("updateObjectsToSlideNumber :: " + baseObjectName + "," + slidesNumber); - for (Entry<String, List<Object>> me : whiteboardObject.entrySet()) { + for (Entry<String, List<Object>> me : wb.entrySet()) { List<Object> actionObjectStored = me.getValue(); if (actionObjectStored.get(0).equals("ellipse") @@ -131,28 +119,18 @@ public class WhiteboardManager { } } } - - wbListManagerById.setWhiteBoardObjectListRoomObjAndWhiteboardId(roomId, whiteboardObject, whiteBoardId); } else if (action.equals("clearSlide")) { - WhiteboardObject whiteboardObject = wbListManagerById.getWhiteBoardObjectListByRoomIdAndWhiteboard(roomId, whiteBoardId); - for (Object objectName : actionObject) { - whiteboardObject.remove(objectName); + wb.remove(objectName); } - - wbListManagerById.setWhiteBoardObjectListRoomObjAndWhiteboardId(roomId, whiteboardObject, whiteBoardId); } else if (action.equals("whiteboardObj")) { - WhiteboardObject whiteboardObject = wbListManagerById.getWhiteBoardObjectListByRoomIdAndWhiteboard(roomId, whiteBoardId); - - whiteboardObject.setFullFit((Boolean) actionObject.get(1)); - whiteboardObject.setZoom((Integer) actionObject.get(2)); - - wbListManagerById.setWhiteBoardObjectListRoomObjAndWhiteboardId(roomId, whiteboardObject, whiteBoardId); + wb.setFullFit((Boolean) actionObject.get(1)); + wb.setZoom((Integer) actionObject.get(2)); } else { log.warn("Unkown Type: " + action + " actionObject: " + actionObject); } } catch (Exception err) { - log.error("[addWhiteBoardObject]", err); + log.error("[add]", err); } } } http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardObjectSyncManager.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardObjectSyncManager.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardObjectSyncManager.java new file mode 100644 index 0000000..6998a2b --- /dev/null +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/data/whiteboard/WhiteboardObjectSyncManager.java @@ -0,0 +1,98 @@ +/* + * 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.core.data.whiteboard; + +import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import org.apache.openmeetings.db.dto.room.WhiteboardSyncLockObject; +import org.red5.logging.Red5LoggerFactory; +import org.slf4j.Logger; + +/** + * Memory based, configured as singleton in spring configuration + * + * @author sebawagner + * + */ +public class WhiteboardObjectSyncManager { + private Map<Long, Map<String, WhiteboardSyncLockObject>> whiteBoardSyncList = new ConcurrentHashMap<>(); + private Map<Long, Map<String, Map<String, WhiteboardSyncLockObject>>> whiteBoardObjectSyncList = new ConcurrentHashMap<>(); + + private static final Logger log = Red5LoggerFactory.getLogger(WhiteboardObjectSyncManager.class, webAppRootKey); + + /* + * Initial Sync Process + */ + public void setWhiteBoardSyncListByRoomid(Long roomId, Map<String, WhiteboardSyncLockObject> mapObject) { + whiteBoardSyncList.put(roomId, mapObject); + } + + public Map<String, WhiteboardSyncLockObject> getWhiteBoardSyncListByRoomid(Long roomId) { + if (whiteBoardSyncList.containsKey(roomId)) { + return whiteBoardSyncList.get(roomId); + } else { + return new ConcurrentHashMap<>(); + } + } + + /* + * Image Sync Process + */ + public void setWhiteBoardImagesSyncListByRoomid(Long roomId, Map<String, Map<String, WhiteboardSyncLockObject>> mapObject) { + whiteBoardObjectSyncList.put(roomId, mapObject); + } + + public void setWhiteBoardImagesSyncListByRoomAndObjectId(Long roomId, String objectId, Map<String, WhiteboardSyncLockObject> imageSyncList) { + Map<String, Map<String, WhiteboardSyncLockObject>> roomList = getWhiteBoardObjectSyncListByRoomid(roomId); + if (imageSyncList.isEmpty()) { + roomList.remove(objectId); + } else { + roomList.put(objectId, imageSyncList); + } + setWhiteBoardImagesSyncListByRoomid(roomId, roomList); + } + + public Map<String, Map<String, WhiteboardSyncLockObject>> getWhiteBoardObjectSyncListByRoomid(Long roomId) { + if (whiteBoardObjectSyncList.containsKey(roomId)) { + return whiteBoardObjectSyncList.get(roomId); + } else { + return new ConcurrentHashMap<>(); + } + } + + public Map<String, WhiteboardSyncLockObject> getWhiteBoardObjectSyncListByRoomAndObjectId(Long roomId, String objectId) { + log.debug("getWhiteBoardImagesSyncListByRoomAndImageid roomId: " + roomId); + Map<String, Map<String, WhiteboardSyncLockObject>> roomList = getWhiteBoardObjectSyncListByRoomid(roomId); + if (log.isDebugEnabled()) { + log.debug("getWhiteBoardImagesSyncListByRoomAndImageid roomList: " + roomList); + log.debug("getWhiteBoardImagesSyncListByRoomAndImageid objectId: " + objectId); + if (roomList.size() == 1) { + log.debug("getWhiteBoardImagesSyncListByRoomAndImageid roomList Key imageId: " + roomList.keySet().iterator().next()); + } + } + Map<String, WhiteboardSyncLockObject> imageSyncList = roomList.get(objectId); + if (imageSyncList == null) { + imageSyncList = new ConcurrentHashMap<>(); + } + return imageSyncList; + } +} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java index b024b5d..58c6350 100644 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/ConferenceLibrary.java @@ -18,27 +18,22 @@ */ package org.apache.openmeetings.core.remote; -import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4; import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; -import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.apache.commons.io.FileUtils; import org.apache.openmeetings.core.data.whiteboard.WhiteboardManager; import org.apache.openmeetings.core.documents.LibraryChartLoader; import org.apache.openmeetings.core.documents.LibraryDocumentConverter; import org.apache.openmeetings.core.documents.LibraryWmlLoader; -import org.apache.openmeetings.core.documents.LoadLibraryPresentation; import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter; import org.apache.openmeetings.db.dao.file.FileExplorerItemDao; import org.apache.openmeetings.db.dao.server.ISessionManager; import org.apache.openmeetings.db.dao.server.SessiondataDao; import org.apache.openmeetings.db.dao.user.UserDao; -import org.apache.openmeetings.db.dto.file.LibraryPresentation; import org.apache.openmeetings.db.dto.server.ClientSessionInfo; import org.apache.openmeetings.db.entity.file.FileExplorerItem; import org.apache.openmeetings.db.entity.file.FileItem; @@ -48,8 +43,6 @@ import org.apache.openmeetings.db.entity.server.Sessiondata; import org.apache.openmeetings.db.util.AuthLevelUtil; import org.apache.openmeetings.util.OmFileHelper; import org.red5.logging.Red5LoggerFactory; -import org.red5.server.api.IConnection; -import org.red5.server.api.Red5; import org.red5.server.api.service.IPendingServiceCall; import org.red5.server.api.service.IPendingServiceCallback; import org.slf4j.Logger; @@ -72,35 +65,10 @@ public class ConferenceLibrary implements IPendingServiceCallback { @Autowired private FileExplorerItemDao fileDao; @Autowired - private WhiteboardManager whiteboardManagement; + private WhiteboardManager whiteboardManager; @Autowired private ScopeApplicationAdapter scopeAdapter; - public LibraryPresentation getPresentationPreviewFileExplorer(String sid, String parentFolder) { - try { - Sessiondata sd = sessionDao.check(sid); - - log.debug("#############users_id : " + sd.getUserId()); - - if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) { - File working_dir = new File(OmFileHelper.getUploadFilesDir(), parentFolder); - log.debug("############# working_dir : " + working_dir); - - File file = new File(working_dir, OmFileHelper.libraryFileName); - - if (!file.exists()) { - throw new Exception(file.getCanonicalPath() + ": does not exist"); - } - return LoadLibraryPresentation.parseLibraryFileToObject(file); - } else { - throw new Exception("not Authenticated"); - } - } catch (Exception e) { - log.error("[getListOfFilesByAbsolutePath]", e); - return null; - } - } - /** * * Save an Object to the library and returns the file-explorer Id @@ -165,7 +133,7 @@ public class ConferenceLibrary implements IPendingServiceCallback { wbClear.put(3, null); Long roomId = client.getRoomId(); - whiteboardManagement.addWhiteBoardObjectById(roomId, wbClear, wbId); + whiteboardManager.add(roomId, wbClear, wbId); for (int k = 0; k < roomItems.size(); k++) { List<?> actionObject = (List<?>)roomItems.get(k); @@ -174,7 +142,7 @@ public class ConferenceLibrary implements IPendingServiceCallback { whiteboardObj.put(2, "draw"); whiteboardObj.put(3, actionObject); - whiteboardManagement.addWhiteBoardObjectById(roomId, whiteboardObj, wbId); + whiteboardManager.add(roomId, whiteboardObj, wbId); } Map<String, Object> sendObject = new HashMap<>(); @@ -206,40 +174,6 @@ public class ConferenceLibrary implements IPendingServiceCallback { return null; } - /** - * @param sid - * @param fileId - * @return 1 in case of success, -1 otherwise - */ - public Long copyFileToCurrentRoom(String sid, Long fileId) { - try { - Sessiondata sd = sessionDao.check(sid); - if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) { - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - - Client client = sessionManager.getClientByStreamId(streamid, null); - Long roomId = client.getRoomId(); - - FileExplorerItem f = fileDao.get(fileId); - if (roomId != null && f != null) { - File mp4 = f.getFile(EXTENSION_MP4); - - File targetFolder = OmFileHelper.getStreamsSubDir(roomId); - - File target = new File(targetFolder, mp4.getName()); - if (mp4.exists() && !target.exists()) { - FileUtils.copyFile(mp4, target, false); - } - return 1L; - } - } - } catch (Exception err) { - log.error("[copyFileToCurrentRoom] ", err); - } - return -1L; - } - @Override public void resultReceived(IPendingServiceCall arg0) { // TODO Auto-generated method stub http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/WhiteBoardService.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/WhiteBoardService.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/WhiteBoardService.java deleted file mode 100644 index 9cd5a9b..0000000 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/WhiteBoardService.java +++ /dev/null @@ -1,560 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License") + you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.openmeetings.core.remote; - -import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG_KEY; -import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; - -import java.io.File; -import java.io.FilenameFilter; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.Map; - -import org.apache.commons.collections4.ComparatorUtils; -import org.apache.openmeetings.core.data.whiteboard.WhiteBoardObjectListManagerById; -import org.apache.openmeetings.core.data.whiteboard.WhiteBoardObjectSyncManager; -import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter; -import org.apache.openmeetings.db.dao.basic.ConfigurationDao; -import org.apache.openmeetings.db.dao.label.LabelDao; -import org.apache.openmeetings.db.dao.server.ISessionManager; -import org.apache.openmeetings.db.dao.server.SessiondataDao; -import org.apache.openmeetings.db.dao.user.UserDao; -import org.apache.openmeetings.db.dto.room.Cliparts; -import org.apache.openmeetings.db.dto.room.WhiteboardObject; -import org.apache.openmeetings.db.dto.room.WhiteboardObjectList; -import org.apache.openmeetings.db.dto.room.WhiteboardSyncLockObject; -import org.apache.openmeetings.db.entity.room.Client; -import org.apache.openmeetings.db.entity.server.Sessiondata; -import org.apache.openmeetings.db.entity.user.User; -import org.apache.openmeetings.db.util.AuthLevelUtil; -import org.apache.openmeetings.util.OmFileHelper; -import org.red5.logging.Red5LoggerFactory; -import org.red5.server.api.IConnection; -import org.red5.server.api.Red5; -import org.red5.server.api.scope.IScope; -import org.red5.server.api.service.IPendingServiceCall; -import org.red5.server.api.service.IPendingServiceCallback; -import org.slf4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; - -/** - * - * @author sebastianwagner - * - */ -public class WhiteBoardService implements IPendingServiceCallback { - private static final Logger log = Red5LoggerFactory.getLogger(WhiteBoardService.class, webAppRootKey); - @Autowired - private UserDao userDao; - @Autowired - private ScopeApplicationAdapter scopeAdapter; - @Autowired - private ISessionManager sessionManager; - @Autowired - private WhiteBoardObjectSyncManager wbListManager; - @Autowired - private WhiteBoardObjectListManagerById wbListManagerById; - @Autowired - private SessiondataDao sessionDao; - @Autowired - private LabelDao labelDao; - @Autowired - private ConfigurationDao cfgDao; - - public boolean getNewWhiteboardId(String name) { - try { - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - Long roomId = currentClient.getRoomId(); - - Long whiteBoardId = wbListManagerById.getNewWhiteboardId(roomId, name); - scopeAdapter.sendMessageAll(Arrays.asList("newWhiteboard", whiteBoardId, name)); - } catch (Exception e) { - log.error("[getNewWhiteboardId]", e); - return false; - } - return true; - } - - public boolean deleteWhiteboard(Long whiteBoardId) { - try { - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - Long roomId = currentClient.getRoomId(); - - WhiteboardObjectList whiteboardObjectList = wbListManagerById.getWhiteBoardObjectListByRoomId(roomId); - Object returnValue = whiteboardObjectList.getWhiteboardObjects().remove(whiteBoardId); - - log.debug(" :: whiteBoardId :: " + whiteBoardId); - - wbListManagerById.setWhiteBoardObjectListRoomObj(roomId, whiteboardObjectList); - - if (returnValue != null) { - return true; - } - } catch (Exception err) { - log.error("[deleteWhiteboard]", err); - } - return false; - } - - public Map<Long, WhiteboardObject> getRoomItemsBy() { - Map<Long, WhiteboardObject> result = new LinkedHashMap<>(); - try { - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - Long roomId = currentClient.getRoomId(); - - log.debug("getRoomItems: " + roomId); - WhiteboardObjectList whiteboardObjectList = wbListManagerById.getWhiteBoardObjectListByRoomId(roomId); - - if (whiteboardObjectList.getWhiteboardObjects().size() == 0) { - Long langId = null; - { - Long userId = currentClient.getUserId(); - if (userId != null && userId.longValue() < 0) { - userId = -userId; - } - User u = userDao.get(userId); - langId = u == null ? cfgDao.getConfValue(CONFIG_DEFAULT_LANG_KEY, Long.class, "1") : u.getLanguageId(); - } - wbListManagerById.getNewWhiteboardId(roomId, labelDao.getString("615", langId)); - log.debug("Init New Room List"); - whiteboardObjectList = wbListManagerById.getWhiteBoardObjectListByRoomId(roomId); - } - whiteboardObjectList.getWhiteboardObjects().entrySet().stream() - .sorted(Map.Entry.<Long, WhiteboardObject>comparingByKey().reversed()) - .forEachOrdered(x -> result.put(x.getKey(), x.getValue())); - } catch (Exception err) { - log.error("[getRoomItemsBy]", err); - } - return result; - } - - public boolean rename(Long wbId, String name) { - try { - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - Long roomId = currentClient.getRoomId(); - - WhiteboardObjectList whiteboardObjectList = wbListManagerById.getWhiteBoardObjectListByRoomId(roomId); - WhiteboardObject wb = whiteboardObjectList.getWhiteboardObjects().get(wbId); - wb.setName(name); - - log.debug(" :: rename whiteBoard :: id = {}, name = {}", wbId, name); - scopeAdapter.sendMessageAll(Arrays.asList("renameWhiteboard", wbId, name)); - } catch (Exception err) { - log.error("[rename]", err); - return false; - } - return true; - } - - /** - * change the draw status of a user, allow disallow him to draw anybody - * besides the Moderator to draw on the whiteboard, only a Moderator is - * allowed to trigger this function - * - * @param sid - * @param publicSID - * @param canDraw - * @return null in case of success, false otherwise - */ - public boolean setCanDraw(String sid, String publicSID, boolean canDraw) { - try { - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - - Sessiondata sd = sessionDao.check(sid); - if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) { - if (currentClient.getIsMod()) { - Client rcl = sessionManager.getClientByPublicSID(publicSID, null); - - if (rcl != null) { - rcl.setCanDraw(canDraw); - sessionManager.updateClientByStreamId(rcl.getStreamid(), rcl, false, null); - - Map<Integer, Object> newMessage = new HashMap<>(); - newMessage.put(0, "updateDrawStatus"); - newMessage.put(1, rcl); - scopeAdapter.sendMessageWithClientWithSyncObject(newMessage, true); - return true; - } - } - } - } catch (Exception err) { - log.error("[setCanDraw]", err); - } - return false; - } - - public boolean setCanShare(String sid, String publicSID, boolean canShare) { - try { - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - - Sessiondata sd = sessionDao.check(sid); - if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) { - if (currentClient.getIsMod()) { - Client rcl = sessionManager.getClientByPublicSID(publicSID, null); - - if (rcl != null) { - rcl.setCanShare(canShare); - sessionManager.updateClientByStreamId(rcl.getStreamid(), rcl, false, null); - - Map<Integer, Object> newMessage = new HashMap<>(); - newMessage.put(0, "updateDrawStatus"); - newMessage.put(1, rcl); - scopeAdapter.sendMessageWithClientWithSyncObject(newMessage, true); - return true; - } - } - } - } catch (Exception err) { - log.error("[setCanShare]", err); - } - return false; - } - - public boolean setCanRemote(String sid, String publicSID, boolean canRemote) { - try { - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - - Sessiondata sd = sessionDao.check(sid); - if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) { - if (currentClient.getIsMod()) { - Client rcl = sessionManager.getClientByPublicSID(publicSID, null); - - if (rcl != null) { - rcl.setCanRemote(canRemote); - sessionManager.updateClientByStreamId(rcl.getStreamid(), rcl, false, null); - - Map<Integer, Object> newMessage = new HashMap<>(); - newMessage.put(0, "updateDrawStatus"); - newMessage.put(1, rcl); - scopeAdapter.sendMessageWithClientWithSyncObject(newMessage, true); - return true; - } - } - } - } catch (Exception err) { - log.error("[setCanDraw]", err); - } - return false; - } - - public boolean setCanGiveAudio(String sid, String publicSID, boolean canGiveAudio) { - try { - log.debug("[setCanGiveAudio] " + sid + ", " + publicSID + ", " + canGiveAudio); - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - - Sessiondata sd = sessionDao.check(sid); - if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) { - if (currentClient.getIsMod()) { - Client rcl = sessionManager.getClientByPublicSID(publicSID, null); - - if (rcl != null) { - rcl.setCanGiveAudio(canGiveAudio); - sessionManager.updateClientByStreamId(rcl.getStreamid(), rcl, false, null); - - Map<Integer, Object> newMessage = new HashMap<>(); - newMessage.put(0, "updateGiveAudioStatus"); - newMessage.put(1, rcl); - scopeAdapter.sendMessageWithClientWithSyncObject(newMessage, true); - return true; - } - } - } - } catch (Exception err) { - log.error("[setCanGiveAudio]", err); - } - return false; - } - - public WhiteboardSyncLockObject startNewSyncprocess() { - try { - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - Long roomId = currentClient.getRoomId(); - - WhiteboardSyncLockObject wSyncLockObject = new WhiteboardSyncLockObject(); - wSyncLockObject.setAddtime(new Date()); - wSyncLockObject.setPublicSID(currentClient.getPublicSID()); - wSyncLockObject.setInitialLoaded(true); - - Map<String, WhiteboardSyncLockObject> syncListRoom = wbListManager.getWhiteBoardSyncListByRoomid(roomId); - - wSyncLockObject.setCurrentLoadingItem(true); - wSyncLockObject.setInserted(new Date()); - - syncListRoom.put(currentClient.getPublicSID(), wSyncLockObject); - wbListManager.setWhiteBoardSyncListByRoomid(roomId, syncListRoom); - - //Sync to clients - scopeAdapter.sendMessageToCurrentScope("sendSyncFlag", wSyncLockObject, true); - - return wSyncLockObject; - } catch (Exception err) { - log.error("[startNewSyncprocess]", err); - } - return null; - } - - public void sendCompletedSyncEvent() { - try { - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - Long roomId = currentClient.getRoomId(); - - Map<String, WhiteboardSyncLockObject> syncListRoom = wbListManager.getWhiteBoardSyncListByRoomid(roomId); - - WhiteboardSyncLockObject wSyncLockObject = syncListRoom.get(currentClient.getPublicSID()); - - if (wSyncLockObject == null) { - log.error("WhiteboardSyncLockObject not found for this Client " - + syncListRoom); - return; - } else if (!wSyncLockObject.isCurrentLoadingItem()) { - log.warn("WhiteboardSyncLockObject was not started yet " + syncListRoom); - return; - } else { - syncListRoom.remove(currentClient.getPublicSID()); - wbListManager.setWhiteBoardSyncListByRoomid(roomId, syncListRoom); - - int numberOfInitial = getNumberOfInitialLoaders(syncListRoom); - - if (numberOfInitial == 0) { - scopeAdapter.sendMessageToCurrentScope("sendSyncCompleteFlag", wSyncLockObject, true); - } else { - return; - } - } - } catch (Exception err) { - log.error("[sendCompletedSyncEvent]", err); - } - return; - } - - private static int getNumberOfInitialLoaders(Map<String, WhiteboardSyncLockObject> syncListRoom) { - int number = 0; - for (Map.Entry<String, WhiteboardSyncLockObject> e : syncListRoom.entrySet()) { - if (e.getValue().isInitialLoaded()) { - number++; - } - } - return number; - } - - /* - * Image Sync Sequence - */ - - public void startNewObjectSyncProcess(String objectId, boolean isStarting) { - try { - log.debug("startNewObjectSyncprocess: " + objectId); - - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - Long roomId = currentClient.getRoomId(); - - WhiteboardSyncLockObject wSyncLockObject = new WhiteboardSyncLockObject(); - wSyncLockObject.setAddtime(new Date()); - wSyncLockObject.setPublicSID(currentClient.getPublicSID()); - wSyncLockObject.setInserted(new Date()); - - Map<String, WhiteboardSyncLockObject> syncListImage = wbListManager.getWhiteBoardObjectSyncListByRoomAndObjectId(roomId, objectId); - syncListImage.put(currentClient.getPublicSID(), wSyncLockObject); - wbListManager.setWhiteBoardImagesSyncListByRoomAndObjectId(roomId, objectId, syncListImage); - - // Do only send the Token to show the Loading Splash for the - // initial-Request that starts the loading - if (isStarting) { - scopeAdapter.sendMessageToCurrentScope("sendObjectSyncFlag", wSyncLockObject, true); - } - } catch (Exception err) { - log.error("[startNewObjectSyncProcess]", err); - } - } - - public int sendCompletedObjectSyncEvent(String objectId) { - try { - log.debug("sendCompletedObjectSyncEvent: " + objectId); - - IConnection current = Red5.getConnectionLocal(); - String streamid = current.getClient().getId(); - Client currentClient = sessionManager.getClientByStreamId(streamid, null); - Long roomId = currentClient.getRoomId(); - - Map<String, WhiteboardSyncLockObject> syncListImage = wbListManager.getWhiteBoardObjectSyncListByRoomAndObjectId(roomId, objectId); - - log.debug("sendCompletedObjectSyncEvent syncListImage: " + syncListImage); - - WhiteboardSyncLockObject wSyncLockObject = syncListImage.get(currentClient.getPublicSID()); - - if (wSyncLockObject == null) { - log.error("WhiteboardSyncLockObject not found for this Client " + currentClient.getPublicSID()); - log.error("WhiteboardSyncLockObject not found for this syncListImage " + syncListImage); - return -2; - } else { - log.debug("sendCompletedImagesSyncEvent remove: " + currentClient.getPublicSID()); - - syncListImage.remove(currentClient.getPublicSID()); - wbListManager.setWhiteBoardImagesSyncListByRoomAndObjectId(roomId, objectId, syncListImage); - - int numberOfInitial = wbListManager.getWhiteBoardObjectSyncListByRoomid(roomId).size(); - - log.debug("sendCompletedImagesSyncEvent numberOfInitial: " + numberOfInitial); - - if (numberOfInitial == 0) { - scopeAdapter.sendMessageToCurrentScope("sendObjectSyncCompleteFlag", wSyncLockObject, true); - return 1; - } else { - return -4; - } - } - } catch (Exception err) { - log.error("[sendCompletedObjectSyncEvent]", err); - } - return -1; - } - - public synchronized void removeUserFromAllLists(IScope scope, Client currentClient) { - try { - Long roomId = currentClient.getRoomId(); - - // TODO: Maybe we should also check all rooms, independent from the - // current roomId if there is any user registered - if (roomId != null) { - log.debug("removeUserFromAllLists this.whiteBoardObjectListManager: " + wbListManager); - log.debug("removeUserFromAllLists roomId: " + roomId); - - // Check Initial Loaders - Map<String, WhiteboardSyncLockObject> syncListRoom = wbListManager.getWhiteBoardSyncListByRoomid(roomId); - - WhiteboardSyncLockObject wSyncLockObject = syncListRoom.get(currentClient.getPublicSID()); - - if (wSyncLockObject != null) { - syncListRoom.remove(currentClient.getPublicSID()); - } - wbListManager.setWhiteBoardSyncListByRoomid(roomId, syncListRoom); - - int numberOfInitial = getNumberOfInitialLoaders(syncListRoom); - - log.debug("scope " + scope); - - if (numberOfInitial == 0 && scope != null) { - scopeAdapter.sendMessageToCurrentScope("" + roomId, "sendSyncCompleteFlag", wSyncLockObject, false); - } - - // Check Image Loaders - Map<String, Map<String, WhiteboardSyncLockObject>> syncListRoomImages = wbListManager.getWhiteBoardObjectSyncListByRoomid(roomId); - - for (Map.Entry<String, Map<String, WhiteboardSyncLockObject>> e : syncListRoomImages.entrySet()) { - if (e.getValue().containsKey(currentClient.getPublicSID())) { - e.getValue().remove(currentClient.getPublicSID()); - } - wbListManager.setWhiteBoardImagesSyncListByRoomAndObjectId(roomId, e.getKey(), e.getValue()); - } - - int numberOfImageLoaders = wbListManager.getWhiteBoardObjectSyncListByRoomid(roomId).size(); - - if (numberOfImageLoaders == 0 && scope != null) { - scopeAdapter.sendMessageToCurrentScope("" + roomId, "sendImagesSyncCompleteFlag", new Object[] { "remove" }, true); - } - } - } catch (Exception err) { - log.error("[removeUserFromAllLists]", err); - } - } - - public Cliparts getClipArtIcons() { - try { - File clipart_dir = OmFileHelper.getPublicClipartsDir(); - - FilenameFilter getFilesOnly = new FilenameFilter() { - @Override - public boolean accept(File b, String name) { - File f = new File(b, name); - return !f.isDirectory(); - } - }; - - FilenameFilter getDirectoriesOnly = new FilenameFilter() { - @Override - public boolean accept(File b, String name) { - File f = new File(b, name); - return f.isDirectory() && !f.getName().equals("thumb"); - } - }; - - Cliparts cl = new Cliparts(); - cl.setFolderName("general"); - - Comparator<String> comparator = ComparatorUtils.naturalComparator(); - String[] files_general = clipart_dir.list(getFilesOnly); - if (files_general != null) { - Arrays.sort(files_general, comparator); - cl.setGeneralList(files_general); - } - cl.setSubCategories(new LinkedList<Cliparts>()); - - File[] dirs = clipart_dir.listFiles(getDirectoriesOnly); - if (dirs != null) { - for (File dir : dirs) { - Cliparts cl_sub = new Cliparts(); - cl_sub.setFolderName("math"); - String[] files = dir.list(getFilesOnly); - if (files != null) { - Arrays.sort(files, comparator); - cl_sub.setGeneralList(files); - cl.getSubCategories().add(cl_sub); - } - } - } - - return cl; - } catch (Exception err) { - log.error("[getClipArtIcons]", err); - } - return null; - } - - @Override - public void resultReceived(IPendingServiceCall arg0) { - log.debug("resultReceived: " + arg0); - } -} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/WhiteboardService.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/WhiteboardService.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/WhiteboardService.java new file mode 100644 index 0000000..7107100 --- /dev/null +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/WhiteboardService.java @@ -0,0 +1,560 @@ +/* + * 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.core.remote; + +import static org.apache.openmeetings.util.OpenmeetingsVariables.CONFIG_DEFAULT_LANG_KEY; +import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; + +import java.io.File; +import java.io.FilenameFilter; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.Map; + +import org.apache.commons.collections4.ComparatorUtils; +import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache; +import org.apache.openmeetings.core.data.whiteboard.WhiteboardObjectSyncManager; +import org.apache.openmeetings.core.remote.red5.ScopeApplicationAdapter; +import org.apache.openmeetings.db.dao.basic.ConfigurationDao; +import org.apache.openmeetings.db.dao.label.LabelDao; +import org.apache.openmeetings.db.dao.server.ISessionManager; +import org.apache.openmeetings.db.dao.server.SessiondataDao; +import org.apache.openmeetings.db.dao.user.UserDao; +import org.apache.openmeetings.db.dto.room.Cliparts; +import org.apache.openmeetings.db.dto.room.Whiteboard; +import org.apache.openmeetings.db.dto.room.WhiteboardSyncLockObject; +import org.apache.openmeetings.db.dto.room.Whiteboards; +import org.apache.openmeetings.db.entity.room.Client; +import org.apache.openmeetings.db.entity.server.Sessiondata; +import org.apache.openmeetings.db.entity.user.User; +import org.apache.openmeetings.db.util.AuthLevelUtil; +import org.apache.openmeetings.util.OmFileHelper; +import org.red5.logging.Red5LoggerFactory; +import org.red5.server.api.IConnection; +import org.red5.server.api.Red5; +import org.red5.server.api.scope.IScope; +import org.red5.server.api.service.IPendingServiceCall; +import org.red5.server.api.service.IPendingServiceCallback; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * + * @author sebastianwagner + * + */ +public class WhiteboardService implements IPendingServiceCallback { + private static final Logger log = Red5LoggerFactory.getLogger(WhiteboardService.class, webAppRootKey); + @Autowired + private UserDao userDao; + @Autowired + private ScopeApplicationAdapter scopeAdapter; + @Autowired + private ISessionManager sessionManager; + @Autowired + private WhiteboardObjectSyncManager wbListManager; + @Autowired + private WhiteboardCache wbCache; + @Autowired + private SessiondataDao sessionDao; + @Autowired + private LabelDao labelDao; + @Autowired + private ConfigurationDao cfgDao; + + public boolean getNewWhiteboardId(String name) { + try { + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + Long roomId = currentClient.getRoomId(); + + Long whiteBoardId = wbCache.getNewWhiteboardId(roomId, name); + scopeAdapter.sendMessageAll(Arrays.asList("newWhiteboard", whiteBoardId, name)); + } catch (Exception e) { + log.error("[getNewWhiteboardId]", e); + return false; + } + return true; + } + + public boolean deleteWhiteboard(Long whiteBoardId) { + try { + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + Long roomId = currentClient.getRoomId(); + + Whiteboards whiteboards = wbCache.get(roomId); + Object returnValue = whiteboards.getWhiteboards().remove(whiteBoardId); + + log.debug(" :: whiteBoardId :: " + whiteBoardId); + + wbCache.set(roomId, whiteboards); + + if (returnValue != null) { + return true; + } + } catch (Exception err) { + log.error("[deleteWhiteboard]", err); + } + return false; + } + + public Map<Long, Whiteboard> getRoomItemsBy() { + Map<Long, Whiteboard> result = new LinkedHashMap<>(); + try { + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + Long roomId = currentClient.getRoomId(); + + log.debug("getRoomItems: " + roomId); + Whiteboards whiteboards = wbCache.get(roomId); + + if (whiteboards.getWhiteboards().isEmpty()) { + Long langId = null; + { + Long userId = currentClient.getUserId(); + if (userId != null && userId.longValue() < 0) { + userId = -userId; + } + User u = userDao.get(userId); + langId = u == null ? cfgDao.getConfValue(CONFIG_DEFAULT_LANG_KEY, Long.class, "1") : u.getLanguageId(); + } + wbCache.getNewWhiteboardId(roomId, labelDao.getString("615", langId)); + log.debug("Init New Room List"); + whiteboards = wbCache.get(roomId); + } + whiteboards.getWhiteboards().entrySet().stream() + .sorted(Map.Entry.<Long, Whiteboard>comparingByKey().reversed()) + .forEachOrdered(x -> result.put(x.getKey(), x.getValue())); + } catch (Exception err) { + log.error("[getRoomItemsBy]", err); + } + return result; + } + + public boolean rename(Long wbId, String name) { + try { + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + Long roomId = currentClient.getRoomId(); + + Whiteboards whiteboards = wbCache.get(roomId); + Whiteboard wb = whiteboards.getWhiteboards().get(wbId); + wb.setName(name); + + log.debug(" :: rename whiteBoard :: id = {}, name = {}", wbId, name); + scopeAdapter.sendMessageAll(Arrays.asList("renameWhiteboard", wbId, name)); + } catch (Exception err) { + log.error("[rename]", err); + return false; + } + return true; + } + + /** + * change the draw status of a user, allow disallow him to draw anybody + * besides the Moderator to draw on the whiteboard, only a Moderator is + * allowed to trigger this function + * + * @param sid + * @param publicSID + * @param canDraw + * @return null in case of success, false otherwise + */ + public boolean setCanDraw(String sid, String publicSID, boolean canDraw) { + try { + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + + Sessiondata sd = sessionDao.check(sid); + if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) { + if (currentClient.getIsMod()) { + Client rcl = sessionManager.getClientByPublicSID(publicSID, null); + + if (rcl != null) { + rcl.setCanDraw(canDraw); + sessionManager.updateClientByStreamId(rcl.getStreamid(), rcl, false, null); + + Map<Integer, Object> newMessage = new HashMap<>(); + newMessage.put(0, "updateDrawStatus"); + newMessage.put(1, rcl); + scopeAdapter.sendMessageWithClientWithSyncObject(newMessage, true); + return true; + } + } + } + } catch (Exception err) { + log.error("[setCanDraw]", err); + } + return false; + } + + public boolean setCanShare(String sid, String publicSID, boolean canShare) { + try { + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + + Sessiondata sd = sessionDao.check(sid); + if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) { + if (currentClient.getIsMod()) { + Client rcl = sessionManager.getClientByPublicSID(publicSID, null); + + if (rcl != null) { + rcl.setCanShare(canShare); + sessionManager.updateClientByStreamId(rcl.getStreamid(), rcl, false, null); + + Map<Integer, Object> newMessage = new HashMap<>(); + newMessage.put(0, "updateDrawStatus"); + newMessage.put(1, rcl); + scopeAdapter.sendMessageWithClientWithSyncObject(newMessage, true); + return true; + } + } + } + } catch (Exception err) { + log.error("[setCanShare]", err); + } + return false; + } + + public boolean setCanRemote(String sid, String publicSID, boolean canRemote) { + try { + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + + Sessiondata sd = sessionDao.check(sid); + if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) { + if (currentClient.getIsMod()) { + Client rcl = sessionManager.getClientByPublicSID(publicSID, null); + + if (rcl != null) { + rcl.setCanRemote(canRemote); + sessionManager.updateClientByStreamId(rcl.getStreamid(), rcl, false, null); + + Map<Integer, Object> newMessage = new HashMap<>(); + newMessage.put(0, "updateDrawStatus"); + newMessage.put(1, rcl); + scopeAdapter.sendMessageWithClientWithSyncObject(newMessage, true); + return true; + } + } + } + } catch (Exception err) { + log.error("[setCanDraw]", err); + } + return false; + } + + public boolean setCanGiveAudio(String sid, String publicSID, boolean canGiveAudio) { + try { + log.debug("[setCanGiveAudio] " + sid + ", " + publicSID + ", " + canGiveAudio); + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + + Sessiondata sd = sessionDao.check(sid); + if (AuthLevelUtil.hasUserLevel(userDao.getRights(sd.getUserId()))) { + if (currentClient.getIsMod()) { + Client rcl = sessionManager.getClientByPublicSID(publicSID, null); + + if (rcl != null) { + rcl.setCanGiveAudio(canGiveAudio); + sessionManager.updateClientByStreamId(rcl.getStreamid(), rcl, false, null); + + Map<Integer, Object> newMessage = new HashMap<>(); + newMessage.put(0, "updateGiveAudioStatus"); + newMessage.put(1, rcl); + scopeAdapter.sendMessageWithClientWithSyncObject(newMessage, true); + return true; + } + } + } + } catch (Exception err) { + log.error("[setCanGiveAudio]", err); + } + return false; + } + + public WhiteboardSyncLockObject startNewSyncprocess() { + try { + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + Long roomId = currentClient.getRoomId(); + + WhiteboardSyncLockObject wSyncLockObject = new WhiteboardSyncLockObject(); + wSyncLockObject.setAddtime(new Date()); + wSyncLockObject.setPublicSID(currentClient.getPublicSID()); + wSyncLockObject.setInitialLoaded(true); + + Map<String, WhiteboardSyncLockObject> syncListRoom = wbListManager.getWhiteBoardSyncListByRoomid(roomId); + + wSyncLockObject.setCurrentLoadingItem(true); + wSyncLockObject.setInserted(new Date()); + + syncListRoom.put(currentClient.getPublicSID(), wSyncLockObject); + wbListManager.setWhiteBoardSyncListByRoomid(roomId, syncListRoom); + + //Sync to clients + scopeAdapter.sendMessageToCurrentScope("sendSyncFlag", wSyncLockObject, true); + + return wSyncLockObject; + } catch (Exception err) { + log.error("[startNewSyncprocess]", err); + } + return null; + } + + public void sendCompletedSyncEvent() { + try { + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + Long roomId = currentClient.getRoomId(); + + Map<String, WhiteboardSyncLockObject> syncListRoom = wbListManager.getWhiteBoardSyncListByRoomid(roomId); + + WhiteboardSyncLockObject wSyncLockObject = syncListRoom.get(currentClient.getPublicSID()); + + if (wSyncLockObject == null) { + log.error("WhiteboardSyncLockObject not found for this Client " + + syncListRoom); + return; + } else if (!wSyncLockObject.isCurrentLoadingItem()) { + log.warn("WhiteboardSyncLockObject was not started yet " + syncListRoom); + return; + } else { + syncListRoom.remove(currentClient.getPublicSID()); + wbListManager.setWhiteBoardSyncListByRoomid(roomId, syncListRoom); + + int numberOfInitial = getNumberOfInitialLoaders(syncListRoom); + + if (numberOfInitial == 0) { + scopeAdapter.sendMessageToCurrentScope("sendSyncCompleteFlag", wSyncLockObject, true); + } else { + return; + } + } + } catch (Exception err) { + log.error("[sendCompletedSyncEvent]", err); + } + return; + } + + private static int getNumberOfInitialLoaders(Map<String, WhiteboardSyncLockObject> syncListRoom) { + int number = 0; + for (Map.Entry<String, WhiteboardSyncLockObject> e : syncListRoom.entrySet()) { + if (e.getValue().isInitialLoaded()) { + number++; + } + } + return number; + } + + /* + * Image Sync Sequence + */ + + public void startNewObjectSyncProcess(String objectId, boolean isStarting) { + try { + log.debug("startNewObjectSyncprocess: " + objectId); + + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + Long roomId = currentClient.getRoomId(); + + WhiteboardSyncLockObject wSyncLockObject = new WhiteboardSyncLockObject(); + wSyncLockObject.setAddtime(new Date()); + wSyncLockObject.setPublicSID(currentClient.getPublicSID()); + wSyncLockObject.setInserted(new Date()); + + Map<String, WhiteboardSyncLockObject> syncListImage = wbListManager.getWhiteBoardObjectSyncListByRoomAndObjectId(roomId, objectId); + syncListImage.put(currentClient.getPublicSID(), wSyncLockObject); + wbListManager.setWhiteBoardImagesSyncListByRoomAndObjectId(roomId, objectId, syncListImage); + + // Do only send the Token to show the Loading Splash for the + // initial-Request that starts the loading + if (isStarting) { + scopeAdapter.sendMessageToCurrentScope("sendObjectSyncFlag", wSyncLockObject, true); + } + } catch (Exception err) { + log.error("[startNewObjectSyncProcess]", err); + } + } + + public int sendCompletedObjectSyncEvent(String objectId) { + try { + log.debug("sendCompletedObjectSyncEvent: " + objectId); + + IConnection current = Red5.getConnectionLocal(); + String streamid = current.getClient().getId(); + Client currentClient = sessionManager.getClientByStreamId(streamid, null); + Long roomId = currentClient.getRoomId(); + + Map<String, WhiteboardSyncLockObject> syncListImage = wbListManager.getWhiteBoardObjectSyncListByRoomAndObjectId(roomId, objectId); + + log.debug("sendCompletedObjectSyncEvent syncListImage: " + syncListImage); + + WhiteboardSyncLockObject wSyncLockObject = syncListImage.get(currentClient.getPublicSID()); + + if (wSyncLockObject == null) { + log.error("WhiteboardSyncLockObject not found for this Client " + currentClient.getPublicSID()); + log.error("WhiteboardSyncLockObject not found for this syncListImage " + syncListImage); + return -2; + } else { + log.debug("sendCompletedImagesSyncEvent remove: " + currentClient.getPublicSID()); + + syncListImage.remove(currentClient.getPublicSID()); + wbListManager.setWhiteBoardImagesSyncListByRoomAndObjectId(roomId, objectId, syncListImage); + + int numberOfInitial = wbListManager.getWhiteBoardObjectSyncListByRoomid(roomId).size(); + + log.debug("sendCompletedImagesSyncEvent numberOfInitial: " + numberOfInitial); + + if (numberOfInitial == 0) { + scopeAdapter.sendMessageToCurrentScope("sendObjectSyncCompleteFlag", wSyncLockObject, true); + return 1; + } else { + return -4; + } + } + } catch (Exception err) { + log.error("[sendCompletedObjectSyncEvent]", err); + } + return -1; + } + + public synchronized void removeUserFromAllLists(IScope scope, Client currentClient) { + try { + Long roomId = currentClient.getRoomId(); + + // TODO: Maybe we should also check all rooms, independent from the + // current roomId if there is any user registered + if (roomId != null) { + log.debug("removeUserFromAllLists this.whiteBoardObjectListManager: " + wbListManager); + log.debug("removeUserFromAllLists roomId: " + roomId); + + // Check Initial Loaders + Map<String, WhiteboardSyncLockObject> syncListRoom = wbListManager.getWhiteBoardSyncListByRoomid(roomId); + + WhiteboardSyncLockObject wSyncLockObject = syncListRoom.get(currentClient.getPublicSID()); + + if (wSyncLockObject != null) { + syncListRoom.remove(currentClient.getPublicSID()); + } + wbListManager.setWhiteBoardSyncListByRoomid(roomId, syncListRoom); + + int numberOfInitial = getNumberOfInitialLoaders(syncListRoom); + + log.debug("scope " + scope); + + if (numberOfInitial == 0 && scope != null) { + scopeAdapter.sendMessageToCurrentScope("" + roomId, "sendSyncCompleteFlag", wSyncLockObject, false); + } + + // Check Image Loaders + Map<String, Map<String, WhiteboardSyncLockObject>> syncListRoomImages = wbListManager.getWhiteBoardObjectSyncListByRoomid(roomId); + + for (Map.Entry<String, Map<String, WhiteboardSyncLockObject>> e : syncListRoomImages.entrySet()) { + if (e.getValue().containsKey(currentClient.getPublicSID())) { + e.getValue().remove(currentClient.getPublicSID()); + } + wbListManager.setWhiteBoardImagesSyncListByRoomAndObjectId(roomId, e.getKey(), e.getValue()); + } + + int numberOfImageLoaders = wbListManager.getWhiteBoardObjectSyncListByRoomid(roomId).size(); + + if (numberOfImageLoaders == 0 && scope != null) { + scopeAdapter.sendMessageToCurrentScope("" + roomId, "sendImagesSyncCompleteFlag", new Object[] { "remove" }, true); + } + } + } catch (Exception err) { + log.error("[removeUserFromAllLists]", err); + } + } + + public Cliparts getClipArtIcons() { + try { + File clipart_dir = OmFileHelper.getPublicClipartsDir(); + + FilenameFilter getFilesOnly = new FilenameFilter() { + @Override + public boolean accept(File b, String name) { + File f = new File(b, name); + return !f.isDirectory(); + } + }; + + FilenameFilter getDirectoriesOnly = new FilenameFilter() { + @Override + public boolean accept(File b, String name) { + File f = new File(b, name); + return f.isDirectory() && !f.getName().equals("thumb"); + } + }; + + Cliparts cl = new Cliparts(); + cl.setFolderName("general"); + + Comparator<String> comparator = ComparatorUtils.naturalComparator(); + String[] files_general = clipart_dir.list(getFilesOnly); + if (files_general != null) { + Arrays.sort(files_general, comparator); + cl.setGeneralList(files_general); + } + cl.setSubCategories(new LinkedList<Cliparts>()); + + File[] dirs = clipart_dir.listFiles(getDirectoriesOnly); + if (dirs != null) { + for (File dir : dirs) { + Cliparts cl_sub = new Cliparts(); + cl_sub.setFolderName("math"); + String[] files = dir.list(getFilesOnly); + if (files != null) { + Arrays.sort(files, comparator); + cl_sub.setGeneralList(files); + cl.getSubCategories().add(cl_sub); + } + } + } + + return cl; + } catch (Exception err) { + log.error("[getClipArtIcons]", err); + } + return null; + } + + @Override + public void resultReceived(IPendingServiceCall arg0) { + log.debug("resultReceived: " + arg0); + } +} http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java ---------------------------------------------------------------------- diff --git a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java index 16a6a4c..c854997 100644 --- a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java +++ b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/red5/ScopeApplicationAdapter.java @@ -18,9 +18,11 @@ */ package org.apache.openmeetings.core.remote.red5; +import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_MP4; import static org.apache.openmeetings.util.OpenmeetingsVariables.webAppRootKey; import java.awt.Point; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -34,11 +36,13 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; +import org.apache.commons.io.FileUtils; import org.apache.openmeetings.IApplication; import org.apache.openmeetings.core.data.conference.RoomManager; +import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache; import org.apache.openmeetings.core.data.whiteboard.WhiteboardManager; import org.apache.openmeetings.core.remote.RecordingService; -import org.apache.openmeetings.core.remote.WhiteBoardService; +import org.apache.openmeetings.core.remote.WhiteboardService; import org.apache.openmeetings.core.remote.util.SessionVariablesUtil; import org.apache.openmeetings.core.util.WebSocketHelper; import org.apache.openmeetings.db.dao.basic.ConfigurationDao; @@ -99,9 +103,11 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp @Autowired private ISessionManager sessionManager; @Autowired - private WhiteBoardService whiteBoardService; + private WhiteboardService whiteBoardService; @Autowired - private WhiteboardManager whiteboardManagement; + private WhiteboardManager whiteboardManager; + @Autowired + private WhiteboardCache whiteboardCache; @Autowired private RecordingService recordingService; @Autowired @@ -1160,7 +1166,6 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp } private static List<?> getWbObject(FileItem fi, String url) { - String fuid = UUID.randomUUID().toString(); Point size = getSize(fi); String type = "n/a"; switch (fi.getType()) { @@ -1190,7 +1195,7 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp , size.x // initwidth //14 , size.y // initheight //15 , 100 // currentzoom //16 FIXME TODO - , fuid // uniquObjectSyncName //17 + , fi.getHash() // uniquObjectSyncName //17 , fi.getName() // standardFileName //18 , true // fullFit //19 FIXME TODO , 0 // zIndex //-8 @@ -1200,18 +1205,17 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp , 0 // posy //-4 , size.x // width //-3 , size.y // height //-2 - , fuid // this.currentlayer.name //-1 + , fi.getHash() // this.currentlayer.name //-1 ); } - private static List<?> getFlvWbObject(FileItem fi) { - String fuid = UUID.randomUUID().toString(); + private static List<?> getMp4WbObject(FileItem fi, String url) { Point size = getSize(fi); return Arrays.asList( "flv" // 0: 'flv' , fi.getId() // 1: 7 , fi.getName() // 2: 'BigBuckBunny_512kb.mp4' - , false // 3: false //playRemote + , url // 3: posterUrl , size.x // 4: 416 , size.y // 5: 240 , 0 // 6: 1 // z-index @@ -1221,10 +1225,27 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp , 0 // 10: 0 //TODO // y , size.x // 11: 749 // width , size.y // 12: 739 // height - , fuid // 13: 'flv_1469602000351' + , fi.getHash() // 13: 'flv_1469602000351' ); } + private static void copyFileToRoom(Long roomId, FileItem f) { + try { + if (roomId != null && f != null) { + File mp4 = f.getFile(EXTENSION_MP4); + + File targetFolder = OmFileHelper.getStreamsSubDir(roomId); + + File target = new File(targetFolder, mp4.getName()); + if (mp4.exists() && !target.exists()) { + FileUtils.copyFile(mp4, target, false); + } + } + } catch (Exception err) { + log.error("[copyFileToCurrentRoom] ", err); + } + } + public void sendToWhiteboard(String uid, Long wbId, FileItem fi, String url, boolean clean) { ClientSessionInfo csi = sessionManager.getClientByPublicSIDAnyServer(uid); if (csi == null) { @@ -1242,7 +1263,9 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp wbObject = getWbObject(fi, url); break; case Video: - wbObject = getFlvWbObject(fi); + case Recording: + wbObject = getMp4WbObject(fi, url); + copyFileToRoom(client.getRoomId(), fi); break; default: } @@ -1251,6 +1274,7 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp wbClear.put("id", wbId); wbClear.put("param", Arrays.asList("whiteboard", new Date(), "clear", null)); + whiteboardCache.get(client.getRoomId(), wbId).clear(); sendToScope(client.getRoomId(), "sendVarsToWhiteboardById", Arrays.asList(null, wbClear)); } sendToWhiteboard(client, Arrays.asList("whiteboard", new Date(), "draw", wbObject), wbId); @@ -1300,10 +1324,10 @@ public class ScopeApplicationAdapter extends MultiThreadedApplicationAdapter imp whiteboardTempObj.put(3, tempActionObject); - whiteboardManagement.addWhiteBoardObjectById(roomId, whiteboardTempObj, wbId); + whiteboardManager.add(roomId, whiteboardTempObj, wbId); } } else { - whiteboardManagement.addWhiteBoardObjectById(roomId, whiteboardObj, wbId); + whiteboardManager.add(roomId, whiteboardObj, wbId); } Map<String, Object> sendObject = new HashMap<>(); http://git-wip-us.apache.org/repos/asf/openmeetings/blob/a5d2b138/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java ---------------------------------------------------------------------- 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 new file mode 100644 index 0000000..0cfe6d5 --- /dev/null +++ b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java @@ -0,0 +1,189 @@ +/* + * 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.util.OpenmeetingsVariables.webAppRootKey; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import org.red5.logging.Red5LoggerFactory; +import org.slf4j.Logger; + +public class Whiteboard { + private static final Logger log = Red5LoggerFactory.getLogger(Whiteboard.class, webAppRootKey); + private long whiteBoardId; + private Integer x = 0; + private Integer y = 0; + private Integer zoom = 100; + private Boolean fullFit = true; + private Map<String, List<Object>> roomItems = new ConcurrentHashMap<>(); + private Date created = new Date(); + private int zIndex = 1; + private String name; + + public Whiteboard() {} + + public Whiteboard(String name) { + this.name = name; + } + + public long getWhiteBoardId() { + return whiteBoardId; + } + + public void setWhiteBoardId(long whiteBoardId) { + this.whiteBoardId = whiteBoardId; + } + + public Integer getX() { + return x; + } + + public void setX(Integer x) { + this.x = x; + } + + public Integer getY() { + return y; + } + + public void setY(Integer y) { + this.y = y; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public Integer getZoom() { + return zoom; + } + + public void setZoom(Integer zoom) { + this.zoom = zoom; + } + + public Boolean getFullFit() { + return fullFit; + } + + public void setFullFit(Boolean fullFit) { + this.fullFit = fullFit; + } + + public void clear() { + roomItems.clear(); + zIndex = 1; + } + + //getter is required, otherwise roomItems are not available in red5 + public Map<String, List<Object>> getRoomItems() { + return roomItems; + } + + public void add(String oid, List<Object> actionObject) { + Object type = actionObject.size() > 0 ? actionObject.get(0) : ""; + if (actionObject.size() > 8 && ("swf".equals(type) || "image".equals(type) || "flv".equals(type))) { + Integer zInd = (Integer)actionObject.get(actionObject.size() - 8); + if (zInd == null || zInd == 0 || zInd < zIndex) { + actionObject.set(actionObject.size() - 8, zIndex++); + } + } + roomItems.put(oid, actionObject); + } + + public List<Object> get(String oid) { + return roomItems.get(oid); + } + + public Set<Entry<String, List<Object>>> entrySet() { + return roomItems.entrySet(); + } + + public void remove(Object oid) { + roomItems.remove(oid); + } + + public void remove(List<Object> actionObject) { + String oid = actionObject.get(actionObject.size() - 1).toString(); + String type = actionObject.get(0).toString(); + log.debug("Removal of object: oid = {}, type = {} ", oid, type); + + /* I believe this is redundant + // Re-Index all items in its zIndex + if (type.equals("ellipse") + || type.equals("drawarrow") + || type.equals("line") + || type.equals("paint") + || type.equals("rectangle") + || type.equals("uline") + || type.equals("image") + || type.equals("letter") + || type.equals("clipart") + || type.equals("swf") + || type.equals("mindmapnode") + || type.equals("flv")) { + + Integer zIndex = Integer.valueOf(actionObject.get(actionObject.size() - 8).toString()); + + log.debug("1|zIndex " + zIndex); + log.debug("2|zIndex " + actionObject.get(actionObject.size() - 8).toString()); + log.debug("3|zIndex " + actionObject.get(actionObject.size() - 8)); + + int l = 0; + for (Object o : actionObject) { + log.debug("4|zIndex " + l + " -- " + o); + l++; + } + + for (Entry<String, List<Object>> e : roomItems.entrySet()) { + List<Object> actionObjectStored = e.getValue(); + + Integer zIndexStored = Integer.valueOf(actionObjectStored.get(actionObjectStored.size() - 8).toString()); + + log.debug("zIndexStored|zIndex " + zIndexStored + "|" + zIndex); + + if (zIndexStored >= zIndex) { + zIndexStored -= 1; + log.debug("new-zIndex " + zIndexStored); + } + actionObjectStored.set(actionObjectStored.size() - 8, zIndexStored); + } + } + */ + roomItems.remove(oid); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +}
