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 31a762a..6bc198c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,12 @@
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);
+ }
+}