import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Scanner; public class PasswordManager implements PasswordManagerInterface { boolean running = true; InputStream inputStream = System.in; OutputStream outputStream = System.out; ArrayList vaults = new ArrayList<>(); int selectedVaultId = -1; ArrayList vaultOperationOptions = new ArrayList<>(); public static void main(String[] args) { PasswordManager pm = new PasswordManager(); while (pm.running) { pm.showMenu(); } System.exit(0); } public PasswordManager() { println("Hello World"); } private void println(String output) { try { outputStream.write((output + "\n").getBytes(StandardCharsets.UTF_8)); } catch (IOException e) { e.printStackTrace(); } } @Override public void listVaults() { println("Vaults:"); for (int i = 0; i < vaults.size(); i++) { println("- vault id: " + i); } } public void createNewVault() { vaults.add(new Vault()); } @Override public void openVault() { } @Override public void showMenu() { StringBuilder sb = new StringBuilder(); Scanner scan = new Scanner(inputStream); running = true; sb.append("\nciip Gruppe 8 - Password Manager\n\n"); sb.append("Menu:\n"); sb.append("- list vaults: l\n"); sb.append("- create new vault: v\n"); sb.append("- select vault and show operations: v x (replace x with vault id)\n"); sb.append("- select vault operation: o x (replace o with a operation id for the selected vault)\n"); sb.append("- exit: e\n"); println(sb.toString()); String input = scan.nextLine(); if (input.equals("e")) { running = false; } else if (input.equals("l")) { listVaults(); } else if (input.equals("v")) { createNewVault(); } else if (input.startsWith("v")) { String vaultAction = (input.replace('v', ' ')).trim(); int vaultId = -1; try { vaultId = Integer.parseInt(vaultAction); } catch (NumberFormatException e) { println("-- please enter a correct vault id"); } if (vaultId >= 0) { selectedVaultId = vaultId; println("\nVault " + vaultId + " selected."); try { int internalOptionCounter = 0; println("\nAvailable vault operations:"); for (Method m : Class.forName("Vault").getDeclaredMethods()) { // returns all declared methods including private or protected try { if (Modifier.isPublic(Class.forName("Vault").getDeclaredMethod(m.getName()).getModifiers())) { // filter out methods that are not public (using Modifier) or have arguments (using getDeclaredMethod) vaultOperationOptions.add(m.getName()); println(internalOptionCounter + " - " + m.getName()); internalOptionCounter++; } } catch (NoSuchMethodException ignore) { // println("No method with name " + m.getName() + " found"); } } } catch (ClassNotFoundException e) { println("-- vaults not implemented yet"); } } } else if (input.startsWith("o")) { String operation = (input.replace('o', ' ')).trim(); int operationId = -1; try { operationId = Integer.parseInt(operation); } catch (NumberFormatException e) { println("-- please enter a valid operation id"); } if (selectedVaultId < 0) { println("-- a vault needs to be selected"); } else if (operationId >= 0 && operationId < vaultOperationOptions.size()) { Vault vault = vaults.get(selectedVaultId); try { println("Run selected operation '" + vaultOperationOptions.get(operationId) + "':"); vault.getClass().getDeclaredMethod(vaultOperationOptions.get(operationId)).invoke(vault); } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { e.printStackTrace(); println("-- selected operation failed"); } } else { println("-- please enter a valid operation id"); } } } }