CpuStat.java

package eu.linuxengineering.procfs;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import eu.javaexperience.collection.map.SmallMap;
import eu.javaexperience.io.IOTools;
import eu.javaexperience.parse.ParsePrimitive;
import eu.javaexperience.reflect.Mirror;
import eu.javaexperience.regex.RegexTools;

public class CpuStat
{
	public List<CpuStatEntry> cpuEntries = new ArrayList<>();
	
	public Map<String, Long> values = new SmallMap<>();
	
	public List<CpuStatOtherEntry> otherEntries = new ArrayList<>();
	
	public static class CpuStatOtherEntry
	{
		public String name;
		public List<Long> values = new ArrayList<>();
		
		public static CpuStatOtherEntry parse(String[] comp)
		{
			CpuStatOtherEntry ret = new CpuStatOtherEntry();
			ret.name = comp[0];
			for(int i=1;i<comp.length;++i)
			{
				ret.values.add(ParsePrimitive.tryParseLong(comp[i]));
			}
			
			return ret;
		}
		
		@Override
		public String toString()
		{
			return Mirror.usualToString(this);
		}
	}
	
	public static class CpuStatEntry
	{
		public String name;
		
		public long user;
		
		public long nice;
		public long system;
		public long idle;
		public long iowait;
		public long irq;
		public long softirq;
		
		public long steal;
		public long guest;
		
		protected static List<Field> CPU_FIELDS = new ArrayList<>();
		
		static
		{
			for(Field f:CpuStatEntry.class.getFields())
			{
				if(f.getType() == long.class)
				{
					CPU_FIELDS.add(f);
				}
			}
		}
		
		public static CpuStatEntry parse(String[] comp)
		{
			CpuStatEntry ret = new CpuStatEntry();
			ret.name = comp[0];
			for(int i=1;i<comp.length && i <= CPU_FIELDS.size();++i)
			{
				try
				{
					CPU_FIELDS.get(i-1).set(ret, ParsePrimitive.tryParseLong(comp[i]));
				}
				catch(Exception e)
				{
					e.printStackTrace();
				}
			}
			
			return ret;
		}
		
		@Override
		public String toString()
		{
			return Mirror.usualToString(this);
		}
	}
	
	@Override
	public String toString()
	{
		return Mirror.usualToString(this);
	}
	
	public static CpuStat parseStatData(String data)
	{
		CpuStat ret = new CpuStat();
		
		for(String line:RegexTools.LINUX_NEW_LINE.split(data))
		{
			String[] comp = RegexTools.SPACES.split(line);
			if(0 == comp.length)
			{
				continue;
			}
			
			if(2 == comp.length)
			{
				ret.values.put(comp[0], ParsePrimitive.tryParseLong(comp[1]));
			}
			
			if(comp[0].startsWith("cpu"))
			{
				CpuStatEntry add = CpuStatEntry.parse(comp);
				if(null != add)
				{
					ret.cpuEntries.add(add);
				}
			}
			else
			{
				CpuStatOtherEntry oth = CpuStatOtherEntry.parse(comp);
				if(null != oth)
				{
					ret.otherEntries.add(oth);
				}
			}
		}
		
		return ret;
	}
	
	public static void main(String[] args) throws Throwable
	{
		System.out.println(CpuStat.parseStatData(new String(IOTools.loadFileProcContent("/proc/stat"))));
	}
}