public Blob getBlob()

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;
   }