package art.servers.controller;
import art.library.model.devices.application.ApplicationStatus;
import art.library.model.devices.application.status.ApplicationStatusMemory;
import art.library.model.devices.application.status.ApplicationStatusOperatingSystem;
import art.library.model.devices.application.status.ApplicationStatusRuntime;
import art.library.model.devices.application.status.ApplicationStatusThread;
import art.library.utils.windows.System32;
import com.sun.management.OperatingSystemMXBean;
import static java.lang.Thread.sleep;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import java.lang.management.RuntimeMXBean;
import java.lang.management.ThreadMXBean;
import java.util.Enumeration;
import java.util.Hashtable;
import art.servers.Shared;
public class ControllerProcessInformation extends Controller
{
public float cores = Runtime.getRuntime().availableProcessors();
public long systemTime = 0;
public long systemProcessesUsageTime = 0;
public long cpuLoadPercentage = 0;
public double processorPercentage = 0;
private String name = null;
private ApplicationStatus status = null;
public ControllerProcessInformation()
{
this.name = Shared.getMessage("Controller process information");
this.setName("Controller process information");
this.status = new ApplicationStatus();
start();
}
public ApplicationStatus getApplicationStatus()
{
return status;
}
public void run()
{
Shared.traceInformation(name, Shared.getMessage("Starting"));
// Update realtime
while ((isInterrupted() == false) && (exit == false))
{
long timestamp = System.currentTimeMillis();
try
{
if (Shared.isServerEnabled() == true)
{
update();
}
}
catch (Exception exception)
{
}
long timetowait = (1000 - (System.currentTimeMillis() - timestamp));
try
{
if (timetowait > 0)
{
sleep(timetowait);
}
}
catch (Exception e)
{
}
}
Shared.traceInformation(name, Shared.getMessage("Finishing"));
}
public void update()
{
if ((System.getProperty("os.name").toLowerCase().contains("windows") == true))
{
windows();
}
long timestamp = System.currentTimeMillis();
memoryMXBean(status, timestamp);
threadMXBean(status, timestamp);
runtimeMXBean(status, timestamp);
operatingSystemMXBean(status, timestamp);
}
//
private void windows()
{
try
{
Hashtable systemProcesses = (Hashtable)System32.listProcessesHashtable();
// CPU del sistema
long newsystemProcessesUsageTime = 0;
long newsystemTime = System.currentTimeMillis();
Enumeration enumeration = systemProcesses.elements();
while (enumeration.hasMoreElements())
{
art.library.utils.windows.SystemProcess systemProcess = (art.library.utils.windows.SystemProcess)enumeration.nextElement();
newsystemProcessesUsageTime = newsystemProcessesUsageTime + systemProcess.lpKernelTime + systemProcess.lpUserTime;
}
this.processorPercentage = (((float)(newsystemProcessesUsageTime - this.systemProcessesUsageTime) / (float)(newsystemTime - this.systemTime)) / this.cores) * 100.0f;
if (this.processorPercentage < 0) Shared.controllerProcessInformation.processorPercentage = 0;
this.systemTime = newsystemTime;
this.systemProcessesUsageTime = newsystemProcessesUsageTime;
}
catch (Exception exception)
{
}
}
//
//
private void memoryMXBean(ApplicationStatus status, long timestamp)
{
try
{
MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();
if (status.memory == null) status.memory = new ApplicationStatusMemory();
status.memory.timestamp = timestamp;
MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
MemoryUsage nonheapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();
status.memory.heapMemoryUsage_init = heapMemoryUsage.getInit();
status.memory.heapMemoryUsage_max = heapMemoryUsage.getMax();
status.memory.heapMemoryUsage_used = heapMemoryUsage.getUsed();
status.memory.heapMemoryUsage_committed = heapMemoryUsage.getCommitted();
status.memory.nonheapMemoryUsage_init = nonheapMemoryUsage.getInit();
status.memory.nonheapMemoryUsage_max = nonheapMemoryUsage.getMax();
status.memory.nonheapMemoryUsage_used = nonheapMemoryUsage.getUsed();
status.memory.nonheapMemoryUsage_committed = nonheapMemoryUsage.getCommitted();
}
catch (Exception e)
{
}
}
private void threadMXBean(ApplicationStatus status, long timestamp)
{
try
{
ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
if (status.thread == null) status.thread = new ApplicationStatusThread();
status.thread.timestamp = timestamp;
long[] threadsid = threadMXBean.getAllThreadIds();
long threadCpuTime = 0;
long threadUserTime = 0;
for (long threadid : threadsid)
{
try
{
long currentThreadCpuTime = threadMXBean.getThreadCpuTime(threadid);
long currentThreadUserTime = threadMXBean.getThreadUserTime(threadid);
if (currentThreadCpuTime > 0) threadCpuTime = threadCpuTime + currentThreadCpuTime;
if (currentThreadUserTime > 0) threadUserTime = threadUserTime + currentThreadUserTime;
}
catch (Exception e)
{
}
}
status.thread.threadCpuTime = threadCpuTime;
status.thread.threadUserTime = threadUserTime;
status.thread.totalStartedThreadCount = threadMXBean.getTotalStartedThreadCount();
status.thread.threadCount = threadMXBean.getThreadCount();
status.thread.peakThreadCount = threadMXBean.getPeakThreadCount();
status.thread.daemonThreadCount = threadMXBean.getDaemonThreadCount();
}
catch (Exception e)
{
}
}
private void runtimeMXBean(ApplicationStatus status, long timestamp)
{
try
{
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
if (status.runtime == null) status.runtime = new ApplicationStatusRuntime();
status.runtime.timestamp = timestamp;
status.runtime.startTime = runtimeMXBean.getStartTime();
status.runtime.upTime = runtimeMXBean.getUptime();
status.runtime.userTimeZone = runtimeMXBean.getSystemProperties().get("Time zone");
status.runtime.javaVmSpecificationVersion = runtimeMXBean.getSystemProperties().get("java.vm.specification.version");
status.runtime.javaRuntimeVersion = runtimeMXBean.getSystemProperties().get("java.runtime.version");
status.runtime.javaClassVersion = runtimeMXBean.getSystemProperties().get("java.class.version");
status.runtime.userCountry = runtimeMXBean.getSystemProperties().get("user.country");
status.runtime.userLanguage = runtimeMXBean.getSystemProperties().get("user.language");
status.runtime.userTimeZone = runtimeMXBean.getSystemProperties().get("user.timezone");
}
catch (Exception e)
{
}
}
private void operatingSystemMXBean(ApplicationStatus status, long timestamp)
{
try
{
OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean)ManagementFactory.getOperatingSystemMXBean();
if (status.system == null) status.system = new ApplicationStatusOperatingSystem();
status.system.timestamp = timestamp;
status.system.committedVirtualMemorySize = operatingSystemMXBean.getCommittedVirtualMemorySize();
status.system.name = operatingSystemMXBean.getName();
status.system.version = operatingSystemMXBean.getVersion();
status.system.arch = operatingSystemMXBean.getArch();
status.system.freePhysicalMemorySize = operatingSystemMXBean.getFreePhysicalMemorySize();
status.system.freeSwapSpaceSize = operatingSystemMXBean.getFreeSwapSpaceSize();
status.system.processCpuLoad = operatingSystemMXBean.getProcessCpuLoad();
status.system.processCpuTime = operatingSystemMXBean.getProcessCpuTime();
status.system.systemCpuLoad = operatingSystemMXBean.getSystemCpuLoad();
status.system.totalPhysicalMemorySize = operatingSystemMXBean.getTotalPhysicalMemorySize();
status.system.totalSwapSpaceSize = operatingSystemMXBean.getTotalSwapSpaceSize();
status.system.systemLoadAverage = operatingSystemMXBean.getSystemLoadAverage();
status.system.availableProcessors = operatingSystemMXBean.getAvailableProcessors();
status.system.totalPhysicalMemorySize = operatingSystemMXBean.getTotalPhysicalMemorySize();
status.system.systemLoadAverage = this.processorPercentage;
}
catch (Exception e)
{
}
}
//
}