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

Reply via email to