Split server page plugin players table creation into a separate class

This commit is contained in:
Rsl1122 2018-05-25 23:16:28 +03:00
parent 2f886ac124
commit 1efa9f7f9d
4 changed files with 110 additions and 73 deletions

View File

@ -18,7 +18,7 @@ import java.util.List;
*/ */
public class TableContainer { public class TableContainer {
private final String[] header; protected final String[] header;
private List<Serializable[]> values; private List<Serializable[]> values;
private boolean jqueryDatatable; private boolean jqueryDatatable;

View File

@ -9,7 +9,7 @@ import com.djrapitops.plan.data.element.InspectContainer;
import com.djrapitops.plan.data.plugin.PluginData; import com.djrapitops.plan.data.plugin.PluginData;
import com.djrapitops.plan.utilities.analysis.Analysis; import com.djrapitops.plan.utilities.analysis.Analysis;
import com.djrapitops.plan.utilities.comparators.PluginDataNameComparator; import com.djrapitops.plan.utilities.comparators.PluginDataNameComparator;
import com.djrapitops.plan.utilities.html.tables.PlayersTableCreator; import com.djrapitops.plan.utilities.html.tables.PluginPlayersTable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -73,8 +73,7 @@ public class AnalysisPluginsTabContentCreator {
"<div class=\"card\">" + "<div class=\"card\">" +
"<div class=\"header\"><h2><i class=\"fa fa-users\"></i> Plugin Data</h2></div>" + "<div class=\"header\"><h2><i class=\"fa fa-users\"></i> Plugin Data</h2></div>" +
"<div class=\"body\">" + "<div class=\"body\">" +
"<div class=\"table-responsive\">" + new PluginPlayersTable(containers, Analysis.getServerProfile().getPlayers()).parseHtml() +
PlayersTableCreator.createPluginsTable(containers, Analysis.getServerProfile().getPlayers()) +
"</div></div></div>" + "</div></div></div>" +
"</div></div></div>"; "</div></div></div>";

View File

@ -3,18 +3,14 @@ package com.djrapitops.plan.utilities.html.tables;
import com.djrapitops.plan.api.PlanAPI; import com.djrapitops.plan.api.PlanAPI;
import com.djrapitops.plan.data.PlayerProfile; import com.djrapitops.plan.data.PlayerProfile;
import com.djrapitops.plan.data.calculation.ActivityIndex; import com.djrapitops.plan.data.calculation.ActivityIndex;
import com.djrapitops.plan.data.element.AnalysisContainer;
import com.djrapitops.plan.data.element.TableContainer;
import com.djrapitops.plan.data.plugin.PluginData;
import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.utilities.FormatUtils; import com.djrapitops.plan.utilities.FormatUtils;
import com.djrapitops.plan.utilities.html.Html; import com.djrapitops.plan.utilities.html.Html;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import org.apache.commons.lang3.ArrayUtils;
import java.io.Serializable; import java.util.List;
import java.util.*; import java.util.UUID;
/** /**
* @author Rsl1122 * @author Rsl1122
@ -84,67 +80,4 @@ public class PlayersTableCreator {
return html.toString(); return html.toString();
} }
public static String createPluginsTable(Map<PluginData, AnalysisContainer> containers, Collection<PlayerProfile> players) {
TreeMap<String, Map<UUID, ? extends Serializable>> data = new TreeMap<>();
for (AnalysisContainer container : containers.values()) {
if (!container.hasPlayerTableValues()) {
continue;
}
data.putAll(container.getPlayerTableValues());
}
List<String> header = new ArrayList<>(data.keySet());
Collections.sort(header);
int size = header.size();
TableContainer tableContainer = new TableContainer(true, header.toArray(new String[size]));
try {
if (players.isEmpty()) {
tableContainer.addRow("<b>No Players</b>");
throw new IllegalArgumentException("No players");
}
Map<UUID, String[]> sortedData = new HashMap<>();
for (PlayerProfile profile : players) {
UUID uuid = profile.getUuid();
String[] playerdata = new String[size];
for (int i = 0; i < size; i++) {
String label = header.get(i);
Map<UUID, ? extends Serializable> playerSpecificData = data.getOrDefault(label, new HashMap<>());
Serializable value = playerSpecificData.get(uuid);
if (value != null) {
playerdata[i] = value.toString();
} else {
playerdata[i] = "-";
}
}
sortedData.put(uuid, playerdata);
}
int i = 0;
int maxPlayers = Settings.MAX_PLAYERS.getNumber();
if (maxPlayers <= 0) {
maxPlayers = 2000;
}
for (PlayerProfile profile : players) {
if (i >= maxPlayers) {
break;
}
UUID uuid = profile.getUuid();
String link = Html.LINK_EXTERNAL.parse(PlanAPI.getInstance().getPlayerInspectPageLink(profile.getName()), profile.getName());
String[] playerData = FormatUtils.mergeArrays(new String[]{link}, sortedData.getOrDefault(uuid, new String[]{}));
tableContainer.addRow(ArrayUtils.addAll(playerData));
i++;
}
} catch (IllegalArgumentException ignored) {
}
return tableContainer.parseHtml().replace(Html.TABLE_SCROLL.parse(), "<table class=\"table table-bordered table-striped table-hover player-table dataTable\">");
}
} }

View File

@ -0,0 +1,105 @@
package com.djrapitops.plan.utilities.html.tables;
import com.djrapitops.plan.api.PlanAPI;
import com.djrapitops.plan.data.PlayerProfile;
import com.djrapitops.plan.data.element.AnalysisContainer;
import com.djrapitops.plan.data.element.TableContainer;
import com.djrapitops.plan.data.plugin.PluginData;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.utilities.FormatUtils;
import com.djrapitops.plan.utilities.html.Html;
import org.apache.commons.lang3.ArrayUtils;
import java.io.Serializable;
import java.util.*;
/**
* TableContainer that creates the html table for per player plugins values.
*
* @author Rsl1122
*/
public class PluginPlayersTable extends TableContainer {
private Collection<PlayerProfile> players;
public PluginPlayersTable(Map<PluginData, AnalysisContainer> containers, Collection<PlayerProfile> players) {
this(getPluginDataSet(containers), players);
}
private PluginPlayersTable(TreeMap<String, Map<UUID, ? extends Serializable>> pluginDataSet, Collection<PlayerProfile> players) {
super(true, getHeaders(pluginDataSet.keySet()));
this.players = players;
useJqueryDataTables();
if (players.isEmpty()) {
addRow("No Players");
} else {
Map<UUID, String[]> rows = getRows(pluginDataSet);
addValues(rows);
}
}
private static String[] getHeaders(Set<String> columnNames) {
List<String> header = new ArrayList<>(columnNames);
Collections.sort(header);
return header.toArray(new String[0]);
}
private static TreeMap<String, Map<UUID, ? extends Serializable>> getPluginDataSet(Map<PluginData, AnalysisContainer> containers) {
TreeMap<String, Map<UUID, ? extends Serializable>> data = new TreeMap<>();
for (AnalysisContainer container : containers.values()) {
if (!container.hasPlayerTableValues()) {
continue;
}
data.putAll(container.getPlayerTableValues());
}
return data;
}
private void addValues(Map<UUID, String[]> rows) {
int i = 0;
int maxPlayers = Settings.MAX_PLAYERS.getNumber();
if (maxPlayers <= 0) {
maxPlayers = 2000;
}
for (PlayerProfile profile : players) {
if (i >= maxPlayers) {
break;
}
UUID uuid = profile.getUuid();
String link = Html.LINK_EXTERNAL.parse(PlanAPI.getInstance().getPlayerInspectPageLink(profile.getName()), profile.getName());
String[] playerData = FormatUtils.mergeArrays(new String[]{link}, rows.getOrDefault(uuid, new String[]{}));
addRow(ArrayUtils.addAll(playerData));
i++;
}
}
private Map<UUID, String[]> getRows(TreeMap<String, Map<UUID, ? extends Serializable>> data) {
Map<UUID, String[]> rows = new HashMap<>();
int size = header.length - 1;
for (PlayerProfile profile : players) {
UUID uuid = profile.getUuid();
String[] row = new String[size];
for (int i = 0; i < size; i++) {
String label = header[i + 1];
Map<UUID, ? extends Serializable> playerSpecificData = data.getOrDefault(label, new HashMap<>());
Serializable value = playerSpecificData.get(uuid);
if (value != null) {
row[i] = value.toString();
} else {
row[i] = "-";
}
}
rows.put(uuid, row);
}
return rows;
}
}