package oculusPrime;
import java.io.*;
import java.util.HashMap;
import java.util.UUID;
import oculusPrime.State.values;
import org.jasypt.util.password.ConfigurablePasswordEncryptor;
public class Settings {
public final static String redhome = System.getenv("RED5_HOME");
public final static String settingsfile = redhome+Util.sep+"conf"+Util.sep+"oculus_settings.txt";
public final static String appsubdir = "webapps/oculusPrime";
public final static String streamfolder = redhome + Util.sep+"webapps/oculusPrime/streams/";
public final static String framefolder = redhome+Util.sep+appsubdir+"/framegrabs";
public final static String streamsfolder = redhome+Util.sep+appsubdir+"/streams";
public final static String stdout = redhome+Util.sep+"log"+Util.sep+"jvm.stdout";
public final static String archivefolder = redhome+Util.sep+"archive";
public final static String logfolder = redhome+Util.sep+"log";
public final static String roslogfolder = "~/.ros/";
public final static String DISABLED= "disabled";
public final static String ENABLED = "enabled";
public static final String FALSE = "false";
public static final String TRUE = "true";
public static final int ERROR = -1;
private static Settings singleton = null;
public static Settings getReference() {
if (singleton == null) singleton = new Settings();
return singleton;
}
private HashMap<String, String> settings = new HashMap<String, String>();
private Settings(){
// be sure of basic configuration
if(! new File(settingsfile).exists()) createFile(settingsfile);
importFile();
}
private void importFile(){
try {
String line;
FileInputStream filein = new FileInputStream(settingsfile);
BufferedReader reader = new BufferedReader(new InputStreamReader(filein));
while ((line = reader.readLine()) != null) {
String items[] = line.split(" ");
settings.put(items[0], items[1]);
}
reader.close();
filein.close();
} catch (Exception e) {
Util.log("importFile: " + e.getMessage(), this);
}
// test for missing
for (GUISettings setting : GUISettings.values()) {
if (readSetting(setting.name()) == null) {
Util.log("missing setting, changed to default: " + setting.name(), this);
writeFile();
break;
} else {
if(readSetting(setting.name()).equalsIgnoreCase("null")){
Util.log("missing setting, changed to default: " + setting.name(), this);
writeFile();
break;
}
}
}
for (ManualSettings setting : ManualSettings.values()) {
if (readSetting(setting.name()) == null) {
Util.log("missing setting, changed to default: " + setting.name(), this);
writeFile();
break;
} else {
if(readSetting(setting.name()).equalsIgnoreCase("null")){
Util.log("missing setting, changed to default: " + setting.name(), this);
writeFile();
break;
}
}
}
}
public boolean getBoolean(String key) {
if (key == null) return false;
String str = readSetting(key);
if (str == null) return false;
if (str.toUpperCase().equals("YES")) return true;
else if (str.equalsIgnoreCase(TRUE)) return true;
return false;
}
public int getInteger(String key) {
String ans = null;
int value = ERROR;
try {
ans = readSetting(key);
value = Integer.parseInt(ans);
} catch (Exception e) {
return ERROR;
}
return value;
}
public double getDouble(String key) {
String ans = null;
double value = ERROR;
try {
ans = readSetting(key);
value = Double.parseDouble(ans);
} catch (Exception e) {
return ERROR;
}
return value;
}
public String readSetting(String str) {
if(settings.containsKey(str)) return settings.get(str);
FileInputStream filein;
String result = null;
try {
filein = new FileInputStream(settingsfile);
BufferedReader reader = new BufferedReader(new InputStreamReader(filein));
String line = "";
while ((line = reader.readLine()) != null) {
String items[] = line.split(" ");
if(items.length>=2){
if ((items[0].toUpperCase()).equals(str.toUpperCase())) {
result = items[1];
}
}
}
reader.close();
filein.close();
} catch (Exception e) {
Util.log("readSetting: " + e.getMessage(), this);
return null;
}
// don't let string "null" be confused for actually a null, error state
if(result!=null) if(result.equalsIgnoreCase("null")) result = null;
return result;
}
@Override
public String toString(){
String result = new String();
for (GUISettings factory : GUISettings.values()) {
String val = readSetting(factory.toString());
if (val != null) { // never send out plain text passwords
if( ! factory.equals(GUISettings.email_password))
result += factory.toString() + " " + val + "<br>";
}
}
for (ManualSettings ops : ManualSettings.values()) {
String val = readSetting(ops.toString());
if (val != null) result += ops.toString() + " " + val + "<br>";
}
return result;
}
public synchronized void createFile(String path) {
try {
Util.log("creating "+path.toString(), this);
FileWriter fw = new FileWriter(new File(path));
fw.append("# GUI settings \r\n");
for (GUISettings factory : GUISettings.values()) {
fw.append(factory.toString() + " " + GUISettings.getDefault(factory) + "\r\n");
}
fw.append("# manual settings \r\n");
for (ManualSettings ops : ManualSettings.values()) {
fw.append(ops.toString() + " " + ManualSettings.getDefault(ops) + "\r\n");
}
fw.append("# user list \r\n");
fw.append("salt "+UUID.randomUUID().toString() + "\r\n");
fw.close();
} catch (Exception e) {
e.printStackTrace(System.out);
}
}
/** Organize the settings file into 3 sections. Use Enums's to order the file */
public synchronized void writeFile(){
try {
final String temp = redhome + Util.sep+"conf"+Util.sep+"oculus_created.txt";
FileWriter fw = new FileWriter(new File(temp));
fw.append("# gui settings \r\n");
for (GUISettings factory : GUISettings.values()) {
String val = readSetting(factory.toString());
if (val != null) {
fw.append(factory.toString() + " " + val + "\r\n");
}
else {
fw.append(factory.toString() + " " + GUISettings.getDefault(factory) + "\r\n");
}
}
fw.append("# manual settings \r\n");
for (ManualSettings ops : ManualSettings.values()) {
String val = readSetting(ops.toString());
if (val != null){
fw.append(ops.toString() + " " + val + "\r\n");
}
else {
fw.append(ops.toString() + " " + ManualSettings.getDefault(ops) + "\r\n");
}
}
fw.append("# user list \r\n");
if(readSetting("salt") != null) { fw.append("salt " + readSetting("salt") + "\r\n"); }
else fw.append("salt "+UUID.randomUUID().toString() + "\r\n");
if(readSetting("user0")!=null){
String[][] users = getUsers();
for (int j = 0; j < users.length; j++) {
fw.append("user" + j + " " + users[j][0] + "\r\n");
fw.append("pass" + j + " " + users[j][1] + "\r\n");
}
} else {
}
fw.close();
// now swap temp for real file
new File(settingsfile).delete();
new File(temp).renameTo(new File(settingsfile));
new File(temp).delete();
importFile();
} catch (Exception e) {
Util.log("Settings.writeFile(): " + e.getMessage(), this);
}
}
private String[][] getUsers() {
int i = 0;
for (;; i++)
if (readSetting("user" + i) == null)
break;
String[][] users = new String[i][2];
for (int j = 0; j < i; j++) {
users[j][0] = readSetting("user" + j);
users[j][1] = readSetting("pass" + j);
}
return users;
}
public void writeSettings(String setting, int value) {
String str = null;
try {
str = Integer.toString(value);
} catch (Exception e) {
return;
}
if (str != null) writeSettings(setting, str);
}
public void writeSettings(ManualSettings setting, String str) {
writeSettings(setting.name(), str);
}
public void writeSettings(GUISettings setting, String str) {
writeSettings(setting.name(), str);
}
/**
* Modify value of existing setting. read whole file, replace line while
* you're at it, write whole file
*/
public synchronized void writeSettings(String setting, String value) {
if(setting == null) return;
if(value == null) return;
if(value.equalsIgnoreCase("null")) return;
setting = setting.trim();
value = value.trim();
Util.debug("writeSettings(): "+setting+" "+value, this);
if(settings.get(setting) == null) Util.debug("settings.get(setting) == null", this);
//TODO: revisit -- test if is existing setting already
if(settings.get(setting).equals(value)) {
Util.debug("setting rejected, "+setting+" already set to: " + value, this);
return;
}
settings.put(setting, value);
FileInputStream filein;
String[] lines = new String[999];
try {
filein = new FileInputStream(settingsfile);
BufferedReader reader = new BufferedReader(new InputStreamReader(filein));
int i = 0;
while ((lines[i] = reader.readLine()) != null) {
String items[] = lines[i].split(" ");
if(items.length==2){ //TODO: SHOULD SETTINGS BE CASE SENSITIVE?
if ((items[0].toUpperCase()).equals(setting.toUpperCase())) {
lines[i] = setting + " " + value;
}
}
i++;
}
filein.close();
} catch (Exception e) {
e.printStackTrace();
}
FileOutputStream fileout;
try {
fileout = new FileOutputStream(settingsfile);
for (int n = 0; n < lines.length; n++) {
if (lines[n] != null) {
new PrintStream(fileout).println(lines[n]);
}
}
fileout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void newSetting(String setting, String value) {
setting = setting.trim();
value = value.trim();
FileInputStream filein;
String[] lines = new String[999];
try {
filein = new FileInputStream(settingsfile);
BufferedReader reader = new BufferedReader(new InputStreamReader(filein));
int i = 0;
while ((lines[i] = reader.readLine()) != null) {
lines[i] = lines[i].replaceAll("\\s+$", "");
if (!lines[i].equals("")) {
i++;
}
}
filein.close();
settings.put(setting, value);
} catch (Exception e) {
e.printStackTrace();
}
FileOutputStream fileout;
try {
fileout = new FileOutputStream(settingsfile);
for (int n = 0; n < lines.length; n++) {
if (lines[n] != null) {
new PrintStream(fileout).println(lines[n]);
}
}
new PrintStream(fileout).println(setting + " " + value);
fileout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void deleteSetting(String setting) {
// read whole file, remove offending line, write whole file
setting = setting.replaceAll("\\s+$", "");
FileInputStream filein;
String[] lines = new String[999];
try {
filein = new FileInputStream(settingsfile);
BufferedReader reader = new BufferedReader(new InputStreamReader(
filein));
int i = 0;
while ((lines[i] = reader.readLine()) != null) {
String items[] = lines[i].split(" ");
if ((items[0].toUpperCase()).equals(setting.toUpperCase())) {
lines[i] = null;
}
i++;
}
filein.close();
} catch (Exception e) {
e.printStackTrace();
}
FileOutputStream fileout;
try {
fileout = new FileOutputStream(settingsfile);
for (int n = 0; n < lines.length; n++) {
if (lines[n] != null) {
new PrintStream(fileout).println(lines[n]);
}
}
fileout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public String readRed5Setting(String str) {
String filenm = System.getenv("RED5_HOME") + Util.sep+"conf"+Util.sep+"red5.properties";
FileInputStream filein;
String result = null;
try {
filein = new FileInputStream(filenm);
BufferedReader reader = new BufferedReader(new InputStreamReader(
filein));
String line = "";
while ((line = reader.readLine()) != null) {
String s[] = line.split("=");
if (s[0].equals(str)) {
result = s[1];
}
}
filein.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public void writeRed5Setting(String setting, String value) {
String filenm = System.getenv("RED5_HOME") + Util.sep+"conf"+Util.sep+"red5.properties";
value = value.replaceAll("\\s+$", "");
FileInputStream filein;
String[] lines = new String[999];
try {
filein = new FileInputStream(filenm);
BufferedReader reader = new BufferedReader(new InputStreamReader(filein));
int i = 0;
while ((lines[i] = reader.readLine()) != null) {
String items[] = lines[i].split("=");
if ((items[0].toUpperCase()).equals(setting.toUpperCase())) {
lines[i] = setting + "=" + value;
}
i++;
}
filein.close();
} catch (Exception e) {
e.printStackTrace();
}
FileOutputStream fileout;
try {
fileout = new FileOutputStream(filenm);
for (int n = 0; n < lines.length; n++) {
if (lines[n] != null) {
new PrintStream(fileout).println(lines[n]);
}
}
fileout.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean getBoolean(GUISettings setting) {
return getBoolean(setting.toString());
}
public boolean getBoolean(ManualSettings setting) {
return getBoolean(setting.toString());
}
public String readSetting(ManualSettings setting) {
return readSetting(setting.toString());
}
public String readSetting(GUISettings setting) {
return readSetting(setting.toString());
}
public int getInteger(ManualSettings setting) {
return getInteger(setting.toString());
}
public int getInteger(GUISettings setting) {
return getInteger(setting.toString());
}
public boolean getBoolean(values key) {
return getBoolean(key.name());
}
public double getDouble(GUISettings setting) { return getDouble(setting.name()); }
public double getDouble(ManualSettings setting) { return getDouble(setting.name()); }
public long getLong(ManualSettings setting) { return Long.valueOf(readSetting(setting)); }
public long getLong(GUISettings setting) { return Long.valueOf(readSetting(setting)); }
}