/**
   * キー情報から実ファイルデータを取得し、それらからメタデータを生成して返します.
   *
   * @param key ファイルデータのキー情報
   * @return キーから生成したメタデータ
   */
  @Override
  public UrlTreeMetaData<InputStream> generateMetaDataFromReal(String key, UrlTreeContext ctx)
      throws BadContentException {
    if (!this.canLoad(key, ctx)) {
      throw new IllegalArgumentException(
          "Cannot Load it. check before can it load with canLoad(key): " + key);
    }
    Path p = this.generateFileObj(key);
    File f = p.toFile();
    long lastModified = f.lastModified();

    logger.trace("[デバッグ]ファイル名とファイルのlastModified: " + p.toString() + ":" + lastModified);

    UrlTreeMetaData<InputStream> md = new UrlTreeMetaData<>();
    md.setDirectory(Files.isDirectory(p, LinkOption.NOFOLLOW_LINKS));
    md.setFilename(key);
    md.setOwnerId(ctx.getUserName());
    md.setGroupId(ctx.getPrimaryGroup());
    md.setCreatedTime(lastModified);
    md.setUpdatedTime(lastModified);
    md.setPermission(ctx.getDefaultPermission());
    String contentType = new MimetypesFileTypeMap().getContentType(p.getFileName().toString());
    md.setContentType(contentType);

    return md;
  }
  /**
   * ファイルデータをストレージからロードします.
   *
   * @param metadata urlTreeメタデータオブジェクト
   * @param ctx urlTreeコンテキストオブジェクト
   * @return ロードされたファイルデータ
   */
  @Override
  public InputStream load(UrlTreeMetaData<InputStream> metadata, UrlTreeContext ctx)
      throws BadContentException, TargetNotFoundException {
    Path f = this.generateFileObj(metadata.getAbsolutePath());

    if (!Files.exists(f) || !Files.isReadable(f)) {
      throw new TargetNotFoundException("cannot read real file");
    }

    InputStream contents;
    try {
      contents = Files.newInputStream(f);
    } catch (IOException e) {
      throw new GenericResourceException(e);
    }

    String contentType = new MimetypesFileTypeMap().getContentType(f.getFileName().toString());
    metadata.setContentType(contentType);

    return contents;
  }