This is an automated email from the ASF dual-hosted git repository. solomax pushed a commit to branch java11-modules in repository https://gitbox.apache.org/repos/asf/openmeetings.git
commit 37f32562b8a3451fb55e9f1ffe4c4516914b4d4c Author: Maxim Solodovnik <[email protected]> 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); } }
