package nl.topicus.onderwijs.dashboard.modules.topicus; import java.io.Serializable; import java.io.StringWriter; import java.util.ArrayList; import java.util.Date; import java.util.List; import nl.topicus.onderwijs.dashboard.datatypes.Alert; import nl.topicus.onderwijs.dashboard.datatypes.Dot; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig; import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; class TopicusApplicationStatus implements Serializable { private static final long serialVersionUID = 1L; private List<Alert> alerts; private List<TopicusServerStatus> servers = new ArrayList<TopicusServerStatus>(); public TopicusApplicationStatus() { } public void addServer(TopicusServerStatus server) { servers.add(server); } public List<TopicusServerStatus> getServers() { return servers; } public List<TopicusServerStatus> getOnlineServers() { List<TopicusServerStatus> ret = new ArrayList<TopicusServerStatus>(); for (TopicusServerStatus curServer : getServers()) { if (curServer.isOnline()) ret.add(curServer); } return ret; } public String getVersion() { String ret = null; for (TopicusServerStatus curServer : getServers()) { if (curServer.getVersion() != null) { if (ret == null || ret.compareTo(curServer.getVersion()) > 0) ret = curServer.getVersion(); } } return ret == null ? "n/a" : ret; } public int getNumberOfUsers() { int ret = 0; for (TopicusServerStatus curServer : getOnlineServers()) { ret += curServer.getNumberOfUsers(); } return ret; } public List<Integer> getUsersPerServer() { List<Integer> ret = new ArrayList<Integer>(); for (TopicusServerStatus curServer : getServers()) { ret.add(curServer.getNumberOfUsers()); } return ret; } public int getNumberOfErrors() { int ret = 0; for (TopicusServerStatus curServer : getServers()) { ret += curServer.getNumberOfErrors(); } return ret; } public int getNumberOfServers() { return servers.size(); } public int getNumberOfServersOnline() { return getOnlineServers().size(); } public Integer getAverageRequestDuration() { int div = 0; int total = 0; for (TopicusServerStatus curServer : getOnlineServers()) { Integer rpm = curServer.getRequestsPerMinute(); Integer ard = curServer.getAverageRequestDuration(); if (rpm != null && ard != null) { div += rpm; total += (rpm * ard); } } return div == 0 ? null : total / div; } public Integer getRequestsPerMinute() { Integer total = null; for (TopicusServerStatus curServer : getOnlineServers()) { if (curServer.getRequestsPerMinute() != null) { if (total == null) total = 0; total += curServer.getRequestsPerMinute(); } } return total; } public Long getUptime() { Long ret = null; for (TopicusServerStatus curServer : getOnlineServers()) { if (curServer.getUptime() != null) { if (ret == null || curServer.getUptime() < ret) ret = curServer.getUptime(); } } return ret; } public Date getLastCheckTime() { Date ret = null; for (TopicusServerStatus curServer : getOnlineServers()) { if (curServer.getTime() != null) { if (ret == null || curServer.getTime().after(ret)) ret = curServer.getTime(); } } return ret; } public List<Dot> getServerStatusses() { List<Dot> ret = new ArrayList<Dot>(); for (TopicusServerStatus curServer : getServers()) { ret.add(new Dot(curServer.getServerStatus(), curServer.getCode())); } return ret; } public List<Alert> getAlerts() { return alerts; } public void setAlerts(List<Alert> alerts) { this.alerts = alerts; } @Override public String toString() { ObjectMapper mapper = new ObjectMapper(); StringWriter sw = new StringWriter(); try { SerializationConfig config = mapper.getSerializationConfig(); config.setSerializationInclusion(Inclusion.NON_NULL); mapper.writeValue(sw, this); } catch (Exception e) { e.printStackTrace(); } return sw.toString(); } }