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);
 		}
 	}