Add database, some utils to database and create photo entity
This commit is contained in:
parent
1d4dc9602f
commit
fd8556f26c
@ -1,6 +1,5 @@
|
|||||||
package dev.mateuszkowalczyk.ffm;
|
package dev.mateuszkowalczyk.ffm;
|
||||||
|
|
||||||
import dev.mateuszkowalczyk.ffm.view.SceneEnum;
|
|
||||||
import dev.mateuszkowalczyk.ffm.view.StageController;
|
import dev.mateuszkowalczyk.ffm.view.StageController;
|
||||||
import javafx.application.Application;
|
import javafx.application.Application;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
@ -9,7 +8,6 @@ public class Main extends Application {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void start(Stage stage) throws Exception{
|
public void start(Stage stage) throws Exception{
|
||||||
|
|
||||||
StageController.getInstance().initApp(stage);
|
StageController.getInstance().initApp(stage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package dev.mateuszkowalczyk.ffm.app;
|
package dev.mateuszkowalczyk.ffm.app;
|
||||||
|
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.database.image.Photo;
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.database.image.PhotoDAO;
|
||||||
import dev.mateuszkowalczyk.ffm.utils.PropertiesLoader;
|
import dev.mateuszkowalczyk.ffm.utils.PropertiesLoader;
|
||||||
import dev.mateuszkowalczyk.ffm.utils.Property;
|
import dev.mateuszkowalczyk.ffm.utils.Property;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
@ -17,6 +19,7 @@ import java.util.ArrayList;
|
|||||||
public class DirectoryScanner implements Runnable {
|
public class DirectoryScanner implements Runnable {
|
||||||
private WorkspaceService workspaceService = WorkspaceService.getInstance();
|
private WorkspaceService workspaceService = WorkspaceService.getInstance();
|
||||||
private PropertiesLoader propertiesLoader = PropertiesLoader.getInstance();
|
private PropertiesLoader propertiesLoader = PropertiesLoader.getInstance();
|
||||||
|
private PhotoDAO photoDAO = new PhotoDAO();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -34,7 +37,10 @@ public class DirectoryScanner implements Runnable {
|
|||||||
if(this.isImagePath(filename)) {
|
if(this.isImagePath(filename)) {
|
||||||
ImageView imageView = new ImageView();
|
ImageView imageView = new ImageView();
|
||||||
|
|
||||||
InputStream inputStream = null;
|
Photo photo = new Photo();
|
||||||
|
photo.setPath(path.toString());
|
||||||
|
|
||||||
|
this.photoDAO.save(photo);
|
||||||
|
|
||||||
Image image1 = new Image("file:" + path.toString(), 200, 200, false, true);
|
Image image1 = new Image("file:" + path.toString(), 200, 200, false, true);
|
||||||
|
|
||||||
|
@ -1,25 +1,19 @@
|
|||||||
package dev.mateuszkowalczyk.ffm.app;
|
package dev.mateuszkowalczyk.ffm.app;
|
||||||
|
|
||||||
import dev.mateuszkowalczyk.ffm.data.Chooser;
|
import dev.mateuszkowalczyk.ffm.data.Chooser;
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.DatabaseService;
|
||||||
import dev.mateuszkowalczyk.ffm.utils.PropertiesLoader;
|
import dev.mateuszkowalczyk.ffm.utils.PropertiesLoader;
|
||||||
import dev.mateuszkowalczyk.ffm.utils.Property;
|
import dev.mateuszkowalczyk.ffm.utils.Property;
|
||||||
import dev.mateuszkowalczyk.ffm.view.SceneEnum;
|
import dev.mateuszkowalczyk.ffm.view.SceneEnum;
|
||||||
import dev.mateuszkowalczyk.ffm.view.StageController;
|
import dev.mateuszkowalczyk.ffm.view.StageController;
|
||||||
import dev.mateuszkowalczyk.ffm.view.workspace.MainPageController;
|
import dev.mateuszkowalczyk.ffm.view.workspace.MainPageController;
|
||||||
import javafx.collections.FXCollections;
|
import javafx.application.Platform;
|
||||||
import javafx.collections.ObservableList;
|
|
||||||
import javafx.scene.image.Image;
|
|
||||||
import javafx.scene.image.ImageView;
|
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class WorkspaceService {
|
public class WorkspaceService {
|
||||||
private static final WorkspaceService instance = new WorkspaceService();
|
private static final WorkspaceService instance = new WorkspaceService();
|
||||||
private PropertiesLoader propertiesLoader = new PropertiesLoader();
|
private PropertiesLoader propertiesLoader = PropertiesLoader.getInstance();
|
||||||
|
private DatabaseService databaseService = DatabaseService.getInstance();
|
||||||
private MainPageController mainPageController;
|
private MainPageController mainPageController;
|
||||||
|
|
||||||
private WorkspaceService() {
|
private WorkspaceService() {
|
||||||
@ -40,6 +34,7 @@ public class WorkspaceService {
|
|||||||
public void setupWorkspace() {
|
public void setupWorkspace() {
|
||||||
Chooser chooser = new Chooser();
|
Chooser chooser = new Chooser();
|
||||||
String path = chooser.chooseDirectory();
|
String path = chooser.chooseDirectory();
|
||||||
|
|
||||||
this.propertiesLoader.set(Property.PATH_TO_DIRECTORY, path);
|
this.propertiesLoader.set(Property.PATH_TO_DIRECTORY, path);
|
||||||
try {
|
try {
|
||||||
StageController.getInstance().setScene(SceneEnum.MainPage);
|
StageController.getInstance().setScene(SceneEnum.MainPage);
|
||||||
@ -49,54 +44,8 @@ public class WorkspaceService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void refreshWorkspace() {
|
public void refreshWorkspace() {
|
||||||
this.getMainPageController().clearImages();
|
Platform.runLater(() -> {this.getMainPageController().clearImages();});
|
||||||
var t = new Thread(new DirectoryScanner());
|
var t = new Thread(new DirectoryScanner());
|
||||||
t.start();
|
t.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void readImages() {
|
|
||||||
try {
|
|
||||||
Files.walk(Paths.get(this.propertiesLoader.get(Property.PATH_TO_DIRECTORY)))
|
|
||||||
.filter(Files::isRegularFile)
|
|
||||||
.forEach(path -> {
|
|
||||||
String filename = path.getFileName().toString();
|
|
||||||
if(this.isImagePath(filename)) {
|
|
||||||
System.out.println("read image");
|
|
||||||
ImageView imageView = new ImageView();
|
|
||||||
InputStream inputStream = null;
|
|
||||||
|
|
||||||
try {
|
|
||||||
inputStream = new FileInputStream(path.toString());
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
Image image = new Image(inputStream);
|
|
||||||
|
|
||||||
Image image1 = new Image("file:" + path.toString(), 200, 200, false, true);
|
|
||||||
|
|
||||||
imageView.setImage(image1);
|
|
||||||
imageView.setFitHeight(200);
|
|
||||||
imageView.setFitWidth(200);
|
|
||||||
imageView.setSmooth(true);
|
|
||||||
imageView.setCache(true);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.mainPageController.addImage(imageView);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isImagePath(String filename) {
|
|
||||||
switch (filename.substring(filename.length() - 3).toLowerCase()) {
|
|
||||||
case "jpg":
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package dev.mateuszkowalczyk.ffm.data;
|
||||||
|
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.database.image.Photo;
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.database.utils.TableCreator;
|
||||||
|
import dev.mateuszkowalczyk.ffm.utils.ResourceLoader;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
public class DatabaseCreator {
|
||||||
|
public Connection create() {
|
||||||
|
var connection = this.createDatabase();
|
||||||
|
this.createTables(connection);
|
||||||
|
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Connection createDatabase() {
|
||||||
|
Connection connection = null;
|
||||||
|
String path = "jdbc:sqlite:" + ResourceLoader.getInstance().getPath() + "app.db";
|
||||||
|
|
||||||
|
try {
|
||||||
|
connection = DriverManager.getConnection(path);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createTables(Connection connection) {
|
||||||
|
TableCreator creator = new TableCreator(connection);
|
||||||
|
|
||||||
|
creator.create("photos", new Photo());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
package dev.mateuszkowalczyk.ffm.data;
|
||||||
|
|
||||||
|
import dev.mateuszkowalczyk.ffm.utils.ResourceLoader;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
|
||||||
|
public class DatabaseService {
|
||||||
|
private static final DatabaseService instance = new DatabaseService();
|
||||||
|
private ResourceLoader resourceLoader = ResourceLoader.getInstance();
|
||||||
|
private Connection connection;
|
||||||
|
|
||||||
|
private DatabaseService() {
|
||||||
|
this.checkIfDatabaseExists();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkIfDatabaseExists() {
|
||||||
|
var db = this.resourceLoader.getResource("app.db");
|
||||||
|
if (db == null) {
|
||||||
|
DatabaseCreator creator = new DatabaseCreator();
|
||||||
|
this.connection = creator.create();
|
||||||
|
} else {
|
||||||
|
this.connect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DatabaseService getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void connect() {
|
||||||
|
if (this.connection == null) {
|
||||||
|
String path = ResourceLoader.getInstance().getPath() + "app.db";
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.connection = DriverManager.getConnection(path);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Connection getConnection() {
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConnection(Connection connection) {
|
||||||
|
this.connection = connection;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package dev.mateuszkowalczyk.ffm.data.database;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface Dao<T> {
|
||||||
|
Optional<T> get(long id);
|
||||||
|
|
||||||
|
void save(T t);
|
||||||
|
void update(T t);
|
||||||
|
void delete (T t);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
package dev.mateuszkowalczyk.ffm.data.database.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
public @interface Column {
|
||||||
|
|
||||||
|
public enum Type {
|
||||||
|
STRING, INT, DATE
|
||||||
|
}
|
||||||
|
|
||||||
|
public String name() default "";
|
||||||
|
public Type type() default Type.STRING;
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package dev.mateuszkowalczyk.ffm.data.database.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.FIELD)
|
||||||
|
public @interface PrimaryKey {
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package dev.mateuszkowalczyk.ffm.data.database.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.TYPE)
|
||||||
|
public @interface Table {
|
||||||
|
public String name() default "";
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
package dev.mateuszkowalczyk.ffm.data.database.image;
|
||||||
|
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.database.annotation.Column;
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.database.annotation.PrimaryKey;
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.database.annotation.Table;
|
||||||
|
|
||||||
|
@Table(name = "photo")
|
||||||
|
public class Photo {
|
||||||
|
|
||||||
|
@Column
|
||||||
|
@PrimaryKey
|
||||||
|
private long id;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String path;
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String cachedPath;
|
||||||
|
|
||||||
|
public long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPath() {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPath(String path) {
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCachedPath() {
|
||||||
|
return cachedPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCachedPath(String cachedPath) {
|
||||||
|
this.cachedPath = cachedPath;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
package dev.mateuszkowalczyk.ffm.data.database.image;
|
||||||
|
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.DatabaseService;
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.database.Dao;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class PhotoDAO implements Dao<Photo> {
|
||||||
|
private DatabaseService databaseService = DatabaseService.getInstance();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<Photo> get(long id) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void save(Photo photo) {
|
||||||
|
|
||||||
|
String sql = "INSERT INTO photos(path) values (?)";
|
||||||
|
|
||||||
|
try {
|
||||||
|
PreparedStatement preparedStatement = this.databaseService.getConnection().prepareStatement(sql);
|
||||||
|
preparedStatement.setString(1, photo.getPath());
|
||||||
|
preparedStatement.executeUpdate();
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(Photo photo) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void delete(Photo photo) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
package dev.mateuszkowalczyk.ffm.data.database.utils;
|
||||||
|
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.DatabaseService;
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.database.annotation.Column;
|
||||||
|
import dev.mateuszkowalczyk.ffm.data.database.annotation.PrimaryKey;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.sql.Statement;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class TableCreator {
|
||||||
|
|
||||||
|
private final Connection connection;
|
||||||
|
|
||||||
|
public TableCreator(Connection connection) {
|
||||||
|
this.connection = connection;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void create(String name, Object object) {
|
||||||
|
String sql = "CREATE TABLE IF NOT EXISTS " + name;
|
||||||
|
|
||||||
|
Field[] fields = object.getClass().getDeclaredFields();
|
||||||
|
|
||||||
|
sql += this.addFields(fields);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Statement stmt = this.connection.createStatement();
|
||||||
|
stmt.execute(sql);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String addFields(Field[] fields) {
|
||||||
|
String sql = " ( \n ";
|
||||||
|
List<String> listOfFields = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Field field :fields) {
|
||||||
|
if (field.isAnnotationPresent(Column.class)) {
|
||||||
|
listOfFields.add(
|
||||||
|
field.getName() +
|
||||||
|
" " +
|
||||||
|
this.getType(field.getAnnotation(Column.class)) +
|
||||||
|
(field.isAnnotationPresent(PrimaryKey.class) ? " PRIMARY KEY " : "")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sql += String.join(", \n ", listOfFields);
|
||||||
|
|
||||||
|
return sql + ") ";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getType(Column annotation) {
|
||||||
|
switch (annotation.type()) {
|
||||||
|
case INT:
|
||||||
|
return "integer";
|
||||||
|
case STRING:
|
||||||
|
default:
|
||||||
|
return "text";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -13,7 +13,7 @@ public class PropertiesLoader {
|
|||||||
private ResourceLoader resourceLoader = ResourceLoader.getInstance();
|
private ResourceLoader resourceLoader = ResourceLoader.getInstance();
|
||||||
private Properties properties = null;
|
private Properties properties = null;
|
||||||
|
|
||||||
public PropertiesLoader () {}
|
private PropertiesLoader () {}
|
||||||
|
|
||||||
public static PropertiesLoader getInstance() {
|
public static PropertiesLoader getInstance() {
|
||||||
return instance;
|
return instance;
|
||||||
|
@ -12,6 +12,10 @@ public class ResourceLoader {
|
|||||||
return getClass().getClassLoader().getResource(name);
|
return getClass().getClassLoader().getResource(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPath() {
|
||||||
|
return this.getResource("").toString();
|
||||||
|
}
|
||||||
|
|
||||||
public InputStream getResourceAsStream(String name) {
|
public InputStream getResourceAsStream(String name) {
|
||||||
return getClass().getClassLoader().getResourceAsStream( name);
|
return getClass().getClassLoader().getResourceAsStream( name);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user