package fm.liu.timo.manager.response;
import java.lang.reflect.Field;
import java.util.ArrayList;
import fm.liu.timo.TimoServer;
import fm.liu.timo.manager.ManagerConnection;
import fm.liu.timo.manager.handler.ShowHandler;
import fm.liu.timo.manager.response.ResponseUtil.Head;
import fm.liu.timo.util.FormatUtil;
import fm.liu.timo.util.TimeUtil;
public class ShowServer extends ShowHandler {
private static final ArrayList<Head> heads = new ArrayList<>();
private ManagerConnection c;
static {
heads.add(new Head("uptime"));
heads.add(new Head("used_memory"));
heads.add(new Head("total_memory"));
heads.add(new Head("max_memory"));
heads.add(new Head("max_direct_memory"));
heads.add(new Head("used_direct_memory"));
heads.add(new Head("charset"));
heads.add(new Head("status"));
}
@Override
public String getInfo() {
return "show the status of timo-server";
}
@Override
public ArrayList<Head> getHeads() {
return heads;
}
@Override
public ArrayList<Object[]> getRows() {
ArrayList<Object[]> rows = new ArrayList<>();
Object[] row = new Object[heads.size()];
TimoServer server = TimoServer.getInstance();
Runtime rt = Runtime.getRuntime();
try {
Class<?> mem = Class.forName("java.nio.Bits");
Field maxMemory = mem.getDeclaredField("maxMemory");
maxMemory.setAccessible(true);
Field reservedMemory = mem.getDeclaredField("reservedMemory");
reservedMemory.setAccessible(true);
Long maxMemoryValue = (Long) maxMemory.get(null);
Long reservedMemoryValue = (Long) reservedMemory.get(null);
int i = 0;
long m = 1024 * 1024;
row[i++] = FormatUtil.formatTime(TimeUtil.currentTimeMillis() - server.getStartupTime(),
3);
row[i++] = String.valueOf((rt.totalMemory() - rt.freeMemory()) / m) + "M";
row[i++] = String.valueOf(rt.totalMemory() / m) + "M";
row[i++] = String.valueOf(rt.maxMemory() / m) + "M";
row[i++] = String.valueOf(maxMemoryValue / m) + "M";
row[i++] = String.valueOf(reservedMemoryValue / m) + "M";
if (c == null) {
row[i++] = "NULL";
} else {
row[i++] = c.getCharset();
}
row[i++] = server.isOnline() ? "ON" : "OFF";
rows.add(row);
} catch (Exception e) {
ResponseUtil.error(c, e.toString());
}
return rows;
}
@Override
public void execute(ManagerConnection c) {
this.c = c;
ResponseUtil.write(c, heads, getRows());
}
}