/*******************************************************************************
*
* Pentaho Big Data
*
* Copyright (C) 2002-2015 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.hadoop.shim;
import java.util.Collection;
import java.util.Collections;
import org.apache.commons.vfs2.Capability;
import org.apache.commons.vfs2.FileName;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemConfigBuilder;
import org.apache.commons.vfs2.FileSystemException;
import org.apache.commons.vfs2.FileSystemOptions;
import org.apache.commons.vfs2.provider.FileProvider;
/**
* Proxies the active {@link HadoopConfiguration}'s {@link FileProvider}. This is used to be able to swap out the Hadoop
* configuration at runtime while registering multiple file providers under the same scheme.
*/
public class ActiveHadoopShimFileProvider implements FileProvider {
private HadoopConfigurationFileSystemManager fsm;
private String scheme;
public ActiveHadoopShimFileProvider( HadoopConfigurationFileSystemManager fsm, String scheme ) {
if ( fsm == null || scheme == null ) {
throw new NullPointerException();
}
this.fsm = fsm;
this.scheme = scheme;
}
@Override
public FileObject createFileSystem( String scheme, FileObject file, FileSystemOptions fileSystemOptions )
throws FileSystemException {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
FileProvider p = fsm.getActiveFileProvider( scheme );
Thread.currentThread().setContextClassLoader( p.getClass().getClassLoader() );
try {
return p.createFileSystem( scheme, file, fileSystemOptions );
} finally {
Thread.currentThread().setContextClassLoader( cl );
}
}
@Override
public FileObject findFile( FileObject baseFile, String uri, FileSystemOptions fileSystemOptions )
throws FileSystemException {
ClassLoader cl = Thread.currentThread().getContextClassLoader();
FileProvider p = fsm.getActiveFileProvider( scheme );
Thread.currentThread().setContextClassLoader( p.getClass().getClassLoader() );
try {
return p.findFile( baseFile, uri, fileSystemOptions );
} finally {
Thread.currentThread().setContextClassLoader( cl );
}
}
@SuppressWarnings( "unchecked" )
@Override
public Collection<Capability> getCapabilities() {
try {
return fsm.getActiveFileProvider( scheme ).getCapabilities();
} catch ( FileSystemException e ) {
return Collections.emptyList();
}
}
@Override
public FileSystemConfigBuilder getConfigBuilder() {
try {
return fsm.getActiveFileProvider( scheme ).getConfigBuilder();
} catch ( FileSystemException e ) {
return null;
}
}
@Override
public FileName parseUri( FileName root, String uri ) throws FileSystemException {
return fsm.getActiveFileProvider( scheme ).parseUri( root, uri );
}
}