diff --git a/database/pom.xml b/database/pom.xml index bed81fa..537de74 100644 --- a/database/pom.xml +++ b/database/pom.xml @@ -1,17 +1,47 @@ - + + 4.0.0 + Database + + database + 0.1-SNAPSHOT + bundle + arcadexsystem eu.arcadex.system ${global.version} - 4.0.0 - - database - jar - + + + org.mapdb + mapdb + 0.9.7 + + + + ${groupId}.${artifactId}-${version} + + + org.apache.felix + maven-bundle-plugin + 2.3.5 + true + + + Arcadex System: ${name} ${version} + ${groupId}.${artifactId} + eu.arcadex.system.database.Activator + eu.arcadex.system.database.api + * + + + + + \ No newline at end of file diff --git a/database/src/main/java/eu/arcadex/system/database/Activator.java b/database/src/main/java/eu/arcadex/system/database/Activator.java new file mode 100644 index 0000000..98f21fc --- /dev/null +++ b/database/src/main/java/eu/arcadex/system/database/Activator.java @@ -0,0 +1,28 @@ +package eu.arcadex.system.database; + +import eu.arcadex.system.database.api.IDatabase; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceRegistration; + +/** + * @author DmitriyMX + * 2016 + */ +public class Activator implements BundleActivator { + private Database database; + private ServiceRegistration service; + + @Override + public void start(BundleContext context) throws Exception { + database = new Database(); + database.init(); + service = context.registerService(IDatabase.class.getName(), database, null); + } + + @Override + public void stop(BundleContext context) throws Exception { + service.unregister(); + database.save(); + } +} diff --git a/database/src/main/java/eu/arcadex/system/database/Database.java b/database/src/main/java/eu/arcadex/system/database/Database.java new file mode 100644 index 0000000..748c2f4 --- /dev/null +++ b/database/src/main/java/eu/arcadex/system/database/Database.java @@ -0,0 +1,87 @@ +package eu.arcadex.system.database; + +import eu.arcadex.system.database.api.IDatabase; +import org.mapdb.DB; +import org.mapdb.DBMaker; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.util.Map; + +/** + * @author DmitriyMX + * 2016 + */ +class Database implements IDatabase { + private Logger logger = LoggerFactory.getLogger(Database.class.getName()); + private DB database; + private Map databaseStorage; + private AutosaveDBThread autosaveThread; + + void init() { + database = DBMaker.newFileDB(new File("database")) + .closeOnJvmShutdown() + .make(); + databaseStorage = database.createHashMap("storage").makeOrGet(); + + autosaveThread = new AutosaveDBThread(database); + autosaveThread.start(); + } + + @Override + public boolean containsKey(String key) { + return databaseStorage.containsKey(key); + } + + @Override + public String get(String key) { + return databaseStorage.get(key); + } + + @Override + public void set(String key, String value) { + databaseStorage.put(key, value); + } + + @Override + public void remove(String key) { + databaseStorage.remove(key); + } + + void save() { + logger.trace("Saving database"); + autosaveThread.stopThread(); + + database.commit(); + database.close(); + } + + private class AutosaveDBThread extends Thread { + private boolean run = false; + private DB database; + + AutosaveDBThread(DB db) { + this.database = db; + } + + void stopThread() { + this.run = false; + } + + @Override + public void run() { + run = true; + + while (run) { + try { + // TODO: переместить в конфиг + Thread.sleep(60000); + } catch (InterruptedException ignore) { + // ignore + } + database.commit(); + } + } + } +} diff --git a/database/src/main/java/eu/arcadex/system/database/api/IDatabase.java b/database/src/main/java/eu/arcadex/system/database/api/IDatabase.java new file mode 100644 index 0000000..22f94fd --- /dev/null +++ b/database/src/main/java/eu/arcadex/system/database/api/IDatabase.java @@ -0,0 +1,12 @@ +package eu.arcadex.system.database.api; + +/** + * @author DmitriyMX + * 2016 + */ +public interface IDatabase { + boolean containsKey(String key); + String get(String key); + void set(String key, String value); + void remove(String key); +}