Package railo.commons.io

Source Code of railo.commons.io.SystemUtil

package railo.commons.io;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.lang.management.MemoryType;
import java.lang.management.MemoryUsage;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.NetworkInterface;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.ServletContext;

import railo.commons.digest.MD5;
import railo.commons.io.res.Resource;
import railo.commons.io.res.ResourceProvider;
import railo.commons.io.res.ResourcesImpl;
import railo.commons.io.res.util.ResourceUtil;
import railo.commons.lang.ClassUtil;
import railo.commons.lang.StringUtil;
import railo.loader.TP;
import railo.loader.engine.CFMLEngineFactory;
import railo.runtime.Info;
import railo.runtime.config.Config;
import railo.runtime.exp.ApplicationException;
import railo.runtime.exp.DatabaseException;
import railo.runtime.functions.other.CreateUniqueId;
import railo.runtime.net.http.ReqRspUtil;
import railo.runtime.op.Caster;
import railo.runtime.type.Array;
import railo.runtime.type.Collection;
import railo.runtime.type.KeyImpl;
import railo.runtime.type.Query;
import railo.runtime.type.QueryImpl;
import railo.runtime.type.Struct;
import railo.runtime.type.StructImpl;
import railo.runtime.type.util.KeyConstants;
import railo.runtime.type.util.ListUtil;

import com.jezhumble.javasysmon.CpuTimes;
import com.jezhumble.javasysmon.JavaSysMon;
import com.jezhumble.javasysmon.MemoryStats;

/**
*
*/
public final class SystemUtil {

  public static final int MEMORY_TYPE_ALL=0;
  public static final int MEMORY_TYPE_HEAP=1;
  public static final int MEMORY_TYPE_NON_HEAP=2;

  public static final int ARCH_UNKNOW=0;
  public static final int ARCH_32=32;
  public static final int ARCH_64=64;

  public static final char CHAR_DOLLAR=(char)36;
  public static final char CHAR_POUND=(char)163;
  public static final char CHAR_EURO=(char)8364;
 

  public static final int OUT = 0;
  public static final int ERR = 1;
 
  private static final PrintWriter PRINTWRITER_OUT = new PrintWriter(System.out);
  private static final PrintWriter PRINTWRITER_ERR = new PrintWriter(System.err);
 
  private static PrintWriter[] printWriter=new PrintWriter[2];
   
   
  private static final boolean isWindows=System.getProperty("os.name").toLowerCase().startsWith("windows");
    private static final boolean isUnix=!isWindows &&  File.separatorChar == '/';
 
    private static Resource tempFile;
    private static Resource homeFile;
    private static Resource[] classPathes;
    private static Charset charset;
    private static String lineSeparator=System.getProperty("line.separator","\n");
    private static MemoryPoolMXBean permGenSpaceBean;

  public static int osArch=-1;
  public static int jreArch=-1;
 
  static {
    String strCharset=System.getProperty("file.encoding");
    if(strCharset==null || strCharset.equalsIgnoreCase("MacRoman"))
      strCharset="cp1252";

    if(strCharset.equalsIgnoreCase("utf-8")) charset=CharsetUtil.UTF8;
    else if(strCharset.equalsIgnoreCase("iso-8859-1")) charset=CharsetUtil.ISO88591;
    else charset=CharsetUtil.toCharset(strCharset,null);
   
    // Perm Gen
    permGenSpaceBean=getPermGenSpaceBean();
    // make sure the JVM does not always a new bean
    MemoryPoolMXBean tmp = getPermGenSpaceBean();
    if(tmp!=permGenSpaceBean)permGenSpaceBean=null;
  }
 
 
 
