You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by so...@apache.org on 2020/04/27 11:45:25 UTC
[openmeetings] branch master updated: [OPENMEETINGS-2298]
connection panel is refactored
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 5f880a5 [OPENMEETINGS-2298] connection panel is refactored
5f880a5 is described below
commit 5f880a5a2e048f6208a56bebdf862a16b7c2dd43
Author: Maxim Solodovnik <so...@gmail.com>
AuthorDate: Mon Apr 27 18:45:07 2020 +0700
[OPENMEETINGS-2298] connection panel is refactored
---
.../openmeetings/core/remote/StreamProcessor.java | 4 +
.../web/admin/connection/ConnectionsPanel.java | 163 ++++++---------------
...nectionListKStreamItem.java => KStreamDto.java} | 39 +++--
.../admin/connection/dto/ConnectionListItem.java | 64 --------
4 files changed, 70 insertions(+), 200 deletions(-)
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 374d485..32cda74 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
@@ -512,6 +512,10 @@ public class StreamProcessor implements IStreamProcessor {
return cm.getBySid(sid);
}
+ public boolean hasStream(String uid) {
+ return streamByUid.get(uid) != null;
+ }
+
KStream getByUid(String uid) {
return uid == null ? null : streamByUid.get(uid);
}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
index 55d4f6f..84cc14c 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/ConnectionsPanel.java
@@ -30,15 +30,13 @@ import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
-import org.apache.openmeetings.core.remote.KRoom;
import org.apache.openmeetings.core.remote.KurentoHandler;
import org.apache.openmeetings.core.remote.StreamProcessor;
import org.apache.openmeetings.db.dao.user.IUserManager;
+import org.apache.openmeetings.db.entity.IDataProviderEntity;
import org.apache.openmeetings.db.entity.basic.Client;
import org.apache.openmeetings.web.admin.AdminBasePanel;
import org.apache.openmeetings.web.admin.SearchableDataView;
-import org.apache.openmeetings.web.admin.connection.dto.ConnectionListItem;
-import org.apache.openmeetings.web.admin.connection.dto.ConnectionListKStreamItem;
import org.apache.openmeetings.web.app.ClientManager;
import org.apache.openmeetings.web.common.PagedEntityListPanel;
import org.apache.openmeetings.web.data.SearchableDataProvider;
@@ -65,108 +63,47 @@ public class ConnectionsPanel extends AdminBasePanel {
@SpringBean
private ClientManager cm;
@SpringBean
- private KurentoHandler scm;
+ private KurentoHandler kHandler;
@SpringBean
private StreamProcessor streamProcessor;
@SpringBean
private IUserManager userManager;
- /**
- * This needs to combine two lists as we currently hold a reference to the KStream in two places:
- * <ul>
- * <li>{@link StreamProcessor#getStreams()}}</li>
- * <li>{@link KRoom#getParticipants()}</li>
- * </ul>
- * Both are singletons and hold a reference to a stream list and can get out of sync or leak.
- *
- * TODO: Investigate if we can have 1 source of truth.
- *
- * @return list of KStreams registered
- */
- public Collection<ConnectionListKStreamItem> getAllStreams() {
- Collection<ConnectionListKStreamItem> allStreams = new ArrayList<>();
-
- allStreams.addAll(
- streamProcessor.getStreams().stream()
- .map(stream -> new ConnectionListKStreamItem(
- streamProcessor.getClass().getSimpleName(),
- stream.getSid(),
- stream.getUid(),
- (stream.getRoom() == null) ? null : stream.getRoom().getRoomId(),
- stream.getConnectedSince(),
- stream.getStreamType(),
- stream.getProfile().toString(),
- (stream.getRecorder() == null) ? null : stream.getRecorder().toString(),
- stream.getChunkId(),
- stream.getType()
- ))
- .collect(Collectors.toList())
- );
-
- log.info("Retrieve all Streams, StreamProcessor has {} of streams", allStreams.size());
-
- // Add any streams from the KRoom that are not in the StreamProcessor
- scm.getRooms().forEach(
- room -> {
- log.info("Retrieve room {}, participants {}", room, room.getParticipants().size());
- room.getParticipants().forEach(
- participant -> {
- if (!streamProcessor.getStreams().contains(participant)) {
- log.warn("Stream was in KRoom but not in StreamProcessor, stream {}", participant);
- allStreams.add(new ConnectionListKStreamItem(
- scm.getClass().getSimpleName(),
- participant.getSid(),
- participant.getUid(),
- (participant.getRoom() == null) ? null : participant.getRoom().getRoomId(),
- participant.getConnectedSince(),
- participant.getStreamType(),
- participant.getProfile().toString(),
- (participant.getRecorder() == null) ? null : participant.getRecorder().toString(),
- participant.getChunkId(),
- participant.getType()
- ));
- }
- }
- );
- }
- );
-
- return allStreams;
- }
-
- /**
- * Combine lists for Client and KStream
- *
- * @return
- */
- protected List<ConnectionListItem> getConnections() {
-
- List<ConnectionListItem> connections = new ArrayList<>();
- List<Client> clients = cm.list();
- Collection<ConnectionListKStreamItem> streams = getAllStreams();
-
- connections.addAll(
- clients.stream()
- .map(client -> new ConnectionListItem(client, null))
- .collect(Collectors.toList())
- );
- connections.addAll(
- streams.stream()
- .map(stream -> new ConnectionListItem(null, stream))
- .collect(Collectors.toList())
- );
- return connections;
- }
-
public ConnectionsPanel(String id) {
super(id);
+ }
- SearchableDataProvider<ConnectionListItem> sdp = new SearchableDataProvider<>(null) {
+ @Override
+ protected void onInitialize() {
+ super.onInitialize();
+
+ SearchableDataProvider<IDataProviderEntity> sdp = new SearchableDataProvider<>(null) {
private static final long serialVersionUID = 1L;
+ private List<IDataProviderEntity> getConnections() {
+ List<IDataProviderEntity> l = new ArrayList<>();
+ l.addAll(cm.list());
+ Collection<KStreamDto> streams = streamProcessor.getStreams()
+ .stream()
+ .map(kStream -> new KStreamDto("processor", kStream))
+ .collect(Collectors.toList());
+ l.addAll(streams);
+ log.info("Retrieve all Streams, StreamProcessor has {} of streams", streams.size());
+
+ List<KStreamDto> missing = kHandler.getRooms()
+ .stream()
+ .flatMap(room -> room.getParticipants().stream())
+ .filter(stream -> !streamProcessor.hasStream(stream.getUid()))
+ .map(kStream -> new KStreamDto("KRoom", kStream))
+ .collect(Collectors.toList());
+ l.addAll(missing);
+ log.warn("Following streams were in KRoom but not in StreamProcessor: {}", missing);
+ return l;
+ }
+
@Override
- public Iterator<? extends ConnectionListItem> iterator(long first, long count) {
- List<ConnectionListItem> l = getConnections();
+ public Iterator<? extends IDataProviderEntity> iterator(long first, long count) {
+ List<IDataProviderEntity> l = getConnections();
return l.subList((int)Math.max(0, first), (int)Math.min(first + count, l.size())).iterator();
}
@@ -177,24 +114,22 @@ public class ConnectionsPanel extends AdminBasePanel {
};
final WebMarkupContainer container = new WebMarkupContainer("container");
final WebMarkupContainer details = new WebMarkupContainer("details");
- SearchableDataView<ConnectionListItem> dataView = new SearchableDataView<>("clientList", sdp) {
+ SearchableDataView<IDataProviderEntity> dataView = new SearchableDataView<>("clientList", sdp) {
private static final long serialVersionUID = 1L;
@Override
- protected void populateItem(final Item<ConnectionListItem> item) {
- ConnectionListItem connection = item.getModelObject();
-
- if (connection.getStream() != null) {
- ConnectionListKStreamItem kStream = connection.getStream();
- item.add(new Label("type", kStream.getType()));
+ protected void populateItem(final Item<IDataProviderEntity> item) {
+ if (item.getModelObject() instanceof KStreamDto) {
+ KStreamDto kStream = (KStreamDto)item.getModelObject();
+ item.add(new Label("type", kStream.getType() + " " + kStream.getStreamType()));
item.add(new Label("login", kStream.getUid()));
item.add(new Label("since", getDateFormat().format(kStream.getConnectedSince())));
- item.add(new Label("scope", kStream.getStreamType()));
- item.add(new Label("server", kStream.getSource()));
+ item.add(new Label("scope", kStream.getRoomId()));
+ item.add(new Label("server", ""));
item.add(new Label("kick", ""));
}
- if (connection.getClient() != null) {
- Client c = connection.getClient();
+ if (item.getModelObject() instanceof Client) {
+ Client c = (Client)item.getModelObject();
item.add(new Label("type", "html5"));
item.add(new Label("login", c.getUser().getLogin()));
item.add(new Label("since", getDateFormat().format(c.getConnectedSince())));
@@ -219,23 +154,9 @@ public class ConnectionsPanel extends AdminBasePanel {
@Override
protected void onEvent(AjaxRequestTarget target) {
-
+ Field[] ff = (item.getModelObject() instanceof KStreamDto ? KStreamDto.class : Client.class).getDeclaredFields();
RepeatingView lines = new RepeatingView("line");
- ConnectionListItem connection = item.getModelObject();
-
- Field[] ff;
- Object c;
-
- if (connection.getStream() != null) {
- ff = connection.getStream().getClass().getDeclaredFields();
- c = connection.getStream();
- } else if (connection.getClient() != null) {
- ff = connection.getClient().getClass().getDeclaredFields();
- c = connection.getClient();
- } else {
- log.warn("Should be either Client or ConnectionListItem, modelObject {}", item.getModelObject());
- return;
- }
+ Object c = item.getModelObject();
for (Field f : ff) {
int mod = f.getModifiers();
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/dto/ConnectionListKStreamItem.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/KStreamDto.java
similarity index 71%
rename from openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/dto/ConnectionListKStreamItem.java
rename to openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/KStreamDto.java
index d1ac5a9..cc6521d 100644
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/dto/ConnectionListKStreamItem.java
+++ b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/KStreamDto.java
@@ -16,11 +16,12 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.openmeetings.web.admin.connection.dto;
+package org.apache.openmeetings.web.admin.connection;
-import java.io.Serializable;
import java.util.Date;
+import org.apache.openmeetings.core.remote.KStream;
+import org.apache.openmeetings.db.entity.IDataProviderEntity;
import org.apache.openmeetings.db.entity.basic.Client.StreamType;
import org.apache.openmeetings.db.entity.record.RecordingChunk.Type;
@@ -33,7 +34,7 @@ import org.apache.openmeetings.db.entity.record.RecordingChunk.Type;
* @author sebawagner
*
*/
-public class ConnectionListKStreamItem implements Serializable {
+public class KStreamDto implements IDataProviderEntity {
private static final long serialVersionUID = 1L;
/** StreamProcessor or KurentoHandler list */
private String source;
@@ -48,19 +49,17 @@ public class ConnectionListKStreamItem implements Serializable {
private Long chunkId;
private Type type;
- public ConnectionListKStreamItem(String source, String sid, String uid, Long roomId, Date connectedSince,
- StreamType streamType, String profile, String recorder, Long chunkId, Type type) {
- super();
+ public KStreamDto(String source, KStream kStream) {
this.source = source;
- this.sid = sid;
- this.uid = uid;
- this.roomId = roomId;
- this.connectedSince = connectedSince;
- this.streamType = streamType;
- this.profile = profile;
- this.recorder = recorder;
- this.chunkId = chunkId;
- this.type = type;
+ this.sid = kStream.getSid();
+ this.uid = kStream.getUid();
+ this.roomId = (kStream.getRoom() == null) ? null : kStream.getRoom().getRoomId();
+ this.connectedSince = kStream.getConnectedSince();
+ this.streamType = kStream.getStreamType();
+ this.profile = kStream.getProfile().toString();
+ this.recorder = (kStream.getRecorder() == null) ? null : kStream.getRecorder().toString();
+ this.chunkId = kStream.getChunkId();
+ this.type = kStream.getType();
}
public static long getSerialversionuid() {
@@ -106,4 +105,14 @@ public class ConnectionListKStreamItem implements Serializable {
public Type getType() {
return type;
}
+
+ @Override
+ public Long getId() {
+ return null;
+ }
+
+ @Override
+ public void setId(Long id) {
+ // no-op
+ }
}
diff --git a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/dto/ConnectionListItem.java b/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/dto/ConnectionListItem.java
deleted file mode 100644
index 1820ce8..0000000
--- a/openmeetings-web/src/main/java/org/apache/openmeetings/web/admin/connection/dto/ConnectionListItem.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * 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.web.admin.connection.dto;
-
-import org.apache.openmeetings.db.entity.IDataProviderEntity;
-import org.apache.openmeetings.db.entity.basic.Client;
-
-/**
- * Wrapper object for the UI display as the list item might be a client (that
- * may have also has ConnectionListKStreamItem(KStream) referenced).<br>
- * Or<br>
- * A single ConnectionListKStreamItem(KStream).<br>
- *
- * We want to see a total list of connections, a client represents a WebSocket and session.
- * A ConnectionListKStreamItem is a wrapper of KStream (which is a MediaStream).
- *
- * @author sebawagner
- *
- */
-public class ConnectionListItem implements IDataProviderEntity {
- private static final long serialVersionUID = 1L;
-
- private Client client;
- private ConnectionListKStreamItem stream;
-
- public ConnectionListItem(Client client, ConnectionListKStreamItem stream) {
- super();
- this.client = client;
- this.stream = stream;
- }
- public Client getClient() {
- return client;
- }
- public ConnectionListKStreamItem getStream() {
- return stream;
- }
- @Override
- public Long getId() {
- if (client != null) {
- return client.getId();
- }
- return null;
- }
- @Override
- public void setId(Long id) {
- // no-op
- }
-}