/*
* CMISBox - Synchronize and share your files with your CMIS Repository
*
* Copyright (C) 2011 - Andrea Agili
*
* CMISBox is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CMISBox is distributed in the hope that it will be useful,
*
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CMISBox. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.github.cmisbox.core;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.PropertyConfigurator;
import com.github.cmisbox.ui.UI;
public class Config {
public static enum OS {
LINUX, WINDOWS, MACOSX;
}
private static final String REPOSITORY_USERNAME = "repository.username";
private static final String REPOSITORY_URL = "repository.url";
private static final String REPOSITORY_PASSWORD = "repository.password";
private static final String WATCHPARENT = "watchparent";
private static final String PROPERTIES_FILE = "cmisbox.properties";
private static final String CHANGE_LOG_TOKEN = "change.log.token";
private File configHome;
private OS os;
private Properties properties;
private Log log;
private static Config instance = new Config();
public static Config getInstance() {
return Config.instance;
}
private Config() {
String osName = System.getProperty("os.name").toLowerCase();
if (osName.equals("linux")) {
this.os = OS.LINUX;
} else if (osName.startsWith("windows")) {
this.os = OS.WINDOWS;
} else if (osName.startsWith("mac os x")) {
this.os = OS.MACOSX;
} else {
throw new RuntimeException(Messages.unsupportedOs + ": " + osName);
}
String homePath = System.getProperty("user.home");
if (this.os == OS.LINUX) {
homePath += "/.cmisbox";
} else if (this.os == OS.MACOSX) {
homePath += "/Library/Application Support/CMISBox";
} else if (this.os == OS.WINDOWS) {
homePath = System.getenv("APPDATA") + "/CMISBox";
}
this.configHome = new File(homePath);
if (!this.configHome.exists()) {
this.configHome.mkdirs();
}
File logdir = new File(this.configHome, "logs");
if (!logdir.exists()) {
logdir.mkdirs();
}
System.getProperties().setProperty("cmisbox.home",
this.configHome.getAbsolutePath());
PropertyConfigurator.configure(this.getClass().getResource(
"log4j.properties"));
this.log = LogFactory.getLog(this.getClass());
this.properties = this.createDefaultProperties();
try {
File propertiesFile = new File(this.configHome,
Config.PROPERTIES_FILE);
if (!propertiesFile.exists()) {
FileOutputStream out = new FileOutputStream(propertiesFile);
this.properties.store(out, null);
out.close();
}
this.properties.load(new FileInputStream(propertiesFile));
} catch (IOException e) {
}
this.log.info(Messages.cmisBoxConfigHome + ": " + this.configHome);
String watchParent = this.properties.getProperty(Config.WATCHPARENT);
UI ui = UI.getInstance();
while (watchParent == null) {
if (ui.isAvailable()) {
File f = ui.getWatchFolder();
watchParent = f != null ? f.getAbsolutePath() : null;
if (watchParent != null) {
this.saveProperties();
File box = new File(f, "Box");
box.mkdirs();
this.setWatchParent(box.getAbsolutePath());
}
} else {
System.err.print(Messages.unableToLocateParent + ", "
+ Messages.pleaseInsertInProps);
this.log.error(Messages.unableToLocateParent);
Main.exit(1);
}
}
}
private Properties createDefaultProperties() {
Properties p = new Properties();
return p;
}
public String getChangeLogToken() {
return this.properties.getProperty(Config.CHANGE_LOG_TOKEN);
}
public File getConfigHome() {
return this.configHome;
}
public OS getOS() {
return this.os;
}
public String getRepositoryPassword() {
return this.properties.getProperty(Config.REPOSITORY_PASSWORD);
}
public String getRepositoryUrl() {
return this.properties.getProperty(Config.REPOSITORY_URL);
}
public String getRepositoryUsername() {
return this.properties.getProperty(Config.REPOSITORY_USERNAME);
}
public String getWatchParent() {
return this.properties.getProperty(Config.WATCHPARENT);
}
public boolean isLinux() {
return this.getOS() == OS.LINUX;
}
public boolean isMacOSX() {
return this.getOS() == OS.MACOSX;
}
public boolean isWindows() {
return this.getOS() == OS.WINDOWS;
}
private void saveProperties() {
File f = new File(this.configHome, Config.PROPERTIES_FILE);
try {
FileOutputStream fos = new FileOutputStream(f);
this.properties.store(fos, null);
fos.close();
} catch (Exception e) {
this.log.error(e);
UI ui = UI.getInstance();
if (ui.isAvailable()) {
ui.notify(e.getLocalizedMessage());
}
}
}
public void setChangeLogToken(String token) {
try {
token = (Integer.parseInt(token) + 1) + "";
} catch (Exception e) {
}
this.properties.setProperty(Config.CHANGE_LOG_TOKEN, token);
this.saveProperties();
}
public void setCredentials(String username, String password, String url) {
this.properties.setProperty(Config.REPOSITORY_USERNAME, username);
this.properties.setProperty(Config.REPOSITORY_PASSWORD, password);
this.properties.setProperty(Config.REPOSITORY_URL, url);
this.saveProperties();
}
public void setWatchParent(String watchParent) {
this.properties.setProperty(Config.WATCHPARENT, watchParent);
this.saveProperties();
}
}