  public static MemoryPoolMXBean getPermGenSpaceBean() {
    java.util.List<MemoryPoolMXBean> manager = ManagementFactory.getMemoryPoolMXBeans();
    MemoryPoolMXBean bean;
    // PERM GEN
    Iterator<MemoryPoolMXBean> it = manager.iterator();
    while(it.hasNext()){
      bean = it.next();
      if("Perm Gen".equalsIgnoreCase(bean.getName()) || "CMS Perm Gen".equalsIgnoreCase(bean.getName())) {
        return bean;
      }
    }
    it = manager.iterator();
    while(it.hasNext()){
      bean = it.next();
      if(StringUtil.indexOfIgnoreCase(bean.getName(),"Perm Gen")!=-1 || StringUtil.indexOfIgnoreCase(bean.getName(),"PermGen")!=-1) {
        return bean;
      }
    }
    // take none-heap when only one
    it = manager.iterator();
    LinkedList<MemoryPoolMXBean> beans=new LinkedList<MemoryPoolMXBean>();
    while(it.hasNext()){
      bean = it.next();
      if(bean.getType().equals(MemoryType.NON_HEAP)) {
        beans.add(bean);
        return bean;
      }
    }
    if(beans.size()==1) return beans.getFirst();
   
    // Class Memory/ClassBlock Memory?
    it = manager.iterator();
    while(it.hasNext()){
      bean = it.next();
      if(StringUtil.indexOfIgnoreCase(bean.getName(),"Class Memory")!=-1) {
        return bean;
      }
    }
   
   
    return null;
  }
 
    private static Boolean isFSCaseSensitive;
  private static JavaSysMon jsm;
  private static Boolean isCLI;
  private static double loaderVersion=0D;
  private static String macAddress;

    /**
     * returns if the file system case sensitive or not
     * @return is the file system case sensitive or not
     */
    public static boolean isFSCaseSensitive() {
        if(isFSCaseSensitive==null) {
                try {
                  _isFSCaseSensitive(File.createTempFile("abcx","txt"));
                }
                catch (IOException e) {
                File f = new File("abcx.txt").getAbsoluteFile();
                try {
            f.createNewFile();
                      _isFSCaseSensitive(f);
           
          } catch (IOException e1) {
            throw new RuntimeException(e1.getMessage());
          }
                }
        }
        return isFSCaseSensitive.booleanValue();
    }
    private static void _isFSCaseSensitive(File f) {
        File temp=new File(f.getPath().toUpperCase());
        isFSCaseSensitive=temp.exists()?Boolean.FALSE:Boolean.TRUE;
        f.delete();
    }


  /**
   * fixes a java canonical path to a Windows path
   * e.g. /C:/Windows/System32 will be changed to C:\Windows\System32
   *
   * @param path
   * @return
   */
  public static String fixWindowsPath(String path) {
    if ( isWindows && path.length() > 3 && path.charAt(0) == '/' && path.charAt(2) == ':' ) {
      path = path.substring(1).replace( '/', '\\' );
    }
    return path;
  }


    /**
     * @return is local machine a Windows Machine
     */
    public static boolean isWindows() {
        return isWindows;
    }

    /**
     * @return is local machine a Unix Machine
     */
    public static boolean isUnix() {
        return isUnix;
    }

    /**
     * @return return System directory
     */
    public static Resource getSystemDirectory() {
        String pathes=System.getProperty("java.library.path");
        ResourceProvider fr = ResourcesImpl.getFileResourceProvider();
        if(pathes!=null) {
            String[] arr=ListUtil.toStringArrayEL(ListUtil.listToArray(pathes,File.pathSeparatorChar));
            for(int i=0;i<arr.length;i++) {   
                if(arr[i].toLowerCase().indexOf("windows\\system")!=-1) {
                    Resource file = fr.getResource(arr[i]);
                    if(file.exists() && file.isDirectory() && file.isWriteable()) return ResourceUtil.getCanonicalResourceEL(file);
                   
                }
            }
            for(int i=0;i<arr.length;i++) {   
                if(arr[i].toLowerCase().indexOf("windows")!=-1) {
                  Resource file = fr.getResource(arr[i]);
                    if(file.exists() && file.isDirectory() && file.isWriteable()) return ResourceUtil.getCanonicalResourceEL(file);
                   
                }
            }
            for(int i=0;i<arr.length;i++) {   
                if(arr[i].toLowerCase().indexOf("winnt")!=-1) {
                  Resource file = fr.getResource(arr[i]);
                    if(file.exists() && file.isDirectory() && file.isWriteable()) return ResourceUtil.getCanonicalResourceEL(file);
                   
                }
            }
            for(int i=0;i<arr.length;i++) {   
                if(arr[i].toLowerCase().indexOf("win")!=-1) {
                  Resource file = fr.getResource(arr[i]);
                    if(file.exists() && file.isDirectory() && file.isWriteable()) return ResourceUtil.getCanonicalResourceEL(file);
                   
                }
            }
            for(int i=0;i<arr.length;i++) {
              Resource file = fr.getResource(arr[i]);
                if(file.exists() && file.isDirectory() && file.isWriteable()) return ResourceUtil.getCanonicalResourceEL(file);
            }
        }
        return null;
    }
   
