env.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 3,016 行 · 第 1/5 页

JAVA
3,016
字号
/* * 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.quercus.env;import com.caucho.quercus.*;import com.caucho.quercus.expr.Expr;import com.caucho.quercus.function.Marshal;import com.caucho.quercus.function.MarshalFactory;import com.caucho.quercus.lib.ErrorModule;import com.caucho.quercus.lib.VariableModule;import com.caucho.quercus.lib.OptionsModule;import com.caucho.quercus.lib.file.FileModule;import com.caucho.quercus.lib.file.PhpStderr;import com.caucho.quercus.lib.file.PhpStdin;import com.caucho.quercus.lib.file.PhpStdout;import com.caucho.quercus.lib.string.StringModule;import com.caucho.quercus.lib.string.StringUtility;import com.caucho.quercus.module.ModuleContext;import com.caucho.quercus.module.ModuleStartupListener;import com.caucho.quercus.module.IniDefinition;import com.caucho.quercus.page.QuercusPage;import com.caucho.quercus.program.*;import com.caucho.quercus.resources.StreamContextResource;import com.caucho.util.*;import com.caucho.vfs.ByteToChar;import com.caucho.vfs.Encoding;import com.caucho.vfs.NullPath;import com.caucho.vfs.Path;import com.caucho.vfs.ReadStream;import com.caucho.vfs.WriteStream;import com.caucho.vfs.TempBuffer;import com.caucho.vfs.i18n.EncodingReader;import javax.script.Bindings;import javax.script.ScriptContext;import javax.servlet.ServletContext;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import javax.sql.DataSource;import java.io.IOException;import java.io.InputStream;import java.lang.ref.SoftReference;import java.lang.ref.WeakReference;import java.lang.reflect.Array;import java.net.URL;import java.sql.Connection;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.HashSet;import java.util.LinkedHashMap;import java.util.Map;import java.util.IdentityHashMap;import java.util.TimeZone;import java.util.logging.Level;import java.util.logging.Logger;/** * Represents the Quercus environment. */public class Env {  private static final L10N L = new L10N(Env.class);  private static final Logger log    = Logger.getLogger(Env.class.getName());  public static final int B_ERROR = 0;  public static final int B_WARNING = 1;  public static final int B_PARSE = 2;  public static final int B_NOTICE = 3;  public static final int B_CORE_ERROR = 4;  public static final int B_CORE_WARNING = 5;  public static final int B_COMPILE_ERROR = 6;  public static final int B_COMPILE_WARNING = 7;  public static final int B_USER_ERROR = 8;  public static final int B_USER_WARNING = 9;  public static final int B_USER_NOTICE = 10;  public static final int B_STRICT = 11;  public static final int B_RECOVERABLE_ERROR = 12;    public static final int B_LAST = B_RECOVERABLE_ERROR;  public static final int E_ERROR = 1 << B_ERROR;  public static final int E_WARNING = 1 << B_WARNING;  public static final int E_PARSE = 1 << B_PARSE;  public static final int E_NOTICE = 1 << B_NOTICE;  public static final int E_CORE_ERROR = 1 << B_CORE_ERROR;  public static final int E_CORE_WARNING = 1 << B_CORE_WARNING;  public static final int E_COMPILE_ERROR = 1 << B_COMPILE_ERROR;  public static final int E_COMPILE_WARNING = 1 << B_COMPILE_WARNING;  public static final int E_USER_ERROR = 1 << B_USER_ERROR;  public static final int E_USER_WARNING = 1 << B_USER_WARNING;  public static final int E_USER_NOTICE = 1 << B_USER_NOTICE;  public static final int E_ALL = 6143; //(4096 + 2048 - 1)  public static final int E_STRICT = 1 << B_STRICT;  public static final int E_RECOVERABLE_ERROR = 1 << B_RECOVERABLE_ERROR;  public static final int E_DEFAULT = E_ALL & ~E_NOTICE;  private static final int _SERVER = 1;  private static final int _GET = 2;  private static final int _POST = 3;  private static final int _COOKIE = 4;  private static final int _GLOBAL = 5;  private static final int _REQUEST = 6;  private static final int _SESSION = 7;  private static final int HTTP_GET_VARS = 8;  private static final int HTTP_POST_VARS = 9;  private static final int HTTP_COOKIE_VARS = 10;  private static final int PHP_SELF = 11;  private static final int _FILES = 12;  private static final int HTTP_POST_FILES = 13;  private static final int _ENV = 14;  private static final int HTTP_SERVER_VARS = 15;  private static final int HTTP_RAW_POST_DATA = 16;  private static final IntMap SPECIAL_VARS = new IntMap();  private static final StringValue PHP_SELF_STRING    = new StringBuilderValue("PHP_SELF");  private static final StringValue UTF8_STRING    = new StringBuilderValue("utf-8");  public static final Value []EMPTY_VALUE = new Value[0];  private static final    LruCache<ClassKey,SoftReference<QuercusClass>> _classCache    = new LruCache<ClassKey,SoftReference<QuercusClass>>(4096);  private static final    LruCache<IncludeKey,SoftReference<IncludeCache>> _includeCache    = new LruCache<IncludeKey,SoftReference<IncludeCache>>(4096);  private static ThreadLocal<Env> _threadEnv = new ThreadLocal<Env>();  private static final FreeList<AbstractFunction[]> _freeFunList    = new FreeList<AbstractFunction[]>(256);  protected final Quercus _quercus;  private final boolean _isUnicodeSemantics;   private QuercusPage _page;  private Value _this = NullThisValue.NULL;  private ArrayList<EnvCleanup> _cleanupList    = new ArrayList<EnvCleanup>();    private ArrayList<Shutdown> _shutdownList    = new ArrayList<Shutdown>();  private final HashMap<String, Var> _globalMap    = new HashMap<String, Var>(1024);    private HashMap<String, Var> _staticMap    = new HashMap<String, Var>();    private HashMap<String, Var> _map = _globalMap;  private HashMap<String, Value> _constMap    = new HashMap<String, Value>(1024);  private HashMap<String, Value> _lowerConstMap    = new HashMap<String, Value>(1024);  private HashMap<String, QuercusClass> _classMap    = new HashMap<String, QuercusClass>();  private HashMap<String, QuercusClass> _lowerClassMap    = new HashMap<String, QuercusClass>();  private HashSet<String> _initializedClassSet    = new HashSet<String>();  // Function map  public AbstractFunction []_fun;    // anonymous functions created by create_function()  public HashMap<String, AbstractFunction> _anonymousFunMap;    // Class map  public ClassDef []_classDef;  public QuercusClass []_qClass;  private IdentityHashMap<String, Value> _iniMap;  // specialMap is used for implicit resources like the mysql link  private HashMap<String, Object> _specialMap    = new HashMap<String, Object>();  // include_path ini  private int _iniCount = 1;  private String _defaultIncludePath;  private String _includePath;  private int _includePathIniCount;  private ArrayList<String> _includePathList;  private HashMap<Path,ArrayList<Path>> _includePathMap;  private LinkedHashMap<Path,QuercusPage> _includeMap    = new LinkedHashMap<Path,QuercusPage>();    private boolean _isAllowUrlInclude;  private boolean _isAllowUrlFopen;    private HashMap<StringValue,Path> _lookupCache    = new HashMap<StringValue,Path>();  private HashMap<ConnectionEntry,ConnectionEntry> _connMap    = new HashMap<ConnectionEntry,ConnectionEntry>();  private AbstractFunction _autoload;  private HashSet<String> _autoloadClasses    = new HashSet<String>();    private ArrayList<Callback> _autoloadList;  private long _startTime;  private long _timeLimit = 600000L;  private Expr [] _callStack = new Expr[256];  private Value [] _callThisStack = new Value[256];  private int _callStackTop;    private String _callingClass;  private Value [] _functionArgs;  private Path _selfPath;  private Path _selfDirectory;  private Path _pwd;  private Path _uploadPath;  private Path _tmpPath;  private ArrayList<Path> _removePaths;  private final boolean _isStrict;  private HttpServletRequest _request;  private HttpServletResponse _response;  private ArrayValue _postArray;  private StringValue _inputData;    private ArrayValue _files;  private SessionArrayValue _session;  private HttpSession _javaSession;  private ScriptContext _scriptContext;  private WriteStream _originalOut;  private OutputBuffer _outputBuffer;  private WriteStream _out;  private LocaleInfo _locale;  private Callback [] _prevErrorHandlers = new Callback[B_LAST + 1];  private Callback [] _errorHandlers = new Callback[B_LAST + 1];  private Callback _prevExceptionHandler;  private Callback _exceptionHandler;  private SessionCallback _sessionCallback;  private StreamContextResource _defaultStreamContext;  // XXX: need to look this up from the module itself  private int _errorMask = E_DEFAULT;  private int _objectId = 0;  private Logger _logger;  // hold special Quercus php import statements  private ImportMap _importMap;  private TimeZone _defaultTimeZone;  private Object _gzStream;  private Env _oldThreadEnv;    public Env(Quercus quercus,             QuercusPage page,             WriteStream out,             HttpServletRequest request,             HttpServletResponse response)  {    _quercus = quercus;    _isStrict = quercus.isStrict();    _isUnicodeSemantics = quercus.isUnicodeSemantics();        _isAllowUrlInclude = quercus.isAllowUrlInclude();    _isAllowUrlFopen = quercus.isAllowUrlFopen();    _page = page;    // XXX: grab initial from page    // _defState = new DefinitionState(quercus);    AbstractFunction []defFuns = quercus.getFunctionMap();    _fun = _freeFunList.allocate();    if (_fun == null || _fun.length != defFuns.length)      _fun = new AbstractFunction[defFuns.length];    System.arraycopy(defFuns, 0, _fun, 0, defFuns.length);    ClassDef []defClasses = quercus.getClassDefMap();    _classDef = new ClassDef[defClasses.length];    _qClass = new QuercusClass[_classDef.length];        _originalOut = out;    _out = out;    _request = request;    _response = response;    if (_page != null) {      _page.init(this);      _page.importDefinitions(this);    }    setPwd(_quercus.getPwd());    if (_page != null) {      setSelfPath(_page.getSelfPath(null));      // php/0b32      _includeMap.put(_selfPath, _page);    }        if (_request != null && _request.getMethod().equals("POST")) {      _postArray = new ArrayValueImpl();      _files = new ArrayValueImpl();      Post.fillPost(this,                    _postArray,                    _files,                    _request,                    getIniBoolean("magic_quotes_gpc"));    } else if (_request != null && ! _request.getMethod().equals("GET")) {      InputStream is = null;            try {        is = _request.getInputStream();      } catch (IOException e) {        warning(e);      }            StringValue bb = createBinaryBuilder();      bb.appendReadAll(is, Integer.MAX_VALUE);            setInputData(bb);    }    /*    Cluster cluster = Cluster.getLocal();    if (cluster != null) {      ClusterServer selfServer = cluster.getSelfServer();      if (selfServer != null)        setIni("caucho.server_id", selfServer.getId());    }    */    // Define the constant string PHP_VERSION    VariableModule.define(this,      this.createString("PHP_VERSION"),      OptionsModule.phpversion(this, null),      true);        // STDIN, STDOUT, STDERR    // php://stdin, php://stdout, php://stderr    if (response == null) {      VariableModule.define(this,                            this.createString("STDOUT"),                            wrapJava(new PhpStdout()),                            false);            VariableModule.define(this,                            this.createString("STDERR"),                            wrapJava(new PhpStderr()),                            false);      VariableModule.define(this,                            this.createString("STDIN"),                            wrapJava(new PhpStdin(this)),                            false);    }  }  public Env(Quercus quercus)  {    this(quercus, null, null, null, null);  }  public static Env getInstance()  {    return _threadEnv.get();  }  //  // i18n  //  /**   * Returns true if unicode.semantics is on.   */  public boolean isUnicodeSemantics()  {    return _isUnicodeSemantics;  }  /**   * Returns the encoding used for scripts.   */  public String getScriptEncoding()  {    StringValue encoding = getIni("unicode.script_encoding");    if (encoding.length() == 0) {      encoding = getIni("unicode.fallback_encoding");      if (encoding.length() == 0)        return getQuercus().getScriptEncoding();    }    return encoding.toString();  }  /**   * Returns the encoding used for runtime conversions, e.g. files   * XXX: ISO-8859-1 when unicode.semantics is OFF   */  public String getRuntimeEncoding()  {    if (! _isUnicodeSemantics)      return "iso-8859-1";        StringValue encoding = getIni("unicode.runtime_encoding");    if (encoding.length() == 0) {      encoding = getIni("unicode.fallback_encoding");      if (encoding.length() == 0)        encoding = UTF8_STRING;    }    return encoding.toString();  }  /**   * Sets the encoding used for runtime conversions.   */  public Value setRuntimeEncoding(String encoding)  {    return setIni("unicode.runtime_encoding", encoding);  }  /**   * Returns the encoding used for runtime conversions, e.g. files   */  public EncodingReader getRuntimeEncodingFactory()    throws IOException  {    return Encoding.getReadFactory(getRuntimeEncoding());  }  /**   * Returns the encoding used for input, i.e. post,   * null if unicode.semantics is off.   */  public String getHttpInputEncoding()  {    if (! _isUnicodeSemantics)      return null;        StringValue encoding = getIni("unicode.http_input_encoding");    if (encoding.length() == 0) {      encoding = getIni("unicode.fallback_encoding");      if (encoding.length() == 0)        encoding = UTF8_STRING;    }    return encoding.toString();  }  /**   * Returns the encoding used for output, null if unicode.semantics is off.   */  public String getOutputEncoding()  {    if (! _isUnicodeSemantics)      return null;    String encoding = Quercus.INI_UNICODE_OUTPUT_ENCODING.getAsString(this);    if (encoding == null)      encoding = Quercus.INI_UNICODE_FALLBACK_ENCODING.getAsString(this);    if (encoding == null)      encoding = "utf-8";    return encoding;  }  /**   * Creates a binary builder.   */  public StringValue createBinaryBuilder()  {    if (_isUnicodeSemantics)      return new BinaryBuilderValue();    else      return new StringBuilderValue();  }  /**   * Creates a binary builder for large things like files.   */  public StringValue createLargeBinaryBuilder()  {    if (_isUnicodeSemantics)      return new BinaryBuilderValue();    else      return new LargeStringBuilderValue();  }  /**   * Creates a binary builder.   */  public StringValue createBinaryBuilder(int length)  {    if (_isUnicodeSemantics)      return new BinaryBuilderValue(length);    else      return new StringBuilderValue(length);  }  /**   * Creates a binary builder.   */  public StringValue createBinaryBuilder(byte []buffer, int offset, int length)  {    if (_isUnicodeSemantics)      return new BinaryBuilderValue(buffer, offset, length);    else      return new StringBuilderValue(buffer, offset, length);  }  /**   * Creates a binary builder.   */  public StringValue createBinaryBuilder(byte []buffer)  {    if (_isUnicodeSemantics)      return new BinaryBuilderValue(buffer, 0, buffer.length);    else      return new StringBuilderValue(buffer, 0, buffer.length);  }  /**   * Creates a unicode builder.   */  public StringValue createUnicodeBuilder()  {    if (_isUnicodeSemantics)      return new UnicodeBuilderValue();    else      return new StringBuilderValue();  }

⌨️ 快捷键说明

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