From 8544b3f0ef17263d91f1e601c88648bc45427a9f Mon Sep 17 00:00:00 2001 From: ZacharyDavidSaunders Date: Wed, 15 Feb 2017 23:09:25 -0800 Subject: [PATCH] Wrapped User Input In Dedicated Methods This should mitigate some of the scanner.NextXXX problems. --- .idea/workspace.xml | 139 ++++++++++++++++++++++++------------------- src/Main.java | 62 ++++++++----------- src/utils/input.java | 96 ++++++++++++++++++++++++++++++ 3 files changed, 199 insertions(+), 98 deletions(-) create mode 100644 src/utils/input.java diff --git a/.idea/workspace.xml b/.idea/workspace.xml index d2eecd6..1632b31 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -52,8 +52,20 @@ - - + + + + + + + + + + + + + + @@ -68,16 +80,6 @@ - - - - - - - - - - @@ -106,13 +108,14 @@ @@ -154,7 +157,6 @@ - @@ -208,6 +210,7 @@ + @@ -220,6 +223,7 @@ + @@ -686,14 +690,15 @@ + - - + @@ -702,12 +707,14 @@ + - + + @@ -716,9 +723,7 @@ - - @@ -743,6 +748,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -781,16 +828,6 @@ - - - - - - - - - - @@ -833,16 +870,6 @@ - - - - - - - - - - @@ -875,16 +902,6 @@ - - - - - - - - - - @@ -1003,16 +1020,6 @@ - - - - - - - - - - @@ -1027,10 +1034,20 @@ + + + + + + + + + + - - + + diff --git a/src/Main.java b/src/Main.java index db76e4f..8d952af 100644 --- a/src/Main.java +++ b/src/Main.java @@ -10,12 +10,10 @@ import java.net.URL; import java.time.Instant; import java.util.ArrayList; -import java.util.Scanner; import java.util.concurrent.TimeUnit; public class main { - static Scanner scanner = new Scanner(System.in); static boolean isValidWebsite; static boolean sourceCodeDifferenceFound; static ArrayList recordList = new ArrayList<>(); @@ -35,13 +33,12 @@ public static void main(String[] args) throws Exception { getMaxNumberOfRefreshesFromUser(); htmlCompareProcess(); displayChangeReport(); - scanner.close(); } private static void getWebsiteFromUser() { System.out.println("Please enter the full URL for the website whose HTML source code you want to track:"); - settings.setWebsite(scanner.nextLine()); + settings.setWebsite(utils.input.getStringFromConsole()); } private static void verifyValidWebsite() { @@ -112,22 +109,20 @@ private static void getRefreshRateFromUser() System.out.println("Please enter \"3\" if you would like to track "+ settings.getWebsite() + "'s changes every X hour(s)."); System.out.println("Please enter \"4\" if you would like to track "+ settings.getWebsite() + "'s changes every X day(s)."); System.out.println("Please enter \"5\" if you would like to track "+ settings.getWebsite() + "'s changes every X week(s)."); - if (scanner.hasNextLine()) { - String userInput = scanner.nextLine(); //You have to save the value of scanner.nextLine because it changes each time you access it via scanner.next... - try{ - if((Integer.valueOf(userInput) >= 1) && (Integer.valueOf(userInput) <= 5)) - { - refreshType = Integer.valueOf(userInput); - } - else{ - System.out.println("Error: You entered an invalid option. Please enter 1, 2, 3, 4, or 5."); - } - } - catch (Exception e) + + String userInput = utils.input.getStringFromConsole(); + try{ + if((Integer.valueOf(userInput) >= 1) && (Integer.valueOf(userInput) <= 5)) { + refreshType = Integer.valueOf(userInput); + } + else{ System.out.println("Error: You entered an invalid option. Please enter 1, 2, 3, 4, or 5."); } - + } + catch (Exception e) + { + System.out.println("Error: You entered an invalid option. Please enter 1, 2, 3, 4, or 5."); } } while (refreshType == 0); @@ -136,35 +131,35 @@ private static void getRefreshRateFromUser() { case 1: System.out.println("Enter the number of seconds between each evaluation."); - refreshFrequency = scanner.nextInt(); + refreshFrequency = utils.input.getIntFromConsole(); System.out.println(settings.getWebsite()+" will be checked for source code changes every " + refreshFrequency + " second(s)."); refreshRate = TimeUnit.SECONDS.toMillis(refreshFrequency); break; case 2: System.out.println("Enter the number of minutes between each evaluation."); - refreshFrequency = scanner.nextInt(); + refreshFrequency = utils.input.getIntFromConsole(); System.out.println(settings.getWebsite()+" will be checked for source code changes every " + refreshFrequency + " minute(s)."); refreshRate = TimeUnit.MINUTES.toMillis(refreshFrequency); break; case 3: System.out.println("Enter the number of hours between each evaluation."); - refreshFrequency = scanner.nextInt(); + refreshFrequency = utils.input.getIntFromConsole(); System.out.println(settings.getWebsite()+" will be checked for source code changes every " + refreshFrequency + " hour(s)."); refreshRate = TimeUnit.HOURS.toMillis(refreshFrequency); break; case 4: System.out.println("Enter the number of days between each evaluation."); - refreshFrequency = scanner.nextInt(); + refreshFrequency = utils.input.getIntFromConsole(); System.out.println(settings.getWebsite()+" will be checked for source code changes every " + refreshFrequency + " day(s)."); refreshRate = TimeUnit.DAYS.toMillis(refreshFrequency); break; case 5: System.out.println("Enter the number of weeks between each evaluation."); - refreshFrequency = scanner.nextInt(); + refreshFrequency = utils.input.getIntFromConsole(); System.out.println(settings.getWebsite()+" will be checked for source code changes every " + refreshFrequency + " week(s)."); refreshRate = (TimeUnit.DAYS.toMillis(refreshFrequency) * 7); // Times 7 because the TimeUnit library only goes up to Days to millis conversion. break; @@ -175,28 +170,21 @@ private static void getRefreshRateFromUser() private static void getMaxNumberOfRefreshesFromUser() { - String userResponceToIndefQuestion; System.out.println("Would you like to perform the checks indefinitely?"); - userResponceToIndefQuestion = scanner.next(); - if(userResponceToIndefQuestion.equalsIgnoreCase("yes") == false && userResponceToIndefQuestion.equalsIgnoreCase("no") == false) - { - System.out.println("ERROR: Please enter \"Yes\" or \"no\""); - getMaxNumberOfRefreshesFromUser(); - } - if(userResponceToIndefQuestion.equalsIgnoreCase("yes")) + + if(utils.input.getBooleanFromConsole()) { settings.setInfiniteComparison(true); } - else - { + else { settings.setInfiniteComparison(false); System.out.println("What is the maximum number of times that you would like to check for changes to " + settings.getWebsite() + "'s source code?"); - settings.setMaxNumberOfCompares(scanner.nextInt()); + settings.setMaxNumberOfCompares(utils.input.getIntFromConsole()); } } - private static htmlWebsiteRecord generateHtmlWebpageRecord(int recordNumber) throws Exception { + private static htmlWebsiteRecord generateHtmlWebsiteRecord(int recordNumber) throws Exception { htmlWebsiteRecord record = new htmlWebsiteRecord(recordNumber, settings.getWebsite()); System.out.println("New website record created. (Record #: "+(record.getVersion()+1)+", Timestamp: " +record.getTimestampAccessed()+ ")"); return record; @@ -232,7 +220,7 @@ private static void htmlCompareProcess() throws Exception { if(sourceCodeDifferenceFound == false) { htmlWebsiteRecord recentlyCreatedRecord; - recentlyCreatedRecord = generateHtmlWebpageRecord(i*-1); + recentlyCreatedRecord = generateHtmlWebsiteRecord(i*-1); recordList.add(recentlyCreatedRecord.getVersion(), recentlyCreatedRecord); compareRecordsAndUpdateActivityReport(); Thread.sleep(settings.getRefreshRate()); @@ -247,7 +235,7 @@ private static void htmlCompareProcess() throws Exception { if(sourceCodeDifferenceFound == false) { htmlWebsiteRecord recentlyCreatedRecord; - recentlyCreatedRecord = generateHtmlWebpageRecord(i); + recentlyCreatedRecord = generateHtmlWebsiteRecord(i); recordList.add(recentlyCreatedRecord.getVersion(), recentlyCreatedRecord); compareRecordsAndUpdateActivityReport(); Thread.sleep(settings.getRefreshRate()); @@ -326,7 +314,7 @@ public static void displayChangeReport() throws IOException fileWriter.newLine(); fileWriter.write(difference); } finally { - System.out.println("\nNOTE: A text file containing more details has been created and saved to your desktop. See: \""+changeReportFileName+"\""); + System.out.println("\n" + "NOTE: A text file containing more details has been created and saved to your desktop. See: \""+changeReportFileName+"\""); fileWriter.close(); } } diff --git a/src/utils/input.java b/src/utils/input.java new file mode 100644 index 0000000..1e28d2f --- /dev/null +++ b/src/utils/input.java @@ -0,0 +1,96 @@ +package utils; + +import java.util.ArrayList; +import java.util.Scanner; + +public class input +{ + private static Scanner scanner = new Scanner(System.in); + private static String invalidInputMessagePrefix = "ERROR: Invalid input. You entered "; + + + //Uses a whitelist type procedure to determine whether the user's input is valid. + //TODO: Modify this so that it can be used with integer ranges. + public static boolean inputIsValid(String ... args) + { + String input = args[0]; + ArrayList validInputs = new ArrayList<>(); + + for(int i = 1; i < args.length; i++) //Starts at 1 because we don't want the first arg (the user's input) + { + validInputs.add(args[i]); + } + + for(String validInput : validInputs) + { + if(input.equalsIgnoreCase(validInput)) + { + return true; + } + } + System.out.println(invalidInputMessagePrefix +"\""+ input +"\". The following options are valid: "); + for(int i = 0; i < validInputs.size(); i++ ) + { + if(i != validInputs.size()){//For all valid inputs except for the last one... + System.out.print("\""+validInputs.get(i)+"\", "); + } + else //For the last valid input ... + { + System.out.print("and \""+validInputs.get(i)+"\"."); + } + } + return false; + } + + public static String getStringFromConsole() { + + String input = ""; + + input = scanner.nextLine(); //You have to save the value of scanner.nextLine because it changes each time you access it via scanner.next... + + return input; + } + + public static int getIntFromConsole(){ + String input = ""; + int value; + + while(true) { + try { + input = scanner.nextLine(); + value = Integer.valueOf(input); + break; + } catch (Exception e) { + System.out.println(invalidInputMessagePrefix + "\"" + input + "\". Please enter a whole number."); + } + } + return value; + } + + public static boolean getBooleanFromConsole(){ + String input; + boolean value; + while(true) + { + input = scanner.nextLine(); + if(input.equalsIgnoreCase("yes") || input.equalsIgnoreCase("no")) + { + if(input.equalsIgnoreCase("yes")) + { + value = true; + break; + } + else + { + value = false; + break; + } + } + else + { + System.out.println(invalidInputMessagePrefix + "\"" + input + "\". Please enter \"Yes\" or \"No\"."); + } + } + return value; + } +}