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 9b9af64  [OPENMEETINGS-2588] non-beans are injected, tests are green 
(#137)
9b9af64 is described below

commit 9b9af64501921186a200779da163b52cb53af0eb
Author: Maxim Solodovnik <solomax...@gmail.com>
AuthorDate: Thu Mar 18 13:57:03 2021 +0700

    [OPENMEETINGS-2588] non-beans are injected, tests are green (#137)
    
    * [OPENMEETINGS-2588] non-beans are injected, mappers are added, tests are 
green
---
 openmeetings-core/pom.xml                          |   5 +
 .../org/apache/openmeetings/core/remote/KRoom.java |  59 ++++----
 .../apache/openmeetings/core/remote/KStream.java   |  33 +++--
 .../openmeetings/core/remote/KTestStream.java      |  16 ++-
 .../openmeetings/core/remote/KurentoHandler.java   |  24 +---
 .../openmeetings/core/remote/StreamProcessor.java  |   2 +-
 .../core/remote/StreamProcessorActions.java        |   2 +-
 .../core/remote/TestStreamProcessor.java           |   2 +-
 .../openmeetings/core/remote/BaseMockedTest.java   |  50 +++++++
 .../openmeetings/db/dao/file/BaseFileItemDao.java  |   4 +
 .../db/dto/calendar/AppointmentDTO.java            |  49 -------
 .../db/dto/calendar/MeetingMemberDTO.java          |  36 -----
 .../openmeetings/db/dto/room/InvitationDTO.java    |  55 --------
 .../apache/openmeetings/db/dto/room/RoomDTO.java   |  44 ++----
 .../openmeetings/db/dto/room/RoomFileDTO.java      |  24 ----
 .../apache/openmeetings/db/dto/user/GroupDTO.java  |   8 --
 .../apache/openmeetings/db/dto/user/UserDTO.java   |  24 ----
 .../openmeetings/db/mapper/CalendarMapper.java     | 122 ++++++++++++++++
 .../apache/openmeetings/db/mapper/RoomMapper.java  | 157 +++++++++++++++++++++
 .../apache/openmeetings/db/mapper/UserMapper.java  |  69 +++++++++
 .../webservice/CalendarWebService.java             |   6 +-
 .../openmeetings/webservice/RoomWebService.java    |  10 +-
 .../openmeetings/webservice/UserWebService.java    |   5 +-
 23 files changed, 497 insertions(+), 309 deletions(-)

diff --git a/openmeetings-core/pom.xml b/openmeetings-core/pom.xml
index dfb1100..7b61a40 100644
--- a/openmeetings-core/pom.xml
+++ b/openmeetings-core/pom.xml
@@ -77,6 +77,11 @@
                        <version>${wicket.version}</version>
                </dependency>
                <dependency>
+                       <groupId>org.apache.wicket</groupId>
+                       <artifactId>wicket-ioc</artifactId>
+                       <version>${wicket.version}</version>
+               </dependency>
+               <dependency>
                        <groupId>org.apache.directory.api</groupId>
                        <artifactId>api-all</artifactId>
                        <version>${api-all.version}</version>
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
index 3de644f..04c9a08 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KRoom.java
@@ -27,10 +27,12 @@ import java.util.Date;
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import javax.inject.Inject;
+
 import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.core.util.WebSocketHelper;
-import org.apache.openmeetings.db.dao.record.RecordingChunkDao;
+import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.Client.Activity;
 import org.apache.openmeetings.db.entity.basic.Client.StreamDesc;
@@ -43,6 +45,7 @@ import org.apache.openmeetings.db.manager.IClientManager;
 import org.apache.openmeetings.db.util.FormatHelper;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
+import org.apache.wicket.injection.Injector;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -55,8 +58,15 @@ import com.github.openjson.JSONObject;
 public class KRoom {
        private static final Logger log = LoggerFactory.getLogger(KRoom.class);
 
-       private final StreamProcessor processor;
-       private final RecordingChunkDao chunkDao;
+       @Inject
+       private KurentoHandler kHandler;
+       @Inject
+       private StreamProcessor processor;
+       @Inject
+       private RecordingDao recDao;
+       @Inject
+       private IClientManager cm;
+
        private final Room room;
        private final AtomicBoolean recordingStarted = new AtomicBoolean(false);
        private final AtomicBoolean sharingStarted = new AtomicBoolean(false);
@@ -65,10 +75,9 @@ public class KRoom {
        private JSONObject recordingUser = new JSONObject();
        private JSONObject sharingUser = new JSONObject();
 
-       public KRoom(KurentoHandler handler, Room r) {
-               this.processor = handler.getStreamProcessor();
-               this.chunkDao = handler.getChunkDao();
+       public KRoom(Room r) {
                this.room = r;
+               Injector.get().inject(this);
                log.info("ROOM {} has been created", room.getId());
        }
 
@@ -80,13 +89,9 @@ public class KRoom {
                return recordingId;
        }
 
-       public RecordingChunkDao getChunkDao() {
-               return chunkDao;
-       }
-
-       public KStream join(final StreamDesc sd, KurentoHandler kHandler) {
+       public KStream join(final StreamDesc sd) {
                log.info("ROOM {}: join client {}, stream: {}", room.getId(), 
sd.getClient(), sd.getUid());
-               final KStream stream = new KStream(sd, this, kHandler);
+               final KStream stream = new KStream(sd, this);
                processor.addStream(stream);
                return stream;
        }
@@ -144,11 +149,11 @@ public class KRoom {
                        Optional<StreamDesc> osd = c.getScreenStream();
                        if (osd.isPresent()) {
                                osd.get().addActivity(Activity.RECORD);
-                               processor.getClientManager().update(c);
+                               cm.update(c);
                                rec.setWidth(osd.get().getWidth());
                                rec.setHeight(osd.get().getHeight());
                        }
-                       rec = processor.getRecordingDao().update(rec);
+                       rec = recDao.update(rec);
                        // Receive recordingId
                        recordingId = rec.getId();
                        
processor.getByRoom(room.getId()).forEach(KStream::startRecord);
@@ -163,9 +168,9 @@ public class KRoom {
                if (recordingStarted.compareAndSet(true, false)) {
                        log.debug("##REC:: recording in room {} is stopping {} 
::", room.getId(), recordingId);
                        
processor.getByRoom(room.getId()).forEach(KStream::stopRecord);
-                       Recording rec = 
processor.getRecordingDao().get(recordingId);
+                       Recording rec = recDao.get(recordingId);
                        rec.setRecordEnd(new Date());
-                       rec = processor.getRecordingDao().update(rec);
+                       rec = recDao.update(rec);
                        recordingUser = new JSONObject();
                        recordingId = null;
 
@@ -178,8 +183,8 @@ public class KRoom {
                                Optional<StreamDesc> osd = c.getScreenStream();
                                if (osd.isPresent()) {
                                        
osd.get().removeActivity(Activity.RECORD);
-                                       processor.getClientManager().update(c);
-                                       
processor.getHandler().sendShareUpdated(osd.get());
+                                       cm.update(c);
+                                       kHandler.sendShareUpdated(osd.get());
                                }
                        }
                        // Send notification to all users that the recording 
has been started
@@ -203,29 +208,28 @@ public class KRoom {
                return new JSONObject(sharingUser.toString());
        }
 
-       public void startSharing(StreamProcessor processor, IClientManager cm, 
Client c, Optional<StreamDesc> osd, JSONObject msg, Activity a) {
+       public void startSharing(Client c, Optional<StreamDesc> osd, JSONObject 
msg, Activity a) {
                StreamDesc sd;
-               KurentoHandler h = processor.getHandler();
                if (sharingStarted.compareAndSet(false, true)) {
                        sharingUser.put("sid", c.getSid());
                        sd = c.addStream(StreamType.SCREEN, a);
                        cm.update(c);
                        log.debug("Stream.UID {}: sharing has been started, 
activity: {}", sd.getUid(), a);
-                       h.sendClient(sd.getSid(), newKurentoMsg()
+                       kHandler.sendClient(sd.getSid(), newKurentoMsg()
                                        .put("id", "broadcast")
                                        .put("stream", sd.toJson()
                                                        .put("shareType", 
msg.getString("shareType"))
                                                        .put("fps", 
msg.getString("fps")))
-                                       .put(PARAM_ICE, h.getTurnServers(c)));
+                                       .put(PARAM_ICE, 
kHandler.getTurnServers(c)));
                } else if (osd.isPresent() && !osd.get().hasActivity(a)) {
                        sd = osd.get();
                        sd.addActivity(a);
                        cm.update(c);
-                       h.sendShareUpdated(sd);
+                       kHandler.sendShareUpdated(sd);
                        WebSocketHelper.sendRoom(new 
TextRoomMessage(c.getRoomId(), c, RoomMessage.Type.RIGHT_UPDATED, c.getUid()));
                        WebSocketHelper.sendRoomOthers(room.getId(), 
c.getUid(), newKurentoMsg()
                                        .put("id", "newStream")
-                                       .put(PARAM_ICE, 
processor.getHandler().getTurnServers(c))
+                                       .put(PARAM_ICE, 
kHandler.getTurnServers(c))
                                        .put("stream", sd.toJson()));
                }
        }
@@ -245,17 +249,16 @@ public class KRoom {
                if (count != sipCount) {
                        processor.getByRoom(room.getId()).forEach(stream -> 
stream.addSipProcessor(count));
                        if (sipCount == 0) {
-                               processor.getClientManager()
-                                       .streamByRoom(room.getId())
+                               cm.streamByRoom(room.getId())
                                        .filter(Client::isSip)
                                        .findAny()
                                        .ifPresent(c -> {
                                                StreamDesc sd = 
c.addStream(StreamType.WEBCAM, Activity.AUDIO);
                                                sd.setWidth(120).setHeight(90);
                                                c.restoreActivities(sd);
-                                               KStream stream = join(sd, 
processor.getHandler());
+                                               KStream stream = join(sd);
                                                stream.startBroadcast(sd, "", 
() -> {});
-                                               
processor.getClientManager().update(c);
+                                               cm.update(c);
                                        });
                        }
                        sipCount = count;
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
index 56f2a58..f461c6d 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KStream.java
@@ -43,9 +43,13 @@ import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 
+import javax.inject.Inject;
+
 import org.apache.openmeetings.core.sip.ISipCallbacks;
+import org.apache.openmeetings.core.sip.SipManager;
 import org.apache.openmeetings.core.sip.SipStackProcessor;
 import org.apache.openmeetings.core.util.WebSocketHelper;
+import org.apache.openmeetings.db.dao.record.RecordingChunkDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.Client.Activity;
 import org.apache.openmeetings.db.entity.basic.Client.StreamDesc;
@@ -54,6 +58,7 @@ import 
org.apache.openmeetings.db.entity.record.RecordingChunk.Type;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.db.util.ws.TextRoomMessage;
 import org.apache.openmeetings.util.OmFileHelper;
+import org.apache.wicket.injection.Injector;
 import org.kurento.client.BaseRtpEndpoint;
 import org.kurento.client.Continuation;
 import org.kurento.client.IceCandidate;
@@ -75,7 +80,15 @@ import com.github.openjson.JSONObject;
 public class KStream extends AbstractStream implements ISipCallbacks {
        private static final Logger log = 
LoggerFactory.getLogger(KStream.class);
 
-       private final KurentoHandler kHandler;
+       @Inject
+       private KurentoHandler kHandler;
+       @Inject
+       private StreamProcessor processor;
+       @Inject
+       private RecordingChunkDao chunkDao;
+       @Inject
+       private SipManager sipManager;
+
        private final KRoom kRoom;
        private final Date connectedSince;
        private final StreamType streamType;
@@ -96,12 +109,12 @@ public class KStream extends AbstractStream implements 
ISipCallbacks {
        private boolean hasScreen;
        private boolean sipClient;
 
-       public KStream(final StreamDesc sd, KRoom kRoom, KurentoHandler 
kHandler) {
+       public KStream(final StreamDesc sd, KRoom kRoom) {
                super(sd.getSid(), sd.getUid());
                this.kRoom = kRoom;
                streamType = sd.getType();
                this.connectedSince = new Date();
-               this.kHandler = kHandler;
+               Injector.get().inject(this);
                //TODO Min/MaxVideoSendBandwidth
                //TODO Min/Max Audio/Video RecvBandwidth
        }
@@ -189,7 +202,7 @@ public class KStream extends AbstractStream implements 
ISipCallbacks {
                                flowoutFuture = Optional.of(new 
CompletableFuture<>().completeAsync(() -> {
                                        log.warn("KStream will be dropped {}, 
sid {}, uid {}", sd, sid, uid);
                                        if (StreamType.SCREEN == streamType) {
-                                               
kHandler.getStreamProcessor().doStopSharing(sid, uid);
+                                               processor.doStopSharing(sid, 
uid);
                                        }
                                        stopBroadcast();
                                        return null;
@@ -275,7 +288,7 @@ public class KStream extends AbstractStream implements 
ISipCallbacks {
                listeners.put(uid, listener);
 
                log.debug("PARTICIPANT {}: obtained endpoint for {}", uid, 
this.uid);
-               Client cur = kHandler.getStreamProcessor().getBySid(this.sid);
+               Client cur = processor.getBySid(this.sid);
                if (cur == null) {
                        log.warn("Client for endpoint dooesn't exists");
                } else {
@@ -338,9 +351,9 @@ public class KStream extends AbstractStream implements 
ISipCallbacks {
                recorder = createRecorderEndpoint(pipeline, 
getRecUri(getRecordingChunk(getRoomId(), chunkUid)), profile);
                setTags(recorder, uid);
 
-               recorder.addRecordingListener(evt -> chunkId = 
kRoom.getChunkDao().start(kRoom.getRecordingId(), type, chunkUid, sid));
+               recorder.addRecordingListener(evt -> chunkId = 
chunkDao.start(kRoom.getRecordingId(), type, chunkUid, sid));
                recorder.addStoppedListener(evt -> {
-                       kRoom.getChunkDao().stop(chunkId);
+                       chunkDao.stop(chunkId);
                        chunkId = null;
                });
                switch (profile) {
@@ -459,7 +472,7 @@ public class KStream extends AbstractStream implements 
ISipCallbacks {
 
        private void doRemove(boolean remove) {
                if (remove) {
-                       kHandler.getStreamProcessor().release(this, false);
+                       processor.release(this, false);
                }
        }
 
@@ -606,7 +619,7 @@ public class KStream extends AbstractStream implements 
ISipCallbacks {
                if (count > 0) {
                        if (sipProcessor.isEmpty()) {
                                try {
-                                       sipProcessor = 
kHandler.getSipManager().createSipStackProcessor(
+                                       sipProcessor = 
sipManager.createSipStackProcessor(
                                                        randomUUID().toString()
                                                        , kRoom.getRoom()
                                                        , this);
@@ -644,7 +657,7 @@ public class KStream extends AbstractStream implements 
ISipCallbacks {
                answerConsumer.accept(answer);
                log.debug(answer);
                if (sipClient) {
-                       StreamDesc sd = 
kHandler.getStreamProcessor().getBySid(sid).getStream(uid);
+                       StreamDesc sd = processor.getBySid(sid).getStream(uid);
                        try {
                                outgoingMedia = rtpEndpoint;
                                internalStartBroadcast(sd, sdp);
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KTestStream.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KTestStream.java
index 741c1f6..57111ed 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KTestStream.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KTestStream.java
@@ -36,9 +36,12 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
+import javax.inject.Inject;
+
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.entity.basic.IWsClient;
 import org.apache.openmeetings.util.OmFileHelper;
+import org.apache.wicket.injection.Injector;
 import org.kurento.client.Continuation;
 import org.kurento.client.IceCandidate;
 import org.kurento.client.MediaPipeline;
@@ -55,7 +58,12 @@ import com.github.openjson.JSONObject;
 public class KTestStream extends AbstractStream {
        private static final Logger log = 
LoggerFactory.getLogger(KTestStream.class);
        private static final Map<String, String> TAGS = Map.of(TAG_MODE, 
MODE_TEST, TAG_ROOM, MODE_TEST);
-       private final KurentoHandler kHandler;
+
+       @Inject
+       private KurentoHandler kHandler;
+       @Inject
+       private TestStreamProcessor processor;
+
        private MediaPipeline pipeline;
        private WebRtcEndpoint webRtcEndpoint;
        private PlayerEndpoint player;
@@ -65,9 +73,9 @@ public class KTestStream extends AbstractStream {
        private ScheduledFuture<?> recHandle;
        private int recTime;
 
-       public KTestStream(IWsClient c, JSONObject msg, KurentoHandler 
kHandler) {
+       public KTestStream(IWsClient c, JSONObject msg) {
                super(null, c.getUid());
-               this.kHandler = kHandler;
+               Injector.get().inject(this);
                createPipeline(() -> startTestRecording(c, msg));
        }
 
@@ -251,7 +259,7 @@ public class KTestStream extends AbstractStream {
                releasePlayer();
                releaseRecorder();
                if (remove) {
-                       kHandler.getTestProcessor().release(this, true);
+                       processor.release(this, true);
                }
        }
 }
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
index 1e8ebb4..a301dce 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/KurentoHandler.java
@@ -41,9 +41,7 @@ import javax.annotation.PreDestroy;
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 
-import org.apache.openmeetings.core.sip.SipManager;
 import org.apache.openmeetings.core.util.WebSocketHelper;
-import org.apache.openmeetings.db.dao.record.RecordingChunkDao;
 import org.apache.openmeetings.db.dao.room.RoomDao;
 import org.apache.openmeetings.db.entity.basic.Client;
 import org.apache.openmeetings.db.entity.basic.Client.Activity;
@@ -125,13 +123,9 @@ public class KurentoHandler {
        @Autowired
        private RoomDao roomDao;
        @Autowired
-       private RecordingChunkDao chunkDao;
-       @Autowired
        private TestStreamProcessor testProcessor;
        @Autowired
        private StreamProcessor streamProcessor;
-       @Autowired
-       private SipManager sipManager;
 
        boolean isConnected() {
                boolean connctd = connected.get() && client != null && 
!client.isClosed();
@@ -309,7 +303,7 @@ public class KurentoHandler {
                return rooms.computeIfAbsent(roomId, k -> {
                        log.debug("Room {} does not exist. Will create now!", 
roomId);
                        Room r = roomDao.get(roomId);
-                       return new KRoom(this, r);
+                       return new KRoom(r);
                });
        }
 
@@ -397,22 +391,6 @@ public class KurentoHandler {
                return kuid;
        }
 
-       public TestStreamProcessor getTestProcessor() {
-               return testProcessor;
-       }
-
-       StreamProcessor getStreamProcessor() {
-               return streamProcessor;
-       }
-
-       SipManager getSipManager() {
-               return sipManager;
-       }
-
-       RecordingChunkDao getChunkDao() {
-               return chunkDao;
-       }
-
        static int getFlowoutTimeout() {
                return flowoutTimeout;
        }
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
index 3771c0c..d99edb9 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessor.java
@@ -322,7 +322,7 @@ public class StreamProcessor implements IStreamProcessor {
 
        private void startSharing(Client c, Optional<StreamDesc> osd, 
JSONObject msg, Activity a) {
                if (kHandler.isConnected() && c.getRoomId() != null) {
-                       kHandler.getRoom(c.getRoomId()).startSharing(this, cm, 
c, osd, msg, a);
+                       kHandler.getRoom(c.getRoomId()).startSharing(c, osd, 
msg, a);
                }
        }
 
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessorActions.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessorActions.java
index 8608485..b80a290 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessorActions.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/StreamProcessorActions.java
@@ -107,7 +107,7 @@ public class StreamProcessorActions {
                try {
                        if (sender == null) {
                                KRoom room = kHandler.getRoom(c.getRoomId());
-                               sender = room.join(sd, kHandler);
+                               sender = room.join(sd);
                        }
                        if (msg.has("width")) {
                                
sd.setWidth(msg.getInt("width")).setHeight(msg.getInt("height"));
diff --git 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/TestStreamProcessor.java
 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/TestStreamProcessor.java
index 499d772..3bd7bde 100644
--- 
a/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/TestStreamProcessor.java
+++ 
b/openmeetings-core/src/main/java/org/apache/openmeetings/core/remote/TestStreamProcessor.java
@@ -56,7 +56,7 @@ class TestStreamProcessor implements IStreamProcessor {
                                if (user != null) {
                                        user.release();
                                }
-                               user = new KTestStream(c, msg, kHandler);
+                               user = new KTestStream(c, msg);
                                streamByUid.put(c.getUid(), user);
                                break;
                        case "iceCandidate":
diff --git 
a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
 
b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
index 4d94aa0..86f0211 100644
--- 
a/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
+++ 
b/openmeetings-core/src/test/java/org/apache/openmeetings/core/remote/BaseMockedTest.java
@@ -22,11 +22,18 @@ package org.apache.openmeetings.core.remote;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.mockStatic;
+import static org.mockito.Mockito.withSettings;
+import static org.mockito.internal.util.collections.Sets.newMockSafeHashSet;
 
+import java.lang.reflect.Field;
 import java.util.Locale;
+import java.util.Set;
+
+import javax.inject.Inject;
 
 import org.apache.openmeetings.IApplication;
 import org.apache.openmeetings.core.util.WebSocketHelper;
@@ -34,6 +41,7 @@ import org.apache.openmeetings.db.dao.label.LabelDao;
 import org.apache.openmeetings.db.entity.basic.IWsClient;
 import org.apache.openmeetings.db.entity.label.OmLanguage;
 import org.apache.openmeetings.db.util.ApplicationHelper;
+import org.apache.wicket.injection.Injector;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.kurento.client.KurentoClient;
@@ -49,14 +57,18 @@ import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.MockedStatic;
 import org.mockito.Spy;
+import org.mockito.internal.configuration.injection.scanner.MockScanner;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.junit.jupiter.MockitoExtension;
 import org.mockito.stubbing.Answer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.github.openjson.JSONObject;
 
 @ExtendWith(MockitoExtension.class)
 public class BaseMockedTest {
+       private static final Logger log = 
LoggerFactory.getLogger(BaseMockedTest.class);
        @Mock
        protected RomManager romManager;
        @Mock
@@ -90,8 +102,12 @@ public class BaseMockedTest {
                                MockedStatic<WebSocketHelper> wsHelperMock = 
mockStatic(WebSocketHelper.class);
                                MockedStatic<LabelDao> labelMock = 
mockStatic(LabelDao.class);
                                MockedStatic<ApplicationHelper> appHelpMock = 
mockStatic(ApplicationHelper.class);
+                               MockedStatic<Injector> injectMock = 
mockStatic(Injector.class)
                                )
                {
+                       Set<Object> mocks = newMockSafeHashSet();
+                       new MockScanner(this, 
BaseMockedTest.class).addPreparedMocks(mocks);
+                       new MockScanner(this, 
this.getClass()).addPreparedMocks(mocks);
                        wsHelperMock.when(() -> 
WebSocketHelper.sendClient(any(IWsClient.class), 
any(JSONObject.class))).thenAnswer(new Answer<Void>() {
                                @Override
                                public Void answer(InvocationOnMock invocation) 
throws Throwable {
@@ -104,7 +120,41 @@ public class BaseMockedTest {
 
                        labelMock.when(() -> 
LabelDao.getLanguage(any(Long.class))).thenReturn(new OmLanguage(1L, 
Locale.ENGLISH));
                        appHelpMock.when(() -> 
ApplicationHelper.ensureApplication(any(Long.class))).thenReturn(mock(IApplication.class));
+                       Injector injector = mock(Injector.class, 
withSettings().lenient());
+                       doAnswer(new Answer<Void>() {
+                               @Override
+                               public Void answer(InvocationOnMock invocation) 
throws Throwable {
+                                       Object o = invocation.getArgument(0);
+                                       if (forInjection(o)) {
+                                               inject(o, mocks);
+                                       }
+                                       return null;
+                               }
+                       }).when(injector).inject(any());
+                       injectMock.when(() -> 
Injector.get()).thenReturn(injector);
                        task.run();
                }
        }
+
+       private boolean forInjection(Object o) {
+               return o instanceof KRoom || o instanceof KStream || o 
instanceof KTestStream;
+       }
+
+       private void inject(Object o, Set<Object> mocks) {
+               for (Field f : o.getClass().getDeclaredFields()) {
+                       if (f.isAnnotationPresent(Inject.class)) {
+                               mocks.stream()
+                                               .filter(mock -> 
f.getType().isAssignableFrom(mock.getClass()))
+                                               .findAny()
+                                               .ifPresent(mock -> {
+                                                       try {
+                                                               
f.setAccessible(true);
+                                                               f.set(o, mock);
+                                                       } catch (Exception e) {
+                                                               log.error("Fail 
to set mock {} {}", f, mock);
+                                                       }
+                                               });
+                       }
+               }
+       }
 }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java
index 639433a..e3d9def 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dao/file/BaseFileItemDao.java
@@ -62,6 +62,10 @@ public class BaseFileItemDao implements 
IDataProviderDao<BaseFileItem> {
 
        @Override
        public BaseFileItem get(Long id) {
+               return getBase(id);
+       }
+
+       public BaseFileItem getBase(Long id) {
                if (id == null || id.longValue() <= 0) {
                        return null;
                }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
index 0b70ca4..2a904e0 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/AppointmentDTO.java
@@ -29,17 +29,11 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
-import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
-import org.apache.openmeetings.db.dao.file.BaseFileItemDao;
-import org.apache.openmeetings.db.dao.room.RoomDao;
-import org.apache.openmeetings.db.dao.user.GroupDao;
-import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.room.RoomDTO;
 import org.apache.openmeetings.db.dto.user.UserDTO;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.calendar.Appointment.Reminder;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
-import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.util.TimezoneUtil;
 
 import com.github.openjson.JSONObject;
@@ -100,49 +94,6 @@ public class AppointmentDTO implements Serializable {
                reminderEmailSend = a.isReminderEmailSend();
        }
 
-       public Appointment get(UserDao userDao, GroupDao groupDao, RoomDao 
roomDao, BaseFileItemDao fileDao, AppointmentDao appointmentDao, User u) {
-               Appointment a = id == null ? new Appointment() : 
appointmentDao.get(id);
-               a.setId(id);
-               a.setTitle(title);
-               a.setLocation(location);
-               a.setStart(start.getTime());
-               a.setEnd(end.getTime());
-               a.setDescription(description);
-               a.setOwner(owner == null ? u : userDao.get(owner.getId()));
-               a.setInserted(inserted);
-               a.setUpdated(updated);
-               a.setDeleted(deleted);
-               a.setReminder(reminder);
-               a.setRoom(room.get(roomDao, groupDao, fileDao));
-               a.setIcalId(icalId);
-               List<MeetingMember> mml = new ArrayList<>();
-               for(MeetingMemberDTO mm : meetingMembers) {
-                       MeetingMember m = null;
-                       if (mm.getId() != null) {
-                               //if ID is NOT null it should already be in the 
list
-                               for (MeetingMember m1 : a.getMeetingMembers()) {
-                                       if (m1.getId().equals(mm.getId())) {
-                                               m = m1;
-                                               break;
-                                       }
-                               }
-                               if (m == null) {
-                                       throw new RuntimeException("Weird guest 
from different appointment is passed");
-                               }
-                       } else {
-                               m = mm.get(userDao, groupDao, u);
-                               m.setAppointment(a);
-                       }
-                       mml.add(m);
-               }
-               a.setMeetingMembers(mml);
-               a.setLanguageId(languageId);
-               a.setPasswordProtected(passwordProtected);
-               a.setConnectedEvent(connectedEvent);
-               a.setReminderEmailSend(reminderEmailSend);
-               return a;
-       }
-
        public Long getId() {
                return id;
        }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
index afaa51c..4fa265d 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/calendar/MeetingMemberDTO.java
@@ -26,12 +26,8 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
-import org.apache.openmeetings.db.dao.user.GroupDao;
-import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.dto.user.UserDTO;
 import org.apache.openmeetings.db.entity.calendar.MeetingMember;
-import org.apache.openmeetings.db.entity.user.User;
-import org.apache.wicket.util.string.Strings;
 
 import com.github.openjson.JSONObject;
 
@@ -51,38 +47,6 @@ public class MeetingMemberDTO implements Serializable {
                this.user = new UserDTO(mm.getUser());
        }
 
-       public MeetingMember get(UserDao userDao, GroupDao groupDao, User 
owner) {
-               MeetingMember mm = new MeetingMember();
-               mm.setId(id);
-               if (user.getId() != null) {
-                       mm.setUser(userDao.get(user.getId()));
-               } else {
-                       User u = null;
-                       if (User.Type.EXTERNAL == user.getType()) {
-                               // try to get ext. user
-                               u = 
userDao.getExternalUser(user.getExternalId(), user.getExternalType());
-                       }
-                       if (u == null && user.getAddress() != null) {
-                               u = 
userDao.getContact(user.getAddress().getEmail()
-                                               , user.getFirstname()
-                                               , user.getLastname()
-                                               , user.getLanguageId()
-                                               , user.getTimeZoneId()
-                                               , owner);
-                       }
-                       if (u == null) {
-                               user.setType(User.Type.CONTACT);
-                               u = user.get(userDao, groupDao);
-                               u.getRights().clear();
-                       }
-                       if (Strings.isEmpty(u.getTimeZoneId())) {
-                               u.setTimeZoneId(owner.getTimeZoneId());
-                       }
-                       mm.setUser(u);
-               }
-               return mm;
-       }
-
        public Long getId() {
                return id;
        }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/InvitationDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/InvitationDTO.java
index 245f020..d974150 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/InvitationDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/InvitationDTO.java
@@ -18,25 +18,13 @@
  */
 package org.apache.openmeetings.db.dto.room;
 
-import static java.util.UUID.randomUUID;
-
 import java.io.Serializable;
-import java.text.ParseException;
-import java.util.Date;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
-import org.apache.commons.lang3.time.FastDateFormat;
-import org.apache.openmeetings.db.dao.room.RoomDao;
-import org.apache.openmeetings.db.dao.user.UserDao;
-import org.apache.openmeetings.db.entity.room.Invitation;
 import org.apache.openmeetings.db.entity.room.Invitation.Valid;
-import org.apache.openmeetings.db.entity.user.User.Type;
-import org.apache.openmeetings.util.crypt.CryptProvider;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import com.github.openjson.JSONObject;
 
@@ -44,8 +32,6 @@ import com.github.openjson.JSONObject;
 @XmlAccessorType(XmlAccessType.FIELD)
 public class InvitationDTO implements Serializable {
        private static final long serialVersionUID = 1L;
-       private static final Logger log = 
LoggerFactory.getLogger(InvitationDTO.class);
-       private static final FastDateFormat SDF = 
FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");
 
        private String email;
        private String firstname;
@@ -197,47 +183,6 @@ public class InvitationDTO implements Serializable {
                this.languageId = languageId;
        }
 
-       public Invitation get(Long userId, UserDao userDao, RoomDao roomDao) {
-               Invitation i = new Invitation();
-               i.setHash(randomUUID().toString());
-               i.setPasswordProtected(passwordProtected);
-               if (passwordProtected) {
-                       i.setPassword(CryptProvider.get().hash(password));
-               }
-
-               i.setUsed(false);
-               i.setValid(valid);
-
-               try {
-                       // valid period of Invitation
-                       switch (valid) {
-                               case PERIOD:
-                                       i.setValidFrom(new 
Date(SDF.parse(validFrom).getTime() - (5 * 60 * 1000)));
-                                       i.setValidTo(SDF.parse(validTo));
-                                       break;
-                               case ENDLESS:
-                               case ONE_TIME:
-                               default:
-                                       break;
-                       }
-               } catch (ParseException e) {
-                       log.error("Unexpected error while creating invitation", 
e);
-                       throw new RuntimeException(e);
-               }
-
-               i.setDeleted(false);
-
-               i.setInvitedBy(userDao.get(userId));
-               i.setInvitee(userDao.getContact(email, firstname, lastname, 
userId));
-               if (Type.CONTACT == i.getInvitee().getType()) {
-                       i.getInvitee().setLanguageId(languageId);
-               }
-               i.setRoom(roomDao.get(roomId));
-               i.setInserted(new Date());
-               i.setAppointment(null);
-               return i;
-       }
-
        public static InvitationDTO fromString(String s) {
                return get(new JSONObject(s));
        }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
index 9291f7b..f774f1b 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomDTO.java
@@ -33,12 +33,8 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
-import org.apache.openmeetings.db.dao.file.BaseFileItemDao;
-import org.apache.openmeetings.db.dao.room.RoomDao;
-import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
-import org.apache.wicket.util.string.Strings;
 
 import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
@@ -101,38 +97,6 @@ public class RoomDTO implements Serializable {
                files = RoomFileDTO.get(r.getFiles());
        }
 
-       public Room get(RoomDao roomDao, GroupDao groupDao, BaseFileItemDao 
fileDao) {
-               Room r = id == null ? new Room() : roomDao.get(id);
-               r.setId(id);
-               r.setName(name);
-               r.setTag(tag);
-               r.setComment(comment);
-               r.setType(type);
-               r.setCapacity(capacity);
-               r.setAppointment(appointment);
-               r.setConfno(confno);
-               r.setIspublic(isPublic);
-               r.setDemoRoom(demo);
-               r.setClosed(closed);
-               r.setDemoTime(demoTime);
-               r.setExternalId(externalId);
-               if (!Strings.isEmpty(externalType)
-                               && r.getGroups().stream().filter(gu -> 
gu.getGroup().isExternal() && 
gu.getGroup().getName().equals(externalType)).count() == 0)
-               {
-                       r.addGroup(groupDao.getExternal(externalType));
-               }
-               r.setRedirectURL(redirectUrl);
-               r.setModerated(moderated);
-               r.setWaitModerator(waitModerator);
-               r.setAllowUserQuestions(allowUserQuestions);
-               r.setAllowRecording(allowRecording);
-               r.setWaitRecording(waitRecording);
-               r.setAudioOnly(audioOnly);
-               r.setHiddenElements(hiddenElements);
-               r.setFiles(RoomFileDTO.get(id, files, fileDao));
-               return r;
-       }
-
        public Long getId() {
                return id;
        }
@@ -221,6 +185,14 @@ public class RoomDTO implements Serializable {
                this.moderated = moderated;
        }
 
+       public boolean isWaitModerator() {
+               return waitModerator;
+       }
+
+       public void setWaitModerator(boolean waitModerator) {
+               this.waitModerator = waitModerator;
+       }
+
        public boolean isAllowUserQuestions() {
                return allowUserQuestions;
        }
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java
index c6d7de2..053f7f9 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/RoomFileDTO.java
@@ -28,7 +28,6 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlRootElement;
 
-import org.apache.openmeetings.db.dao.file.BaseFileItemDao;
 import org.apache.openmeetings.db.entity.room.RoomFile;
 
 import com.github.openjson.JSONObject;
@@ -51,15 +50,6 @@ public class RoomFileDTO implements Serializable {
                wbIdx = rf.getWbIdx();
        }
 
-       public RoomFile get(BaseFileItemDao fileDao, Long roomId) {
-               RoomFile f = new RoomFile();
-               f.setId(id);
-               f.setRoomId(roomId);
-               f.setFile(fileDao.get(fileId));
-               f.setWbIdx(wbIdx);
-               return f;
-       }
-
        public Long getId() {
                return id;
        }
@@ -94,20 +84,6 @@ public class RoomFileDTO implements Serializable {
                return r;
        }
 
-       public static List<RoomFile> get(Long roomId, List<RoomFileDTO> rfl, 
BaseFileItemDao fileDao) {
-               List<RoomFile> r = new ArrayList<>();
-               if (rfl != null) {
-                       for (RoomFileDTO rf : rfl) {
-                               RoomFile f = rf.get(fileDao, roomId);
-                               if (f.getFile() == null) {
-                                       continue;
-                               }
-                               r.add(f);
-                       }
-               }
-               return r;
-       }
-
        public static RoomFileDTO get(JSONObject o) {
                if (o == null) {
                        return null;
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/GroupDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/GroupDTO.java
index fbafe14..828d800 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/GroupDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/GroupDTO.java
@@ -24,7 +24,6 @@ import java.util.List;
 
 import javax.xml.bind.annotation.XmlRootElement;
 
-import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.entity.user.Group;
 
 @XmlRootElement
@@ -44,13 +43,6 @@ public class GroupDTO implements Serializable {
                tag = g.getTag();
        }
 
-       public Group get(GroupDao groupDao) {
-               Group g = id == null ? new Group() : groupDao.get(id);
-               g.setName(name);
-               g.setTag(tag);
-               return g;
-       }
-
        public static List<GroupDTO> list(List<Group> l) {
                List<GroupDTO> gList = new ArrayList<>();
                if (l != null) {
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
index 3842a62..b4848be 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/user/UserDTO.java
@@ -30,13 +30,10 @@ import java.util.Set;
 
 import javax.xml.bind.annotation.XmlRootElement;
 
-import org.apache.openmeetings.db.dao.user.GroupDao;
-import org.apache.openmeetings.db.dao.user.UserDao;
 import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
 import org.apache.openmeetings.db.entity.user.User.Type;
-import org.apache.wicket.util.string.Strings;
 
 import com.github.openjson.JSONObject;
 
@@ -76,27 +73,6 @@ public class UserDTO implements Serializable {
                pictureUri = u.getPictureUri();
        }
 
-       public User get(UserDao userDao, GroupDao groupDao) {
-               User u = id == null ? new User() : userDao.get(id);
-               u.setLogin(login);
-               u.setFirstname(firstname);
-               u.setLastname(lastname);
-               u.setRights(rights);
-               u.setLanguageId(languageId);
-               u.setAddress(address);
-               u.setTimeZoneId(timeZoneId);
-               if (Type.EXTERNAL == type || (!Strings.isEmpty(externalId) && 
!Strings.isEmpty(externalType))) {
-                       type = Type.EXTERNAL;
-                       if (u.getGroupUsers().stream().filter(gu -> 
gu.getGroup().isExternal() && 
gu.getGroup().getName().equals(externalType)).count() == 0) {
-                               u.addGroup(groupDao.getExternal(externalType));
-                       }
-                       u.setExternalId(externalId);
-               }
-               u.setType(type == null ? Type.USER : type);
-               u.setPictureUri(pictureUri);
-               return u;
-       }
-
        public static List<UserDTO> list(List<User> l) {
                List<UserDTO> uList = new ArrayList<>();
                if (l != null) {
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/CalendarMapper.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/CalendarMapper.java
new file mode 100644
index 0000000..6fd6d68
--- /dev/null
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/CalendarMapper.java
@@ -0,0 +1,122 @@
+/*
+ * 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.mapper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
+import org.apache.openmeetings.db.dto.calendar.MeetingMemberDTO;
+import org.apache.openmeetings.db.dto.user.UserDTO;
+import org.apache.openmeetings.db.entity.calendar.Appointment;
+import org.apache.openmeetings.db.entity.calendar.MeetingMember;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.wicket.util.string.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class CalendarMapper {
+       @Autowired
+       private UserDao userDao;
+       @Autowired
+       private AppointmentDao appointmentDao;
+       @Autowired
+       private UserMapper uMapper;
+       @Autowired
+       private RoomMapper rMapper;
+
+       public Appointment get(AppointmentDTO dto, User u) {
+               Appointment a = dto.getId() == null ? new Appointment() : 
appointmentDao.get(dto.getId());
+               a.setId(dto.getId());
+               a.setTitle(dto.getTitle());
+               a.setLocation(dto.getLocation());
+               a.setStart(dto.getStart().getTime());
+               a.setEnd(dto.getEnd().getTime());
+               a.setDescription(dto.getDescription());
+               a.setOwner(dto.getOwner() == null ? u : 
userDao.get(dto.getOwner().getId()));
+               a.setInserted(dto.getInserted());
+               a.setUpdated(dto.getUpdated());
+               a.setDeleted(dto.isDeleted());
+               a.setReminder(dto.getReminder());
+               a.setRoom(rMapper.get(dto.getRoom()));
+               a.setIcalId(dto.getIcalId());
+               List<MeetingMember> mml = new ArrayList<>();
+               for(MeetingMemberDTO mm : dto.getMeetingMembers()) {
+                       MeetingMember m = null;
+                       if (mm.getId() != null) {
+                               //if ID is NOT null it should already be in the 
list
+                               for (MeetingMember m1 : a.getMeetingMembers()) {
+                                       if (m1.getId().equals(mm.getId())) {
+                                               m = m1;
+                                               break;
+                                       }
+                               }
+                               if (m == null) {
+                                       throw new RuntimeException("Weird guest 
from different appointment is passed");
+                               }
+                       } else {
+                               m = get(mm, u);
+                               m.setAppointment(a);
+                       }
+                       mml.add(m);
+               }
+               a.setMeetingMembers(mml);
+               a.setLanguageId(dto.getLanguageId());
+               a.setPasswordProtected(dto.isPasswordProtected());
+               a.setConnectedEvent(dto.isConnectedEvent());
+               a.setReminderEmailSend(dto.isReminderEmailSend());
+               return a;
+       }
+
+       public MeetingMember get(MeetingMemberDTO dto, User owner) {
+               MeetingMember mm = new MeetingMember();
+               mm.setId(dto.getId());
+               if (dto.getUser().getId() != null) {
+                       mm.setUser(userDao.get(dto.getUser().getId()));
+               } else {
+                       User u = null;
+                       UserDTO user = dto.getUser();
+                       if (User.Type.EXTERNAL == user.getType()) {
+                               // try to get ext. user
+                               u = 
userDao.getExternalUser(user.getExternalId(), user.getExternalType());
+                       }
+                       if (u == null && user.getAddress() != null) {
+                               u = 
userDao.getContact(user.getAddress().getEmail()
+                                               , user.getFirstname()
+                                               , user.getLastname()
+                                               , user.getLanguageId()
+                                               , user.getTimeZoneId()
+                                               , owner);
+                       }
+                       if (u == null) {
+                               user.setType(User.Type.CONTACT);
+                               u = uMapper.get(user);
+                               u.getRights().clear();
+                       }
+                       if (Strings.isEmpty(u.getTimeZoneId())) {
+                               u.setTimeZoneId(owner.getTimeZoneId());
+                       }
+                       mm.setUser(u);
+               }
+               return mm;
+       }
+}
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/RoomMapper.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/RoomMapper.java
new file mode 100644
index 0000000..250b21d
--- /dev/null
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/RoomMapper.java
@@ -0,0 +1,157 @@
+/*
+ * 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.mapper;
+
+import static java.util.UUID.randomUUID;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang3.time.FastDateFormat;
+import org.apache.openmeetings.db.dao.file.FileItemDao;
+import org.apache.openmeetings.db.dao.room.RoomDao;
+import org.apache.openmeetings.db.dao.user.GroupDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.dto.room.InvitationDTO;
+import org.apache.openmeetings.db.dto.room.RoomDTO;
+import org.apache.openmeetings.db.dto.room.RoomFileDTO;
+import org.apache.openmeetings.db.entity.room.Invitation;
+import org.apache.openmeetings.db.entity.room.Room;
+import org.apache.openmeetings.db.entity.room.RoomFile;
+import org.apache.openmeetings.db.entity.user.User.Type;
+import org.apache.openmeetings.util.crypt.CryptProvider;
+import org.apache.wicket.util.string.Strings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class RoomMapper {
+       private static final Logger log = 
LoggerFactory.getLogger(RoomMapper.class);
+       private static final FastDateFormat SDF = 
FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss");
+       @Autowired
+       private RoomDao roomDao;
+       @Autowired
+       private UserDao userDao;
+       @Autowired
+       private GroupDao groupDao;
+       @Autowired
+       private FileItemDao fileDao;
+
+       public Room get(RoomDTO dto) {
+               Room r = dto.getId() == null ? new Room() : 
roomDao.get(dto.getId());
+               r.setId(dto.getId());
+               r.setName(dto.getName());
+               r.setTag(dto.getTag());
+               r.setComment(dto.getComment());
+               r.setType(dto.getType());
+               r.setCapacity(dto.getCapacity());
+               r.setAppointment(dto.isAppointment());
+               r.setConfno(dto.getConfno());
+               r.setIspublic(dto.isPublic());
+               r.setDemoRoom(dto.isDemo());
+               r.setClosed(dto.isClosed());
+               r.setDemoTime(dto.getDemoTime());
+               r.setExternalId(dto.getExternalId());
+               String externalType = dto.getExternalType();
+               if (!Strings.isEmpty(externalType)
+                               && r.getGroups().stream().filter(gu -> 
gu.getGroup().isExternal() && 
gu.getGroup().getName().equals(externalType)).count() == 0)
+               {
+                       r.addGroup(groupDao.getExternal(externalType));
+               }
+               r.setRedirectURL(dto.getRedirectUrl());
+               r.setModerated(dto.isModerated());
+               r.setWaitModerator(dto.isWaitModerator());
+               r.setAllowUserQuestions(dto.isAllowUserQuestions());
+               r.setAllowRecording(dto.isAllowRecording());
+               r.setWaitRecording(dto.isWaitRecording());
+               r.setAudioOnly(dto.isAudioOnly());
+               r.setHiddenElements(dto.getHiddenElements());
+               r.setFiles(get(dto.getId(), dto.getFiles()));
+               return r;
+       }
+
+       public RoomFile get(RoomFileDTO dto, Long roomId) {
+               RoomFile f = new RoomFile();
+               f.setId(dto.getId());
+               f.setRoomId(roomId);
+               f.setFile(fileDao.getBase(dto.getFileId()));
+               f.setWbIdx(dto.getWbIdx());
+               return f;
+       }
+
+       public List<RoomFile> get(Long roomId, List<RoomFileDTO> rfl) {
+               List<RoomFile> r = new ArrayList<>();
+               if (rfl != null) {
+                       for (RoomFileDTO rf : rfl) {
+                               RoomFile f = get(rf, roomId);
+                               if (f.getFile() == null) {
+                                       continue;
+                               }
+                               r.add(f);
+                       }
+               }
+               return r;
+       }
+
+
+       public Invitation get(InvitationDTO dto, Long userId) {
+               Invitation i = new Invitation();
+               i.setHash(randomUUID().toString());
+               i.setPasswordProtected(dto.isPasswordProtected());
+               if (dto.isPasswordProtected()) {
+                       
i.setPassword(CryptProvider.get().hash(dto.getPassword()));
+               }
+
+               i.setUsed(false);
+               i.setValid(dto.getValid());
+
+               try {
+                       // valid period of Invitation
+                       switch (dto.getValid()) {
+                               case PERIOD:
+                                       i.setValidFrom(new 
Date(SDF.parse(dto.getValidFrom()).getTime() - (5 * 60 * 1000)));
+                                       
i.setValidTo(SDF.parse(dto.getValidTo()));
+                                       break;
+                               case ENDLESS:
+                               case ONE_TIME:
+                               default:
+                                       break;
+                       }
+               } catch (ParseException e) {
+                       log.error("Unexpected error while creating invitation", 
e);
+                       throw new RuntimeException(e);
+               }
+
+               i.setDeleted(false);
+
+               i.setInvitedBy(userDao.get(userId));
+               i.setInvitee(userDao.getContact(dto.getEmail(), 
dto.getFirstname(), dto.getLastname(), userId));
+               if (Type.CONTACT == i.getInvitee().getType()) {
+                       i.getInvitee().setLanguageId(dto.getLanguageId());
+               }
+               i.setRoom(roomDao.get(dto.getRoomId()));
+               i.setInserted(new Date());
+               i.setAppointment(null);
+               return i;
+       }
+}
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/UserMapper.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/UserMapper.java
new file mode 100644
index 0000000..cd5fc13
--- /dev/null
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/mapper/UserMapper.java
@@ -0,0 +1,69 @@
+/*
+ * 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.mapper;
+
+import org.apache.openmeetings.db.dao.user.GroupDao;
+import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.dto.user.GroupDTO;
+import org.apache.openmeetings.db.dto.user.UserDTO;
+import org.apache.openmeetings.db.entity.user.Group;
+import org.apache.openmeetings.db.entity.user.User;
+import org.apache.openmeetings.db.entity.user.User.Type;
+import org.apache.wicket.util.string.Strings;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class UserMapper {
+       @Autowired
+       private UserDao userDao;
+       @Autowired
+       private GroupDao groupDao;
+
+       public User get(UserDTO dto) {
+               User u = dto.getId() == null ? new User() : 
userDao.get(dto.getId());
+               u.setLogin(dto.getLogin());
+               u.setFirstname(dto.getFirstname());
+               u.setLastname(dto.getLastname());
+               u.setRights(dto.getRights());
+               u.setLanguageId(dto.getLanguageId());
+               u.setAddress(dto.getAddress());
+               u.setTimeZoneId(dto.getTimeZoneId());
+               String externalId = dto.getExternalId();
+               String externalType = dto.getExternalType();
+               Type type = dto.getType();
+               if (Type.EXTERNAL == type || (!Strings.isEmpty(externalId) && 
!Strings.isEmpty(externalType))) {
+                       type = Type.EXTERNAL;
+                       if (u.getGroupUsers().stream().filter(gu -> 
gu.getGroup().isExternal() && 
gu.getGroup().getName().equals(externalType)).count() == 0) {
+                               u.addGroup(groupDao.getExternal(externalType));
+                       }
+                       u.setExternalId(externalId);
+               }
+               u.setType(type == null ? Type.USER : type);
+               u.setPictureUri(dto.getPictureUri());
+               return u;
+       }
+
+       public Group get(GroupDTO dto) {
+               Group g = dto.getId() == null ? new Group() : 
groupDao.get(dto.getId());
+               g.setName(dto.getName());
+               g.setTag(dto.getTag());
+               return g;
+       }
+}
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
index f62272b..a75a6d8 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/CalendarWebService.java
@@ -40,13 +40,13 @@ import javax.ws.rs.core.MediaType;
 
 import org.apache.cxf.feature.Features;
 import org.apache.openmeetings.db.dao.calendar.AppointmentDao;
-import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
 import org.apache.openmeetings.db.dto.basic.ServiceResult.Type;
 import org.apache.openmeetings.db.dto.calendar.AppointmentDTO;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
+import org.apache.openmeetings.db.mapper.CalendarMapper;
 import org.apache.openmeetings.db.util.AuthLevelUtil;
 import org.apache.openmeetings.webservice.error.InternalServiceException;
 import org.apache.openmeetings.webservice.error.ServiceException;
@@ -72,7 +72,7 @@ public class CalendarWebService extends BaseWebService {
        @Autowired
        private AppointmentDao dao;
        @Autowired
-       private GroupDao groupDao;
+       private CalendarMapper calMapper;
 
        /**
         * Load appointments by a start / end range for the current SID
@@ -247,7 +247,7 @@ public class CalendarWebService extends BaseWebService {
                                                || 
appointment.getOwner().getId().equals(u.getId());
                        }, sd -> {
                                User u = userDao.get(sd.getUserId());
-                               Appointment a = appointment.get(userDao, 
groupDao, roomDao, fileDao, dao, u);
+                               Appointment a = calMapper.get(appointment, u);
                                if (a.getRoom().getId() != null) {
                                        if (a.getRoom().isAppointment()) {
                                                a.getRoom().setIspublic(false);
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
index 5cb0ed2..414507c 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/RoomWebService.java
@@ -40,7 +40,6 @@ import javax.ws.rs.core.MediaType;
 import org.apache.cxf.feature.Features;
 import org.apache.openmeetings.core.util.WebSocketHelper;
 import org.apache.openmeetings.db.dao.room.InvitationDao;
-import org.apache.openmeetings.db.dao.user.GroupDao;
 import org.apache.openmeetings.db.dao.user.IUserManager;
 import org.apache.openmeetings.db.dto.basic.ServiceResult;
 import org.apache.openmeetings.db.dto.basic.ServiceResult.Type;
@@ -54,6 +53,7 @@ import org.apache.openmeetings.db.entity.room.RoomFile;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.manager.IClientManager;
 import org.apache.openmeetings.db.manager.IWhiteboardManager;
+import org.apache.openmeetings.db.mapper.RoomMapper;
 import org.apache.openmeetings.db.util.ws.RoomMessage;
 import org.apache.openmeetings.service.room.InvitationManager;
 import org.apache.openmeetings.webservice.error.InternalServiceException;
@@ -89,7 +89,7 @@ public class RoomWebService extends BaseWebService {
        @Autowired
        private InvitationManager inviteManager;
        @Autowired
-       private GroupDao groupDao;
+       private RoomMapper rMapper;
 
        /**
         * Returns an Object of Type RoomsList which contains a list of
@@ -190,7 +190,7 @@ public class RoomWebService extends BaseWebService {
                                } else {
                                        room.setExternalType(externalType);
                                        room.setExternalId(externalId);
-                                       r = room.get(roomDao, groupDao, 
fileDao);
+                                       r = rMapper.get(room);
                                        r = updateRtoRoom(r, sd.getUserId());
                                        return new RoomDTO(r);
                                }
@@ -219,7 +219,7 @@ public class RoomWebService extends BaseWebService {
                        ) throws ServiceException
        {
                return performCall(sid, User.Right.SOAP, sd -> {
-                       Room r = room.get(roomDao, groupDao, fileDao);
+                       Room r = rMapper.get(room);
                        r = updateRtoRoom(r, sd.getUserId());
                        return new RoomDTO(r);
                });
@@ -430,7 +430,7 @@ public class RoomWebService extends BaseWebService {
        {
                log.debug("[hash] invite {}", invite);
                return performCall(sid, User.Right.SOAP, sd -> {
-                       Invitation i = invite.get(sd.getUserId(), userDao, 
roomDao);
+                       Invitation i = rMapper.get(invite, sd.getUserId());
                        i = inviteDao.update(i);
 
                        if (i != null) {
diff --git 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
index 5d863ec..708882c 100644
--- 
a/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
+++ 
b/openmeetings-webservice/src/main/java/org/apache/openmeetings/webservice/UserWebService.java
@@ -58,6 +58,7 @@ import org.apache.openmeetings.db.entity.server.Sessiondata;
 import org.apache.openmeetings.db.entity.user.Address;
 import org.apache.openmeetings.db.entity.user.User;
 import org.apache.openmeetings.db.entity.user.User.Right;
+import org.apache.openmeetings.db.mapper.UserMapper;
 import org.apache.openmeetings.util.OmException;
 import org.apache.openmeetings.webservice.error.InternalServiceException;
 import org.apache.openmeetings.webservice.error.ServiceException;
@@ -93,6 +94,8 @@ public class UserWebService extends BaseWebService {
        private SOAPLoginDao soapDao;
        @Autowired
        private GroupDao groupDao;
+       @Autowired
+       private UserMapper uMapper;
 
        /**
         * @param user - login or email of Openmeetings user with admin or 
SOAP-rights
@@ -182,7 +185,7 @@ public class UserWebService extends BaseWebService {
                        if (user.getLanguageId() == null) {
                                user.setLanguageId(1L);
                        }
-                       User jsonUser = user.get(userDao, groupDao);
+                       User jsonUser = uMapper.get(user);
                        IValidator<String> passValidator = new 
StrongPasswordValidator(false, jsonUser);
                        Validatable<String> passVal = new 
Validatable<>(user.getPassword());
                        passValidator.validate(passVal);

Reply via email to