<?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>
            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.3 and 2.4.x require Java 8.
          </p>
          <p>
           Apache Commons VFS 2.2 requires Java 7.
          </p>
          <p>
           Apache Commons VFS 2.1 requires Java 6.
          </p>
          <p>
           Apache Commons VFS 2.0 requires Java 5.
          </p>
        </section>

        <section name="News">
          <p>
            Apache Commons VFS 2.4.1 is a bug fix release.
          </p>
          <p>
            Apache Commons VFS 2.4 is a new features and bug fix release.
          </p>
          <p>
            Apache Commons VFS 2.3 is a new features and bug fix release.
          </p>
          <p>
            Apache Commons VFS 2.2 is a new features and bug fix release.
          </p>
          <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. The TarFileProvider is one known exception to compatibility with 2.0.
            See the <a href="https://dist.apache.org/repos/dist/dev/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>

