/* * Copyright (c) 1998-2011 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 java.util.HashMap; /** * The top-level filesystem schemes are collected into a single map. * * <p>The default scheme has a number of standard filesystems, file:, mailto:, * jndi:, http:. * * <p>Applications can add schemes in the configuration file. When first * accessed, the SchemeMap will look in the Registry to match the scheme. * If the new scheme exists, it will instantiate a single root instance and * use that for the remainder of the application. * <code><pre> * <caucho.com> * <vfs scheme="foo" class-name="test.vfs.FooPath"/> * </caucho.com> * </pre></code> */ public class SchemeMap { // Constant null scheme map for protected filesystems. public static final SchemeMap NULL_SCHEME_MAP = new SchemeMap(); private final HashMap<String,SchemeRoot> _schemeMap = new HashMap<String,SchemeRoot>(); /** * Create an empty SchemeMap. */ public SchemeMap() { } /** * Create an empty SchemeMap. */ private SchemeMap(HashMap<String,SchemeRoot> map) { _schemeMap.putAll(map); } /** * The null scheme map is useful for protected filesystems as used * in createRoot(). That way, no dangerous code can get access to * files using, for example, the file: scheme. */ static SchemeMap getNullSchemeMap() { return NULL_SCHEME_MAP; } /** * Gets the scheme from the schemeMap. */ public Path get(String scheme) { SchemeRoot root = _schemeMap.get(scheme); Path path = null; if (root != null) path = root.getRoot(); if (path != null) { return path; } else { return new NotFoundPath(this, scheme + ":"); } } public SchemeRoot getSchemeRoot(String scheme) { return _schemeMap.get(scheme); } /** * Puts a new value in the schemeMap. */ public Path put(String scheme, Path path) { SchemeRoot oldRoot = _schemeMap.put(scheme, new SchemeRoot(path)); return oldRoot != null ? oldRoot.getRoot() : null; } /** * Puts a new value in the schemeMap. */ public SchemeRoot put(String scheme, SchemeRoot root) { return _schemeMap.put(scheme, root); } public SchemeMap copy() { return new SchemeMap(_schemeMap); } /** * Removes value from the schemeMap. */ public Path remove(String scheme) { SchemeRoot oldRoot = _schemeMap.remove(scheme); return oldRoot != null ? oldRoot.getRoot() : null; } }