package ru.lao.rha;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import scala.Console;
public class RHAConfig {
public static String configPath = "config/rha.config";
public static File cfgFile = new File(configPath);
public static boolean debug = true;
public RHAConfig() {
}
/**
* считывает из файла конфигурации ключ в цифровом виде
* @param key - ключ
* @return - значение ключа (если нет такого ключа или строка с ним неправильная - возвращает 0)
*/
public static Integer getInt(String key) {
int result = 0;
if (!cfgFile.exists()) { createConfigFile(); }
String line = getLineWithKeyFromFile(configPath, key);
if(line.equalsIgnoreCase("[error]")){if(debug){logError(1);}; return result;}
if(line.equalsIgnoreCase("[not_found]")){if(debug){logError(2);}; return result;}
String[] values = line.split(": ");
if(values.length != 2){if(debug){logError(3);}; return result;}
try { result = Integer.parseInt(values[1]); } catch (Exception e){}
return result;
}
/**
* считывает из файла конфигурации ключ в булевом виде
* @param key - ключ
* @return - значение ключа (если нет такого ключа или строка с ним неправильная - возвращает false)
*/
public static boolean getBoolean(String key) {
if (!cfgFile.exists()) { createConfigFile(); }
String line = getLineWithKeyFromFile(configPath, key);
if(line.equalsIgnoreCase("[error]")){if(debug){logError(4);}; return false;}
if(line.equalsIgnoreCase("[not_found]")){if(debug){logError(5);}; return false;}
String[] values = line.split(": ");
if(values.length != 2){if(debug){logError(6);}; return false;}
if(values[1].equalsIgnoreCase("true")){return true;}
return false;
}
/**
* считывает из файла конфигурации ключ в текстовом виде
* @param key - ключ
* @return - значение ключа (если нет такого ключа или строка с ним неправильная - возвращает "")
*/
public static String getString(String key) {
if (!cfgFile.exists()) { createConfigFile(); }
String line = getLineWithKeyFromFile(configPath, key);
if(line.equalsIgnoreCase("[error]")){if(debug){logError(7);}; return "";}
if(line.equalsIgnoreCase("[not_found]")){if(debug){logError(8);}; return "";}
String[] values = line.split(": ");
if(values.length != 2){if(debug){logError(9);}; return "";}
return values[1];
}
/**
* записывает в конфиг новый булевый ключ, если его нет, либо перезаписывает старый
* (при этом тип старого ключа поменяется, если типы нового и старого не совпадают!)
* @param key - ключ
* @param valueToWrite - значение
*/
public static void setBoolean(String key, boolean valueToWrite) {
String value = "true";
if(!valueToWrite)value = "false";
setString(key, value);
}
/**
* записывает в конфиг новый цифровой ключ, если его нет, либо перезаписывает старый
* (при этом тип старого ключа поменяется, если типы нового и старого не совпадают!)
* @param key - ключ
* @param valueToWrite - значение
*/
public static void setInteger(String key, int valueToWrite) {
String value = String.valueOf(valueToWrite);
setString(key, value);
}
/**
* записывает в конфиг новый текстовый ключ, если его нет, либо перезаписывает старый
* (при этом тип старого ключа поменяется, если типы нового и старого не совпадают!)
* @param key - ключ
* @param valueToWrite - значение
*/
public static void setString(String key, String valueToWrite) {
if (!cfgFile.exists()) { createConfigFile(); }
boolean found = false;
List<String> contents = new ArrayList<String>();
String line = "";
try { // считываем конфиг файл в лист, если находим ключевую строку, то подставляем новое значение
BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(configPath), "UTF-8"));
do {
try { line = file.readLine();} catch (Exception EndOfFile){break;}
if(line != null && line.startsWith(key)){
String lineparts[] = line.split(": ");
line = lineparts[0] + ": " + valueToWrite;
found = true;
}
if(line != null && line.length() > 0){contents.add(line);}
} while (line != null);
if(!found){contents.add(key + ": " + valueToWrite);} // если не находим ключ - в конец листа дописываем новую строку
file.close();
cfgFile.delete(); // удаляем старый файл
cfgFile.createNewFile(); // записываем новый файл
BufferedOutputStream quoteOut = new BufferedOutputStream(new FileOutputStream(configPath, true));
for(int i = 0; i < contents.size(); i++){
quoteOut.write((contents.get(i) + "\n").getBytes("UTF-8"));
}
quoteOut.flush();
quoteOut.close();
} catch (Exception e){ if(debug){logError(10);};}
}
/**
* ищет строку с ключом в файле конфигурации
* @param filePath - путь к файлу
* @param key - ключ
* @return - строка
*/
private static String getLineWithKeyFromFile(String path, String key) {
try {
BufferedReader file = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8"));
String line = "";
do {
try { line = file.readLine(); } catch (Exception EndOfFile){break;}
if(line.startsWith(key)){file.close(); return line;}
} while (line != null);
file.close();
return "[not_found]";
} catch (Exception e) { return "[error]"; }
}
/**
* создает файл конфигурации
* @param filename - имя файла
*/
private static void createConfigFile() {
try {
cfgFile.createNewFile();
BufferedOutputStream file = new BufferedOutputStream(new FileOutputStream(configPath, true));
file.write("Russian Hostility Configuration File\n".getBytes("UTF-8"));
file.write("enabledHelmets: true\n".getBytes("UTF-8"));
file.flush();
file.close();
} catch (Exception e){ if(debug){logError(11);}}
}
/**
* этот блок срабатывает, если debug = true, облегчает поиск ошибки, все места пронумерованы
* @param labelError - номер ошибки
*/
private static void logError(int labelError) {
Console.out().println("Config error #" + labelError + ". Check your code." );
}
}