in paimon-common/src/main/java/org/apache/paimon/fs/FileIO.java [231:333]
static FileIO get(Path path, CatalogContext config) throws IOException {
URI uri = path.toUri();
if (uri.getScheme() == null) {
return new LocalFileIO();
}
// print a helpful pointer for malformed local URIs (happens a lot to new users)
if (uri.getScheme().equals("file")
&& uri.getAuthority() != null
&& !uri.getAuthority().isEmpty()) {
String supposedUri = "file:///" + uri.getAuthority() + uri.getPath();
throw new IOException(
"Found local file path with authority '"
+ uri.getAuthority()
+ "' in path '"
+ uri
+ "'. Hint: Did you forget a slash? (correct path would be '"
+ supposedUri
+ "')");
}
Map<String, FileIOLoader> loaders = discoverLoaders();
FileIOLoader loader = loaders.get(uri.getScheme());
// load fallbackIO
FileIOLoader fallbackIO = config.fallbackIO();
List<IOException> ioExceptionList = new ArrayList<>();
if (loader != null) {
Set<String> options =
config.options().keySet().stream()
.map(String::toLowerCase)
.collect(Collectors.toSet());
Set<String> missOptions = new HashSet<>();
for (String[] keys : loader.requiredOptions()) {
boolean found = false;
for (String key : keys) {
if (options.contains(key.toLowerCase())) {
found = true;
break;
}
}
if (!found) {
missOptions.add(keys[0]);
}
}
if (missOptions.size() > 0) {
IOException exception =
new IOException(
String.format(
"One or more required options are missing.\n\n"
+ "Missing required options are:\n\n"
+ "%s",
String.join("\n", missOptions)));
ioExceptionList.add(exception);
loader = null;
}
}
if (loader == null) {
try {
loader = checkAccess(fallbackIO, path, config);
} catch (IOException ioException) {
ioExceptionList.add(ioException);
}
}
// load hadoopIO
if (loader == null) {
try {
loader = checkAccess(new HadoopFileIOLoader(), path, config);
} catch (IOException ioException) {
ioExceptionList.add(ioException);
}
}
if (loader == null) {
String fallbackMsg = "";
if (fallbackIO != null) {
fallbackMsg =
" "
+ fallbackIO.getClass().getSimpleName()
+ " also cannot access this path.";
}
UnsupportedSchemeException ex =
new UnsupportedSchemeException(
String.format(
"Could not find a file io implementation for scheme '%s' in the classpath."
+ "%s Hadoop FileSystem also cannot access this path '%s'.",
uri.getScheme(), fallbackMsg, path));
for (IOException ioException : ioExceptionList) {
ex.addSuppressed(ioException);
}
throw ex;
}
FileIO fileIO = loader.load(path);
fileIO.configure(config);
return fileIO;
}