cauchosystem.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 496 行

JAVA
496
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.server.util;import com.caucho.java.WorkDir;import com.caucho.loader.EnvironmentLocal;import com.caucho.util.Alarm;import com.caucho.util.CharBuffer;import com.caucho.util.CpuUsage;import com.caucho.util.Crc64;import com.caucho.vfs.CaseInsensitive;import com.caucho.vfs.Path;import com.caucho.vfs.Vfs;import java.io.File;import java.io.IOException;import java.net.InetAddress;import java.util.logging.Level;import java.util.logging.Logger;import java.util.regex.Pattern;/** * A wrapper for Caucho system variables, allowing tests to override * the default variables. */public class CauchoSystem {  private static Logger log    = Logger.getLogger("com.caucho.util.CauchoSystem");  static EnvironmentLocal<String> _serverIdLocal    = new EnvironmentLocal<String>("caucho.server-id");  static char _separatorChar = File.separatorChar;  static char _pathSeparatorChar = File.pathSeparatorChar;  static String _localHost;  static String _userDir;  static String _userName;  static Path _resinHome;  static Path _rootDirectory;  static boolean _isTesting;  static boolean _isTestWindows;  static boolean _hasJni;  private static int _isUnix = -1;  private static String _newline;  private static long _version;  private static JniCauchoSystem _jniCauchoSystem;  private static boolean _isDetailedStatistics;  private static String _user;  private static String _group;  private static String _classPath;  static CpuUsage _cpuUsage;    private CauchoSystem()  {  }  /**   * Returns true if we're currently running a test.   */  public static boolean isTesting()  {    return _isTesting;  }  public static void setIsTesting(boolean testing)  {    _isTesting = testing;  }  /**   * Sets the Path to be used as ResinHome.   */  public static void setResinHome(Path path)  {    _resinHome = path;  }  /**   * Gets the Path used as ResinHome.   */  public static Path getResinHome()  {    if (_resinHome != null)      return _resinHome;    String path = System.getProperty("resin.home");    if (path != null) {      _resinHome = Vfs.lookupNative(path);      return _resinHome;    }    String classpath = System.getProperty("java.class.path");    int head = 0;    char sep = getFileSeparatorChar();    char pathSep = sep == '/' ? ':' : ';';    while (path == null) {      int p = classpath.indexOf(pathSep, head);      String subpath;      if (p < 0)        subpath = classpath.substring(head);      else        subpath = classpath.substring(head, p);      if (subpath.endsWith(sep + "lib" + sep + "resin.jar") ||          subpath.equals("lib" + sep + "resin.jar")) {        path = subpath.substring(0, subpath.length() -                                    ("lib" + sep + "resin.jar").length());      }      else if (subpath.endsWith(sep + "classes") ||               subpath.equals("classes")) {        Path resinPath = Vfs.lookupNative(subpath);        resinPath = resinPath.lookup("com/caucho/util/CauchoSystem.class");        if (resinPath.exists()) {          path = subpath.substring(0, subpath.length() - "classes".length());        }      }      if (p < 0)        break;      else        head = p + 1;    }    if (path != null)      _resinHome = Vfs.lookupNative(path);    if (_resinHome != null && _resinHome.isDirectory())      return _resinHome;    /*    String userHome = System.getProperty("user.home");    if (userHome != null)      resinHome = Pwd.lookupNative(userHome).lookup(".resin-home");    if (resinHome != null && resinHome.isDirectory())      return resinHome;    */    return Vfs.lookup();  }  /**   * Gets the Path used as root directory   */  /**  public static Path getRootDirectory()  {    if (_rootDirectory != null)      return _rootDirectory;    String path = System.getProperty("server.root");    if (path != null) {      _rootDirectory = Vfs.lookupNative(path);      return _rootDirectory;    }    path = System.getProperty("resin.home");    if (path != null) {      _rootDirectory = Vfs.lookupNative(path);      return _rootDirectory;    }    _rootDirectory = getResinHome();    return _rootDirectory;  }   */  public static long getVersionId()  {    if (_version == 0) {      _version = Crc64.generate(com.caucho.Version.FULL_VERSION);    }    return _version;  }  public static String getResinConfig()  {    return getResinHome() + "/conf/resin.conf";  }  /**   * Returns a path to the work directory.  The work directory is   * specified in the resin.conf by /caucho.com/java/work-path.  If   * unspecified, it defaults to /tmp/caucho.   *   * @return directory path to work in.   */  public static Path getWorkPath()  {    Path workPath = WorkDir.getLocalWorkDir();    if (workPath != null)      return workPath;    String workDir;    // Windows uses /temp as a work dir    if (isWindows())      workDir = "file:/c:/tmp/caucho";    else      workDir = "file:/tmp/caucho";    Path path;    if (workDir.charAt(0) == '/')      path = Vfs.lookupNative(workDir);    else      path = CauchoSystem.getResinHome().lookupNative(workDir);    try {      path.mkdirs();    } catch (IOException e) {    }    return path;  }  public static String getServerId()  {    return _serverIdLocal.get();  }  public static String getUserDir()  {    if (_userDir == null)      _userDir = System.getProperty("user.dir");    return _userDir;  }  public static char getFileSeparatorChar()  {    return _separatorChar;  }  public static char getPathSeparatorChar()  {    return _pathSeparatorChar;  }  public static String getNewlineString()  {    if (_newline == null) {      Thread thread = Thread.currentThread();      ClassLoader oldLoader = thread.getContextClassLoader();      try {	thread.setContextClassLoader(ClassLoader.getSystemClassLoader());		_newline = System.getProperty("line.separator");	if (_newline != null) {	}	else if (isWindows())	  _newline = "\r\n";	else	  _newline = "\n";      } finally {	thread.setContextClassLoader(oldLoader);      }    }    return _newline;  }  public static boolean isWindows()  {    return _separatorChar == '\\' || _isTestWindows;  }  public static boolean isTest()  {    return Alarm.isTest();  }  public static boolean isCaseInsensitive()  {    return CaseInsensitive.isCaseInsensitive();  }  public static boolean isUnix()  {    if (_isUnix >= 0)      return _isUnix == 1;    _isUnix = 0;    if (_separatorChar == '/' && Vfs.lookup("/bin/sh").canRead())      _isUnix = 1;    return _isUnix == 1;  }  public static void setWindowsTest(boolean isWindows)  {    _isTesting = true;    _isTestWindows = isWindows;    Path.setTestWindows(isWindows);  }  public static String getLocalHost()  {    if (_localHost != null)      return _localHost;    try {      InetAddress addr = InetAddress.getLocalHost();      _localHost = addr.getHostName();    } catch (Exception e) {      _localHost = "127.0.0.1";    }    return _localHost;  }  public static boolean isJdk15()  {    try {      return Class.forName("java.lang.annotation.Annotation") != null;    } catch (Throwable e) {      return false;    }  }  public static String getUserName()  {    if (_userName == null)      _userName = System.getProperty("user.name");    return _userName;  }  /**   * Set true to cause the tracking of detailed statistcs, default false.   * Detailed statistics cause various parts of Resin to keep more detailed   * statistics at the possible expense of performance.   */  public static void setDetailedStatistics(boolean isVerboseStatistics)  {    _isDetailedStatistics = isVerboseStatistics;  }  /**   * Detailed statistics cause various parts of Resin to keep more detailed   * statistics at the possible expense of some performance.   */  public static boolean isDetailedStatistics()  {    return _isDetailedStatistics;  }  public static CpuUsage getCpuUsage()  {    return CpuUsage.create();  }  /**   * Loads a class from the context class loader.   *   * @param name the classname, separated by '.'   *   * @return the loaded class.   */  public static Class loadClass(String name)    throws ClassNotFoundException  {    return loadClass(name, false, null);  }  /**   * Loads a class from a classloader.  If the loader is null, uses the   * context class loader.   *   * @param name the classname, separated by '.'   * @param init if true, resolves the class instances   * @param loader the class loader   *   * @return the loaded class.   */  public static Class loadClass(String name, boolean init, ClassLoader loader)    throws ClassNotFoundException  {    if (loader == null)      loader = Thread.currentThread().getContextClassLoader();    if (loader == null || loader.equals(CauchoSystem.class.getClassLoader()))      return Class.forName(name);    else      return Class.forName(name, init, loader);  }  /**   * Returns the system classpath, including the bootpath   */  public static String getClassPath()  {    if (_classPath != null)      return _classPath;    String cp = System.getProperty("java.class.path");    String boot = System.getProperty("sun.boot.class.path");    if (boot != null && ! boot.equals(""))      cp = cp + File.pathSeparatorChar + boot;    Pattern pattern = Pattern.compile("" + File.pathSeparatorChar);    String []path = pattern.split(cp);    CharBuffer cb = new CharBuffer();    for (int i = 0; i < path.length; i++) {      Path subpath = Vfs.lookup(path[i]);      if (subpath.canRead() || subpath.isDirectory()) {        if (cb.length() > 0)          cb.append(File.pathSeparatorChar);        cb.append(path[i]);      }    }    _classPath = cb.toString();    return _classPath;  }  public static double getLoadAvg()  {    if (_jniCauchoSystem == null)      _jniCauchoSystem = JniCauchoSystem.create();    return _jniCauchoSystem.getLoadAvg();  }  /**   * Sets the runtime user so we don't need to run as root.   */  public static int setUser(String user, String group)    throws Exception  {    _user = user;    _group = group;    if (_hasJni && user != null)      return setUserNative(_user, _group);    else      return -1;  }  private static native int setUserNative(String user, String group)    throws IOException;  static {    try {      System.loadLibrary("resin");      _hasJni = true;    } catch (Throwable e) {      log.log(Level.FINE, e.toString(), e);    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?