package org.rzo.yajsw.os.ms.win.w32; import java.util.logging.Logger; import org.apache.commons.lang.StringUtils; import org.apache.commons.vfs.FileSystemException; import org.rzo.yajsw.script.Script; import org.rzo.yajsw.script.ScriptFactory; import org.rzo.yajsw.util.VFSUtils; public class ScriptCounter implements PdhCounter { Logger _log = Logger.getLogger(getClass().getName()); Script _script; private String _scriptFile; String _counterString; private String[] _args; private long _lastModified; /** * Format "\ScriptCounter(abc.groovy)\arg1,arg2,..." */ public ScriptCounter(String counterString) { init(counterString); checkScript(); } private void init(String counterString) { _counterString = counterString; _scriptFile = StringUtils.substringBetween(counterString, "(", ")"); String argsString = StringUtils.substringAfter(counterString, ")\\"); if (argsString != null) _args = StringUtils.split(argsString, ","); } private void checkScript() { long lastModified; try { lastModified = VFSUtils.resolveFile(".", _scriptFile).getContent().getLastModifiedTime(); } catch (FileSystemException e) { throw new IllegalArgumentException("Cannot find script " + _scriptFile + " ex=" + e.getMessage()); } if (_lastModified == lastModified) return; else { _lastModified = lastModified; _script = ScriptFactory.createScript(_scriptFile, _counterString, null, _args, _log, 0); if (_script == null) throw new IllegalArgumentException("Cannot find script " + _scriptFile); } } public void close() { // nothing } public double getDoubleValue() { checkScript(); Object result = _script.execute(); if (result instanceof Number) return ((Number) result).doubleValue(); else return Double.parseDouble((String) result); } public int getIntValue() { checkScript(); Object result = _script.execute(); if (result instanceof Number) return ((Number) result).intValue(); else return Integer.parseInt((String) result); } public boolean isValid() { try { getIntValue(); return true; } catch (Exception e) { try { getDoubleValue(); return true; } catch (Exception e2) { return false; } } } }