diff --git a/.gitignore b/.gitignore index 2d69fec..683296e 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ build/ ri_log* test-*.tmp .idea/workspace.xml +.idea/ diff --git a/pom.xml b/pom.xml index 18f9739..6bc198c 100644 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,17 @@ json 20210307 + + org.quartz-scheduler + quartz + 2.3.2 + + + org.jetbrains + annotations + RELEASE + compile + diff --git a/src/main/java/org/leolo/nrdatad/App.java b/src/main/java/org/leolo/nrdatad/App.java index cef45fd..fd6f245 100644 --- a/src/main/java/org/leolo/nrdatad/App.java +++ b/src/main/java/org/leolo/nrdatad/App.java @@ -85,5 +85,11 @@ public class App { System.exit(1); return; } + loadCronJob(); + } + + private void loadCronJob() { + log.atDebug().log("Start loading cron jobs"); + } } diff --git a/src/main/java/org/leolo/nrdatad/db/BaseDao.java b/src/main/java/org/leolo/nrdatad/db/BaseDao.java new file mode 100644 index 0000000..973961f --- /dev/null +++ b/src/main/java/org/leolo/nrdatad/db/BaseDao.java @@ -0,0 +1,18 @@ +package org.leolo.nrdatad.db; + +import java.sql.Connection; +import java.sql.SQLException; + +public abstract class BaseDao { + + private DatabaseManager manager; + + public BaseDao(DatabaseManager manager){ + this.manager = manager; + } + + protected Connection getConnection() throws SQLException{ + return manager.getConnection(); + } + +} diff --git a/src/main/java/org/leolo/nrdatad/db/DatabaseManager.java b/src/main/java/org/leolo/nrdatad/db/DatabaseManager.java index 7e383f3..b738397 100644 --- a/src/main/java/org/leolo/nrdatad/db/DatabaseManager.java +++ b/src/main/java/org/leolo/nrdatad/db/DatabaseManager.java @@ -2,6 +2,7 @@ package org.leolo.nrdatad.db; import java.sql.Connection; import java.sql.SQLException; +import java.util.function.BiConsumer; public interface DatabaseManager { @@ -10,4 +11,6 @@ public interface DatabaseManager { public boolean checkConnection(); public Connection getConnection() throws SQLException; + + public MetadataDao getMetadataDao(); } diff --git a/src/main/java/org/leolo/nrdatad/db/MetadataDao.java b/src/main/java/org/leolo/nrdatad/db/MetadataDao.java new file mode 100644 index 0000000..286c2f6 --- /dev/null +++ b/src/main/java/org/leolo/nrdatad/db/MetadataDao.java @@ -0,0 +1,42 @@ +package org.leolo.nrdatad.db; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; +import org.leolo.nrdatad.ConfigurationManager; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.Set; +import java.util.function.BiConsumer; + +public abstract class MetadataDao extends BaseDao { + + Logger log = LogManager.getLogger(); + + public MetadataDao(DatabaseManager manager){ + super(manager); + } + + public abstract String getMetadata(String key, String defaultValue) throws SQLException; + + public String getMetadata(String key) throws SQLException{ + return getMetadata(key, null); + } + + public abstract void updateMetadata(String key, @NotNull String value) throws SQLException; + + public abstract Set getKeys() throws SQLException; + + public abstract void forEach(BiConsumer action) throws SQLException; + + public boolean containsKey(String key) throws SQLException{ + return getKeys().contains(key); + } + + public int entryCount() throws SQLException{ + return getKeys().size(); + } + +} diff --git a/src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java b/src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java index fab1e79..d27e98f 100644 --- a/src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java +++ b/src/main/java/org/leolo/nrdatad/db/mariadb/DatabaseManager.java @@ -3,6 +3,7 @@ package org.leolo.nrdatad.db.mariadb; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.leolo.nrdatad.ConfigurationManager; +import org.leolo.nrdatad.db.MetadataDao; import org.mariadb.jdbc.MariaDbPoolDataSource; import java.sql.*; @@ -57,4 +58,9 @@ public class DatabaseManager implements org.leolo.nrdatad.db.DatabaseManager{ public Connection getConnection() throws SQLException{ return ds.getConnection(); } + + @Override + public MetadataDao getMetadataDao() { + return new org.leolo.nrdatad.db.mariadb.MetadataDao(this); + } } diff --git a/src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDao.java b/src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDao.java new file mode 100644 index 0000000..6bfb918 --- /dev/null +++ b/src/main/java/org/leolo/nrdatad/db/mariadb/MetadataDao.java @@ -0,0 +1,116 @@ +package org.leolo.nrdatad.db.mariadb; + +import org.jetbrains.annotations.NotNull; + +import java.sql.*; +import java.util.HashSet; +import java.util.Set; +import java.util.TreeMap; +import java.util.function.BiConsumer; + +public class MetadataDao extends org.leolo.nrdatad.db.MetadataDao { + + private static Object SYNC_TOKEN = new Object(); + + public MetadataDao(DatabaseManager manager){ + super(manager); + } + + @Override + public String getMetadata(String key, String defaultValue) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT value FROM metadata WHERE `key` = ?") + ){ + pstmt.setString(1, key); + try(ResultSet rs = pstmt.executeQuery()){ + if(rs.next()){ + return rs.getString(1); + } + } + } + return defaultValue; + } + + @Override + public void updateMetadata(@NotNull String key, @NotNull String value) throws SQLException { + synchronized (SYNC_TOKEN) { + if (containsKey(key)) { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("UPDATE metadata SET value = ? WHERE `key` = ?") + ){ + pstmt.setString(1, value); + pstmt.setString(2, key); + pstmt.executeUpdate(); + } + } else { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("INSERT INTO metadata (`key`, value) VALUES (?,?)") + ){ + pstmt.setString(1, key); + pstmt.setString(2, value); + pstmt.executeUpdate(); + + } + + } + } + } + + @Override + public Set getKeys() throws SQLException { + HashSet set = new HashSet<>(); + try( + Connection conn = getConnection(); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT `key` FROM metadata") + ){ + while(rs.next()){ + set.add(rs.getString(1)); + } + } + return set; + } + + @Override + public void forEach(BiConsumer action) throws SQLException { + TreeMap map = new TreeMap<>(); + try( + Connection conn = getConnection(); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT `key`, value FROM metadata") + ){ + while(rs.next()){ + map.put(rs.getString(1), rs.getString(2)); + } + } + map.forEach(action); + } + + @Override + public boolean containsKey(String key) throws SQLException { + try( + Connection conn = getConnection(); + PreparedStatement pstmt = conn.prepareStatement("SELECT 1 FROM metadata WHERE `key` = ?") + ){ + pstmt.setString(1, key); + try(ResultSet rs = pstmt.executeQuery()){ + return rs.next(); + } + } + } + + @Override + public int entryCount() throws SQLException { + try( + Connection conn = getConnection(); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery("SELECT COUNT(1) FROM metadata") + ){ + rs.next(); + return rs.getInt(1); + } + } +} diff --git a/src/test/java/org/leolo/nrdatad/db/test/DatabaseManager.java b/src/test/java/org/leolo/nrdatad/db/test/DatabaseManager.java index 8aaacc9..1518226 100644 --- a/src/test/java/org/leolo/nrdatad/db/test/DatabaseManager.java +++ b/src/test/java/org/leolo/nrdatad/db/test/DatabaseManager.java @@ -1,8 +1,28 @@ package org.leolo.nrdatad.db.test; -public class DatabaseManager { +import org.leolo.nrdatad.db.MetadataDao; + +import java.sql.Connection; +import java.sql.SQLException; + +public class DatabaseManager implements org.leolo.nrdatad.db.DatabaseManager { public void initPool() { } + + @Override + public boolean checkConnection() { + return true; + } + + @Override + public Connection getConnection() throws SQLException { + throw new RuntimeException("Function not supported by stub"); + } + + @Override + public MetadataDao getMetadataDao() { + return null; + } } diff --git a/src/test/java/org/leolo/nrdatad/db/test/MetadataDao.java b/src/test/java/org/leolo/nrdatad/db/test/MetadataDao.java new file mode 100644 index 0000000..fa66951 --- /dev/null +++ b/src/test/java/org/leolo/nrdatad/db/test/MetadataDao.java @@ -0,0 +1,40 @@ +package org.leolo.nrdatad.db.test; + +import org.jetbrains.annotations.NotNull; +import org.leolo.nrdatad.db.DatabaseManager; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Set; +import java.util.function.BiConsumer; + +public class MetadataDao extends org.leolo.nrdatad.db.MetadataDao { + + private HashMap dataMap = new HashMap<>(); + + public MetadataDao(DatabaseManager manager) { + super(manager); + } + + @Override + public String getMetadata(String key, String defaultValue) throws SQLException { + if(dataMap.containsKey(key)) + return dataMap.get(key); + return defaultValue; + } + + @Override + public void updateMetadata(String key, @NotNull String value) throws SQLException { + dataMap.put(key, value); + } + + @Override + public Set getKeys() throws SQLException { + return dataMap.keySet(); + } + + @Override + public void forEach(BiConsumer action) throws SQLException { + dataMap.forEach(action); + } +}