浏览代码

Finished EditStudentCommand

BlackPhreak 5 年之前
父节点
当前提交
4ce35c2258

+ 149 - 2
src/me/blackphreak/CommandHandling/EditStudentCommand.java

@@ -1,13 +1,160 @@
 package me.blackphreak.CommandHandling;
 
+import me.blackphreak.CommandHandling.Handlers.SearchStudentCommand;
+import me.blackphreak.Database;
+import me.blackphreak.Debug.Debug;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static me.blackphreak.Lib.promptQuestion;
+import static me.blackphreak.Lib.tryParseUInt;
+
 public class EditStudentCommand extends AbstractCommandHandler {
+	private String lastCmd;
+	private List<Integer> selectedStudentID;
+	private String selectedColumn;
+	
 	public EditStudentCommand(String desc) {
 		super(desc);
 	}
 	
 	@Override
 	public boolean handle() {
-		// TODO: whatever la, but not today do lo :(
-		return false;
+		boolean nextFlag;
+		// reset
+		selectedStudentID = new ArrayList<>();
+		lastCmd = null;
+		selectedColumn = null;
+		
+		do
+		{
+			nextFlag = selectStudentByID();
+			
+			// if lastCmd is set.
+			if (lastCmd != null) {
+				// in this case, lastCmd should be either "exit" nor "end".
+				return lastCmd.equalsIgnoreCase("exit");
+			}
+		} while (!nextFlag);
+		
+		do {
+			nextFlag = selectColumnToBeModified();
+			
+			if (lastCmd.equalsIgnoreCase("exit")) {
+				return true;
+			}
+		} while (!nextFlag);
+		
+		doEdit();
+		
+		return true;
+	}
+	
+	/**
+	 * Ask user to provide student ID before editing the targeted student(s).
+	 * @return true when selected at least one student, otherwise, false.
+	 */
+	private boolean selectStudentByID() {
+		do {
+			System.out.println("\n** type \"next\" to stop providing StudentID **");
+			System.out.println("** type \"exit\" to back to main menu **");
+			System.out.println("\nSelected StudentID(#"+selectedStudentID.size()+"): " + Arrays.toString(selectedStudentID.toArray()));
+			var inp = promptQuestion("Please provide StudentID: ", false);
+			
+			if (inp.equalsIgnoreCase("next"))
+			{
+				if (selectedStudentID.size() <= 0)
+					System.out.println("Please provide at least one student ID before edit.");
+				else
+					return true;
+			}
+			else if (inp.equalsIgnoreCase("exit"))
+			{
+				lastCmd = "exit";  // back to main menu
+				return false;
+			}
+			else
+			{
+				int sid = tryParseUInt(inp);
+				if (sid == -1) {
+					System.out.println("Invalid StudentID, please try again. [Parser Error]");
+					continue;
+				}
+				
+				// query database to confirm that student is exist.
+				try {
+					if (Database.getInstance()
+						.query("SELECT COUNT(*) FROM Student WHERE StudentID = \""+sid+"\";")
+						.getInt(1) != 1)
+					{
+						System.out.println("Invalid StudentID, please try again. [Failed to select (!=1)]");
+						continue;
+					}
+				} catch (SQLException e) {
+					Debug.err("Failed to find student. (Database Error)");
+					e.printStackTrace();
+					lastCmd = "end";  // end the program
+					return false;
+				}
+				
+				selectedStudentID.add(sid);
+			}
+		} while (true);
+	}
+	
+	private boolean selectColumnToBeModified() {
+		do {
+			System.out.println("\nColumns:");
+			for (int i = 0; i < SearchStudentCommand.unmodColNames.size(); i++) {
+				System.out.println(String.format(
+						"  %2s. %-15s",
+						(i+1) + "",
+						SearchStudentCommand.unmodColNames.get(i)
+				));
+			}
+			
+			// exit option
+			System.out.println(String.format(
+					"  %2s. %-15s",
+					"99",
+					"Back to main menu"
+			));
+			
+			var inp = promptQuestion("Please select one column to edit: ");
+			var selected = tryParseUInt(inp, "Invalid column index");
+			if (selected == -1)
+				continue;
+			
+			if (selected == 99)
+			{
+				lastCmd = "exit";
+				return false;
+			}
+			
+			if (selected <= 0
+					|| selected > SearchStudentCommand.unmodColNames.size())
+			{
+				System.out.println("Invalid column index. [Out of range]");
+				continue;
+			}
+			
+			selectedColumn = SearchStudentCommand.unmodColNames.get(selected-1);
+			return true;
+			
+		} while (true);
+	}
+	
+	private void doEdit() {
+		var newValue = promptQuestion("The value that you want it to be: ");
+		
+		var updated = Database.getInstance().update("UPDATE Student SET " + selectedColumn + " = \""+newValue+"\" WHERE StudentID = \""+selectedStudentID+"\";");
+		
+		if (updated <= 0)
+			System.out.println("No changes have been made.");
+		else
+			System.out.println("Update successfully made to "+updated+" student(s).");
 	}
 }

