Skip to content

Commit

Permalink
Add validation to disallow start time after end time
Browse files Browse the repository at this point in the history
  • Loading branch information
zognin committed Sep 14, 2021
1 parent 71103e3 commit 1398dc1
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 28 deletions.
16 changes: 10 additions & 6 deletions src/main/java/command/AddCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
import exception.DuplicateTaskException;
import exception.ErrorAccessingFileException;
import exception.InvalidCommandFormatException;
import exception.InvalidDateTimeException;
import exception.InvalidDateTimeFormatException;
import exception.InvalidTaskTypeException;
import exception.InvalidTimePeriodException;
import exception.MissingCommandDescriptionException;
import message.Message;
import tasklist.Task;
Expand Down Expand Up @@ -46,27 +47,30 @@ public static AddCommand createCommand(String description, CommandTypeEnum comma
* @return Message representing the command is executed.
* @throws InvalidTaskTypeException If the task type is not valid.
* @throws ErrorAccessingFileException If there is an error accessing the storage file.
* @throws InvalidDateTimeException If a task meant to contain time information has an invalid datetime format.
* @throws InvalidDateTimeFormatException If a task meant to contain datetime has an invalid datetime format.
* @throws DuplicateTaskException If there is an attempt to add a duplicate task.
* @throws InvalidCommandFormatException If the task has an incorrect format.
* @throws InvalidTimePeriodException If the start time is after the end time.
*/
public Message execute(TaskList list) throws
InvalidTaskTypeException,
ErrorAccessingFileException,
InvalidDateTimeException,
InvalidDateTimeFormatException,
DuplicateTaskException,
InvalidCommandFormatException {
InvalidCommandFormatException,
InvalidTimePeriodException {
Task task = addTask(list);
Message message = getOutputMessage(list, task);
return message;
}

private Task addTask(TaskList list) throws
InvalidTaskTypeException,
InvalidDateTimeException,
InvalidDateTimeFormatException,
DuplicateTaskException,
ErrorAccessingFileException,
InvalidCommandFormatException {
InvalidCommandFormatException,
InvalidTimePeriodException {
Task task = Task.createTask(this.description, this.commandType);

list.validateTaskNotDuplicate(task);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
/**
* Encapsulates an exception when an input has an invalid datetime format.
*/
public class InvalidDateTimeException extends DukeException {
public class InvalidDateTimeFormatException extends DukeException {
/**
* Instantiates an exception when an input has an invalid datetime format.
*
* @param format Required datetime format.
*/
public InvalidDateTimeException(String dateOrTime, String format) {
public InvalidDateTimeFormatException(String dateOrTime, String format) {
super(String.format("%s should be in the form of <%s>", dateOrTime, format));
}
}
13 changes: 13 additions & 0 deletions src/main/java/exception/InvalidTimePeriodException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package exception;

/**
* Encapsulates an exception when the start time is after the end time in a time period.
*/
public class InvalidTimePeriodException extends DukeException {
/**
* Instantiates an exception when the start time is after the end time in a time period.
*/
public InvalidTimePeriodException() {
super("Start time cannot be after end time. The first time must be the start time.");
}
}
14 changes: 7 additions & 7 deletions src/main/java/parser/DateTimeParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

import exception.InvalidDateTimeException;
import exception.InvalidDateTimeFormatException;

/**
* Encapsulates a parser for date time.
Expand All @@ -17,16 +17,16 @@ public class DateTimeParser {
* @param dateString Date string.
* @param dateFormat Format of date string.
* @return `LocalDate`.
* @throws InvalidDateTimeException If there is an error parsing a string to a date.
* @throws InvalidDateTimeFormatException If there is an error parsing a string to a date.
*/
public static LocalDate changeDateStringToDate(String dateString, String dateFormat)
throws InvalidDateTimeException {
throws InvalidDateTimeFormatException {
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern(dateFormat);

try {
return LocalDate.parse(dateString, dateFormatter);
} catch (DateTimeParseException e) {
throw new InvalidDateTimeException("Date", dateFormat);
throw new InvalidDateTimeFormatException("Date", dateFormat);
}
}

Expand All @@ -36,16 +36,16 @@ public static LocalDate changeDateStringToDate(String dateString, String dateFor
* @param timeString Time string.
* @param timeFormat Format of time string.
* @return `LocalTime`.
* @throws InvalidDateTimeException If there is an error parsing a string to a time.
* @throws InvalidDateTimeFormatException If there is an error parsing a string to a time.
*/
public static LocalTime changeTimeStringToTime(String timeString, String timeFormat)
throws InvalidDateTimeException {
throws InvalidDateTimeFormatException {
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern(timeFormat);

try {
return LocalTime.parse(timeString, timeFormatter);
} catch (DateTimeParseException e) {
throw new InvalidDateTimeException("Time", timeFormat);
throw new InvalidDateTimeFormatException("Time", timeFormat);
}
}

Expand Down
8 changes: 4 additions & 4 deletions src/main/java/tasklist/DeadlineTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import java.time.LocalTime;

import exception.InvalidCommandFormatException;
import exception.InvalidDateTimeException;
import exception.InvalidDateTimeFormatException;
import exception.InvalidFormatInStorageException;
import exception.InvalidNumOfStringPartsException;
import parser.CommandParser;
Expand Down Expand Up @@ -34,11 +34,11 @@ private DeadlineTask(String description, boolean isDone, LocalDate date, LocalTi
*
* @param description Description including action and deadline information.
* @return Deadline task.
* @throws InvalidDateTimeException If the description has an invalid datetime format.
* @throws InvalidDateTimeFormatException If the description has an invalid datetime format.
* @throws InvalidCommandFormatException If the description has an invalid format.
*/
public static DeadlineTask createTask(String description)
throws InvalidDateTimeException, InvalidCommandFormatException {
throws InvalidDateTimeFormatException, InvalidCommandFormatException {
try {
String[] actionAndDateTimeDescriptions = CommandParser.splitStringBySplitter(
description, SPLITTER_ACTION_TIME);
Expand Down Expand Up @@ -123,7 +123,7 @@ public static DeadlineTask createTaskFromStoredString(String description) throws
LocalTime time = DateTimeParser.changeTimeStringToTime(dateTimeDescriptions[1], timeFormat);

return new DeadlineTask(actionDescription, isDone, date, time);
} catch (InvalidDateTimeException | InvalidNumOfStringPartsException e) {
} catch (InvalidDateTimeFormatException | InvalidNumOfStringPartsException e) {
String expectedFormat = String.format("[ ] <description> %s %s %s",
SPLITTER_ACTION_TIME, dateFormat, timeFormat);
throw new InvalidFormatInStorageException(description, expectedFormat);
Expand Down
22 changes: 17 additions & 5 deletions src/main/java/tasklist/EventTask.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
import java.time.LocalTime;

import exception.InvalidCommandFormatException;
import exception.InvalidDateTimeException;
import exception.InvalidDateTimeFormatException;
import exception.InvalidFormatInStorageException;
import exception.InvalidNumOfStringPartsException;
import exception.InvalidTimePeriodException;
import parser.CommandParser;
import parser.DateTimeParser;
import type.CommandTypeEnum;
Expand Down Expand Up @@ -36,11 +37,14 @@ private EventTask(String description, boolean isDone, LocalDate date, LocalTime
*
* @param description Description including action, date and time information.
* @return Event task.
* @throws InvalidDateTimeException If the description has an invalid datetime format.
* @throws InvalidDateTimeFormatException If the description has an invalid datetime format.
* @throws InvalidCommandFormatException If the description has an invalid format.
* @throws InvalidTimePeriodException If the start time is after the end time.
*/
public static EventTask createTask (String description)
throws InvalidDateTimeException, InvalidCommandFormatException {
public static EventTask createTask (String description) throws
InvalidDateTimeFormatException,
InvalidCommandFormatException,
InvalidTimePeriodException {
try {
String[] actionAndTimeDescriptions = CommandParser.splitStringBySplitter(
description,
Expand All @@ -59,6 +63,7 @@ public static EventTask createTask (String description)
dateTimeDescriptions[1], TimeFormatTypeEnum.INPUT.toString());
LocalTime endTime = DateTimeParser.changeTimeStringToTime(
dateTimeDescriptions[2], TimeFormatTypeEnum.INPUT.toString());
validateStartTimeBeforeOrAtEndTime(startTime, endTime);

return new EventTask(actionDescription, false, date, startTime, endTime);
} catch (InvalidNumOfStringPartsException e) {
Expand Down Expand Up @@ -131,7 +136,7 @@ public static EventTask createTaskFromStoredString(String description) throws In
LocalTime endTime = DateTimeParser.changeTimeStringToTime(dateTimeDescriptions[2], timeFormat);

return new EventTask(actionDescription, isDone, date, startTime, endTime);
} catch (InvalidNumOfStringPartsException | InvalidDateTimeException e) {
} catch (InvalidNumOfStringPartsException | InvalidDateTimeFormatException e) {
String expectedFormat = String.format("[ ] <description> %s %s %s",
SPLITTER_ACTION_TIME, dateFormat, timeFormat);
throw new InvalidFormatInStorageException(description, expectedFormat);
Expand Down Expand Up @@ -162,4 +167,11 @@ protected boolean isDuplicateOf(Task task) {

return this.endTime.equals(eventTask.endTime);
}

private static void validateStartTimeBeforeOrAtEndTime(LocalTime startTime, LocalTime endTime)
throws InvalidTimePeriodException {
if (startTime.compareTo(endTime) > 0) {
throw new InvalidTimePeriodException();
}
}
}
13 changes: 9 additions & 4 deletions src/main/java/tasklist/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
import java.util.Arrays;

import exception.InvalidCommandFormatException;
import exception.InvalidDateTimeException;
import exception.InvalidDateTimeFormatException;
import exception.InvalidFormatInStorageException;
import exception.InvalidTaskTypeException;
import exception.InvalidTimePeriodException;
import type.CommandTypeEnum;
import type.TaskIconTypeEnum;

Expand Down Expand Up @@ -38,10 +39,14 @@ public Task(String description, boolean isDone) {
* @return `Task`.
* @throws InvalidTaskTypeException If the type of task is not recognised.
* @throws InvalidCommandFormatException If the command is incorrectly formatted.
* @throws InvalidDateTimeException If there is an invalid date time.
* @throws InvalidDateTimeFormatException If there is an invalid date time.
* @throws InvalidTimePeriodException If the start time is after the end time.
*/
public static Task createTask(String description, CommandTypeEnum commandType)
throws InvalidTaskTypeException, InvalidCommandFormatException, InvalidDateTimeException {
public static Task createTask(String description, CommandTypeEnum commandType) throws
InvalidTaskTypeException,
InvalidCommandFormatException,
InvalidDateTimeFormatException,
InvalidTimePeriodException {
switch (commandType) {
case TODO:
return TodoTask.createTask(description);
Expand Down

0 comments on commit 1398dc1

Please sign in to comment.