Changeset 103 in tmcsimulator for trunk/src/atmsdriver/ConsoleDriver.java
- Timestamp:
- 10/12/2017 12:28:28 AM (9 years ago)
- File:
-
- 1 edited
-
trunk/src/atmsdriver/ConsoleDriver.java (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/atmsdriver/ConsoleDriver.java
r97 r103 1 1 package atmsdriver; 2 2 3 import atmsdriver.model.Highways; 4 import atmsdriver.model.Station.DIRECTION; 5 import atmsdriver.model.Highway; 6 import atmsdriver.model.Station; 7 import java.util.ArrayList; 8 import java.util.Arrays; 9 import java.util.List; 10 import java.util.Scanner; 11 3 12 /** 4 * A console application to drive the ATMS Server. 5 * @author jdalbey 13 * A console application to drive the ATMS Server. 14 * 15 * @author jdalbey, John A. Torres 16 * @version 10/11/2017 6 17 */ 7 public class ConsoleDriver 8 { 9 // 10 //Given 11 // <Highway Number> <Dir> <Postmile> <Range> <DotColor> 12 // 13 //IF default direction of Highway Number = Dir THEN 14 // Set StartPost = Postmile 15 // Set EndPost = Postmile + Range 16 //ELSE 17 // Set StartPost = Postmile - Range 18 // Set EndPost = Postmile 19 //END IF 20 // 21 //FOR each Station in Highway Number LOOP 22 // 23 // IF Station.Postmile within range of StartPost:EndPost THEN 24 // IF default direction of Highway Number = Dir THEN 25 // Set ML color to DotColor 26 // ELSE 27 // Set OPP color to DotColor 28 // END IF 29 // END IF 30 // 31 //END LOOP 32 // 33 // 18 public final class ConsoleDriver { 19 // highways model 20 private final Highways highways; 21 22 // lists used for user input validation 23 private final List<Integer> routeNumInputList; 24 private final List<String> dotColorInputList; 25 26 /** 27 * Constructor. Sets the highways model and generates the input validation 28 * lists, and then runs the console driver application. 29 * @param highways 30 */ 31 public ConsoleDriver(Highways highways) { 32 // set highways model 33 this.highways = highways; 34 35 // set input validation lists 36 routeNumInputList = generateRouteNumInputList(); 37 dotColorInputList = new ArrayList<>(Arrays.asList("R", "Y", "G")); 38 39 // run the console driver 40 runConsole(); 41 } 42 43 /** 44 * Generates the route number list, used for user input validation. 45 * @return list of route numbers. 46 */ 47 private ArrayList<Integer> generateRouteNumInputList() 48 { 49 ArrayList<Integer> routeNums = new ArrayList<>(); 50 // add the route number for each highway to the list 51 for(Highway hwy : highways.highways) 52 { 53 routeNums.add(hwy.routeNumber); 54 } 55 return routeNums; 56 } 57 58 /** 59 * Runs the console driver application. 60 */ 61 public void runConsole() { 62 Scanner sc = new Scanner(System.in); 63 // Run continuously 64 while (true) { 65 // Get necessary values for colorization of highways 66 Integer routeNumber = getRouteNumber(sc); 67 DIRECTION direction = getDirection(sc, routeNumber); 68 Double postmile = getPostmile(sc, routeNumber, direction); 69 Integer range = getRange(sc, postmile); 70 DOTCOLOR dotcolor = getDotColor(sc); 71 72 // apply colorization to highways 73 applyColorToHighwayStretch(routeNumber, direction, postmile, range, dotcolor); 74 } 75 } 76 77 /** 78 * Applies specified color to the specified highway stretch. Route number and 79 * direction specify the highway. Postmile and range specify the stretch of 80 * specified highway. Dot color is the color to be applied to the stretch. 81 * 82 * @param routeNumber highway route number 83 * @param direction highway direction 84 * @param postmile origin postmile value 85 * @param range range from origin postmile 86 * @param dotColor the color to be applied to specified highway stretch 87 */ 88 private void applyColorToHighwayStretch(Integer routeNumber, DIRECTION direction, 89 Double postmile, Integer range, DOTCOLOR dotColor) { 90 System.out.println("Applying " + dotColor.name() + " dots to highway " 91 + routeNumber + " " + direction.name() + " at postmile " 92 + postmile + " with a range of " + range + " miles..."); 93 94 // Get the highway by route number 95 Highway highway = highways.getHighwayByRouteNumber(routeNumber); 96 97 // start value for highway section, and end value for highway section 98 // by postmile 99 Double startPost; 100 Double endPost; 101 102 // postmiles increase from s to n and w to e 103 104 // if the direction is south or west 105 if(direction.equals(DIRECTION.SOUTH) || direction.equals(DIRECTION.WEST)) 106 { 107 // add range value to startPost to get 108 // the end postmile value of the highway section 109 startPost = postmile; 110 endPost = postmile + range; 111 112 // iterate through the stations, if within the specified highway 113 // stretch, update the station by direction and apply dot color 114 for(Station station : highway.stations) 115 { 116 if(station.postmile > startPost && station.postmile < endPost) 117 { 118 station.updateByDirection(direction, dotColor); 119 } 120 } 121 } 122 // if the direction is north or east 123 else 124 { 125 //subtract range value from startPost 126 // to get the end postmile value of the highway section 127 startPost = postmile; 128 endPost = postmile - range; 129 130 // iterate through the stations, if within the specified highway 131 // section, update the station by direction and apply dot color 132 for(Station station : highway.stations) 133 { 134 if(station.postmile < startPost && station.postmile > endPost) 135 { 136 station.updateByDirection(direction, dotColor); 137 } 138 } 139 } 140 System.out.println(""); 141 } 142 143 /** 144 * Gets the highway route number from user and validates the input. 145 * 146 * @param sc stdIn scanner 147 * @return highway route number 148 */ 149 private Integer getRouteNumber(Scanner sc) { 150 Integer routeNum = null; 151 Boolean verified = false; 152 153 // validation loop 154 while(!verified) 155 { 156 // Prints out available route numbers to user to select from 157 System.out.print("Available route numbers: ["); 158 for(Integer rtNum : routeNumInputList) 159 { 160 System.out.print(rtNum.toString() + ", "); 161 } 162 System.out.print("]"); 163 System.out.println(""); 164 165 // Prompt user to input a route number 166 System.out.println("Enter a route number: "); 167 routeNum = sc.nextInt(); 168 System.out.println(""); 169 170 // validate the user's input 171 if(routeNumInputList.contains(routeNum)) 172 { 173 verified = true; 174 } 175 else 176 { 177 System.out.println("Invalid route number, please re-enter: "); 178 } 179 } 180 181 return routeNum; 182 } 183 184 /** 185 * Gets the highway direction from the user and validates the input. 186 * 187 * @param sc stdIn scanner 188 * @return highway direction 189 */ 190 private DIRECTION getDirection(Scanner sc, Integer routeNum) { 191 DIRECTION direction; 192 String directionInput = null; 193 Boolean verified = false; 194 195 // validation loop 196 while(!verified) 197 { 198 // Get available directions for route 199 ArrayList<DIRECTION> availDirs = new ArrayList<>(); 200 for(Station stn : highways.getHighwayByRouteNumber(routeNum).stations) 201 { 202 if(!availDirs.contains(stn.direction)) 203 { 204 availDirs.add(stn.direction); 205 } 206 } 207 208 // prompt user for input 209 System.out.print("Available directions for highway " + routeNum + ": ["); 210 for(DIRECTION dir : availDirs) 211 { 212 System.out.print(dir.getLetter() + ", "); 213 } 214 System.out.print("]"); 215 System.out.println(""); 216 System.out.println("Enter a direction:"); 217 directionInput = sc.next(); 218 System.out.println(""); 219 220 // validate the user's input 221 if(availDirs.contains(DIRECTION.toDirection(directionInput))) 222 { 223 verified = true; 224 } 225 else 226 { 227 System.out.println("Invalid direction, please re-enter: "); 228 } 229 } 230 231 return DIRECTION.toDirection(directionInput); 232 } 233 234 /** 235 * Gets the starting/origin postmile value for the highway section from the 236 * user and validates the input. 237 * 238 * @param sc stdIn scanner 239 * @param routeNumber highway route number 240 * @param dir highway direction 241 * @return highway section start/origin postmile value 242 */ 243 private Double getPostmile(Scanner sc, Integer routeNumber, DIRECTION dir) { 244 Double postmile = null; 245 Boolean verified = false; 246 247 // validation loop 248 while(!verified) 249 { 250 // Get highway, and grab the floor and ceiling for postmile values 251 // from the highway stations to present to the user 252 Highway hwy = highways.getHighwayByRouteNumber(routeNumber); 253 Double floorPostmile = hwy.stations.get(0).postmile; 254 Double ceilPostmile = hwy.stations 255 .get(hwy.stations.size() - 1).postmile; 256 257 // present user with range of postmiles for given highway 258 System.out.println("Route " + hwy.routeNumber + " " + dir 259 + " postmile range: [" + floorPostmile + ", " 260 + ceilPostmile + "]"); 261 262 // prompt user for postmile value 263 System.out.println("Enter a postmile value (Integer/Double): "); 264 postmile = sc.nextDouble(); 265 System.out.println(""); 266 267 // validate user's input, ensures that the postmile is within given 268 // postmile range (floorPostmile, ceilPostmile) 269 if(postmile >= floorPostmile && postmile <= ceilPostmile) 270 { 271 verified = true; 272 } 273 else 274 { 275 System.out.println("Postmile must be within postmile range: [" + floorPostmile + ", " 276 + ceilPostmile + "] please re-enter: "); 277 } 278 } 279 280 return postmile; 281 } 282 283 /** 284 * Gets the range to extend the highway stretch from the start/origin postmile 285 * value from the user and validates the input. 286 * 287 * @param sc stdIn scanner 288 * @param postmile origin/start postmile value for highway stretch 289 * @return range value 290 */ 291 private Integer getRange(Scanner sc, Double postmile) { 292 Integer range = null; 293 Boolean verified = false; 294 295 // validation loop 296 while(!verified) 297 { 298 // prompt user for range value 299 System.out.println("Enter a range value (Integer):"); 300 range = sc.nextInt(); 301 System.out.println(""); 302 303 // range must be greater than or equal to 0 304 if(range >= 0) 305 { 306 verified = true; 307 } 308 else 309 { 310 System.out.println("Range must be >= 0"); 311 } 312 } 313 314 return range; 315 } 316 317 /** 318 * Gets the dot color from the user, to be applied to specified highway 319 * stretch and validates the user's input. 320 * 321 * @param sc stdIn scanner 322 * @return dot color to be applied to highway stretch 323 */ 324 private DOTCOLOR getDotColor(Scanner sc) { 325 DOTCOLOR dotColor; 326 String dotColorInput = null; 327 Boolean verified = false; 328 329 // validationloop 330 while(!verified) 331 { 332 // prompt user for color 333 System.out.println("Enter a dot color (G/Y/R):"); 334 dotColorInput = sc.next(); 335 System.out.println(""); 336 // validate user's input 337 if(dotColorInputList.contains(dotColorInput)) 338 { 339 verified = true; 340 } 341 else 342 { 343 System.out.println("Invalid dot color, please re-enter: "); 344 } 345 } 346 347 return DOTCOLOR.toDotColor(dotColorInput); 348 } 349 350 /** 351 * Enum for highway status dot colors. 352 * 353 * @author John A. Torres 354 * @version 10/11/2017 355 */ 356 public static enum DOTCOLOR { 357 358 RED, 359 YELLOW, 360 GREEN; 361 362 // All the first letters of the values, in order. 363 private static String allLetters = "RYG"; 364 365 /** 366 * Return the first letter of this enum. 367 * 368 * @return String first letter of this enum. 369 */ 370 public String getLetter() { 371 return this.toString().substring(0, 1); 372 } 373 374 /** 375 * Returns a dot color given its first character. 376 * 377 * @param letter the first character of a dot color 378 * @return dot color corresponding to letter 379 * @pre letter must be one of allLetters 380 */ 381 public static DOTCOLOR toDotColor(String letter) { 382 return values()[allLetters.indexOf(letter.charAt(0))]; 383 } 384 } 34 385 }
Note: See TracChangeset
for help on using the changeset viewer.