+ 5 - 5
src/me/blackphreak/CommandHandling/Handlers/SearchStudentCommand.java

@@ -3,6 +3,7 @@ package me.blackphreak.CommandHandling.Handlers;
 import me.blackphreak.CommandHandling.AbstractCommandHandler;
 import me.blackphreak.Database;
 import me.blackphreak.Debug.Debug;
+import me.blackphreak.ImmutableList;
 import me.blackphreak.Student.AbstractStudent;
 import me.blackphreak.Student.Types.LocalStudent;
 import me.blackphreak.Student.Types.OverseaStudent;
@@ -19,7 +20,8 @@ import static me.blackphreak.Lib.promptQuestion;
 import static me.blackphreak.Lib.tryParseUInt;
 
 public class SearchStudentCommand extends AbstractCommandHandler {
-	private List<String> colNames = new ArrayList<>();
+	private static List<String> colNames = new ArrayList<>();
+	public static ImmutableList<String> unmodColNames;
 	private HashMap</*colName*/String, /*searchCondition*/String> selectedCols;
 	
 	public SearchStudentCommand(String desc) {
@@ -35,6 +37,8 @@ public class SearchStudentCommand extends AbstractCommandHandler {
 		} catch (SQLException e) {
 			db.close();
 		}
+		
+		unmodColNames = new ImmutableList<>(colNames);
 	}
 	
 	@Override
@@ -204,8 +208,4 @@ public class SearchStudentCommand extends AbstractCommandHandler {
 		System.out.println("----------------------+--------------------------------+------------+-->");
 		
 	}
-	
-	private void undo() {
-	
-	}
 }

+ 36 - 0
src/me/blackphreak/ImmutableList.java

@@ -0,0 +1,36 @@
+package me.blackphreak;
+
+import java.util.List;
+
+public class ImmutableList<T> {
+	private List list;
+	
+	public ImmutableList(List<T> list)
+	{
+		this.list = List.copyOf(list);
+	}
+	
+	public int size() {
+		return this.list.size();
+	}
+	
+	public Object[] toArray() {
+		return this.list.toArray();
+	}
+	
+	public int lastIndexOf(Object o) {
+		return this.list.lastIndexOf(o);
+	}
+	
+	public int indexOf(Object o) {
+		return this.list.indexOf(o);
+	}
+	
+	public boolean contains(Object o) {
+		return this.list.contains(o);
+	}
+	
+	public T get(int index) {
+		return (T) this.list.get(index);
+	}
+}

+ 1 - 1
src/me/blackphreak/Student/AbstractStudent.java

@@ -53,7 +53,7 @@ public abstract class AbstractStudent {
 		try {
 			id = (Database.getInstance()
 					.query("SELECT MAX(StudentID) FROM Student;")  // query last sID
-					.getInt(1) + 1)  // read & increasement
+					.getInt(1) + 1)  // read & increment
 					+ "";  // toString
 		} catch (Exception e) {
 			e.printStackTrace();