package fr.inria.soctrace.framesoc.headless;
import java.io.Console;
import java.util.Scanner;
import fr.inria.soctrace.framesoc.core.FramesocManager;
import fr.inria.soctrace.lib.model.utils.SoCTraceException;
import fr.inria.soctrace.lib.utils.Configuration;
import fr.inria.soctrace.lib.utils.DBMS;
import fr.inria.soctrace.lib.utils.Configuration.SoCTraceProperty;
public class HeadlessSetup {
// Configuration options
private static final int SQLITE_DB = 1;
private static final int MYSQL_DB = 2;
private static final int SQLITE_PATH_TO_EXISTING_DB_OPTION = 1;
private static final int SQLITE_CREATE_NEW_SYSTEM_DB_OPTION = 2;
private static final int SQLITE_CREATE_NEW_SYSTEM_DB_AT_OPTION = 3;
Scanner scanner;
public HeadlessSetup(Scanner scanner) {
this.scanner = scanner;
}
/**
* Setup Framesoc database.
*/
public void launchSetup() {
System.out
.println("Choose the type of Database management system you want:\n"
+ "1. SQLite\n"
+ "2. MySQL");
int choice = scanner.nextInt();
// Remove the new line from the scanner stream
scanner.nextLine();
switch (choice) {
case SQLITE_DB:
Configuration.getInstance().set(SoCTraceProperty.soctrace_dbms,
DBMS.SQLITE.toString());
setupSQLite();
break;
case MYSQL_DB:
Configuration.getInstance().set(SoCTraceProperty.soctrace_dbms,
DBMS.MYSQL.toString());
setupMySQL();
break;
default:
System.out.println("Invalid option selected: " + choice);
launchSetup();
}
}
/**
* Setup database for SQLite
*/
private void setupSQLite(){
String currentDbPath = Configuration.getInstance().get(
SoCTraceProperty.sqlite_db_directory);
String path;
System.out.println("Getting parameters for SQLite.");
System.out.println("SQLite current path for the database is " + currentDbPath);
System.out.println("Your choices are:\n"
+ " 1. Provide a path to an existing database.\n"
+ " 2. Create a new system database at the current path.\n"
+ " 3. Provide a new path and create a system database.");
int choice = scanner.nextInt();
switch (choice) {
case SQLITE_PATH_TO_EXISTING_DB_OPTION:
System.out
.println("Please provide a path to the directory of an existing database:");
path = scanner.next();
setDatabasePath(path);
break;
case SQLITE_CREATE_NEW_SYSTEM_DB_OPTION:
createDatabase();
break;
case SQLITE_CREATE_NEW_SYSTEM_DB_AT_OPTION:
System.out
.println("Please provide a path to an existing directory:");
path = scanner.next();
setDatabasePath(path);
createDatabase();
break;
default:
System.out.println("Invalid option selected: " + choice);
setupSQLite();
}
}
private void setDatabasePath(String path) {
Configuration.getInstance().set(SoCTraceProperty.sqlite_db_directory,
path);
Configuration.getInstance().saveOnFile();
}
private void createDatabase() {
try {
FramesocManager.getInstance().createSystemDB();
} catch (SoCTraceException e) {
System.out
.println("Error: Failed to create a new system database at "
+ Configuration.getInstance().get(
SoCTraceProperty.sqlite_db_directory));
e.printStackTrace();
}
}
/**
* Setup database for MySQL
*/
private void setupMySQL() {
System.out.println("Getting parameters for mySQL. Current values (in parentheses) will be used if no input is provided.");
// User name
String username = Configuration.getInstance().get(
SoCTraceProperty.mysql_db_user);
System.out.println("Please provide a user name (" + username + "):");
String providedUser = scanner.nextLine();
if (!providedUser.isEmpty())
username = providedUser;
Configuration.getInstance().set(SoCTraceProperty.mysql_db_user,
username);
// Password
Console console = System.console();
String pass = Configuration.getInstance().get(
SoCTraceProperty.mysql_db_password);
String providedPass = new String(console.readPassword("Please provide a password:"));
if (!providedPass.isEmpty())
pass = providedPass;
Configuration.getInstance().set(SoCTraceProperty.mysql_db_password,
pass);
// URL
String url = Configuration.getInstance().get(
SoCTraceProperty.mysql_base_db_jdbc_url);
System.out.println("Please provide the URL (" + url + "):");
String providedUrl = scanner.nextLine();
if (!providedUrl.isEmpty())
url = providedUrl;
Configuration.getInstance().set(
SoCTraceProperty.mysql_base_db_jdbc_url, url);
// Save
Configuration.getInstance().saveOnFile();
}
}