    /**
     * @return return running context root
     */
    public static Resource getRuningContextRoot() {
      ResourceProvider frp = ResourcesImpl.getFileResourceProvider();
       
        try {
            return frp.getResource(".").getCanonicalResource();
        } catch (IOException e) {}
        URL url=new Info().getClass().getClassLoader().getResource(".");
        try {
            return frp.getResource(FileUtil.URLToFile(url).getAbsolutePath());
        } catch (MalformedURLException e) {
            return null;
        }
    }
   
    /**
     * returns the Temp Directory of the System
     * @return temp directory
     */
    public static Resource getTempDirectory() {
        if(tempFile!=null) return tempFile;
        ResourceProvider fr = ResourcesImpl.getFileResourceProvider();
        String tmpStr = System.getProperty("java.io.tmpdir");
        if(tmpStr!=null) {
            tempFile=fr.getResource(tmpStr);
            if(tempFile.exists()) {
                tempFile=ResourceUtil.getCanonicalResourceEL(tempFile);
                return tempFile;
            }
        }
        File tmp =null;
        try {
          tmp = File.createTempFile("a","a");
            tempFile=fr.getResource(tmp.getParent());
            tempFile=ResourceUtil.getCanonicalResourceEL(tempFile);  
        }
        catch(IOException ioe) {}
        finally {
          if(tmp!=null)tmp.delete();
        }
        return tempFile;
    }
   

    /**
     * returns the a unique temp file (with no auto delete)
     * @param extension
     * @return temp directory
     * @throws IOException
     */
    public static Resource getTempFile(String extension, boolean touch) throws IOException {
      String filename=CreateUniqueId.invoke();
      if(!StringUtil.isEmpty(extension,true)){
        if(extension.startsWith("."))filename+=extension;
        else filename+="."+extension;
      }
    Resource file = getTempDirectory().getRealResource(filename);
    if(touch)ResourceUtil.touch(file);
    return file;
  }
   
    /**
     * returns the Hoome Directory of the System
     * @return home directory
     */
    public static Resource getHomeDirectory() {
        if(homeFile!=null) return homeFile;
       
        ResourceProvider frp = ResourcesImpl.getFileResourceProvider();
       
        String homeStr = System.getProperty("user.home");
        if(homeStr!=null) {
            homeFile=frp.getResource(homeStr);
            homeFile=ResourceUtil.getCanonicalResourceEL(homeFile);
        }
        return homeFile;
    }
   
    public static Resource getClassLoadeDirectory(){
      return ResourceUtil.toResource(CFMLEngineFactory.getClassLoaderRoot(TP.class.getClassLoader()));
    }

    /**
     * get class pathes from all url ClassLoaders
     * @param ucl URL Class Loader
     * @param pathes Hashmap with allpathes
     */
    private static void getClassPathesFromClassLoader(URLClassLoader ucl, ArrayList pathes) {
        ClassLoader pcl=ucl.getParent();
        // parent first
        if(pcl instanceof URLClassLoader)
            getClassPathesFromClassLoader((URLClassLoader) pcl, pathes);

        ResourceProvider frp = ResourcesImpl.getFileResourceProvider();
        // get all pathes
        URL[] urls=ucl.getURLs();
        for(int i=0;i<urls.length;i++) {
            Resource file=frp.getResource(urls[i].getPath());
            if(file.exists())
                pathes.add(ResourceUtil.getCanonicalResourceEL(file));
        }
       
    }
   
