You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2022/07/12 17:30:00 UTC

[commons-vfs] 04/05: Remove unused private method

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-vfs.git

commit 4b029693f4a0e631e8a84ac519e989b8e41b122a
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Jul 12 13:26:35 2022 -0400

    Remove unused private method
---
 .../vfs2/impl/StandardFileSystemManager.java       | 885 ++++++++++-----------
 1 file changed, 433 insertions(+), 452 deletions(-)

diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/impl/StandardFileSystemManager.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/impl/StandardFileSystemManager.java
index e62eac9b..e6919edb 100644
--- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/impl/StandardFileSystemManager.java
+++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/impl/StandardFileSystemManager.java
@@ -1,452 +1,433 @@
-/*
- * 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.
- */
-package org.apache.commons.vfs2.impl;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Objects;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.vfs2.FileSystemException;
-import org.apache.commons.vfs2.VfsLog;
-import org.apache.commons.vfs2.operations.FileOperationProvider;
-import org.apache.commons.vfs2.provider.FileProvider;
-import org.apache.commons.vfs2.util.Messages;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-/**
- * A {@link org.apache.commons.vfs2.FileSystemManager} that configures itself from an XML (Default: providers.xml)
- * configuration file.
- * <p>
- * Certain providers are only loaded and available if the dependent library is in your classpath. You have to configure
- * your debugging facility to log "debug" messages to see if a provider was skipped due to "unresolved externals".
- * </p>
- */
-public class StandardFileSystemManager extends DefaultFileSystemManager {
-    private static final String CONFIG_RESOURCE = "providers.xml";
-    private static final String PLUGIN_CONFIG_RESOURCE = "META-INF/vfs-providers.xml";
-
-    private URL configUri;
-    private ClassLoader classLoader;
-
-    /**
-     * Adds an extension map.
-     *
-     * @param map containing the Elements.
-     */
-    private void addExtensionMap(final Element map) {
-        final String extension = map.getAttribute("extension");
-        final String scheme = map.getAttribute("scheme");
-        if (!StringUtils.isEmpty(scheme)) {
-            addExtensionMap(extension, scheme);
-        }
-    }
-
-    /**
-     * Adds a mime-type map.
-     *
-     * @param map containing the Elements.
-     */
-    private void addMimeTypeMap(final Element map) {
-        final String mimeType = map.getAttribute("mime-type");
-        final String scheme = map.getAttribute("scheme");
-        addMimeTypeMap(mimeType, scheme);
-    }
-
-    /**
-     * Adds a operationProvider from a operationProvider definition.
-     */
-    private void addOperationProvider(final Element providerDef) throws FileSystemException {
-        final String classname = providerDef.getAttribute("class-name");
-
-        // Attach only to available schemas
-        final String[] schemas = getSchemas(providerDef);
-        for (final String schema : schemas) {
-            if (hasProvider(schema)) {
-                final FileOperationProvider operationProvider = (FileOperationProvider) createInstance(classname);
-                addOperationProvider(schema, operationProvider);
-            }
-        }
-    }
-
-    /**
-     * Adds a provider from a provider definition.
-     *
-     * @param providerDef the provider definition
-     * @param isDefault true if the default should be used.
-     * @throws FileSystemException if an error occurs.
-     */
-    private void addProvider(final Element providerDef, final boolean isDefault) throws FileSystemException {
-        final String classname = providerDef.getAttribute("class-name");
-
-        // Make sure all required schemes are available
-        final String[] requiredSchemes = getRequiredSchemes(providerDef);
-        for (final String requiredScheme : requiredSchemes) {
-            if (!hasProvider(requiredScheme)) {
-                final String msg = Messages.getString("vfs.impl/skipping-provider-scheme.debug", classname,
-                        requiredScheme);
-                VfsLog.debug(getLogger(), getLogger(), msg);
-                return;
-            }
-        }
-
-        // Make sure all required classes are in classpath
-        final String[] requiredClasses = getRequiredClasses(providerDef);
-        for (final String requiredClass : requiredClasses) {
-            if (!findClass(requiredClass)) {
-                final String msg = Messages.getString("vfs.impl/skipping-provider.debug", classname, requiredClass);
-                VfsLog.debug(getLogger(), getLogger(), msg);
-                return;
-            }
-        }
-
-        // Create and register the provider
-        final FileProvider provider = (FileProvider) createInstance(classname);
-        final String[] schemas = getSchemas(providerDef);
-        if (schemas.length > 0) {
-            addProvider(schemas, provider);
-        }
-
-        // Set as default, if required
-        if (isDefault) {
-            setDefaultProvider(provider);
-        }
-    }
-
-    /**
-     * Configures this manager from an parsed XML configuration file
-     *
-     * @param config The configuration Element.
-     * @throws FileSystemException if an error occurs.
-     */
-    private void configure(final Element config) throws FileSystemException {
-        // Add the providers
-        final NodeList providers = config.getElementsByTagName("provider");
-        final int count = providers.getLength();
-        for (int i = 0; i < count; i++) {
-            final Element provider = (Element) providers.item(i);
-            addProvider(provider, false);
-        }
-
-        // Add the operation providers
-        final NodeList operationProviders = config.getElementsByTagName("operationProvider");
-        for (int i = 0; i < operationProviders.getLength(); i++) {
-            final Element operationProvider = (Element) operationProviders.item(i);
-            addOperationProvider(operationProvider);
-        }
-
-        // Add the default provider
-        final NodeList defProviders = config.getElementsByTagName("default-provider");
-        if (defProviders.getLength() > 0) {
-            final Element provider = (Element) defProviders.item(0);
-            addProvider(provider, true);
-        }
-
-        // Add the mime-type maps
-        final NodeList mimeTypes = config.getElementsByTagName("mime-type-map");
-        for (int i = 0; i < mimeTypes.getLength(); i++) {
-            final Element map = (Element) mimeTypes.item(i);
-            addMimeTypeMap(map);
-        }
-
-        // Add the extension maps
-        final NodeList extensions = config.getElementsByTagName("extension-map");
-        for (int i = 0; i < extensions.getLength(); i++) {
-            final Element map = (Element) extensions.item(i);
-            addExtensionMap(map);
-        }
-    }
-
-    /**
-     * Configures this manager from an XML configuration file.
-     *
-     * @param configUri The URI of the configuration.
-     * @param configStream An InputStream containing the configuration.
-     * @throws FileSystemException if an error occurs.
-     */
-    @SuppressWarnings("unused")
-    private void configure(final String configUri, final InputStream configStream) throws FileSystemException {
-        try {
-            // Load up the config
-            // TODO - validate
-            configure(createDocumentBuilder().parse(configStream).getDocumentElement());
-
-        } catch (final Exception e) {
-            throw new FileSystemException("vfs.impl/load-config.error", configUri, e);
-        }
-    }
-
-    /**
-     * Configures this manager from an XML configuration file.
-     *
-     * @param configUri The URI of the configuration.
-     * @throws FileSystemException if an error occus.
-     */
-    private void configure(final URL configUri) throws FileSystemException {
-        InputStream configStream = null;
-        try {
-            // Load up the config
-            // TODO - validate
-            final DocumentBuilder builder = createDocumentBuilder();
-            configStream = configUri.openStream();
-            final Element config = builder.parse(configStream).getDocumentElement();
-
-            configure(config);
-        } catch (final Exception e) {
-            throw new FileSystemException("vfs.impl/load-config.error", configUri.toString(), e);
-        } finally {
-            if (configStream != null) {
-                try {
-                    configStream.close();
-                } catch (final IOException e) {
-                    getLogger().warn(e.getLocalizedMessage(), e);
-                }
-            }
-        }
-    }
-
-    /**
-     * Scans the classpath to find any droped plugin.
-     * <p>
-     * The plugin-description has to be in {@code /META-INF/vfs-providers.xml}.
-     * </p>
-     *
-     * @throws FileSystemException if an error occurs.
-     */
-    protected void configurePlugins() throws FileSystemException {
-        final Enumeration<URL> enumResources;
-        try {
-            enumResources = enumerateResources(PLUGIN_CONFIG_RESOURCE);
-        } catch (final IOException e) {
-            throw new FileSystemException(e);
-        }
-
-        while (enumResources.hasMoreElements()) {
-            configure(enumResources.nextElement());
-        }
-    }
-
-    protected DefaultFileReplicator createDefaultFileReplicator() {
-        return new DefaultFileReplicator();
-    }
-
-    /**
-     * Configure and create a DocumentBuilder
-     *
-     * @return A DocumentBuilder for the configuration.
-     * @throws ParserConfigurationException if an error occurs.
-     */
-    private DocumentBuilder createDocumentBuilder() throws ParserConfigurationException {
-        final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-        factory.setIgnoringElementContentWhitespace(true);
-        factory.setIgnoringComments(true);
-        factory.setExpandEntityReferences(true);
-        return factory.newDocumentBuilder();
-    }
-
-    /**
-     * Creates a provider.
-     */
-    private Object createInstance(final String className) throws FileSystemException {
-        try {
-            return loadClass(className).newInstance();
-        } catch (final Exception e) {
-            throw new FileSystemException("vfs.impl/create-provider.error", className, e);
-        }
-    }
-
-    /**
-     * Enumerates resources from different class loaders.
-     *
-     * @throws IOException if {@code getResource} failed.
-     * @see #findClassLoader()
-     */
-    private Enumeration<URL> enumerateResources(final String name) throws IOException {
-        Enumeration<URL> enumeration = findClassLoader().getResources(name);
-        if (enumeration == null || !enumeration.hasMoreElements()) {
-            enumeration = getValidClassLoader(getClass()).getResources(name);
-        }
-        return enumeration;
-    }
-
-    /**
-     * Tests if a class is available.
-     */
-    private boolean findClass(final String className) {
-        try {
-            loadClass(className);
-            return true;
-        } catch (final ClassNotFoundException e) {
-            return false;
-        }
-    }
-
-    /**
-     * Returns a class loader or null since some Java implementation is null for the bootstrap class loader.
-     *
-     * @return A class loader or null since some Java implementation is null for the bootstrap class loader.
-     */
-    private ClassLoader findClassLoader() {
-        if (classLoader != null) {
-            return classLoader;
-        }
-        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
-        if (cl != null) {
-            return cl;
-        }
-        return getValidClassLoader(getClass());
-    }
-
-    /**
-     * Extracts the required classes from a provider definition.
-     */
-    private String[] getRequiredClasses(final Element providerDef) {
-        final ArrayList<String> classes = new ArrayList<>();
-        final NodeList deps = providerDef.getElementsByTagName("if-available");
-        final int count = deps.getLength();
-        for (int i = 0; i < count; i++) {
-            final Element dep = (Element) deps.item(i);
-            final String className = dep.getAttribute("class-name");
-            if (!StringUtils.isEmpty(className)) {
-                classes.add(className);
-            }
-        }
-        return classes.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
-    }
-
-    /**
-     * Extracts the required schemes from a provider definition.
-     */
-    private String[] getRequiredSchemes(final Element providerDef) {
-        final ArrayList<String> schemes = new ArrayList<>();
-        final NodeList deps = providerDef.getElementsByTagName("if-available");
-        final int count = deps.getLength();
-        for (int i = 0; i < count; i++) {
-            final Element dep = (Element) deps.item(i);
-            final String scheme = dep.getAttribute("scheme");
-            if (!StringUtils.isEmpty(scheme)) {
-                schemes.add(scheme);
-            }
-        }
-        return schemes.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
-    }
-
-    /**
-     * Extracts the schema names from a provider definition.
-     */
-    private String[] getSchemas(final Element provider) {
-        final ArrayList<String> schemas = new ArrayList<>();
-        final NodeList schemaElements = provider.getElementsByTagName("scheme");
-        final int count = schemaElements.getLength();
-        for (int i = 0; i < count; i++) {
-            final Element scheme = (Element) schemaElements.item(i);
-            schemas.add(scheme.getAttribute("name"));
-        }
-        return schemas.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
-    }
-
-    private ClassLoader getValidClassLoader(final Class<?> clazz) {
-        return validateClassLoader(clazz.getClassLoader(), clazz);
-    }
-
-    /**
-     * Initializes this manager. Adds the providers and replicator.
-     *
-     * @throws FileSystemException if an error occurs.
-     */
-    @Override
-    public void init() throws FileSystemException {
-        // Set the replicator and temporary file store (use the same component)
-        final DefaultFileReplicator replicator = createDefaultFileReplicator();
-        setReplicator(new PrivilegedFileReplicator(replicator));
-        setTemporaryFileStore(replicator);
-
-        if (configUri == null) {
-            // Use default config
-            final URL url = getClass().getResource(CONFIG_RESOURCE);
-            FileSystemException.requireNonNull(url, "vfs.impl/find-config-file.error", CONFIG_RESOURCE);
-            configUri = url;
-        }
-
-        configure(configUri);
-        configurePlugins();
-
-        // Initialize super-class
-        super.init();
-    }
-
-    /**
-     * Load a class from different class loaders.
-     *
-     * @throws ClassNotFoundException if last {@code loadClass} failed.
-     * @see #findClassLoader()
-     */
-    private Class<?> loadClass(final String className) throws ClassNotFoundException {
-        try {
-            return findClassLoader().loadClass(className);
-        } catch (final ClassNotFoundException e) {
-            return getValidClassLoader(getClass()).loadClass(className);
-        }
-    }
-
-    /**
-     * Sets the ClassLoader to use to load the providers. Default is to use the ClassLoader that loaded this class.
-     *
-     * @param classLoader The ClassLoader.
-     */
-    public void setClassLoader(final ClassLoader classLoader) {
-        this.classLoader = classLoader;
-    }
-
-    /**
-     * Sets the configuration file for this manager.
-     *
-     * @param configUri The URI for this manager.
-     */
-    public void setConfiguration(final String configUri) {
-        try {
-            setConfiguration(new URL(configUri));
-        } catch (final MalformedURLException e) {
-            getLogger().warn(e.getLocalizedMessage(), e);
-        }
-    }
-
-    /**
-     * Sets the configuration file for this manager.
-     *
-     * @param configUri The URI forthis manager.
-     */
-    public void setConfiguration(final URL configUri) {
-        this.configUri = configUri;
-    }
-
-    private ClassLoader validateClassLoader(final ClassLoader clazzLoader, final Class<?> clazz) {
-        return Objects.requireNonNull(clazzLoader, "The class loader for " + clazz
-                + " is null; some Java implementions use null for the bootstrap class loader.");
-    }
-
-}
+/*
+ * 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.
+ */
+package org.apache.commons.vfs2.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Objects;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.vfs2.FileSystemException;
+import org.apache.commons.vfs2.VfsLog;
+import org.apache.commons.vfs2.operations.FileOperationProvider;
+import org.apache.commons.vfs2.provider.FileProvider;
+import org.apache.commons.vfs2.util.Messages;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+/**
+ * A {@link org.apache.commons.vfs2.FileSystemManager} that configures itself from an XML (Default: providers.xml)
+ * configuration file.
+ * <p>
+ * Certain providers are only loaded and available if the dependent library is in your classpath. You have to configure
+ * your debugging facility to log "debug" messages to see if a provider was skipped due to "unresolved externals".
+ * </p>
+ */
+public class StandardFileSystemManager extends DefaultFileSystemManager {
+    private static final String CONFIG_RESOURCE = "providers.xml";
+    private static final String PLUGIN_CONFIG_RESOURCE = "META-INF/vfs-providers.xml";
+
+    private URL configUri;
+    private ClassLoader classLoader;
+
+    /**
+     * Adds an extension map.
+     *
+     * @param map containing the Elements.
+     */
+    private void addExtensionMap(final Element map) {
+        final String extension = map.getAttribute("extension");
+        final String scheme = map.getAttribute("scheme");
+        if (!StringUtils.isEmpty(scheme)) {
+            addExtensionMap(extension, scheme);
+        }
+    }
+
+    /**
+     * Adds a mime-type map.
+     *
+     * @param map containing the Elements.
+     */
+    private void addMimeTypeMap(final Element map) {
+        final String mimeType = map.getAttribute("mime-type");
+        final String scheme = map.getAttribute("scheme");
+        addMimeTypeMap(mimeType, scheme);
+    }
+
+    /**
+     * Adds a operationProvider from a operationProvider definition.
+     */
+    private void addOperationProvider(final Element providerDef) throws FileSystemException {
+        final String classname = providerDef.getAttribute("class-name");
+
+        // Attach only to available schemas
+        final String[] schemas = getSchemas(providerDef);
+        for (final String schema : schemas) {
+            if (hasProvider(schema)) {
+                final FileOperationProvider operationProvider = (FileOperationProvider) createInstance(classname);
+                addOperationProvider(schema, operationProvider);
+            }
+        }
+    }
+
+    /**
+     * Adds a provider from a provider definition.
+     *
+     * @param providerDef the provider definition
+     * @param isDefault true if the default should be used.
+     * @throws FileSystemException if an error occurs.
+     */
+    private void addProvider(final Element providerDef, final boolean isDefault) throws FileSystemException {
+        final String classname = providerDef.getAttribute("class-name");
+
+        // Make sure all required schemes are available
+        final String[] requiredSchemes = getRequiredSchemes(providerDef);
+        for (final String requiredScheme : requiredSchemes) {
+            if (!hasProvider(requiredScheme)) {
+                final String msg = Messages.getString("vfs.impl/skipping-provider-scheme.debug", classname,
+                        requiredScheme);
+                VfsLog.debug(getLogger(), getLogger(), msg);
+                return;
+            }
+        }
+
+        // Make sure all required classes are in classpath
+        final String[] requiredClasses = getRequiredClasses(providerDef);
+        for (final String requiredClass : requiredClasses) {
+            if (!findClass(requiredClass)) {
+                final String msg = Messages.getString("vfs.impl/skipping-provider.debug", classname, requiredClass);
+                VfsLog.debug(getLogger(), getLogger(), msg);
+                return;
+            }
+        }
+
+        // Create and register the provider
+        final FileProvider provider = (FileProvider) createInstance(classname);
+        final String[] schemas = getSchemas(providerDef);
+        if (schemas.length > 0) {
+            addProvider(schemas, provider);
+        }
+
+        // Set as default, if required
+        if (isDefault) {
+            setDefaultProvider(provider);
+        }
+    }
+
+    /**
+     * Configures this manager from an parsed XML configuration file
+     *
+     * @param config The configuration Element.
+     * @throws FileSystemException if an error occurs.
+     */
+    private void configure(final Element config) throws FileSystemException {
+        // Add the providers
+        final NodeList providers = config.getElementsByTagName("provider");
+        final int count = providers.getLength();
+        for (int i = 0; i < count; i++) {
+            final Element provider = (Element) providers.item(i);
+            addProvider(provider, false);
+        }
+
+        // Add the operation providers
+        final NodeList operationProviders = config.getElementsByTagName("operationProvider");
+        for (int i = 0; i < operationProviders.getLength(); i++) {
+            final Element operationProvider = (Element) operationProviders.item(i);
+            addOperationProvider(operationProvider);
+        }
+
+        // Add the default provider
+        final NodeList defProviders = config.getElementsByTagName("default-provider");
+        if (defProviders.getLength() > 0) {
+            final Element provider = (Element) defProviders.item(0);
+            addProvider(provider, true);
+        }
+
+        // Add the mime-type maps
+        final NodeList mimeTypes = config.getElementsByTagName("mime-type-map");
+        for (int i = 0; i < mimeTypes.getLength(); i++) {
+            final Element map = (Element) mimeTypes.item(i);
+            addMimeTypeMap(map);
+        }
+
+        // Add the extension maps
+        final NodeList extensions = config.getElementsByTagName("extension-map");
+        for (int i = 0; i < extensions.getLength(); i++) {
+            final Element map = (Element) extensions.item(i);
+            addExtensionMap(map);
+        }
+    }
+
+    /**
+     * Configures this manager from an XML configuration file.
+     *
+     * @param configUri The URI of the configuration.
+     * @throws FileSystemException if an error occus.
+     */
+    private void configure(final URL configUri) throws FileSystemException {
+        InputStream configStream = null;
+        try {
+            // Load up the config
+            // TODO - validate
+            final DocumentBuilder builder = createDocumentBuilder();
+            configStream = configUri.openStream();
+            final Element config = builder.parse(configStream).getDocumentElement();
+
+            configure(config);
+        } catch (final Exception e) {
+            throw new FileSystemException("vfs.impl/load-config.error", configUri.toString(), e);
+        } finally {
+            if (configStream != null) {
+                try {
+                    configStream.close();
+                } catch (final IOException e) {
+                    getLogger().warn(e.getLocalizedMessage(), e);
+                }
+            }
+        }
+    }
+
+    /**
+     * Scans the classpath to find any droped plugin.
+     * <p>
+     * The plugin-description has to be in {@code /META-INF/vfs-providers.xml}.
+     * </p>
+     *
+     * @throws FileSystemException if an error occurs.
+     */
+    protected void configurePlugins() throws FileSystemException {
+        final Enumeration<URL> enumResources;
+        try {
+            enumResources = enumerateResources(PLUGIN_CONFIG_RESOURCE);
+        } catch (final IOException e) {
+            throw new FileSystemException(e);
+        }
+
+        while (enumResources.hasMoreElements()) {
+            configure(enumResources.nextElement());
+        }
+    }
+
+    protected DefaultFileReplicator createDefaultFileReplicator() {
+        return new DefaultFileReplicator();
+    }
+
+    /**
+     * Configure and create a DocumentBuilder
+     *
+     * @return A DocumentBuilder for the configuration.
+     * @throws ParserConfigurationException if an error occurs.
+     */
+    private DocumentBuilder createDocumentBuilder() throws ParserConfigurationException {
+        final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+        factory.setIgnoringElementContentWhitespace(true);
+        factory.setIgnoringComments(true);
+        factory.setExpandEntityReferences(true);
+        return factory.newDocumentBuilder();
+    }
+
+    /**
+     * Creates a provider.
+     */
+    private Object createInstance(final String className) throws FileSystemException {
+        try {
+            return loadClass(className).newInstance();
+        } catch (final Exception e) {
+            throw new FileSystemException("vfs.impl/create-provider.error", className, e);
+        }
+    }
+
+    /**
+     * Enumerates resources from different class loaders.
+     *
+     * @throws IOException if {@code getResource} failed.
+     * @see #findClassLoader()
+     */
+    private Enumeration<URL> enumerateResources(final String name) throws IOException {
+        Enumeration<URL> enumeration = findClassLoader().getResources(name);
+        if (enumeration == null || !enumeration.hasMoreElements()) {
+            enumeration = getValidClassLoader(getClass()).getResources(name);
+        }
+        return enumeration;
+    }
+
+    /**
+     * Tests if a class is available.
+     */
+    private boolean findClass(final String className) {
+        try {
+            loadClass(className);
+            return true;
+        } catch (final ClassNotFoundException e) {
+            return false;
+        }
+    }
+
+    /**
+     * Returns a class loader or null since some Java implementation is null for the bootstrap class loader.
+     *
+     * @return A class loader or null since some Java implementation is null for the bootstrap class loader.
+     */
+    private ClassLoader findClassLoader() {
+        if (classLoader != null) {
+            return classLoader;
+        }
+        final ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        if (cl != null) {
+            return cl;
+        }
+        return getValidClassLoader(getClass());
+    }
+
+    /**
+     * Extracts the required classes from a provider definition.
+     */
+    private String[] getRequiredClasses(final Element providerDef) {
+        final ArrayList<String> classes = new ArrayList<>();
+        final NodeList deps = providerDef.getElementsByTagName("if-available");
+        final int count = deps.getLength();
+        for (int i = 0; i < count; i++) {
+            final Element dep = (Element) deps.item(i);
+            final String className = dep.getAttribute("class-name");
+            if (!StringUtils.isEmpty(className)) {
+                classes.add(className);
+            }
+        }
+        return classes.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
+    }
+
+    /**
+     * Extracts the required schemes from a provider definition.
+     */
+    private String[] getRequiredSchemes(final Element providerDef) {
+        final ArrayList<String> schemes = new ArrayList<>();
+        final NodeList deps = providerDef.getElementsByTagName("if-available");
+        final int count = deps.getLength();
+        for (int i = 0; i < count; i++) {
+            final Element dep = (Element) deps.item(i);
+            final String scheme = dep.getAttribute("scheme");
+            if (!StringUtils.isEmpty(scheme)) {
+                schemes.add(scheme);
+            }
+        }
+        return schemes.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
+    }
+
+    /**
+     * Extracts the schema names from a provider definition.
+     */
+    private String[] getSchemas(final Element provider) {
+        final ArrayList<String> schemas = new ArrayList<>();
+        final NodeList schemaElements = provider.getElementsByTagName("scheme");
+        final int count = schemaElements.getLength();
+        for (int i = 0; i < count; i++) {
+            final Element scheme = (Element) schemaElements.item(i);
+            schemas.add(scheme.getAttribute("name"));
+        }
+        return schemas.toArray(ArrayUtils.EMPTY_STRING_ARRAY);
+    }
+
+    private ClassLoader getValidClassLoader(final Class<?> clazz) {
+        return validateClassLoader(clazz.getClassLoader(), clazz);
+    }
+
+    /**
+     * Initializes this manager. Adds the providers and replicator.
+     *
+     * @throws FileSystemException if an error occurs.
+     */
+    @Override
+    public void init() throws FileSystemException {
+        // Set the replicator and temporary file store (use the same component)
+        final DefaultFileReplicator replicator = createDefaultFileReplicator();
+        setReplicator(new PrivilegedFileReplicator(replicator));
+        setTemporaryFileStore(replicator);
+
+        if (configUri == null) {
+            // Use default config
+            final URL url = getClass().getResource(CONFIG_RESOURCE);
+            FileSystemException.requireNonNull(url, "vfs.impl/find-config-file.error", CONFIG_RESOURCE);
+            configUri = url;
+        }
+
+        configure(configUri);
+        configurePlugins();
+
+        // Initialize super-class
+        super.init();
+    }
+
+    /**
+     * Load a class from different class loaders.
+     *
+     * @throws ClassNotFoundException if last {@code loadClass} failed.
+     * @see #findClassLoader()
+     */
+    private Class<?> loadClass(final String className) throws ClassNotFoundException {
+        try {
+            return findClassLoader().loadClass(className);
+        } catch (final ClassNotFoundException e) {
+            return getValidClassLoader(getClass()).loadClass(className);
+        }
+    }
+
+    /**
+     * Sets the ClassLoader to use to load the providers. Default is to use the ClassLoader that loaded this class.
+     *
+     * @param classLoader The ClassLoader.
+     */
+    public void setClassLoader(final ClassLoader classLoader) {
+        this.classLoader = classLoader;
+    }
+
+    /**
+     * Sets the configuration file for this manager.
+     *
+     * @param configUri The URI for this manager.
+     */
+    public void setConfiguration(final String configUri) {
+        try {
+            setConfiguration(new URL(configUri));
+        } catch (final MalformedURLException e) {
+            getLogger().warn(e.getLocalizedMessage(), e);
+        }
+    }
+
+    /**
+     * Sets the configuration file for this manager.
+     *
+     * @param configUri The URI forthis manager.
+     */
+    public void setConfiguration(final URL configUri) {
+        this.configUri = configUri;
+    }
+
+    private ClassLoader validateClassLoader(final ClassLoader clazzLoader, final Class<?> clazz) {
+        return Objects.requireNonNull(clazzLoader, "The class loader for " + clazz
+                + " is null; some Java implementions use null for the bootstrap class loader.");
+    }
+
+}