From bab92b56885663e20c7bc5010d94b4a6c23ea53e Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Thu, 9 Apr 2020 15:33:30 +0200
Subject: [PATCH] OO-4626: beautify status, remove debug code

---
 .../manager/BigBlueButtonManagerImpl.java     |  6 +-
 .../model/BigBlueButtonServerInfos.java       | 13 +++-
 .../BigBlueButtonAdminServersController.java  |  2 +-
 .../BigBlueButtonAdminServersTableModel.java  |  4 +-
 .../ui/BigBlueButtonServerRow.java            | 12 ++--
 .../bigbluebutton/ui/StatusCellRenderer.java  | 66 +++++++++++++++++++
 .../ui/_i18n/LocalStrings_de.properties       |  4 ++
 .../ui/_i18n/LocalStrings_en.properties       |  4 ++
 8 files changed, 97 insertions(+), 14 deletions(-)
 create mode 100644 src/main/java/org/olat/modules/bigbluebutton/ui/StatusCellRenderer.java

diff --git a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
index 14ce098f809..ee20ee7da46 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/manager/BigBlueButtonManagerImpl.java
@@ -253,7 +253,7 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 					.filter(meeting -> instanceMeetingsIds.contains(meeting.getMeetingId()))
 					.collect(Collectors.toList());
 			double load = this.calculateLoad(info.getServer(), instanceMeetings);
-			instanceInfos.add(new BigBlueButtonServerInfos(info.getServer(), instanceMeetings, load));
+			instanceInfos.add(new BigBlueButtonServerInfos(info.getServer(), info.isAvailable(), instanceMeetings, load));
 		}
 		return instanceInfos;
 	}
@@ -409,7 +409,7 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 		return threads.stream()
 			.filter(MeetingInfosThread::isExecuted)
 			.filter(thread -> !thread.hasErrors())