    /**
     * @return returns a string list of all pathes
     */
    public static Resource[] getClassPathes() {
       
        if(classPathes!=null)
            return classPathes;
       
        ArrayList pathes=new ArrayList();
        String pathSeperator=System.getProperty("path.separator");
        if(pathSeperator==null)pathSeperator=";";
           
    // java.ext.dirs
        ResourceProvider frp = ResourcesImpl.getFileResourceProvider();
     
       
    // pathes from system properties
        String strPathes=System.getProperty("java.class.path");
        if(strPathes!=null) {
            Array arr=ListUtil.listToArrayRemoveEmpty(strPathes,pathSeperator);
            int len=arr.size();
            for(int i=1;i<=len;i++) {
                Resource file=frp.getResource(Caster.toString(arr.get(i,""),"").trim());
                if(file.exists())
                    pathes.add(ResourceUtil.getCanonicalResourceEL(file));
            }
        }
       
       
    // pathes from url class Loader (dynamic loaded classes)
        ClassLoader cl = new Info().getClass().getClassLoader();
        if(cl instanceof URLClassLoader)
            getClassPathesFromClassLoader((URLClassLoader) cl, pathes);
       
        return classPathes=(Resource[]) pathes.toArray(new Resource[pathes.size()]);
       
    }

    public static long getUsedMemory() {
        Runtime r = Runtime.getRuntime();
        return r.totalMemory()-r.freeMemory();
    }
    public static long getAvailableMemory() {
        Runtime r = Runtime.getRuntime();
        return r.freeMemory();
    }

    /**
     * replace path placeholder with the real path, placeholders are [{temp-directory},{system-directory},{home-directory}]
     * @param path
     * @return updated path
     */
    public static String parsePlaceHolder(String path) {
        if(path==null) return path;
        // Temp
        if(path.startsWith("{temp")) {
            if(path.startsWith("}",5)) path=getTempDirectory().getRealResource(path.substring(6)).toString();
            else if(path.startsWith("-dir}",5)) path=getTempDirectory().getRealResource(path.substring(10)).toString();
            else if(path.startsWith("-directory}",5)) path=getTempDirectory().getRealResource(path.substring(16)).toString();
        }
        // System
        else if(path.startsWith("{system")) {
            if(path.startsWith("}",7)) path=getSystemDirectory().getRealResource(path.substring(8)).toString();
            else if(path.startsWith("-dir}",7)) path=getSystemDirectory().getRealResource(path.substring(12)).toString();
            else if(path.startsWith("-directory}",7)) path=getSystemDirectory().getRealResource(path.substring(18)).toString();
        }
        // Home
        else if(path.startsWith("{home")) {
            if(path.startsWith("}",5)) path=getHomeDirectory().getRealResource(path.substring(6)).toString();
            else if(path.startsWith("-dir}",5)) path=getHomeDirectory().getRealResource(path.substring(10)).toString();
            else if(path.startsWith("-directory}",5)) path=getHomeDirectory().getRealResource(path.substring(16)).toString();
        }
        // ClassLoaderDir
        else if(path.startsWith("{classloader")) {
            if(path.startsWith("}",12)) path=getClassLoadeDirectory().getRealResource(path.substring(13)).toString();
            else if(path.startsWith("-dir}",12)) path=getClassLoadeDirectory().getRealResource(path.substring(17)).toString();
            else if(path.startsWith("-directory}",12)) path=getClassLoadeDirectory().getRealResource(path.substring(23)).toString();
        }
        return path;
    }
   
    public static String addPlaceHolder(Resource file, String defaultValue) {
     // Temp
        String path=addPlaceHolder(getTempDirectory(),file,"{temp-directory}");
        if(!StringUtil.isEmpty(path)) return path;
     // System
        path=addPlaceHolder(getSystemDirectory(),file,"{system-directory}");
        if(!StringUtil.isEmpty(path)) return path;
     // Home
        path=addPlaceHolder(getHomeDirectory(),file,"{home-directory}");
        if(!StringUtil.isEmpty(path)) return path;
       
     
        return defaultValue;
    }
   
    private static String addPlaceHolder(Resource dir, Resource file,String placeholder) {
      if(ResourceUtil.isChildOf(file, dir)){
          try {
        return StringUtil.replace(file.getCanonicalPath(), dir.getCanonicalPath(), placeholder, true);
      }
          catch (IOException e) {}
        }
      return null;
  }
   

