You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2022/06/28 08:52:00 UTC
[openmeetings] branch master updated: [OPENMEETINGS-2745] room files are inited on first use as expected
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 cd10d4347 [OPENMEETINGS-2745] room files are inited on first use as expected
cd10d4347 is described below
commit cd10d43472f96b8d8024cf8b4022b2827b7db7cf
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Tue Jun 28 15:51:52 2022 +0700
[OPENMEETINGS-2745] room files are inited on first use as expected
---
.../openmeetings/db/dao/file/FileItemDao.java | 2 +-
.../openmeetings/web/app/WhiteboardManager.java | 42 +++----
.../apache/openmeetings/web/room/wb/WbPanel.java | 129 +++++++++++----------
3 files changed, 87 insertions(+), 86 deletions(-)
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 f5928ccda..ad97f20eb 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
@@ -198,7 +198,7 @@ public class FileItemDao extends BaseFileItemDao {
return update(f);
}
- public List<BaseFileItem> getAllRoomFiles(String search, long start, long count, Long roomId/*, Long ownerId*/, List<Group> groups) {
+ public List<BaseFileItem> getAllRoomFiles(String search, long start, long count, Long roomId, List<Group> groups) {
return setLimits(em.createNamedQuery("getAllFileItemsForRoom", BaseFileItem.class)
.setParameter("folder", Type.FOLDER)
.setParameter("roomId", roomId)
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
index 6d24e7784..a67e10c37 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/app/WhiteboardManager.java
@@ -23,23 +23,20 @@ import static org.apache.openmeetings.db.util.ApplicationHelper.ensureApplicatio
import static org.apache.openmeetings.util.OpenmeetingsVariables.getDefaultLang;
import static org.apache.openmeetings.web.room.wb.WbWebSocketHelper.sendWbAll;
-import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
-import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
+import java.util.stream.Collectors;
import org.apache.openmeetings.core.util.WebSocketHelper;
import org.apache.openmeetings.db.dao.label.LabelDao;
import org.apache.openmeetings.db.dto.room.Whiteboard;
import org.apache.openmeetings.db.dto.room.Whiteboards;
-import org.apache.openmeetings.db.entity.file.BaseFileItem;
import org.apache.openmeetings.db.entity.room.Room;
import org.apache.openmeetings.db.entity.room.RoomFile;
import org.apache.openmeetings.db.entity.user.User;
@@ -140,35 +137,29 @@ public class WhiteboardManager implements IWhiteboardManager {
return wbs;
}
- public Map<Long, List<BaseFileItem>> get(Room r, Long langId) {
- Map<Long, List<BaseFileItem>> result = new HashMap<>();
+ public void initFiles(Room r, Long langId, TriConsumer<Whiteboards, Whiteboard, List<RoomFile>> creator) {
if (!contains(r.getId())
&& r.getFiles() != null
&& !r.getFiles().isEmpty()
&& map().tryLock(r.getId()))
{
try {
- TreeMap<Long, List<BaseFileItem>> files = new TreeMap<>();
- for (RoomFile rf : r.getFiles()) {
- List<BaseFileItem> bfl = files.get(rf.getWbIdx());
- if (bfl == null) {
- files.put(rf.getWbIdx(), new ArrayList<>());
- bfl = files.get(rf.getWbIdx());
- }
- bfl.add(rf.getFile());
- }
- Whiteboards wbs = getOrCreate(r.getId(), null);
- for (Map.Entry<Long, List<BaseFileItem>> e : files.entrySet()) {
- Whiteboard wb = add(wbs, langId);
- wbs.setActiveWb(wb.getId());
- result.put(wb.getId(), e.getValue());
- }
- update(wbs);
+ getOrCreate(r.getId(), wbs -> {
+ r.getFiles().stream()
+ .sorted((rf1, rf2) -> (int)(rf1.getWbIdx() - rf2.getWbIdx()))
+ .collect(Collectors.groupingBy(f -> f.getWbIdx()))
+ .forEach((wbIdx, fileList) -> {
+ log.trace("WBS init, processing idx {}", wbIdx);
+ Whiteboard wb = add(wbs, langId);
+ wbs.setActiveWb(wb.getId());
+ creator.accept(wbs, wb, fileList);
+ });
+ update(wbs);
+ });
} finally {
map().unlock(r.getId());
}
}
- return result;
}
public Whiteboards get(Long roomId, Long langId) {
@@ -292,4 +283,9 @@ public class WhiteboardManager implements IWhiteboardManager {
onlineWbs.remove(event.getKey());
}
}
+
+ @FunctionalInterface
+ public static interface TriConsumer<T, U, S> {
+ void accept(T t, U u, S s);
+ }
}
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 a4949f661..1b830283b 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
@@ -161,12 +161,9 @@ public class WbPanel extends AbstractWbPanel {
@Override
void internalWbLoad(StringBuilder sb) {
Long langId = rp.getClient().getUser().getLanguageId();
- Map<Long, List<BaseFileItem>> files = wbm.get(rp.getRoom(), langId);
- for (Map.Entry<Long, List<BaseFileItem>> e : files.entrySet()) {
- for (BaseFileItem fi : e.getValue()) {
- sendFileToWb(e.getKey(), fi, false);
- }
- }
+ wbm.initFiles(rp.getRoom(), langId, (wbs, wbIdx, roomFiles) -> {
+ roomFiles.forEach(rf -> addFileToWb(wbs, wbIdx, rf.getFile(), false, false));
+ });
Whiteboards wbs = wbm.get(roomId, langId);
loadWhiteboards(sb, rp.getClient(), wbs, wbm.list(roomId));
JSONObject wbj = getWbJson(wbs.getActiveWb());
@@ -487,75 +484,83 @@ public class WbPanel extends AbstractWbPanel {
wb.setHeight(Math.max(wb.getHeight(), (int)(h * scale)));
}
- private void sendFileToWb(Long wbId, final BaseFileItem fi, boolean clean) {
- if (isVisible() && fi.getId() != null) {
- Whiteboards wbs = wbm.get(roomId);
- String wuid = randomUUID().toString();
- Whiteboard wb = wbs.get(wbId == null ? wbs.getActiveWb() : wbId);
- if (wb == null) {
- return;
- }
- switch (fi.getType()) {
- case FOLDER:
- //do nothing
- break;
- case WML_FILE:
- {
- File f = fi.getFile();
- if (f.exists() && f.isFile()) {
- try (BufferedReader br = Files.newBufferedReader(f.toPath())) {
- final boolean[] updated = {false};
- JSONArray arr = getArray(new JSONObject(new JSONTokener(br)), o -> {
- wb.put(o.getString("uid"), o);
- updated[0] = true;
- return addFileUrl(rp.getClient(), wbs.getUid(), o, bf -> updateWbSize(wb, bf));
- });
+ private void addFileToWb(Whiteboards wbs, Whiteboard wb, final BaseFileItem fi, boolean clean, boolean sendAndUpdate) {
+ if (fi.getId() == null || wb == null) {
+ return;
+ }
+ switch (fi.getType()) {
+ case FOLDER:
+ //do nothing
+ break;
+ case WML_FILE:
+ {
+ File f = fi.getFile();
+ if (f.exists() && f.isFile()) {
+ try (BufferedReader br = Files.newBufferedReader(f.toPath())) {
+ final boolean[] updated = {false};
+ JSONArray arr = getArray(new JSONObject(new JSONTokener(br)), o -> {
+ wb.put(o.getString("uid"), o);
+ updated[0] = true;
+ return addFileUrl(rp.getClient(), wbs.getUid(), o, bf -> updateWbSize(wb, bf));
+ });
+ if (sendAndUpdate) {
if (updated[0]) {
wbm.update(roomId, wb);
}
sendWbAll(WbAction.SET_SIZE, wb.getAddJson());
sendWbAll(WbAction.LOAD, getObjWbJson(wb.getId(), arr));
- } catch (Exception e) {
- log.error("Unexpected error while loading WB", e);
}
+ } catch (Exception e) {
+ log.error("Unexpected error while loading WB", e);
}
}
- break;
- case POLL_CHART:
- break;
- default:
- {
- JSONObject file = new JSONObject()
- .put(ATTR_FILE_ID, fi.getId())
- .put(ATTR_FILE_TYPE, fi.getType().name())
- .put("count", fi.getCount())
- .put(ATTR_TYPE, "image")
- .put("left", UPLOAD_WB_LEFT)
- .put("top", UPLOAD_WB_TOP)
- .put(ATTR_WIDTH, fi.getWidth() == null ? DEFAULT_WIDTH : fi.getWidth())
- .put(ATTR_HEIGHT, fi.getHeight() == null ? DEFAULT_HEIGHT : fi.getHeight())
- .put("uid", wuid)
- .put(ATTR_SLIDE, wb.getSlide())
- ;
- if (BaseFileItem.Type.VIDEO == fi.getType() || BaseFileItem.Type.RECORDING == fi.getType()) {
- file.put(ATTR_OMTYPE, "Video");
- file.put(PARAM_STATUS, new JSONObject()
- .put("paused", true)
- .put("pos", 0.0)
- .put(PARAM_UPDATED, System.currentTimeMillis()));
- }
- final String ruid = wbs.getUid();
- if (clean) {
- wbm.clearAll(roomId, wb.getId(), addUndo);
- }
- wb.put(wuid, file);
- updateWbSize(wb, fi);
+ }
+ break;
+ case POLL_CHART:
+ break;
+ default:
+ {
+ String wuid = randomUUID().toString();
+ JSONObject file = new JSONObject()
+ .put(ATTR_FILE_ID, fi.getId())
+ .put(ATTR_FILE_TYPE, fi.getType().name())
+ .put("count", fi.getCount())
+ .put(ATTR_TYPE, "image")
+ .put("left", UPLOAD_WB_LEFT)
+ .put("top", UPLOAD_WB_TOP)
+ .put(ATTR_WIDTH, fi.getWidth() == null ? DEFAULT_WIDTH : fi.getWidth())
+ .put(ATTR_HEIGHT, fi.getHeight() == null ? DEFAULT_HEIGHT : fi.getHeight())
+ .put("uid", wuid)
+ .put(ATTR_SLIDE, wb.getSlide())
+ ;
+ if (BaseFileItem.Type.VIDEO == fi.getType() || BaseFileItem.Type.RECORDING == fi.getType()) {
+ file.put(ATTR_OMTYPE, "Video");
+ file.put(PARAM_STATUS, new JSONObject()
+ .put("paused", true)
+ .put("pos", 0.0)
+ .put(PARAM_UPDATED, System.currentTimeMillis()));
+ }
+ final String ruid = wbs.getUid();
+ if (clean) {
+ wbm.clearAll(roomId, wb.getId(), addUndo);
+ }
+ wb.put(wuid, file);
+ updateWbSize(wb, fi);
+ if (sendAndUpdate) {
wbm.update(roomId, wb);
sendWbAll(WbAction.SET_SIZE, wb.getAddJson());
WbWebSocketHelper.sendWbFile(roomId, wb.getId(), ruid, file, fi);
}
- break;
}
+ break;
+ }
+ }
+
+ private void sendFileToWb(Long wbId, final BaseFileItem fi, boolean clean) {
+ if (isVisible()) {
+ Whiteboards wbs = wbm.get(roomId);
+ Whiteboard wb = wbs.get(wbId == null ? wbs.getActiveWb() : wbId);
+ addFileToWb(wbs, wb, fi, clean, true);
}
}