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