  public static String addPlaceHolder(Resource file,  Config config, String defaultValue) {
      //ResourceProvider frp = ResourcesImpl.getFileResourceProvider();
     
        // temp
          Resource dir = config.getTempDirectory();
          String path = addPlaceHolder(dir,file,"{temp-directory}");
          if(!StringUtil.isEmpty(path)) return path;
             
        // Config
          dir = config.getConfigDir();
          path = addPlaceHolder(dir,file,"{railo-config-directory}");
          if(!StringUtil.isEmpty(path)) return path;

        /* / Config WEB
          dir = config.getConfigDir();
          path = addPlaceHolder(dir,file,"{railo-server-directory}");
          if(!StringUtil.isEmpty(path)) return path;
*/
        // Web root
          dir = config.getRootDirectory();
          path = addPlaceHolder(dir,file,"{web-root-directory}");
          if(!StringUtil.isEmpty(path)) return path;

        return addPlaceHolder(file, defaultValue);
    }
 
  public static String parsePlaceHolder(String path, ServletContext sc, Map<String,String> labels) {
    if(path==null) return null;
        if(path.indexOf('{')!=-1){
          if((path.indexOf("{web-context-label}"))!=-1){
            String id=hash(sc);
           
            String label=labels.get(id);
            if(StringUtil.isEmpty(label)) label=id;
           
            path=StringUtil.replace(path, "{web-context-label}", label, false);
          }
        }
        return parsePlaceHolder(path, sc);
    }
   
  public static String parsePlaceHolder(String path, ServletContext sc) {
      ResourceProvider frp = ResourcesImpl.getFileResourceProvider();
     
     
        if(path==null) return null;
        if(path.indexOf('{')!=-1){
          if(StringUtil.startsWith(path,'{')){
             
              // Web Root
              if(path.startsWith("{web-root")) {
                  if(path.startsWith("}",9))           path=frp.getResource(ReqRspUtil.getRootPath(sc)).getRealResource(path.substring(10)).toString();
                  else if(path.startsWith("-dir}",9))     path=frp.getResource(ReqRspUtil.getRootPath(sc)).getRealResource(path.substring(14)).toString();
                  else if(path.startsWith("-directory}",9))   path=frp.getResource(ReqRspUtil.getRootPath(sc)).getRealResource(path.substring(20)).toString();
 
              }
              else path=SystemUtil.parsePlaceHolder(path);
          }
         
          if((path.indexOf("{web-context-hash}"))!=-1){
            String id=hash(sc);
            path=StringUtil.replace(path, "{web-context-hash}", id, false);
          }
        }
        return path;
    }
 
  public static String hash(ServletContext sc) {
      String id=null;
    try {
      id=MD5.getDigestAsString(ReqRspUtil.getRootPath(sc));
    }
    catch (IOException e) {}
    return id;
    }

    public static Charset getCharset() {
      return charset;
    }

  public static void setCharset(String charset) {
    SystemUtil.charset = CharsetUtil.toCharset(charset);
  }
  public static void setCharset(Charset charset) {
    SystemUtil.charset = charset;
  }

  public static String getOSSpecificLineSeparator() {
    return lineSeparator;
  }

  public static void sleep(int time) {
    try {
      Thread.sleep(time);
    } catch (InterruptedException e) {}
  }

  public static void sleep(long time) {
    try {
      Thread.sleep(time);
    } catch (InterruptedException e) {}
  }
  public static void join(Thread t) {
    try {
      t.join();
    } catch (InterruptedException e) {}
  }
 
  /**
   * locks the object (synchronized) before calling wait
   * @param lock
   * @param timeout
   * @throws InterruptedException
   */
  public static void wait(Object lock, long timeout) {
    try {
      synchronized (lock) {lock.wait(timeout);}
    } catch (InterruptedException e) {}
  }

  /**
   * locks the object (synchronized) before calling wait (no timeout)
   * @param lock
   * @throws InterruptedException
   */
  public static void wait(Object lock) {
    try {
      synchronized (lock) {lock.wait();}
    } catch (InterruptedException e) {}
  }
 
 
 