-			.map(thread -> new BigBlueButtonServerInfos(thread.getServer(), thread.getMeetingsInfos(),
+			.map(thread -> new BigBlueButtonServerInfos(thread.getServer(), thread.isExecuted(), thread.getMeetingsInfos(),
 					calculateLoad(thread.getServer(), thread.getMeetingsInfos())))
 			.collect(Collectors.toList());
 	}
@@ -600,8 +600,6 @@ public class BigBlueButtonManagerImpl implements BigBlueButtonManager, Initializ
 
 	@Override
 	public String join(BigBlueButtonMeeting meeting, Identity identity, boolean moderator, boolean guest, Boolean isRunning, BigBlueButtonErrors errors) {
-		this.getAvailableServer();
-		
 		String joinUrl = null;
 		if(isRunning != null && isRunning.booleanValue() && meeting.getServer() != null) {
 			joinUrl = buildJoinUrl(meeting, meeting.getServer(), identity, moderator, guest);
diff --git a/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonServerInfos.java b/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonServerInfos.java
index d0162ffd385..57535d23bd7 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonServerInfos.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/model/BigBlueButtonServerInfos.java
@@ -19,6 +19,7 @@
  */
 package org.olat.modules.bigbluebutton.model;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -33,19 +34,29 @@ import org.olat.modules.bigbluebutton.BigBlueButtonServer;
 public class BigBlueButtonServerInfos {
 	
 	private double load;
+	private boolean available;
 	private final BigBlueButtonServer server;
 	private final List<BigBlueButtonMeetingInfos> meetingsInfos;
 	
-	public BigBlueButtonServerInfos(BigBlueButtonServer server, List<BigBlueButtonMeetingInfos> meetingsInfos, double load) {
+	public BigBlueButtonServerInfos(BigBlueButtonServer server, boolean available, List<BigBlueButtonMeetingInfos> meetingsInfos, double load) {
 		this.load = load;
 		this.server = server;
+		this.available = available;
 		this.meetingsInfos = meetingsInfos;
 	}
 	
+	public static final BigBlueButtonServerInfos empty(BigBlueButtonServer server) {
+		return new BigBlueButtonServerInfos(server, false, new ArrayList<>(), 0.0d);
+	}
+	
 	public double getLoad() {
 		return load;
 	}
 	
+	public boolean isAvailable() {
+		return available;
+	}
+	
 	public BigBlueButtonServer getServer() {
 		return server;
 	}
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonAdminServersController.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonAdminServersController.java
index 04baceada2c..4cdb7f704fb 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonAdminServersController.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonAdminServersController.java
@@ -65,7 +65,7 @@ public class BigBlueButtonAdminServersController extends FormBasicController {
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		
 		FlexiTableColumnModel columnsModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
-		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ServersCols.enabled));
+		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ServersCols.status, new StatusCellRenderer(getTranslator())));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ServersCols.url));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ServersCols.capacityFactor, new CapacityFactorCellRenderer()));
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(ServersCols.moderatorCount));
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonAdminServersTableModel.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonAdminServersTableModel.java
index dbe5e31e462..f1c2ea7688a 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonAdminServersTableModel.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonAdminServersTableModel.java
@@ -73,7 +73,7 @@ implements SortableFlexiTableDataModel<BigBlueButtonServerRow>, FilterableFlexiT
 	public Object getValueAt(BigBlueButtonServerRow row, int col) {
 		switch(COLS[col]) {
 			case url: return row.getUrl();
-			case enabled: return row.isEnabled();
+			case status: return row.isEnabled();
 			case capacityFactor: return row.getCapacityFactor();
 			case moderatorCount: return allInstances
 					? row.getAllInstancesServerInfos().getModeratorCount() : row.getServerInfos().getModeratorCount();
@@ -105,7 +105,7 @@ implements SortableFlexiTableDataModel<BigBlueButtonServerRow>, FilterableFlexiT
 	public enum ServersCols implements FlexiSortableColumnDef {
 		
 		url("table.header.server.url"),
-		enabled("table.header.server.enabled"),
+		status("table.header.server.enabled"),
 		capacityFactor("table.header.capacity.factor"),
 		moderatorCount("table.header.moderator.count"),
 		participantCount("table.header.participant.count"),
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonServerRow.java b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonServerRow.java
index 62506b318c3..036e0bd9e7a 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonServerRow.java
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/BigBlueButtonServerRow.java
@@ -19,8 +19,6 @@
  */
 package org.olat.modules.bigbluebutton.ui;
 
-import java.util.ArrayList;
-
 import org.olat.modules.bigbluebutton.BigBlueButtonServer;
 import org.olat.modules.bigbluebutton.model.BigBlueButtonServerInfos;
 
@@ -40,10 +38,8 @@ public class BigBlueButtonServerRow {
 			BigBlueButtonServerInfos allInstanceServerInfos,
 			BigBlueButtonServerInfos serverInfos) {
 		this.server = server;
-		this.serverInfos = serverInfos == null
-				? new BigBlueButtonServerInfos(server, new ArrayList<>(), 0.0d) : serverInfos;
-		this.allInstanceServerInfos = allInstanceServerInfos == null
-				? new BigBlueButtonServerInfos(server, new ArrayList<>(), 0.0d) : allInstanceServerInfos;
+		this.serverInfos = serverInfos == null ? BigBlueButtonServerInfos.empty(server) : serverInfos;
+		this.allInstanceServerInfos = allInstanceServerInfos == null ? BigBlueButtonServerInfos.empty(server) : allInstanceServerInfos;
 	}
 	
 	public String getUrl() {
@@ -54,6 +50,10 @@ public class BigBlueButtonServerRow {
 		return server.isEnabled();
 	}
 	
+	public boolean isAvailable() {
+		return allInstanceServerInfos.isAvailable();
+	}
+	
 	public Double getCapacityFactor() {
 		return server.getCapacityFactory();
 	}
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/StatusCellRenderer.java b/src/main/java/org/olat/modules/bigbluebutton/ui/StatusCellRenderer.java
new file mode 100644
index 00000000000..77bcaef3281
--- /dev/null
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/StatusCellRenderer.java
@@ -0,0 +1,66 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.modules.bigbluebutton.ui;
+
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiCellRenderer;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableComponent;
+import org.olat.core.gui.render.Renderer;
+import org.olat.core.gui.render.StringOutput;
+import org.olat.core.gui.render.URLBuilder;
+import org.olat.core.gui.translator.Translator;
+
+/**
+ * 
+ * Initial date: 8 avr. 2020<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class StatusCellRenderer implements FlexiCellRenderer {
+	
+	private final Translator translator;
+	
+	public StatusCellRenderer(Translator translator) {
+		this.translator = translator;
+	}
+
+	@Override
+	public void render(Renderer renderer, StringOutput target, Object cellValue, int row, FlexiTableComponent source,
+			URLBuilder ubu, Translator trans) {
+		Object obj = source.getFlexiTableElement().getTableDataModel().getObject(row);
+		if(obj instanceof BigBlueButtonServerRow) {
+			BigBlueButtonServerRow server = (BigBlueButtonServerRow)obj;
+			
+			String title;
+			String statusCssClass;
+			if(!server.isEnabled()) {
+				title = "server.status.disabled";	
+				statusCssClass = "o_icon_disabled";
+			} else if(!server.isAvailable()) {
+				statusCssClass = "o_icon_warn";
+				title = "server.status.offline";
+			} else {
+				statusCssClass = "o_icon_accept";
+				title = "server.status.available";
+			}
+			target.append("<span title=\"").append(translator.translate(title))
+			      .append("\"><i class='o_icon ").append(statusCssClass).append("'> </i></span>");
+		}
+	}
+}
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
index 8888e1fc999..44b254b9d6b 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_de.properties
@@ -98,6 +98,9 @@ role.group=Gruppenmitglied
 role.owner=Kursbesitzer
 server.overloaded=F\u00FCr das gew\u00E4hlten Datum/Uhrzeit ist kein Raum verf\u00FCgbar. W\u00E4hlen Sie ein anderes Datum/Uhrzeit oder eine andere Raumvorlage.
 servers.title=Server
+server.status.available=Verf\u00FCgbar
+server.status.offline=Scheint offline zu sein
+server.status.disabled=Abgeschaltet
 table.header.available=Verf\u00FCgbarkeit
 table.header.breakout.meetings=\# Breakout
 table.header.breakout.recording.meetings=\# Breakout Recording
@@ -121,6 +124,7 @@ table.header.recording.open=\u00D6ffnen
 table.header.recording.start=Beginn
 table.header.recording.type=Typ
 table.header.server.enabled=Eingeschaltet
+table.header.server.status=Status
 table.header.server.recording=Aufzeichnungen URL
 table.header.server.url=URL
 table.header.system=System
diff --git a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
index c2a39241c04..94b9c8756aa 100644
--- a/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/bigbluebutton/ui/_i18n/LocalStrings_en.properties
@@ -97,6 +97,9 @@ role.coach=Coach
 role.group=Group user
 role.owner=Course owner
 server.overloaded=There is no room available for the choosen date/time. Choose another date/time or another room template.
+server.status.available=Available
+server.status.offline=Seems to be offline
+server.status.disabled=Disabled
 servers.title=Servers
 table.header.available=Availability
 table.header.breakout.meetings=\# Breakout
@@ -121,6 +124,7 @@ table.header.recording.open=Open
 table.header.recording.start=Start
 table.header.recording.type=Type
 table.header.server.enabled=Enabled
+table.header.server.status=Status
 table.header.server.recording=Recording URL
 table.header.server.url=URL
 table.header.system=System
-- 
GitLab