in apis/filesystem/src/main/java/org/jclouds/filesystem/strategy/internal/FilesystemStorageStrategyImpl.java [383:496]
public Blob getBlob(final String container, final String key) {
filesystemContainerNameValidator.validate(container);
filesystemBlobKeyValidator.validate(key);
BlobBuilder builder = blobBuilders.get();
builder.name(key);
File file = getFileForBlobKey(container, key);
ByteSource byteSource;
boolean isDirectory = false;
if (getDirectoryBlobSuffix(key) != null) {
if (!file.isDirectory()) {
// filesystem blobstore does not allow the existence of "file" and
// "file/" and getDirectoryBlobSuffix normalizes "file/" to "file".
// Therefore we need to return null when the normalized file is not
// a directory.
return null;
}
logger.debug("%s - %s is a directory", container, key);
byteSource = ByteSource.empty();
isDirectory = true;
} else {
byteSource = Files.asByteSource(file);
}
try {
String cacheControl = null;
String contentDisposition = null;
String contentEncoding = null;
String contentLanguage = null;
String contentType = isDirectory ? "application/x-directory" : null;
HashCode hashCode = null;
String eTag = null;
Date expires = null;
Tier tier = Tier.STANDARD;
ImmutableMap.Builder<String, String> userMetadata = ImmutableMap.builder();
UserDefinedFileAttributeView view = getUserDefinedFileAttributeView(file.toPath());
if (view != null) {
try {
Set<String> attributes = ImmutableSet.copyOf(view.list());
cacheControl = readStringAttributeIfPresent(view, attributes, XATTR_CACHE_CONTROL);
contentDisposition = readStringAttributeIfPresent(view, attributes, XATTR_CONTENT_DISPOSITION);
contentEncoding = readStringAttributeIfPresent(view, attributes, XATTR_CONTENT_ENCODING);
contentLanguage = readStringAttributeIfPresent(view, attributes, XATTR_CONTENT_LANGUAGE);
if (!isDirectory) {
contentType = readStringAttributeIfPresent(view, attributes, XATTR_CONTENT_TYPE);
if (contentType == null && autoDetectContentType) {
contentType = probeContentType(file.toPath());
}
}
if (attributes.contains(XATTR_CONTENT_MD5)) {
ByteBuffer buf = ByteBuffer.allocate(view.size(XATTR_CONTENT_MD5));
view.read(XATTR_CONTENT_MD5, buf);
byte [] etagBytes = buf.array();
if (etagBytes.length == 16) {
// regular object
hashCode = HashCode.fromBytes(buf.array());
eTag = "\"" + hashCode + "\"";
} else {
// multi-part object
eTag = new String(etagBytes, US_ASCII);
}
}
if (attributes.contains(XATTR_EXPIRES)) {
ByteBuffer buf = ByteBuffer.allocate(view.size(XATTR_EXPIRES));
view.read(XATTR_EXPIRES, buf);
buf.flip();
expires = new Date(buf.asLongBuffer().get());
}
String tierString = readStringAttributeIfPresent(view, attributes, XATTR_STORAGE_TIER);
if (tierString != null) {
tier = Tier.valueOf(tierString);
}
for (String attribute : attributes) {
if (!attribute.startsWith(XATTR_USER_METADATA_PREFIX)) {
continue;
}
String value = readStringAttributeIfPresent(view, attributes, attribute);
userMetadata.put(attribute.substring(XATTR_USER_METADATA_PREFIX.length()), value);
}
} catch (IOException e) {
logger.debug("xattrs not supported on %s", file.toPath());
}
builder.payload(byteSource)
.cacheControl(cacheControl)
.contentDisposition(contentDisposition)
.contentEncoding(contentEncoding)
.contentLanguage(contentLanguage)
.contentLength(byteSource.size())
.contentMD5(hashCode)
.eTag(eTag)
.contentType(contentType)
.expires(expires)
.tier(tier)
.userMetadata(userMetadata.build());
} else {
builder.payload(byteSource)
.contentLength(byteSource.size())
.contentMD5(byteSource.hash(Hashing.md5()).asBytes());
}
} catch (FileNotFoundException fnfe) {
return null;
} catch (IOException e) {
throw Throwables.propagate(e);
}
Blob blob = builder.type(isDirectory ? StorageType.FOLDER : StorageType.BLOB).build();
blob.getMetadata().setContainer(container);
blob.getMetadata().setLastModified(new Date(file.lastModified()));
blob.getMetadata().setSize(file.length());
if (blob.getPayload().getContentMetadata().getContentMD5() != null)
blob.getMetadata().setETag(base16().lowerCase().encode(blob.getPayload().getContentMetadata().getContentMD5()));
return blob;
}