/** * ファイルデータをストレージに保存します. * * @param metadata ファイルデータを含むurlTreeメタデータオブジェクト * @param ctx urlTreeコンテキストオブジェクト */ @Override public void save(UrlTreeMetaData<InputStream> metadata, UrlTreeContext ctx) throws BadContentException { String localFileName = metadata.getAbsolutePath(); logger.debug("saving " + localFileName); Path f = this.generateFileObj(localFileName); InputStream b = metadata.getData(); // nullの場合は書き換えない。 if (b == null) { return; } try { Path parent = f.getParent(); // 書き込む場所がなければ親ディレクトリを作成 if (Files.notExists(parent)) { Files.createDirectories(parent); } Files.copy(b, f, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { throw new GenericResourceException(e); } }
/** * ディレクトリデータをストレージに保存(ディレクトリを作成)します. * * @param metadata ディレクトリデータを含むurlTreeメタデータオブジェクト * @param ctx urlTreeコンテキストオブジェクト */ @Override public void mkdir(UrlTreeMetaData<InputStream> metadata, UrlTreeContext ctx) throws BadContentException, FileAlreadyExistsException { Path f = generateFileObj(metadata.getAbsolutePath()); if (Files.exists(f)) { throw new FileAlreadyExistsException("file exists"); } try { Files.createDirectories(f); } catch (IOException e) { logger.error("mkdir failure", e); throw new RuntimeException(e); } }
/** * ディレクトリデータをストレージから削除します. * * @param metadata ディレクトリデータを含むurlTreeメタデータオブジェクト * @param ctx urlTreeコンテキストオブジェクト */ @Override public void delete(UrlTreeMetaData<InputStream> metadata, UrlTreeContext ctx) throws BadContentException { Path f = generateFileObj(metadata.getAbsolutePath()); logger.debug("delete: " + f.getFileName()); try { boolean deleted = Files.deleteIfExists(f); if (!deleted) { throw new IOException("file not exists"); } } catch (IOException e) { // TargetNotFoundまたはBadContentでもよいか throw new GenericResourceException("cannot delete file", e); } }
/** * ディレクトリデータをストレージから削除します. * * @param metadata ディレクトリデータを含むurlTreeメタデータオブジェクト * @param ctx urlTreeコンテキストオブジェクト */ @Override public void rmdir(UrlTreeMetaData<InputStream> metadata, UrlTreeContext ctx) throws BadContentException, FileNotFoundException { Path f = generateFileObj(metadata.getAbsolutePath()); logger.debug("called rmdir: " + f.getFileName()); if (!Files.exists(f)) { throw new FileNotFoundException("file not exists"); } try { Files.delete(f); } catch (IOException e) { logger.error("rmdir failure", e); throw new RuntimeException(e); } }
@Override public void move(UrlTreeMetaData<InputStream> metadata, String dstDir, UrlTreeContext ctx) throws BadContentException { String srcPathName = metadata.getAbsolutePath(); Path srcPath = this.generateFileObj(srcPathName); Path dstPath = this.generateFileObj(dstDir); logger.debug("move: " + srcPath.toAbsolutePath() + " to " + dstPath.toAbsolutePath()); try { Files.move( srcPath, dstPath.resolve(srcPath.getFileName()), StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { throw new GenericResourceException("cannot copy file", e); } }
/** * ファイルデータをストレージからロードします. * * @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; }