/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.dlect.controller.data;
import com.google.common.base.Optional;
import com.google.common.collect.Maps;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Map;
import javax.xml.bind.JAXBException;
import org.dlect.controller.helper.Initilisable;
import org.dlect.encryption.DatabaseDecryptionHandler;
import org.dlect.encryption.DatabaseEncryptionHandler;
import org.dlect.events.EventID;
import org.dlect.events.listenable.Listenable;
import org.dlect.helper.JavaHelper;
import org.dlect.helpers.FileDebuggingHelper;
import org.dlect.model.Database;
import org.dlect.model.helper.DatabaseLoader;
import org.dlect.model.helper.DatabaseSaver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author lee
*/
public class DatabaseHandler extends Listenable<DatabaseHandler> implements Initilisable {
public static final String DLECT_DATABASE_NAME = "DLect-data.xml";
public static final String DLECT_LOGGING_NAME = "DLect-log.txt";
public static final String DLECT_UPDATER_LOGGING_NAME = "DLect-updater-log.txt";
private static final Logger LOGGER = LoggerFactory.getLogger(DatabaseHandler.class);
private Database database;
private DatabaseEncryptionHandler encryptionHandler;
private DatabaseDecryptionHandler decryptionHandler;
private final Map<String, String> temporaryDatabaseSettings = Maps.newHashMap();
@Override
public void init() {
loadDatabase();
}
public void loadDatabase() {
File dataFile = getDatabaseFile();
database = loadDatabase(dataFile);
decryptionHandler = new DatabaseDecryptionHandler(database);
encryptionHandler = new DatabaseEncryptionHandler(database);
addChild(database);
event(DatabaseHandlerEventID.DATABASE_LOADED).before(null).after(database).fire();
}
public static File getDatabaseFile() {
File dataFolder = getDLectFolder();
File dataFile = new File(dataFolder, DLECT_DATABASE_NAME);
return dataFile;
}
public static File getDLectFolder() {
return JavaHelper.getJarFile().getParentFile();
}
public static File getLoggingFile() {
File dataFolder = getDLectFolder();
File dataFile = new File(dataFolder, DLECT_LOGGING_NAME);
return dataFile;
}
public static File getUpdateLoggingFile() {
File dataFolder = getDLectFolder();
File dataFile = new File(dataFolder, DLECT_UPDATER_LOGGING_NAME);
return dataFile;
}
protected Database loadDatabase(File dataFile) {
if (dataFile.exists()) {
try {
return DatabaseLoader.load(dataFile);
} catch (JAXBException | FileNotFoundException ex) {
LOGGER.error("Failed to load database from file(" + dataFile + "). File Follows.", ex);
FileDebuggingHelper.debugFileToLogger(dataFile, LOGGER);
return backupLoadDatabase(dataFile);
}
} else {
if (!dataFile.getParentFile().exists()) {
dataFile.getParentFile().mkdirs();
}
return backupLoadDatabase(dataFile);
}
}
protected Database backupLoadDatabase(File dataFile) {
Database db = new Database();
saveDatabase(db, dataFile);
return db;
}
public void removeSetting(String key) {
String tmpVal = temporaryDatabaseSettings.remove(key);
if (tmpVal == null) {
database.removeSetting(key);
}
}
public void removeTemporarySetting(String key) {
temporaryDatabaseSettings.remove(key);
}
public void saveDatabase() {
if (database != null) {
saveDatabase(database, getDatabaseFile());
event(DatabaseHandlerEventID.DATABASE_SAVED).before(database).after(null).fire();
}
}
protected void saveDatabase(Database db, File dataFile) {
try {
DatabaseSaver.save(db, dataFile);
} catch (JAXBException ex) {
LOGGER.error("Error exporting database to XML" + db, ex);
} catch (FileNotFoundException ex) {
LOGGER.error("Error saving database to file. Expected Output Follows", ex);
try {
FileDebuggingHelper.debugStringToLogger(DatabaseSaver.save(db), "Expected", LOGGER);
} catch (JAXBException ex1) {
LOGGER.error("Error exporting database!!" + db, ex1);
}
}
}
public Database getDatabase() {
return database;
}
public void addSetting(String key, String value) {
database.addSetting(key, value);
}
public String getSetting(String key) {
String tmpVal = temporaryDatabaseSettings.get(key);
if (tmpVal == null) {
return database.getSetting(key);
}
return tmpVal;
}
public void addTemporarySetting(String key, String value) {
temporaryDatabaseSettings.put(key, value);
}
public boolean isTemporarySetting(String key) {
return temporaryDatabaseSettings.get(key) != null;
}
public Optional<String> getEncryptedSetting(String settingKey) {
return decryptionHandler.getEncryptedSetting(settingKey);
}
public void addEncryptedSetting(String settingKey, String plaintextValue) {
encryptionHandler.setEncryptedSetting(settingKey, plaintextValue);
}
public static enum DatabaseHandlerEventID implements EventID {
DATABASE_LOADED, DATABASE_SAVED;
@Override
public Class<?> getAppliedClass() {
return DatabaseHandler.class;
}
@Override
public String getName() {
return name();
}
}
}