  /**
   * locks the object (synchronized) before calling notify
   * @param lock
   * @param timeout
   * @throws InterruptedException
   */
  public static void notify(Object lock) {
    synchronized (lock) {lock.notify();}
  }
 
  /**
   * locks the object (synchronized) before calling notifyAll
   * @param lock
   * @param timeout
   * @throws InterruptedException
   */
  public static void notifyAll(Object lock) {
    synchronized (lock) {lock.notifyAll();}
  }

  /**
   * return the operating system architecture
   * @return one of the following SystemUtil.ARCH_UNKNOW, SystemUtil.ARCH_32, SystemUtil.ARCH_64
   */
  public static int getOSArch(){
    if(osArch==-1) {
      osArch = toIntArch(System.getProperty("os.arch.data.model"));
      if(osArch==ARCH_UNKNOW)osArch = toIntArch(System.getProperty("os.arch"));
    }
    return osArch;
  }
 
  /**
   * return the JRE (Java Runtime Engine) architecture, this can be different from the operating system architecture
   * @return one of the following SystemUtil.ARCH_UNKNOW, SystemUtil.ARCH_32, SystemUtil.ARCH_64
   */
  public static int getJREArch(){
    if(jreArch==-1) {
      jreArch = toIntArch(System.getProperty("sun.arch.data.model"));
      if(jreArch==ARCH_UNKNOW)jreArch = toIntArch(System.getProperty("com.ibm.vm.bitmode"));
      if(jreArch==ARCH_UNKNOW)jreArch = toIntArch(System.getProperty("java.vm.name"));
      if(jreArch==ARCH_UNKNOW) {
        int addrSize = getAddressSize();
        if(addrSize==4) return ARCH_32;
        if(addrSize==8) return ARCH_64;
      }
     
    }
    return jreArch;
  }
 
  private static int toIntArch(String strArch){
    if(!StringUtil.isEmpty(strArch)) {
      if(strArch.indexOf("64")!=-1) return ARCH_64;
      if(strArch.indexOf("32")!=-1) return ARCH_32;
      if(strArch.indexOf("i386")!=-1) return ARCH_32;
      if(strArch.indexOf("x86")!=-1) return ARCH_32;
    }
    return ARCH_UNKNOW;
  }
 

 
  public static int getAddressSize() {
    try {
      Class unsafe = ClassUtil.loadClass(null,"sun.misc.Unsafe",null);
      if(unsafe==null) return 0;
   
      Field unsafeField = unsafe.getDeclaredField("theUnsafe");
        unsafeField.setAccessible(true);
        Object obj = unsafeField.get(null);
        Method addressSize = unsafe.getMethod("addressSize", new Class[0]);
       
        Object res = addressSize.invoke(obj, new Object[0]);
        return Caster.toIntValue(res,0);
    }
    catch(Throwable t){
      return 0;
    }
     
  }
  /*private static MemoryUsage getPermGenSpaceSize() {
    MemoryUsage mu = getPermGenSpaceSize(null);
    if(mu!=null) return mu;
   
    // create error message including info about available memory blocks
    StringBuilder sb=new StringBuilder();
    java.util.List<MemoryPoolMXBean> manager = ManagementFactory.getMemoryPoolMXBeans();
    Iterator<MemoryPoolMXBean> it = manager.iterator();
    MemoryPoolMXBean bean;
    while(it.hasNext()){
      bean = it.next();
      if(sb.length()>0)sb.append(", ");
      sb.append(bean.getName());
    }
    throw new RuntimeException("PermGen Space information not available, available Memory blocks are ["+sb+"]");
  }*/
 
  private static MemoryUsage getPermGenSpaceSize(MemoryUsage defaultValue) {
    if(permGenSpaceBean!=null) return permGenSpaceBean.getUsage();
    // create on the fly when the bean is not permanent
    MemoryPoolMXBean tmp = getPermGenSpaceBean();
    if(tmp!=null) return tmp.getUsage();
   
    return defaultValue;
  }
 

  public static long getFreePermGenSpaceSize() {
    MemoryUsage mu = getPermGenSpaceSize(null);
    if(mu==null) return -1;
   
    long max = mu.getMax();
    long used = mu.getUsed();
    if(max<0 || used<0) return -1;
    return max-used;
  }
 
