vfs.java

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

JAVA
388
字号
/* * 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.vfs;import com.caucho.loader.EnvironmentLocal;import com.caucho.server.hmux.HmuxPath;import com.caucho.util.CharBuffer;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.Reader;import java.io.Writer;import java.util.Map;/** * Facade to create useful Path and Stream objects. * * <code><pre> * Path path = Vfs.lookup("foo.html"); * </pre><code> * * <p>The default scheme is the file scheme.  Other schemes are * available using the full url. * * <code><pre> * Path mail = Vfs.lookup("mailto:drofnats@foo.com.test?subject='hi'"); * Stream body = mail.openWrite(); * body.writeln("How's it going?"); * body.close(); * </pre><code> */public final class Vfs {  private static final EnvironmentLocal<Path> ENV_PWD    = new EnvironmentLocal<Path>("caucho.vfs.pwd");    private static final SchemeMap DEFAULT_SCHEME_MAP;    private static final EnvironmentLocal<SchemeMap> _localSchemeMap    = new EnvironmentLocal<SchemeMap>();    static FilesystemPath PWD;  private static boolean _isInitJNI;  private Vfs() {}    /**   * Returns a new path relative to the current directory.   *    * @param url a relative or absolute url   * @return the new path.   */  public static Path lookup(String url)  {    Path pwd = getPwd();    if (! url.startsWith("/"))      return pwd.lookup(url, null);    else      return PWD.lookup(url, null);  }  public static FilesystemPath getGlobalPwd()  {    return PWD;  }    /**   * Returns a path for the current directory.   */  public static Path getPwd()  {    Path pwd = ENV_PWD.get();        if (pwd == null) {      if (PWD == null) {	/* JNI set later	PWD = JniFilePath.create();	if (PWD == null)	  PWD = new FilePath(null);	*/	PWD = new FilePath(null);      }      pwd = PWD;      ENV_PWD.setGlobal(pwd);    }    return pwd;  }  public static SchemeMap getLocalScheme()  {    synchronized (_localSchemeMap) {      SchemeMap map = _localSchemeMap.getLevel();      if (map == null) {	map = _localSchemeMap.get().copy();		if (map == null)	  map = DEFAULT_SCHEME_MAP.copy();	_localSchemeMap.set(map);      }      return map;    }  }  /**   * Returns a path for the current directory.   */  public static Path getPwd(ClassLoader loader)  {    return ENV_PWD.get(loader);  }  /**   * Sets a path for the current directory in the current environment.   */  public static void setPwd(Path pwd)  {    setPwd(pwd, Thread.currentThread().getContextClassLoader());  }  /**   * Sets a path for the current directory in the current environment.   */  public static void setPwd(Path pwd, ClassLoader loader)  {    ENV_PWD.set(pwd, loader);  }  /**   * Returns a path for the current directory.   */  public static Path lookup()  {    return getPwd();  }  /**   * Returns a new path, including attributes.   * <p>For example, an application may want to set locale headers   * for an HTTP request.   *   * @param url the relative url   * @param attr attributes used in searching for the url   */  public static Path lookup(String url, Map<String,Object> attr)  {    return getPwd().lookup(url, attr);  }  /**   * Returns a path using the native filesystem conventions.   * <p>For example, on windows   *   * <code><pre>   * Path path = Vfs.lookup("d:\\temp\\test.html");   * </pre></code>   *   * @param url a relative path using the native filesystem conventions.   */  public static Path lookupNative(String url)  {    return getPwd().lookupNative(url, null);  }  /**   * Returns a native filesystem path with attributes.   *   * @param url a relative path using the native filesystem conventions.   * @param attr attributes used in searching for the url   */  public static Path lookupNative(String url, Map<String,Object> attr)  {    return getPwd().lookupNative(url, attr);  }  public static ReadWritePair openReadWrite(InputStream is, OutputStream os)  {    VfsStream s = new VfsStream(is, os);    WriteStream writeStream = new WriteStream(s);    ReadStream readStream = new ReadStream(s, writeStream);    return new ReadWritePair(readStream, writeStream);  }  /**   * Creates new ReadStream from an InputStream   */  public static ReadStream openRead(InputStream is)  {    if (is instanceof ReadStream)      return (ReadStream) is;        VfsStream s = new VfsStream(is, null);    return new ReadStream(s);  }  public static ReadStream openRead(InputStream is, WriteStream ws)  {    VfsStream s = new VfsStream(is, null);    return new ReadStream(s, ws);  }  /**   * Creates a ReadStream from a Reader   */  public static ReadStream openRead(Reader reader)  {    if (reader instanceof ReadStream.StreamReader)      return ((ReadStream.StreamReader) reader).getStream();        ReaderWriterStream s = new ReaderWriterStream(reader, null);    ReadStream is = new ReadStream(s);    try {      is.setEncoding("utf-8");    } catch (Exception e) {    }    return is;  }  /**   * Create a ReadStream from a string.  utf-8 is used as the encoding   */  public static ReadStream openRead(String path)    throws IOException  {    return Vfs.lookup(path).openRead();  }  public static ReadStream openString(String string)  {    return com.caucho.vfs.StringReader.open(string);  }  public static WriteStream openWrite(OutputStream os)  {    if (os instanceof WriteStream)      return ((WriteStream) os);        VfsStream s = new VfsStream(null, os);    return new WriteStream(s);  }  public static WriteStream openWrite(Writer writer)  {    ReaderWriterStream s = new ReaderWriterStream(null, writer);    WriteStream os = new WriteStream(s);        try {      os.setEncoding("utf-8");    } catch (Exception e) {    }    return os;  }  /**   * Creates a write stream to a CharBuffer.  This is the standard way   * to write to a string.   */  public static WriteStream openWrite(CharBuffer cb)  {    com.caucho.vfs.StringWriter s = new com.caucho.vfs.StringWriter(cb);    WriteStream os = new WriteStream(s);        try {      os.setEncoding("utf-8");    } catch (Exception e) {    }    return os;  }  public static WriteStream openWrite(String path)    throws IOException  {    return lookup(path).openWrite();  }  public static WriteStream openAppend(String path)    throws IOException  {    return lookup(path).openAppend();  }  /**   * Initialize the JNI.   */  public static void initJNI()  {    if (_isInitJNI)      return;    _isInitJNI = true;        // order matters because of static init and license checking    FilesystemPath jniFilePath = JniFilePath.create();    if (jniFilePath != null) {      DEFAULT_SCHEME_MAP.put("file", jniFilePath);            SchemeMap localMap = _localSchemeMap.get();      if (localMap != null)	localMap.put("file", jniFilePath);            localMap = _localSchemeMap.get(ClassLoader.getSystemClassLoader());      if (localMap != null)	localMap.put("file", jniFilePath);            Vfs.PWD = jniFilePath;      Vfs.setPwd(jniFilePath);    }  }  static {    DEFAULT_SCHEME_MAP = new SchemeMap();    Path.setDefaultSchemeMap(DEFAULT_SCHEME_MAP);    FilePath pwd = new FilePath(null);    PWD = pwd;    setPwd(pwd);    ENV_PWD.setGlobal(pwd);    ENV_PWD.set(pwd);        _localSchemeMap.setGlobal(DEFAULT_SCHEME_MAP);        DEFAULT_SCHEME_MAP.put("file", pwd);        DEFAULT_SCHEME_MAP.put("memory", new MemoryScheme());        DEFAULT_SCHEME_MAP.put("jar", new JarScheme(null));     DEFAULT_SCHEME_MAP.put("mailto",				 new MailtoPath(null, null, null, null));    DEFAULT_SCHEME_MAP.put("classpath", new ClasspathPath(null, "", ""));    DEFAULT_SCHEME_MAP.put("http", new HttpPath("127.0.0.1", 0));    DEFAULT_SCHEME_MAP.put("https", new HttpsPath("127.0.0.1", 0));    DEFAULT_SCHEME_MAP.put("hmux", new HmuxPath("127.0.0.1", 0));    DEFAULT_SCHEME_MAP.put("tcp", new TcpPath(null, null, null, "127.0.0.1", 0));    DEFAULT_SCHEME_MAP.put("tcps", new TcpsPath(null, null, null, "127.0.0.1", 0));    // DEFAULT_SCHEME_MAP.put("log", new LogPath(null, "/", null, "/"));    DEFAULT_SCHEME_MAP.put("merge", new MergePath());    StreamImpl stdout = StdoutStream.create();    StreamImpl stderr = StderrStream.create();    DEFAULT_SCHEME_MAP.put("stdout", stdout.getPath());    DEFAULT_SCHEME_MAP.put("stderr", stderr.getPath());    VfsStream nullStream = new VfsStream(null, null);    DEFAULT_SCHEME_MAP.put("null", new ConstPath(null, nullStream));    DEFAULT_SCHEME_MAP.put("jndi", new JndiPath());        DEFAULT_SCHEME_MAP.put("config", new ConfigPath());    DEFAULT_SCHEME_MAP.put("spy", new SpyScheme());   }}

⌨️ 快捷键说明

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