package org.hive2hive.client.menu;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.LinkOption;
import org.apache.commons.io.FileUtils;
import org.hive2hive.client.ConsoleClient;
import org.hive2hive.client.console.ConsoleMenu;
import org.hive2hive.client.console.H2HConsoleMenu;
import org.hive2hive.client.console.H2HConsoleMenuItem;
import org.hive2hive.client.util.MenuContainer;
import org.hive2hive.core.security.UserCredentials;
/**
* The user configuration menu of the {@link ConsoleClient}.
*
* @author Christian, Nico
*
*/
public final class UserMenu extends H2HConsoleMenu {
private H2HConsoleMenuItem createUserCredentials;
private UserCredentials userCredentials;
private H2HConsoleMenuItem createRootDirectory;
private File rootDirectory;
public UserMenu(MenuContainer menus) {
super(menus);
}
@Override
protected void createItems() {
createUserCredentials = new H2HConsoleMenuItem("Create User Credentials") {
protected void execute() throws Exception {
userCredentials = new UserCredentials(askUsedId(), askPassword(), askPin());
exit();
}
};
createRootDirectory = new H2HConsoleMenuItem("Create Root Directory") {
protected void execute() throws Exception {
rootDirectory = new File(FileUtils.getUserDirectory(), "H2H_"
+ menus.getUserMenu().getUserCredentials().getUserId() + "_" + System.currentTimeMillis());
if (isExpertMode) {
print(String.format("Please specify the root directory path or enter 'ok' if you agree with '%s'.",
rootDirectory.toPath()));
String input = awaitStringParameter();
if (!"ok".equalsIgnoreCase(input)) {
// override the auto root directory
rootDirectory = new File(input);
}
}
if (!Files.exists(rootDirectory.toPath(), LinkOption.NOFOLLOW_LINKS)) {
try {
FileUtils.forceMkdir(rootDirectory);
print(String.format("Root directory '%s' created.", rootDirectory));
} catch (Exception e) {
printError(String
.format("Exception on creating the root directory %s: " + e, rootDirectory.toPath()));
}
} else {
print(String.format("Existing root directory '%s' will be used.", rootDirectory));
}
}
};
}
@Override
protected void addMenuItems() {
add(createUserCredentials);
}
@Override
protected String getInstruction() {
return "Please select a user configuration option:";
}
@Override
public void reset() {
clearCredentials();
rootDirectory = null;
ConsoleMenu.print("Root directory path has been reset.");
}
public UserCredentials getUserCredentials() {
return userCredentials;
}
public void clearCredentials() {
userCredentials = null;
ConsoleMenu.print("User credentials have been reset.");
}
public boolean createUserCredentials() {
while (getUserCredentials() == null) {
createUserCredentials.invoke();
}
// at this point, credentials have always been specified
return true;
}
public File getRootDirectory() {
return rootDirectory;
}
public boolean createRootDirectory() {
while (getRootDirectory() == null) {
createRootDirectory.invoke();
}
// at this point, a root directory has always been specified
return true;
}
private String askUsedId() {
print("Specify the user ID:");
return awaitStringParameter().trim();
}
private String askPassword() {
print("Specify the user password:");
return awaitStringParameter().trim();
}
private String askPin() {
print("Specify the user PIN:");
return awaitStringParameter().trim();
}
}