assn07
This commit is contained in:
50
src/assn07/Account.java
Normal file
50
src/assn07/Account.java
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
package assn07;
|
||||||
|
|
||||||
|
public class Account<K, V> {
|
||||||
|
private K _website;
|
||||||
|
private V _password;
|
||||||
|
private Account<K, V> _next;
|
||||||
|
|
||||||
|
public Account(K website, V password) {
|
||||||
|
_website = website;
|
||||||
|
_password = password;
|
||||||
|
_next = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public K getWebsite() {
|
||||||
|
return _website;
|
||||||
|
}
|
||||||
|
|
||||||
|
public K getKey() {
|
||||||
|
return getWebsite();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWebsite(K website) {
|
||||||
|
this._website = website;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V getPassword() {
|
||||||
|
return _password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public V getValue() {
|
||||||
|
return getPassword();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(V password) {
|
||||||
|
this._password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(V value) {
|
||||||
|
setPassword(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Account<K, V> getNext() {
|
||||||
|
return _next;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNext(Account<K, V> next) {
|
||||||
|
_next = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
82
src/assn07/Main.java
Normal file
82
src/assn07/Main.java
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
package assn07;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Scanner scanner = new Scanner(System.in);
|
||||||
|
Map<String, String> passwordManager = new PasswordManager<>();
|
||||||
|
|
||||||
|
System.out.println("Enter Master Password");
|
||||||
|
while (!passwordManager.checkMasterPassword(scanner.nextLine()))
|
||||||
|
System.out.println("Enter Master Password");
|
||||||
|
|
||||||
|
String command = scanner.nextLine();
|
||||||
|
|
||||||
|
while (!command.equals("Exit")) {
|
||||||
|
switch (command) {
|
||||||
|
case "New password":
|
||||||
|
String website = scanner.nextLine();
|
||||||
|
String password = scanner.nextLine();
|
||||||
|
|
||||||
|
passwordManager.put(website, password);
|
||||||
|
System.out.println("New password added");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "Get password":
|
||||||
|
website = scanner.nextLine();
|
||||||
|
String result = passwordManager.get(website);
|
||||||
|
|
||||||
|
if (result == null)
|
||||||
|
System.out.println("Account does not exist");
|
||||||
|
else
|
||||||
|
System.out.println(result);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "Delete account":
|
||||||
|
website = scanner.nextLine();
|
||||||
|
result = passwordManager.remove(website);
|
||||||
|
|
||||||
|
if (result == null)
|
||||||
|
System.out.println("Account does not exist");
|
||||||
|
else
|
||||||
|
System.out.println("Account deleted");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "Check duplicate password":
|
||||||
|
password = scanner.nextLine();
|
||||||
|
List<String> list = passwordManager.checkDuplicate(password);
|
||||||
|
|
||||||
|
if (list.isEmpty())
|
||||||
|
System.out.println("No account uses that password");
|
||||||
|
else
|
||||||
|
System.out.println("Websites using that password:");
|
||||||
|
for (String key : list)
|
||||||
|
System.out.println(key);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "Get accounts":
|
||||||
|
System.out.println("Your accounts:");
|
||||||
|
for (String key : passwordManager.keySet())
|
||||||
|
System.out.println(key);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "Generate random password":
|
||||||
|
int length = scanner.nextInt();
|
||||||
|
scanner.nextLine();
|
||||||
|
System.out.println(passwordManager.generateRandomPassword(length));
|
||||||
|
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
System.out.println("Command not found");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
command = scanner.nextLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
scanner.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
66
src/assn07/Map.java
Normal file
66
src/assn07/Map.java
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
package assn07;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public interface Map <K, V> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an Account object using the key value pair,
|
||||||
|
* and inserts the object at the appropriate index
|
||||||
|
* based on the hash of they key. If the key already
|
||||||
|
* exists in map, update its value.
|
||||||
|
* @param key: the website name
|
||||||
|
* @param value: the password
|
||||||
|
*/
|
||||||
|
void put(K key, V value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value associated with the given key.
|
||||||
|
* This operation should have O(1) runtime.
|
||||||
|
* If the key is not in the array, return null.
|
||||||
|
* @param key
|
||||||
|
* @return the value (password) associated with that key
|
||||||
|
*/
|
||||||
|
V get(K key);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of key-value mappings in the map.
|
||||||
|
* @return the number of accounts in the map.
|
||||||
|
*/
|
||||||
|
int size();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a Set of all the keys (websites) contained in this map.
|
||||||
|
* @return A set of the keys contained in the map
|
||||||
|
*/
|
||||||
|
Set<K> keySet();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the Key and value pair from the map
|
||||||
|
* and returns the removed value.
|
||||||
|
* If the key is not in the array, return null.
|
||||||
|
* @param key to be removed
|
||||||
|
* @return the value (password) that was removed
|
||||||
|
*/
|
||||||
|
V remove(K key);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an Arraylist of the website names
|
||||||
|
* that have a password matching the given value
|
||||||
|
* @return A List containing the keys of accounts whose password
|
||||||
|
* match the given value
|
||||||
|
*/
|
||||||
|
List<K> checkDuplicate(V value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks to see if the entered Master Password matches
|
||||||
|
* the password stored in MASTER_PASSWORD
|
||||||
|
* @param enteredPassword - the password the user typed in
|
||||||
|
* @return true if passwords match, false otherwise
|
||||||
|
*/
|
||||||
|
boolean checkMasterPassword(String enteredPassword);
|
||||||
|
|
||||||
|
String generateRandomPassword(int length);
|
||||||
|
|
||||||
|
}
|
||||||
178
src/assn07/PasswordManager.java
Normal file
178
src/assn07/PasswordManager.java
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
package assn07;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class PasswordManager<K, V> implements Map<K, V> {
|
||||||
|
private static final String MASTER_PASSWORD = "password321";
|
||||||
|
private Account<K, V>[] _passwords;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public PasswordManager() {
|
||||||
|
_passwords = new Account[50];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void put(K key, V value) {
|
||||||
|
int hash = Math.abs(key.hashCode());
|
||||||
|
int index = hash % _passwords.length;
|
||||||
|
|
||||||
|
if (_passwords[index] == null)
|
||||||
|
_passwords[index] = new Account<K, V>(key, value);
|
||||||
|
else {
|
||||||
|
Account<K, V> current = _passwords[index];
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (current.getKey().equals(key)) {
|
||||||
|
current.setValue(value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current.getNext() == null) {
|
||||||
|
current.setNext(new Account<K, V>(key, value));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
current = current.getNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V get(K key) {
|
||||||
|
int hash = Math.abs(key.hashCode());
|
||||||
|
int index = hash % _passwords.length;
|
||||||
|
|
||||||
|
if (_passwords[index] == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
Account<K, V> current = _passwords[index];
|
||||||
|
while (current != null) {
|
||||||
|
if (current.getKey().equals(key))
|
||||||
|
return current.getValue();
|
||||||
|
|
||||||
|
current = current.getNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int size() {
|
||||||
|
int size = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < _passwords.length; i++)
|
||||||
|
if (_passwords[i] != null) {
|
||||||
|
Account<K, V> current = _passwords[i];
|
||||||
|
while (current != null) {
|
||||||
|
size++;
|
||||||
|
current = current.getNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<K> keySet() {
|
||||||
|
Set<K> keys = new HashSet<K>();
|
||||||
|
|
||||||
|
for (int i = 0; i < _passwords.length; i++) {
|
||||||
|
if (_passwords[i] == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Account<K, V> current = _passwords[i];
|
||||||
|
while (current != null) {
|
||||||
|
keys.add(current.getKey());
|
||||||
|
current = current.getNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public V remove(K key) {
|
||||||
|
int hash = Math.abs(key.hashCode());
|
||||||
|
int index = hash % _passwords.length;
|
||||||
|
|
||||||
|
if (_passwords[index] == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
Account<K, V> current = _passwords[index];
|
||||||
|
Account<K, V> previous = null;
|
||||||
|
while (current != null) {
|
||||||
|
if (current.getKey().equals(key)) {
|
||||||
|
if (previous == null)
|
||||||
|
_passwords[index] = current.getNext();
|
||||||
|
else
|
||||||
|
previous.setNext(current.getNext());
|
||||||
|
|
||||||
|
return current.getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
previous = current;
|
||||||
|
current = current.getNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<K> checkDuplicate(V value) {
|
||||||
|
List<K> keys = new ArrayList<K>();
|
||||||
|
|
||||||
|
for (int i = 0; i < _passwords.length; i++) {
|
||||||
|
if (_passwords[i] == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Account<K, V> current = _passwords[i];
|
||||||
|
while (current != null) {
|
||||||
|
if (current.getValue().equals(value))
|
||||||
|
keys.add(current.getKey());
|
||||||
|
|
||||||
|
current = current.getNext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return keys;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkMasterPassword(String enteredPassword) {
|
||||||
|
if (enteredPassword.equals(MASTER_PASSWORD))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generates random password of input length
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String generateRandomPassword(int length) {
|
||||||
|
int leftLimit = 48; // numeral '0'
|
||||||
|
int rightLimit = 122; // letter 'z'
|
||||||
|
int targetStringLength = length;
|
||||||
|
Random random = new Random();
|
||||||
|
|
||||||
|
String generatedString = random.ints(leftLimit, rightLimit + 1)
|
||||||
|
.filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
|
||||||
|
.limit(targetStringLength)
|
||||||
|
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
|
||||||
|
.toString();
|
||||||
|
|
||||||
|
return generatedString;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Used for testing, do not change
|
||||||
|
*/
|
||||||
|
public Account<K, V>[] getPasswords() {
|
||||||
|
return _passwords;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user