// Copyright (c) 2023 Tobias Briones. All rights reserved.
// SPDX-License-Identifier: BSD-3-Clause
// This file is part of https://github.com/tobiasbriones/blog
package engineer.mathsoftware.blog.slides.data;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.image.Image;
import javax.imageio.ImageIO;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
public class LocalDataRepository implements DataRepository {
private final String root;
public LocalDataRepository(String root) {
this.root = root;
}
@Override
public void createOrUpdateImage(ImageItem item) throws IOException {
requireLocalStorage();
var path = pathOf(item.filename());
var renderedImage = SwingFXUtils.fromFXImage(item.image(), null);
ImageIO.write(renderedImage, "png", path.toFile());
}
@Override
public void createOrUpdateImage(Path imagePath) throws IOException {
var imageName = imagePath.getFileName().toString();
if (Files.exists(pathOf(imageName))) {
updateImage(imagePath);
}
else {
createImage(imagePath);
}
}
@Override
public void createImage(Path imagePath) throws IOException {
requireFileExists(imagePath);
requireValidFile(imagePath);
requireLocalStorage();
var imageName = imagePath.getFileName().toString();
Files.copy(imagePath, pathOf(imageName));
}
@Override
public List<ImageItem> readAllImages() throws IOException {
requireLocalStorage();
var images = new ArrayList<ImageItem>();
var files = Files
.walk(pathOf(""), 1)
.filter(Data::isFileSupported);
try (files) {
for (var file : files.toList()) {
var img = new Image(Files.newInputStream(file));
images.add(new ImageItem(file.getFileName().toString(), img));
}
}
return images;
}
@Override
public Image readImage(String imageName) throws IOException {
var path = pathOf(imageName);
requireFileExists(path);
requireLocalStorage();
return new Image(Files.newInputStream(path));
}
@Override
public void updateImage(Path imagePath) throws IOException {
var imageName = imagePath.getFileName().toString();
requireFileExists(imagePath);
requireLocalStorage();
deleteImage(imageName);
createImage(imagePath);
}
@Override
public void deleteImage(String imageName) throws IOException {
var path = pathOf(imageName);
requireFileExists(path);
requireLocalStorage();
Files.delete(path);
}
@Override
public void deleteAllImages() throws IOException {
requireLocalStorage();
var walk = Files
.walk(pathOf(""), 1)
.filter(Files::isRegularFile);
try (walk) {
for (var path : walk.toList()) {
Files.delete(path);
}
}
}
private void requireLocalStorage() throws IOException {
var rootPath = pathOf("");
if (!Files.exists(rootPath)) {
Files.createDirectory(rootPath);
}
}
private Path pathOf(String filename) {
return Path.of(root, filename);
}
private static void requireFileExists(Path path) throws IOException {
if (!Files.exists(path)) {
throw new IOException("File " + path + " does not exist");
}
}
private static void requireValidFile(Path path) throws IOException {
if (!Data.isFileSupported(path)) {
throw new IOException("File " + path + " is not supported");
}
}
}