public static Feedback startController(String inputCommandString) {
        assert inputCommandString != null;

        LOGGER.info("==============\n" +
                    "User Input: \n" + 
                    "	" + inputCommandString + "\n" + 
                    "====================\n");

        inputCommandObject = convertStringToCommand(inputCommandString);
        assert inputCommandObject != null;

        LOGGER.info("==============\n" +
    				"Command object: \n" + 
    				"	" + inputCommandObject.getUserCommand() + "\n" + 
    				"====================\n");

        try {
            parsedCommand = analyzeInput(inputCommandObject);
            assert parsedCommand != null;

            // Debugging code
            LOGGER.info("==============\n" +
                        "After analyzer: \n" + 
                        "    Action = " + parsedCommand.getAction() + "\n" + 
                        "    Name = " + parsedCommand.getTaskName() + "\n" +
                        "    Start time = " + parsedCommand.getTaskStart() + "\n" + 
                        "    End time = " + parsedCommand.getTaskEnd() + "\n" + 
                        "    Description = " + parsedCommand.getTaskDescription() + "\n" +
                        "    Location = " + parsedCommand.getTaskLocation() + "\n" +
                        "    Priority = " + parsedCommand.getTaskPriority() + "\n" +
                        "    Task ID = " + parsedCommand.getTaskId() + "\n" +
                        "    Search key = " + parsedCommand.getKey() + "\n" +
                        "    Error message = " + parsedCommand.getErrorMessage() + "\n" +
                        "    Update indicator = " + parsedCommand.getIndicator() + "\n" +
                        "====================\n");

            if (parsedCommand.getErrorMessage().length() != 0) {	// There is an error
                outputString = parsedCommand.getErrorMessage();
                displayInGUI(outputString, parsedCommand, false, NULL_STRING);
            } else {	

                if(parsedCommand != null){
                    feedback = startExecutor(parsedCommand);
                    assert feedback != null;

                } else {
                    feedback = new Feedback(false);
                    feedback.setMessageShowToUser(ERROR_INVALID_COMMAND);
                }

                outputString = getFeedbackMessage(feedback);
                boolean isFeedbackSuccess = feedback.getResult();
                String displayList = feedback.getListNameIndicator();
                assert outputString != null;
                
                if (outputString.equals(StringFormat.IO_MESSAGE_TASK_LIST_FILE_NOT_EXIST) ||
                    outputString.trim().equals(ERROR_CANNOT_LOAD_FILE)) {
                    GUI.openTutorial();
                }
                
                if (outputString.equals(SAVE_SUCCESSFUL)) {
                    System.exit(0);
                } else if (GUI.getShell() != null){      // Only display in GUI if it is running
                    displayInGUI(outputString, parsedCommand, isFeedbackSuccess, displayList);
                }
            }
        } catch (ParseException e) {
            displayInGUI(ERROR_INVALID_PARAMETER, parsedCommand, true, NULL_STRING);
        }   
        return feedback;    // used exclusively for JUnit testing
    }