/*! ******************************************************************************
*
* 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();
}
}
}