  public static int getFreePermGenSpacePromille() {
    MemoryUsage mu = getPermGenSpaceSize(null);
    if(mu==null) return -1;
   
    long max = mu.getMax();
    long used = mu.getUsed();
    if(max<0 || used<0) return -1;
    return (int)(1000L-(1000L*used/max));
  }
 
  public static Query getMemoryUsageAsQuery(int type) throws DatabaseException {
   
   
    java.util.List<MemoryPoolMXBean> manager = ManagementFactory.getMemoryPoolMXBeans();
    Iterator<MemoryPoolMXBean> it = manager.iterator();
    Query qry=new QueryImpl(new Collection.Key[]{
        KeyConstants._name,
        KeyConstants._type,
        KeyConstants._used,
        KeyConstants._max,
        KeyConstants._init
    },0,"memory");
   
    int row=0;
    MemoryPoolMXBean bean;
    MemoryUsage usage;
    MemoryType _type;
    while(it.hasNext()){
      bean = it.next();
      usage = bean.getUsage();
      _type = bean.getType();
      if(type==MEMORY_TYPE_HEAP && _type!=MemoryType.HEAP)continue;
      if(type==MEMORY_TYPE_NON_HEAP && _type!=MemoryType.NON_HEAP)continue;
       
      row++;
      qry.addRow();
      qry.setAtEL(KeyConstants._name, row, bean.getName());
      qry.setAtEL(KeyConstants._type, row, _type.name());
      qry.setAtEL(KeyConstants._max, row, Caster.toDouble(usage.getMax()));
      qry.setAtEL(KeyConstants._used, row, Caster.toDouble(usage.getUsed()));
      qry.setAtEL(KeyConstants._init, row, Caster.toDouble(usage.getInit()));
     
    }
    return qry;
  }
 
  public static Struct getMemoryUsageAsStruct(int type) {
    java.util.List<MemoryPoolMXBean> manager = ManagementFactory.getMemoryPoolMXBeans();
    Iterator<MemoryPoolMXBean> it = manager.iterator();
   
    MemoryPoolMXBean bean;
    MemoryUsage usage;
    MemoryType _type;
    long used=0,max=0,init=0;
    while(it.hasNext()){
      bean = it.next();
      usage = bean.getUsage();
      _type = bean.getType();
      if((type==MEMORY_TYPE_HEAP && _type==MemoryType.HEAP) || (type==MEMORY_TYPE_NON_HEAP && _type==MemoryType.NON_HEAP)){
        used+=usage.getUsed();
        max+=usage.getMax();
        init+=usage.getInit();
      }
    }
    Struct sct=new StructImpl();
    sct.setEL(KeyConstants._used, Caster.toDouble(used));
    sct.setEL(KeyConstants._max, Caster.toDouble(max));
    sct.setEL(KeyConstants._init, Caster.toDouble(init));
    sct.setEL(KeyImpl.init("available"), Caster.toDouble(max-used));
    return sct;
  }
 

  public static Struct getMemoryUsageCompact(int type) {
    java.util.List<MemoryPoolMXBean> manager = ManagementFactory.getMemoryPoolMXBeans();
    Iterator<MemoryPoolMXBean> it = manager.iterator();
   
    MemoryPoolMXBean bean;
    MemoryUsage usage;
    MemoryType _type;
    Struct sct=new StructImpl();
    while(it.hasNext()){
      bean = it.next();
      usage = bean.getUsage();
      _type = bean.getType();
      if(type==MEMORY_TYPE_HEAP && _type!=MemoryType.HEAP)continue;
      if(type==MEMORY_TYPE_NON_HEAP && _type!=MemoryType.NON_HEAP)continue;
       
      double d=((int)(100D/usage.getMax()*usage.getUsed()))/100D;
      sct.setEL(KeyImpl.init(bean.getName()), Caster.toDouble(d));
    }
    return sct;
  }
 
