/*! ****************************************************************************** * * Pentaho Data Integration * * Copyright (C) 2002-2017 by Pentaho : http://www.pentaho.com * ******************************************************************************* * * Licensed 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.pentaho.di.core.vfs; import org.apache.commons.vfs2.Capability; import org.apache.commons.vfs2.FileName; import org.apache.commons.vfs2.FileObject; import org.apache.commons.vfs2.FileSystem; import org.apache.commons.vfs2.FileSystemConfigBuilder; import org.apache.commons.vfs2.FileSystemException; import org.apache.commons.vfs2.FileSystemOptions; import org.apache.commons.vfs2.NameScope; import org.apache.commons.vfs2.impl.StandardFileSystemManager; import org.apache.commons.vfs2.provider.FileProvider; import java.util.Collection; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * This class is aimed to be a thread-safe version of * {@link org.apache.commons.vfs2.impl.StandardFileSystemManager StandardFileSystemManager}. * It locks methods that accessing or mutating the providers Map in * {@link org.apache.commons.vfs2.impl.DefaultFileSystemManager DefaultFileSystemManager}. */ public class ConcurrentFileSystemManager extends StandardFileSystemManager { private static final String CONFIG_RESOURCE = "providers.xml"; private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public ConcurrentFileSystemManager() { setConfiguration( StandardFileSystemManager.class.getResource( CONFIG_RESOURCE ) ); } @Override public void addProvider( String[] urlSchemes, FileProvider provider ) throws FileSystemException { lock.writeLock().lock(); try { super.addProvider( urlSchemes, provider ); } finally { lock.writeLock().unlock(); } } @Override public String[] getSchemes() { lock.readLock().lock(); try { return super.getSchemes(); } finally { lock.readLock().unlock(); } } @Override public boolean hasProvider( String scheme ) { lock.readLock().lock(); try { return super.hasProvider( scheme ); } finally { lock.readLock().unlock(); } } @Override public FileObject resolveFile( FileObject baseFile, String uri, FileSystemOptions fileSystemOptions ) throws FileSystemException { lock.readLock().lock(); try { return super.resolveFile( baseFile, uri, fileSystemOptions ); } finally { lock.readLock().unlock(); } } @Override public FileName resolveName( FileName base, String name, NameScope scope ) throws FileSystemException { lock.readLock().lock(); try { return super.resolveName( base, name, scope ); } finally { lock.readLock().unlock(); } } @Override public FileName resolveURI( String uri ) throws FileSystemException { lock.readLock().lock(); try { return super.resolveURI( uri ); } finally { lock.readLock().unlock(); } } @Override public FileObject createFileSystem( String scheme, FileObject file ) throws FileSystemException { lock.readLock().lock(); try { return super.createFileSystem( scheme, file ); } finally { lock.readLock().unlock(); } } @Override public void _closeFileSystem( FileSystem filesystem ) { lock.readLock().lock(); try { super._closeFileSystem( filesystem ); } finally { lock.readLock().unlock(); } } @Override public Collection<Capability> getProviderCapabilities( String scheme ) throws FileSystemException { lock.readLock().lock(); try { return super.getProviderCapabilities( scheme ); } finally { lock.readLock().unlock(); } } @Override public FileSystemConfigBuilder getFileSystemConfigBuilder( String scheme ) throws FileSystemException { lock.readLock().lock(); try { return super.getFileSystemConfigBuilder( scheme ); } finally { lock.readLock().unlock(); } } @Override public void close() { lock.writeLock().lock(); try { super.close(); } finally { lock.writeLock().unlock(); } } @Override public void freeUnusedResources() { lock.readLock().lock(); try { super.freeUnusedResources(); } finally { lock.readLock().unlock(); } } }