[SIGAR-29] Add pdh language translation support
This commit is contained in:
		
							parent
							
								
									3b5ce46c4d
								
							
						
					
					
						commit
						a4f7770067
					
				@ -22,6 +22,9 @@ import java.util.ArrayList;
 | 
				
			|||||||
import java.util.HashMap;
 | 
					import java.util.HashMap;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.StringTokenizer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.hyperic.sigar.SigarLoader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class Pdh extends Win32 {
 | 
					public class Pdh extends Win32 {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -30,6 +33,21 @@ public class Pdh extends Win32 {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private long   query = -1l; // Handle to the query
 | 
					    private long   query = -1l; // Handle to the query
 | 
				
			||||||
    private String hostname = null;
 | 
					    private String hostname = null;
 | 
				
			||||||
 | 
					    private static Map counters = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static {
 | 
				
			||||||
 | 
					        final String prop = "sigar.pdh.enableTranslation";
 | 
				
			||||||
 | 
					        if (SigarLoader.IS_WIN32 &&
 | 
				
			||||||
 | 
					            "true".equals(System.getProperty(prop)))
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                enableTranslation();
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                System.err.println(prop + ": " +
 | 
				
			||||||
 | 
					                                   e.getMessage());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public Pdh() throws Win32Exception {
 | 
					    public Pdh() throws Win32Exception {
 | 
				
			||||||
        this.query = pdhOpenQuery();
 | 
					        this.query = pdhOpenQuery();
 | 
				
			||||||
@ -55,6 +73,18 @@ public class Pdh extends Win32 {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static void enableTranslation() throws Win32Exception {
 | 
				
			||||||
 | 
					        if (counters != null) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if (LocaleInfo.isEnglish()) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        counters = getEnglishPerflibCounterMap();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static class PerflibCounterMap extends ArrayList {
 | 
					    private static class PerflibCounterMap extends ArrayList {
 | 
				
			||||||
        private Map map = new HashMap();
 | 
					        private Map map = new HashMap();
 | 
				
			||||||
        private String index = null;
 | 
					        private String index = null;
 | 
				
			||||||
@ -123,6 +153,57 @@ public class Pdh extends Win32 {
 | 
				
			|||||||
        return getValue(path, true);
 | 
					        return getValue(path, true);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static final String DELIM = "\\";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private static String getCounterName(String englishName)
 | 
				
			||||||
 | 
					        throws Win32Exception {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String index = (String)counters.get(englishName);
 | 
				
			||||||
 | 
					        if (index == null) {
 | 
				
			||||||
 | 
					            return englishName;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        int ix = Integer.parseInt(index);
 | 
				
			||||||
 | 
					        String name = getCounterName(ix);
 | 
				
			||||||
 | 
					        return name;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public static String translate(String path)
 | 
				
			||||||
 | 
					        throws Win32Exception {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (counters == null) {
 | 
				
			||||||
 | 
					            return path;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        StringBuffer trans = new StringBuffer();
 | 
				
			||||||
 | 
					        StringTokenizer tok =
 | 
				
			||||||
 | 
					            new StringTokenizer(path, DELIM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        int num = tok.countTokens();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (num == 3) {
 | 
				
			||||||
 | 
					            String hostname = tok.nextToken();
 | 
				
			||||||
 | 
					            trans.append(DELIM).append(DELIM).append(hostname);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String object = tok.nextToken();
 | 
				
			||||||
 | 
					        String instance = null;
 | 
				
			||||||
 | 
					        int ix = object.indexOf('(');
 | 
				
			||||||
 | 
					        if (ix != -1) {
 | 
				
			||||||
 | 
					            instance = object.substring(ix);
 | 
				
			||||||
 | 
					            object = object.substring(0, ix);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        trans.append(DELIM).append(getCounterName(object));
 | 
				
			||||||
 | 
					        if (instance != null) {
 | 
				
			||||||
 | 
					            trans.append(instance);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        String counter = tok.nextToken();
 | 
				
			||||||
 | 
					        trans.append(DELIM).append(getCounterName(counter));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return trans.toString();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private double getValue(String path, boolean format)
 | 
					    private double getValue(String path, boolean format)
 | 
				
			||||||
        throws Win32Exception {
 | 
					        throws Win32Exception {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -130,7 +211,8 @@ public class Pdh extends Win32 {
 | 
				
			|||||||
            pdhConnectMachine(this.hostname);
 | 
					            pdhConnectMachine(this.hostname);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        long counter = pdhAddCounter(this.query, path);
 | 
					        long counter =
 | 
				
			||||||
 | 
					            pdhAddCounter(this.query, translate(path));
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
            return pdhGetValue(this.query, counter, format);
 | 
					            return pdhGetValue(this.query, counter, format);
 | 
				
			||||||
        } finally {
 | 
					        } finally {
 | 
				
			||||||
 | 
				
			|||||||
@ -39,44 +39,26 @@ public class TestPdh extends SigarTestCase {
 | 
				
			|||||||
                            (long)pdh.getFormattedValue(key));
 | 
					                            (long)pdh.getFormattedValue(key));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private String getCounterName(String index)
 | 
					 | 
				
			||||||
        throws Exception {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        String name =
 | 
					 | 
				
			||||||
            Pdh.getCounterName(Integer.parseInt(index));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return name;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private void getValue(String object, String counter)
 | 
					 | 
				
			||||||
        throws Exception {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        object = getCounterName(object);
 | 
					 | 
				
			||||||
        counter = getCounterName(counter);
 | 
					 | 
				
			||||||
        getValue("\\" + object + "\\" + counter);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    //XXX restore original test below when this is handled internally
 | 
					 | 
				
			||||||
    public void testGetValue() throws Exception {
 | 
					    public void testGetValue() throws Exception {
 | 
				
			||||||
        Map counters = Pdh.getEnglishPerflibCounterMap();
 | 
					        Pdh.enableTranslation();
 | 
				
			||||||
 | 
					        final String DL = "\\";
 | 
				
			||||||
        String[][] keys = {
 | 
					        String[][] keys = {
 | 
				
			||||||
 | 
					            { "System", "System Up Time" },
 | 
				
			||||||
            { "Memory", "Available Bytes" },
 | 
					            { "Memory", "Available Bytes" },
 | 
				
			||||||
            { "Memory", "Pages/sec" },
 | 
					            { "Memory", "Pages/sec" },
 | 
				
			||||||
 | 
					            { "Processor(_Total)", "% User Time" },
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        for (int i=0; i<keys.length; i++) {
 | 
					 | 
				
			||||||
            String object = (String)counters.get(keys[i][0]);
 | 
					 | 
				
			||||||
            String counter = (String)counters.get(keys[i][1]);
 | 
					 | 
				
			||||||
            getValue(object, counter);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void ORIGINAL_testGetValue() throws Exception {
 | 
					 | 
				
			||||||
        String[] keys = {
 | 
					 | 
				
			||||||
            "\\Memory\\Available Bytes",
 | 
					 | 
				
			||||||
            "\\Memory\\Pages/sec",
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        for (int i=0; i<keys.length; i++) {
 | 
					        for (int i=0; i<keys.length; i++) {
 | 
				
			||||||
            getValue(keys[i]);
 | 
					            String path =
 | 
				
			||||||
 | 
					                DL + keys[i][0] + DL + keys[i][1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            String trans = Pdh.translate(path);
 | 
				
			||||||
 | 
					            if (!trans.equals(path)) {
 | 
				
			||||||
 | 
					                traceln(path + "-->" + trans);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            getValue(path);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        /* XXX hangs for a while on my XP box
 | 
					        /* XXX hangs for a while on my XP box
 | 
				
			||||||
        String bogusKey = "\\Does Not\\Exist";
 | 
					        String bogusKey = "\\Does Not\\Exist";
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user