<?xml version="1.0"?>
<!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->

<document>
    <properties>
        <title>Commons Virtual File System</title>
        <author email="dev@commons.apache.org">Apache Commons Developers</author>
    </properties>

    <body>
        <section name="Commons Virtual File System">

            <p>
                Commons VFS provides a single API for accessing
                various different file systems. It presents a uniform view of
                the files from various different sources, such as the files on
                local disk, on an HTTP server, or inside a Zip archive.
            </p>

            <p>Some of the features of Commons VFS are:</p>
            <ul>
                <li>
                    A single consistent API for accessing files of different
                    types.
                </li>
                <li>Support for numerous
                    <a href="filesystems.html">file system types</a>
                    .
                </li>
                <li>
                    Caching of file information. Caches information in-JVM,
                    and optionally can cache remote file information on the
                    local file system (replicator).
                </li>
                <li>Event delivery.</li>
                <li>
                    Support for logical file systems made up of files from
                    various different file systems.
                </li>
                <li>
                    Utilities for integrating Commons VFS into applications,
                    such as a VFS-aware ClassLoader and URLStreamHandlerFactory.
                </li>
                <li>A set of VFS-enabled
                    <a href="anttasks.html">Ant tasks</a>
                    .
                </li>
            </ul>

        </section>

        <section name="Requirements">
           <p>
            Apache Commons VFS 2.1 requires Java 6. Many of the file systems require that optional components be present
            in order for the protocol to be enabled. See the <a href="download.html">download and build</a> page for
            information on the optional dependencies.
          </p>
          <p>
           Apache Commons VFS 2.0 can be used in a Java 5 runtime.
          </p>
        </section>

        <section name="News">
          <p>
            Apache Commons VFS 2.1 is a bugfix release to VFS 2.0. If you meet the requirements you should be able 
            to replace 2.0 with 2.1 without the need for changes to API consumers. VFS 2.1 has introduced some now 
            methods for provider interfaces (like <code>FileObject</code>). If you implement a VFS provider and use the
            corresponding <code>Abstract*</code> or <code>Default*</code> classes, there should be no need to modify
            the code or recompile the provider.
            See the <a href="https://archive.apache.org/dist/commons/vfs/RELEASE_NOTES.txt">Release Notes</a> and the
            <a href="commons-vfs2/clirr-report.html">Clirr Report</a> for details. VFS 2.1 adds a new read-only provider
            for the Apache Hadoop (HDFS) File system.
          </p><p>
            Apache Commons VFS 2.0 adds support for FTPS and WebDav have been added in addition to many bugs
            being fixed. Version 2.0 is not binary compatible with version 1.0. To insure that both 1.0 and 2.0 can
            coexist version 2.0 has had its Maven groupId changed to org.apache.commons, its Maven artifact changed
            to commons-vfs2, and the package names are now org.apache.commons.vfs2. The API changes are fairly minor
            and will mostly impact provider implementations.
          </p>
        </section>

    </body>
</document>

