/*
* 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.pieShare.pieShareApp.service.configurationService;
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import org.apache.commons.io.FileUtils;
import org.pieShare.pieShareApp.service.configurationService.api.IApplicationConfigurationService;
import org.pieShare.pieShareApp.service.database.PieDatabaseManagerFactory;
import org.pieShare.pieShareApp.service.database.api.IPieDatabaseManagerFactory;
import org.pieShare.pieTools.pieUtilities.service.beanService.IBeanService;
import org.pieShare.pieTools.pieUtilities.service.pieLogger.PieLogger;
import org.pieShare.pieTools.pieUtilities.service.propertiesReader.api.IPropertiesReader;
import org.pieShare.pieTools.pieUtilities.service.propertiesReader.exception.NoConfigFoundException;
/**
*
* @author Richard
*/
public class ApplicationConfigurationService implements IApplicationConfigurationService {
protected File BASE_CONFIG_FOLDER;
private IPropertiesReader propertiesReader;
private File configFile;
private Properties conf;
private IBeanService beanService;
public ApplicationConfigurationService() {
//ToDo: Config Folder is hard coded. Check if we could do this in an other way.
String os = System.getProperty("os.name");
//try to get the appData folder in windows
String baseFolder = System.getenv("APPDATA");
//if on linux fall back to home folder
if (baseFolder == null || !os.contains("win")) {
baseFolder = System.getProperty("user.home");
}
BASE_CONFIG_FOLDER = new File(String.format("%s/%s/%s", baseFolder, ".pieSystems", ".pieShare"));
if (!BASE_CONFIG_FOLDER.exists() || !BASE_CONFIG_FOLDER.isDirectory()) {
BASE_CONFIG_FOLDER.mkdirs();
}
}
@Override
public File getBaseConfigPath() {
return this.BASE_CONFIG_FOLDER;
}
public void setPropertiesReader(IPropertiesReader propertiesReader) {
this.propertiesReader = propertiesReader;
}
@Override
public void setDatabaseFolder(File folder) {
File db = getDatabaseFolder();
addProperty("databaseDir", folder.toPath().toString());
IPieDatabaseManagerFactory fact = beanService.getBean(PieDatabaseManagerFactory.class);
fact.closeDB();
try {
for (File file : db.listFiles()) {
if (file.isDirectory()) {
FileUtils.moveDirectory(file, folder);
} else {
FileUtils.moveFileToDirectory(file, folder, false);
}
}
} catch (IOException ex) {
PieLogger.error(this.getClass(), "Error copy database to new location", ex);
}
fact.init();
}
public void setBeanService(IBeanService beanService) {
this.beanService = beanService;
}
private void addProperty(String key, String value) {
if (conf == null) {
conf = new Properties();
}
if (!conf.containsKey(key)) {
conf.put(key, value);
} else {
conf.replace(key, value);
}
propertiesReader.saveConfig(conf, configFile);
}
public void init() {
if (configFile == null) {
this.configFile = new File(BASE_CONFIG_FOLDER, "pieShare.properties");
}
if (!configFile.getParentFile().exists()) {
configFile.getParentFile().mkdirs();
}
try {
//pieShare.properties
conf = propertiesReader.getConfig(configFile);
} catch (NoConfigFoundException ex) {
PieLogger.error(this.getClass(), "Cannot find pieShareAppConfig.", ex);
}
}
@Override
public File getDatabaseFolder() {
File file;
if (conf == null || !conf.containsKey("databaseDir")) {
file = new File(BASE_CONFIG_FOLDER, "database");
} else {
file = new File(conf.getProperty("databaseDir"));
}
if (!file.exists()) {
file.mkdirs();
}
return file;
}
}