  public static String getPropertyEL(String key) {
    try{
      String str = System.getProperty(key);
      if(!StringUtil.isEmpty(str,true)) return str;
     
      Iterator<Entry<Object, Object>> it = System.getProperties().entrySet().iterator();
      Entry<Object, Object> e;
      String n;
      while(it.hasNext()){
        e = it.next();
        n=(String) e.getKey();
        if(key.equalsIgnoreCase(n)) return (String) e.getValue();
      }
     
    }
    catch(Throwable t){}
    return null;
  }
  public static long microTime() {
    return System.nanoTime()/1000L;
  }
 
  public static TemplateLine getCurrentContext() {
    return _getCurrentContext(new Exception("Stack trace"));
  }
  private static TemplateLine _getCurrentContext(Throwable t) {
   
    //Throwable root = t.getRootCause();
    Throwable cause = t.getCause();
    if(cause!=null)_getCurrentContext(cause);
    StackTraceElement[] traces = t.getStackTrace();
   
   
        int line=0;
    String template;
   
    StackTraceElement trace=null;
    for(int i=0;i<traces.length;i++) {
      trace=traces[i];
      template=trace.getFileName();
      if(trace.getLineNumber()<=0 || template==null || ResourceUtil.getExtension(template,"").equals("java")) continue;
      line=trace.getLineNumber();
      return new TemplateLine(template,line);
    }
    return null;
  }
 
  public static class TemplateLine {

    public final String template;
    public final int line;

    public TemplateLine(String template, int line) {
      this.template=template;
      this.line=line;
    }
    public String toString(){
      return template+":"+line;
    }
  }

  public static long getFreeBytes() throws ApplicationException {
    return physical().getFreeBytes();
  }

  public static long getTotalBytes() throws ApplicationException {
    return physical().getTotalBytes();
  }
 
  public static double getCpuUsage(long time) throws ApplicationException {
    if(time<1) throw new ApplicationException("time has to be bigger than 0");
    if(jsm==null) jsm=new JavaSysMon();
    CpuTimes cput = jsm.cpuTimes();
    if(cput==null) throw new ApplicationException("CPU information are not available for this OS");
    CpuTimes previous = new CpuTimes(cput.getUserMillis(),cput.getSystemMillis(),cput.getIdleMillis());
        sleep(time);
       
        return jsm.cpuTimes().getCpuUsage(previous)*100D;
    }
 

  private synchronized static MemoryStats physical() throws ApplicationException {
    if(jsm==null) jsm=new JavaSysMon();
    MemoryStats p = jsm.physical();
    if(p==null) throw new ApplicationException("Memory information are not available for this OS");
    return p;
  }
  public static void setPrintWriter(int type,PrintWriter pw) {
    printWriter[type]=pw;
  }
  public static PrintWriter getPrintWriter(int type) {
    if(printWriter[type]==null) {
      if(type==OUT) printWriter[OUT]=PRINTWRITER_OUT;
      else printWriter[ERR]=PRINTWRITER_ERR;
    }
    return printWriter[type];
  }
  public static boolean isCLICall() {
      if(isCLI==null){
        isCLI=Caster.toBoolean(System.getProperty("railo.cli.call"),Boolean.FALSE);
      }
      return isCLI.booleanValue();
  }
 
  public static double getLoaderVersion() {
    // this is done via reflection to make it work in older version, where the class railo.loader.Version does not exist
    if(loaderVersion==0D) {
      loaderVersion=4D;
      Class cVersion = ClassUtil.loadClass(TP.class.getClassLoader(),"railo.loader.Version",null);
      if(cVersion!=null) {
        try {
          Field f = cVersion.getField("VERSION");
          loaderVersion=f.getDouble(null);
        }
        catch (Throwable t) {t.printStackTrace();}
      }
    }
    return loaderVersion;
  }
  public static String getMacAddress() {
    if(macAddress==null) {
      try{
        InetAddress ip = InetAddress.getLocalHost();
        NetworkInterface network = NetworkInterface.getByInetAddress(ip);
        byte[] mac = network.getHardwareAddress();
     
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < mac.length; i++) {
          sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));   
        }
        macAddress= sb.toString();
      }
      catch(Throwable t){}
     
    }
    return macAddress;
  }
}
TOP

Related Classes of railo.commons.io.SystemUtil

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.