/** * If <code>f</code> is a file, this method will make a single call to S3. If <code>f</code> is a * directory, this method will make a maximum of (<i>n</i> / 1000) + 2 calls to S3, where <i>n</i> * is the total number of files and directories contained directly in <code>f</code>. */ @Override public FileStatus[] listStatus(Path f) throws IOException { Path absolutePath = makeAbsolute(f); String key = pathToKey(absolutePath); if (key.length() > 0) { FileMetadata meta = store.retrieveMetadata(key); if (meta != null) { return new FileStatus[] {newFile(meta, absolutePath)}; } } URI pathUri = absolutePath.toUri(); Set<FileStatus> status = new TreeSet<FileStatus>(); String priorLastKey = null; do { PartialListing listing = store.list(key, S3_MAX_LISTING_LENGTH, priorLastKey, false); for (FileMetadata fileMetadata : listing.getFiles()) { Path subpath = keyToPath(fileMetadata.getKey()); String relativePath = pathUri.relativize(subpath.toUri()).getPath(); if (fileMetadata.getKey().equals(key + "/")) { // this is just the directory we have been asked to list } else if (relativePath.endsWith(FOLDER_SUFFIX)) { status.add( newDirectory( new Path( absolutePath, relativePath.substring(0, relativePath.indexOf(FOLDER_SUFFIX))))); } else { status.add(newFile(fileMetadata, subpath)); } } for (String commonPrefix : listing.getCommonPrefixes()) { Path subpath = keyToPath(commonPrefix); String relativePath = pathUri.relativize(subpath.toUri()).getPath(); status.add(newDirectory(new Path(absolutePath, relativePath))); } priorLastKey = listing.getPriorLastKey(); } while (priorLastKey != null); if (status.isEmpty() && key.length() > 0 && store.retrieveMetadata(key + FOLDER_SUFFIX) == null) { throw new FileNotFoundException("File " + f + " does not exist."); } return status.toArray(new FileStatus[status.size()]); }
@Override public FileStatus getFileStatus(Path f) throws IOException { Path absolutePath = makeAbsolute(f); String key = pathToKey(absolutePath); if (key.length() == 0) { // root always exists return newDirectory(absolutePath); } if (LOG.isDebugEnabled()) { LOG.debug("getFileStatus retrieving metadata for key '" + key + "'"); } FileMetadata meta = store.retrieveMetadata(key); if (meta != null) { if (LOG.isDebugEnabled()) { LOG.debug("getFileStatus returning 'file' for key '" + key + "'"); } return newFile(meta, absolutePath); } if (store.retrieveMetadata(key + FOLDER_SUFFIX) != null) { if (LOG.isDebugEnabled()) { LOG.debug( "getFileStatus returning 'directory' for key '" + key + "' as '" + key + FOLDER_SUFFIX + "' exists"); } return newDirectory(absolutePath); } if (LOG.isDebugEnabled()) { LOG.debug("getFileStatus listing key '" + key + "'"); } PartialListing listing = store.list(key, 1); if (listing.getFiles().length > 0 || listing.getCommonPrefixes().length > 0) { if (LOG.isDebugEnabled()) { LOG.debug("getFileStatus returning 'directory' for key '" + key + "' as it has contents"); } return newDirectory(absolutePath); } if (LOG.isDebugEnabled()) { LOG.debug("getFileStatus could not find key '" + key + "'"); } throw new FileNotFoundException("No such file or directory '" + absolutePath + "'"); }