Your program must have these methods: • main - This method will be in your main class. Handle all user interaction, call processFile and pass user input as arguments • CaesarEncode - This method must be in the caesar class as provided in the .java file above • Caesar Decode - This method must be in the caesar class as provided in the .java file above • processFile - This method can be in the main class or another custom class, but do not put it in the caesar class. The processFile method must have a minimum of three parameters - one for each user input including inputFileName, outputFileName, encodeDecode (see Important Note at the bottom of this page). This method will read the file using the inputFileName file, call the CaesarEncode or Caesar Decode function depending on the encodeDecode argument and write to the outputFileName file. Important Note: this method will be performing file input/output operations. You are required to properly handle the FileNotFoundException Your main function should: 0. Display a greeting and ask if the the user would like to encode or decode a message. 1. Prompt for inputFileName, the name of the input file. 2. Prompt for outputFileName, the name of the output file. 3. call processFile and pass the user's input as arguments. Your processFile method should: 1. Use the following heading including a minimum of three parameters (see important note below): bool processFile(String inputFileName, String outputFileName, String encodeDecode) 2. Use the inputFileName parameter as the name of the input file. 3. Use the outputFileName parameter as the name of the output file. 4. Try to open the input file. Catch any FileNotFoundException. 5. Loop through the following steps: a. read a character from the input file. b. if end-of-file was reached, then terminate repetition. c. if the encodeDecode parameter is equal to "encode", call the CaesarEncode function or if the encodeDecode parameter is equal to "decode" call the CaesarDecode function d. write the encoded or decoded character to the output file. Catch any FileNotFoundException. End loop. 6. Return true Important Note: The CaesarEncode and Caesar Decode methods require a key. You can choose whether to ask the user for the key in the main method (remember: all user interaction will happen in the main method). If you ask the user for the key, modify the processFile heading to include a parameter for the key and pass the user's key when you call а processFile. If you decide not to ask the user for the key, you can hard code the key into the processFile method so it will use the same key everytime. Either way is fine. public class caesar /****** * CaesarEncode implements the Caesar cipher encoding scheme. Receive: ch, a character. key, the amount by which to rotate ch. Return: The character that is key positions after ch, with "wrap-around" to the beginning of the sequence. public char CaesarEncode(char ch, int key) { int FIRST_UPPER = 65, FIRST_LOWER = 97, NUM_CHARS = 26; int chvalue = ch; int keyva lue = key; int encodechar; if (key <= 0 || key >= NUM_CHARS) { System.out.println("\n CaesarEncode: key must be between 1 and 25\n"); return Character.MIN_VALUE; } if (character.isUpperCase(ch)){ encodechar = (chvalue FIRST_UPPER + keyvalue) % NUM_CHARS + FIRST_UPPER; return (char)encodechar; } else if (Character.is Lower Case (ch)) { encodechar = (chvalue - FIRST_LOWER + keyvalue) % NUM_CHARS + FIRST_LOWER; return (char)encodechar; } else return ch; CaesarDecode implements the Caesar cipher encoding scheme. * Receive: ch, a character, key, an integer. * Return: The character that is key positions before ch, with "wrap-around" to the end of the sequence. public char CaesarDecode(char ch, int key) int FIRST_UPPER = 65, FIRST_LOWER = 97, NUM_CHARS = 26; int chvalue = ch; int keyva lue = key; int decodechar; if (key <= 0 || key >= 26) { System.out.println("\n CaesarDecode: key must be between 1 and 25!\n"); return Character .MIN_VALUE; } if (Character.isUpperCase(ch)) { decodechar = (ch - FIRST_UPPER + NUM_CHARS - key) % NUM_CHARS + FIRST_UPPER; return (char)decodechar; } else if (Character.isLowerCase(ch)) { decodechar = (ch - FIRST_LOWER + NUM_CHARS - key) % NUM_CHARS + FIRST_LOWER; return (char) decodechar; } else return ch; } }