From 28ad2b878f1a21d03879e81cd441d0175d89e6b1 Mon Sep 17 00:00:00 2001 From: damithc Date: Mon, 25 May 2020 00:58:18 +0800 Subject: [PATCH 01/37] Add Gradle support --- build.gradle | 41 +++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58695 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 183 +++++++++++++++++++++++ gradlew.bat | 103 +++++++++++++ text-ui-test/runtest.sh | 0 6 files changed, 332 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat mode change 100644 => 100755 text-ui-test/runtest.sh diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..885198fcfa --- /dev/null +++ b/build.gradle @@ -0,0 +1,41 @@ +plugins { + id 'java' + id 'application' + id 'com.github.johnrengelman.shadow' version '5.1.0' +} + +repositories { + mavenCentral() +} + +dependencies { + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' +} + +test { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed" + + showExceptions true + exceptionFormat "full" + showCauses true + showStackTraces true + showStandardStreams = false + } +} + +application { + mainClassName = "seedu.duke.Duke" +} + +shadowJar { + archiveBaseName = "duke" + archiveClassifier = null +} + +run{ + standardInput = System.in +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f3d88b1c2faf2fc91d853cd5d4242b5547257070 GIT binary patch literal 58695 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..b7c8c5dbf5 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000000..2fe81a7d95 --- /dev/null +++ b/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..62bd9b9cce --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,103 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh old mode 100644 new mode 100755 From ed6d4d25bd4e34461919ffe785a6f10f4c087552 Mon Sep 17 00:00:00 2001 From: lzq Date: Sat, 5 Aug 2023 15:24:02 +0800 Subject: [PATCH 02/37] Bump gradle and lib version --- build.gradle | 9 +- gradle/wrapper/gradle-wrapper.jar | Bin 58695 -> 63375 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 281 ++++++++++++++--------- gradlew.bat | 195 ++++++++-------- 5 files changed, 273 insertions(+), 216 deletions(-) diff --git a/build.gradle b/build.gradle index 885198fcfa..a388517ae1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java' id 'application' - id 'com.github.johnrengelman.shadow' version '5.1.0' + id 'com.github.johnrengelman.shadow' version '7.1.2' } repositories { @@ -9,8 +9,8 @@ repositories { } dependencies { - testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' - testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.10.0' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.10.0' } test { @@ -28,12 +28,13 @@ test { } application { - mainClassName = "seedu.duke.Duke" + mainClass.set("seedu.duke.Duke") } shadowJar { archiveBaseName = "duke" archiveClassifier = null + dependsOn("distZip", "distTar") } run{ diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f3d88b1c2faf2fc91d853cd5d4242b5547257070..033e24c4cdf41af1ab109bc7f253b2b887023340 100644 GIT binary patch delta 43723 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 delta 38942 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b7c8c5dbf5..66c01cfeba 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7d95..fcb6fca147 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,78 +17,110 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -97,87 +129,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 62bd9b9cce..6689b85bee 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,103 +1,92 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega From 26b9e67a5ebbcb7927764e583abfd94597574cab Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Mon, 21 Aug 2023 16:30:14 +0800 Subject: [PATCH 03/37] Level 0. Rename, Greet, Exit. Deleted Duke.java, replaced with Jarvis.java and edited Jarvis.java --- src/main/java/Duke.java | 10 ---------- src/main/java/Jarvis.java | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 10 deletions(-) delete mode 100644 src/main/java/Duke.java create mode 100644 src/main/java/Jarvis.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java deleted file mode 100644 index 5d313334cc..0000000000 --- a/src/main/java/Duke.java +++ /dev/null @@ -1,10 +0,0 @@ -public class Duke { - public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - } -} diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java new file mode 100644 index 0000000000..2120379b37 --- /dev/null +++ b/src/main/java/Jarvis.java @@ -0,0 +1,25 @@ +public class Jarvis { + public static void main(String[] args) { + String name = "Jarvis"; + String logo = " ** ** ******* ** ** ** ********\n" + + " /** **** /**////** /** /**/** **////// \n" + + " /** **//** /** /** /** /**/**/** \n" + + " /** ** //** /******* //** ** /**/*********\n" + + " /** **********/**///** //** ** /**////////**\n" + + " ** /**/**//////**/** //** //**** /** /**\n" + + "//***** /** /**/** //** //** /** ******** \n" + + " ///// // // // // // // //////// "; + System.out.println(logo); + String line = "____________________________________________________________"; + String greeting = "Good day Sir! I'm "; + String question = "How can I help you today Sir?"; + String signOff = "Good bye Sir!"; + + System.out.println(line); + System.out.println(greeting + name); + System.out.println(question); + System.out.println(line); + System.out.println(signOff); + System.out.println(line); + } +} \ No newline at end of file From 07ec1b4cef0792074a40c0a5eed6c84d57dcdb6e Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Mon, 21 Aug 2023 16:55:02 +0800 Subject: [PATCH 04/37] Level 1. Echo Added logic to echo user commands. If user enters anything other than bye, echo. If user enters bye, reply with goodbye message. --- src/main/java/Jarvis.java | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index 2120379b37..8be543dfb4 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -1,3 +1,5 @@ +import java.util.Scanner; + public class Jarvis { public static void main(String[] args) { String name = "Jarvis"; @@ -16,10 +18,24 @@ public static void main(String[] args) { String signOff = "Good bye Sir!"; System.out.println(line); - System.out.println(greeting + name); + System.out.println(greeting + name + "!"); System.out.println(question); System.out.println(line); - System.out.println(signOff); - System.out.println(line); + + while (true) { // any other command other than bye + Scanner userInput = new Scanner(System.in); + String request = userInput.nextLine(); + + if (!request.equals("bye")) { // if "bye is not entered" + System.out.println(line); + System.out.println(request); + System.out.println(line); + } else { + System.out.println(line); // if "bye" is entered + System.out.println(signOff); + System.out.println(line); + break; + } + } } } \ No newline at end of file From 92d1e609f7e9841e6d8fd20c87f54ddd68b6fab3 Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Tue, 22 Aug 2023 11:01:10 +0800 Subject: [PATCH 05/37] Level 2. Add, List. Added logic to store tasks and print out a list of tasks when the request "list" is given. --- src/main/java/Jarvis.java | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index 8be543dfb4..c7ebc33b4a 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -1,4 +1,5 @@ import java.util.Scanner; +import java.util.ArrayList; public class Jarvis { public static void main(String[] args) { @@ -22,19 +23,29 @@ public static void main(String[] args) { System.out.println(question); System.out.println(line); - while (true) { // any other command other than bye + ArrayList taskList = new ArrayList(); // list of tasks + + while (true) { Scanner userInput = new Scanner(System.in); - String request = userInput.nextLine(); + String task = userInput.nextLine(); - if (!request.equals("bye")) { // if "bye is not entered" + if (task.equals("list")) { // if "list" is entered + System.out.println(line); + for (int i = 0; i < taskList.size(); i++) { + int count = i + 1; + System.out.println(count + ". " + taskList.get(i)); + } System.out.println(line); - System.out.println(request); + } else if (task.equals("bye")) { // if "bye" is entered System.out.println(line); - } else { - System.out.println(line); // if "bye" is entered System.out.println(signOff); System.out.println(line); break; + } else { // if any other request + taskList.add(task); // add new task to the end of task list + System.out.println(line); + System.out.println("added: " + task); + System.out.println(line); } } } From 16ff2bc32a7499e1f508d310c934e780dce0a0d7 Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Tue, 22 Aug 2023 16:08:18 +0800 Subject: [PATCH 06/37] Level 3. Mark as Done. Added Task.java. Added logic for "mark" and "unmark" --- src/main/java/Jarvis.java | 42 ++++++++++++++++++++++++++++++++------- src/main/java/Task.java | 23 +++++++++++++++++++++ 2 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index c7ebc33b4a..895d5ac064 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -17,34 +17,62 @@ public static void main(String[] args) { String greeting = "Good day Sir! I'm "; String question = "How can I help you today Sir?"; String signOff = "Good bye Sir!"; + String listInforming = "Here are the task in your list Sir:"; + String markInforming = "Roger that Sir, I've marked this task as done:"; + String unmarkInforming = "Noted Sir, I've marked this task as NOT done yet:"; System.out.println(line); System.out.println(greeting + name + "!"); System.out.println(question); System.out.println(line); - ArrayList taskList = new ArrayList(); // list of tasks + ArrayList taskList = new ArrayList(); // list of Tasks while (true) { Scanner userInput = new Scanner(System.in); - String task = userInput.nextLine(); + String taskDescription = userInput.nextLine(); - if (task.equals("list")) { // if "list" is entered + if (taskDescription.equals("list")) { // if "list" is entered System.out.println(line); - for (int i = 0; i < taskList.size(); i++) { + System.out.println(listInforming); + for (int i = 0; i < taskList.size(); i++) { // listing out the current task int count = i + 1; - System.out.println(count + ". " + taskList.get(i)); + Task currentTask = taskList.get(i); + System.out.println(count + "." + currentTask.getTaskString()); } System.out.println(line); - } else if (task.equals("bye")) { // if "bye" is entered + + } else if (taskDescription.equals("bye")) { // if "bye" is entered System.out.println(line); System.out.println(signOff); System.out.println(line); break; + + } else if (taskDescription.contains("mark") || taskDescription.contains("unmark")) { // if "mark" or "unmark" is entered + int taskNum = Integer.parseInt(taskDescription.substring(taskDescription.length() - 1)); + if (taskDescription.contains("unmark")) { // if "unmark" is entered + Task currentTask = taskList.get(taskNum - 1); + currentTask.setDone(false); + + System.out.println(line); + System.out.println(unmarkInforming); + System.out.println(currentTask.getTaskString()); + System.out.println(line); + } else { // if "mark" is entered + Task currentTask = taskList.get(taskNum - 1); + currentTask.setDone(true); + + System.out.println(line); + System.out.println(markInforming); + System.out.println(currentTask.getTaskString()); + System.out.println(line); + } + } else { // if any other request + Task task = new Task(taskDescription); taskList.add(task); // add new task to the end of task list System.out.println(line); - System.out.println("added: " + task); + System.out.println("added: " + task.description); System.out.println(line); } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 0000000000..b1a90748bd --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,23 @@ +public class Task { + protected String description; + protected boolean isDone; + + public Task(String description) { + this.description = description; + this.isDone = false; + } + + public void setDone(boolean done) { + this.isDone = done; + } + + public String getTaskString() { // generates the string of marking and task + String marking = ""; + if (this.isDone) { + marking = "[✓]"; + } else { + marking = "[✕]"; + } + return marking + " " + this.description; + } +} From 9352ee1dc0eb6a74c32b96a4b3713bef82f4d329 Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Wed, 23 Aug 2023 11:22:11 +0800 Subject: [PATCH 07/37] Level 4. ToDos, Events, Deadlines Added Todo.java, Event.java and Dealine.java which inherit from Task.java Added logic in Jarvis.java to handle "todo", "event" and "deadline" commands --- src/main/java/Deadline.java | 13 ++++ src/main/java/Event.java | 15 ++++ src/main/java/Jarvis.java | 150 +++++++++++++++++++++++------------- src/main/java/Task.java | 2 +- src/main/java/ToDo.java | 11 +++ 5 files changed, 138 insertions(+), 53 deletions(-) create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.java create mode 100644 src/main/java/ToDo.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java new file mode 100644 index 0000000000..573b7b8793 --- /dev/null +++ b/src/main/java/Deadline.java @@ -0,0 +1,13 @@ +public class Deadline extends Task { + protected String by; + + public Deadline(String description, String by) { + super(description); + this.by = by; + } + + @Override + public String toString() { + return "[D]" + super.toString() + " (by: " + by + ")"; + } +} diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 0000000000..a9ffba8322 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,15 @@ +public class Event extends Task { + protected String from; + protected String to; + + public Event(String description, String from, String to) { + super(description); + this.from = from; + this.to = to; + } + + @Override + public String toString() { + return "[E]" + super.toString() + " (from: " + from + "to: " + to + ")"; + } +} diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index 895d5ac064..60958d5e12 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -2,78 +2,124 @@ import java.util.ArrayList; public class Jarvis { - public static void main(String[] args) { - String name = "Jarvis"; - String logo = " ** ** ******* ** ** ** ********\n" + - " /** **** /**////** /** /**/** **////// \n" + - " /** **//** /** /** /** /**/**/** \n" + - " /** ** //** /******* //** ** /**/*********\n" + - " /** **********/**///** //** ** /**////////**\n" + - " ** /**/**//////**/** //** //**** /** /**\n" + - "//***** /** /**/** //** //** /** ******** \n" + - " ///// // // // // // // //////// "; - System.out.println(logo); - String line = "____________________________________________________________"; - String greeting = "Good day Sir! I'm "; - String question = "How can I help you today Sir?"; - String signOff = "Good bye Sir!"; - String listInforming = "Here are the task in your list Sir:"; - String markInforming = "Roger that Sir, I've marked this task as done:"; - String unmarkInforming = "Noted Sir, I've marked this task as NOT done yet:"; + private static ArrayList taskList = new ArrayList(); // list of Tasks + private static final String name = "Jarvis"; + private static final String logo = " ** ** ******* ** ** ** ********\n" + + " /** **** /**////** /** /**/** **////// \n" + + " /** **//** /** /** /** /**/**/** \n" + + " /** ** //** /******* //** ** /**/*********\n" + + " /** **********/**///** //** ** /**////////**\n" + + " ** /**/**//////**/** //** //**** /** /**\n" + + "//***** /** /**/** //** //** /** ******** \n" + + " ///// // // // // // // //////// "; + private static final String line = "____________________________________________________________"; + private static final String greeting = "Good day Sir! I'm "; + private static final String question = "How can I help you today Sir?"; + private static final String signOff = "Good bye Sir!"; + private static final String listInforming = "Here are the task in your list Sir:"; + private static final String markInforming = "Roger that Sir, I've marked this task as done:"; + private static final String unmarkInforming = "Noted Sir, I've marked this task as NOT done yet:"; + private static final String taskInforming = "As you please Sir, I've added the task:"; + + private static void printGreeting() { + System.out.println(logo); System.out.println(line); System.out.println(greeting + name + "!"); System.out.println(question); System.out.println(line); + } + + private static void printBye() { + System.out.println(line); + System.out.println(signOff); + System.out.println(line); + } + + private static void printList() { + System.out.println(line); + System.out.println(listInforming); + for (int i = 0; i < taskList.size(); i++) { // listing out the current task + int count = i + 1; + Task currentTask = taskList.get(i); + System.out.println(count + "." + currentTask.toString()); + } + System.out.println(line); + } + + private static void printMark(Task currentTask) { + System.out.println(line); + System.out.println(markInforming); + System.out.println(currentTask.toString()); + System.out.println(line); + } + + private static void printUnmark(Task currentTask) { + System.out.println(line); + System.out.println(unmarkInforming); + System.out.println(currentTask.toString()); + System.out.println(line); + } + + private static void printTask(Task currentTask) { + System.out.println(line); + System.out.println(taskInforming); + System.out.println(currentTask.toString()); + System.out.println("You have now " + taskList.size() + " tasks in the list Sir."); + System.out.println(line); + } + + public static void main(String[] args) { - ArrayList taskList = new ArrayList(); // list of Tasks + printGreeting(); while (true) { Scanner userInput = new Scanner(System.in); - String taskDescription = userInput.nextLine(); + String command = userInput.nextLine(); - if (taskDescription.equals("list")) { // if "list" is entered - System.out.println(line); - System.out.println(listInforming); - for (int i = 0; i < taskList.size(); i++) { // listing out the current task - int count = i + 1; - Task currentTask = taskList.get(i); - System.out.println(count + "." + currentTask.getTaskString()); - } - System.out.println(line); + if (command.equals("list")) { // if "list" is entered + printList(); - } else if (taskDescription.equals("bye")) { // if "bye" is entered - System.out.println(line); - System.out.println(signOff); - System.out.println(line); + } else if (command.equals("bye")) { // if "bye" is entered + printBye(); break; - } else if (taskDescription.contains("mark") || taskDescription.contains("unmark")) { // if "mark" or "unmark" is entered - int taskNum = Integer.parseInt(taskDescription.substring(taskDescription.length() - 1)); - if (taskDescription.contains("unmark")) { // if "unmark" is entered + } else if (command.contains("mark") || command.contains("unmark")) { // if "mark" or "unmark" is entered + int taskNum = Integer.parseInt(command.substring(command.length() - 1)); + if (command.contains("unmark")) { // if "unmark" is entered Task currentTask = taskList.get(taskNum - 1); currentTask.setDone(false); - - System.out.println(line); - System.out.println(unmarkInforming); - System.out.println(currentTask.getTaskString()); - System.out.println(line); + printUnmark(currentTask); } else { // if "mark" is entered Task currentTask = taskList.get(taskNum - 1); currentTask.setDone(true); - - System.out.println(line); - System.out.println(markInforming); - System.out.println(currentTask.getTaskString()); - System.out.println(line); + printMark(currentTask); } - } else { // if any other request - Task task = new Task(taskDescription); - taskList.add(task); // add new task to the end of task list - System.out.println(line); - System.out.println("added: " + task.description); - System.out.println(line); + } else { // if task command is entered + if (command.contains("todo")) { // if "todo" is entered + String taskDescription = command.substring(5); + ToDo todo = new ToDo(taskDescription); + taskList.add(todo); + printTask(todo); + } else if (command.contains("deadline")) { // if "deadline" is entered + String tempString = command.substring(9); + String[] parts = tempString.split("/"); + String taskDescription = parts[0]; + String by = parts[1].substring(3); + Deadline deadline = new Deadline(taskDescription, by); + taskList.add(deadline); + printTask(deadline); + } else { // if "event" is entered + String tempString = command.substring(6); + String[] parts = tempString.split("/"); + String taskDescription = parts[0]; + String from = parts[1].substring(5); + String to = parts[2].substring(3); + Event event = new Event(taskDescription, from, to); + taskList.add(event); + printTask(event); + } } } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index b1a90748bd..f605548308 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -11,7 +11,7 @@ public void setDone(boolean done) { this.isDone = done; } - public String getTaskString() { // generates the string of marking and task + public String toString() { // generates the string of marking and task String marking = ""; if (this.isDone) { marking = "[✓]"; diff --git a/src/main/java/ToDo.java b/src/main/java/ToDo.java new file mode 100644 index 0000000000..38788ba661 --- /dev/null +++ b/src/main/java/ToDo.java @@ -0,0 +1,11 @@ +public class ToDo extends Task { + + public ToDo(String description) { + super(description); + } + + @Override + public String toString() { + return "[T]" + super.toString(); + } +} From 2cf0402d20f723cd7d3d6b5f8f0b0d3f7808c2ec Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Wed, 23 Aug 2023 17:17:48 +0800 Subject: [PATCH 08/37] A-TextUiTesting: Automated Text UI Testing Added command line inputs into input.txt and expected outputs into expected.txt. Added simple logic to handle erroneous inputs, this is not completed. Removed ASCII art because it was causing too many issues with the input output comparison. --- src/main/java/Jarvis.java | 31 ++++++++++-------- src/main/java/Task.java | 4 +-- text-ui-test/EXPECTED.TXT | 67 +++++++++++++++++++++++++++++++++++---- text-ui-test/input.txt | 11 +++++++ text-ui-test/runtest.sh | 2 +- 5 files changed, 92 insertions(+), 23 deletions(-) diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index 60958d5e12..b87a23a48f 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -5,14 +5,6 @@ public class Jarvis { private static ArrayList taskList = new ArrayList(); // list of Tasks private static final String name = "Jarvis"; - private static final String logo = " ** ** ******* ** ** ** ********\n" + - " /** **** /**////** /** /**/** **////// \n" + - " /** **//** /** /** /** /**/**/** \n" + - " /** ** //** /******* //** ** /**/*********\n" + - " /** **********/**///** //** ** /**////////**\n" + - " ** /**/**//////**/** //** //**** /** /**\n" + - "//***** /** /**/** //** //** /** ******** \n" + - " ///// // // // // // // //////// "; private static final String line = "____________________________________________________________"; private static final String greeting = "Good day Sir! I'm "; private static final String question = "How can I help you today Sir?"; @@ -21,9 +13,9 @@ public class Jarvis { private static final String markInforming = "Roger that Sir, I've marked this task as done:"; private static final String unmarkInforming = "Noted Sir, I've marked this task as NOT done yet:"; private static final String taskInforming = "As you please Sir, I've added the task:"; + private static final String errorInforming = "My apologies Sir, this request cannot be processed."; private static void printGreeting() { - System.out.println(logo); System.out.println(line); System.out.println(greeting + name + "!"); System.out.println(question); @@ -69,13 +61,19 @@ private static void printTask(Task currentTask) { System.out.println(line); } + private static void printError() { + System.out.println(line); + System.out.println(errorInforming); + System.out.println(line); + } + public static void main(String[] args) { printGreeting(); + Scanner scanner = new Scanner(System.in); while (true) { - Scanner userInput = new Scanner(System.in); - String command = userInput.nextLine(); + String command = scanner.nextLine().trim(); if (command.equals("list")) { // if "list" is entered printList(); @@ -84,7 +82,8 @@ public static void main(String[] args) { printBye(); break; - } else if (command.contains("mark") || command.contains("unmark")) { // if "mark" or "unmark" is entered + } else if (command.contains("mark") || + command.contains("unmark")) { // if "mark" or "unmark" is entered int taskNum = Integer.parseInt(command.substring(command.length() - 1)); if (command.contains("unmark")) { // if "unmark" is entered Task currentTask = taskList.get(taskNum - 1); @@ -96,7 +95,9 @@ public static void main(String[] args) { printMark(currentTask); } - } else { // if task command is entered + } else if (command.contains("todo") || + command.contains("deadline") || + command.contains("event")) { // if task command is entered if (command.contains("todo")) { // if "todo" is entered String taskDescription = command.substring(5); ToDo todo = new ToDo(taskDescription); @@ -120,7 +121,11 @@ public static void main(String[] args) { taskList.add(event); printTask(event); } + + } else { // if command given is invalid + printError(); } } + scanner.close(); // closing the user input scanner } } \ No newline at end of file diff --git a/src/main/java/Task.java b/src/main/java/Task.java index f605548308..3a3498364f 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -14,9 +14,9 @@ public void setDone(boolean done) { public String toString() { // generates the string of marking and task String marking = ""; if (this.isDone) { - marking = "[✓]"; + marking = "[X]"; } else { - marking = "[✕]"; + marking = "[ ]"; } return marking + " " + this.description; } diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 657e74f6e7..c780a93b93 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,7 +1,60 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| - +____________________________________________________________ +Good day Sir! I'm Jarvis! +How can I help you today Sir? +____________________________________________________________ +____________________________________________________________ +As you please Sir, I've added the task: +[T][ ] borrow book +You have now 1 tasks in the list Sir. +____________________________________________________________ +____________________________________________________________ +As you please Sir, I've added the task: +[D][ ] return book (by: Sunday) +You have now 2 tasks in the list Sir. +____________________________________________________________ +____________________________________________________________ +As you please Sir, I've added the task: +[E][ ] project meeting (from: Mon 2pm to: 4pm) +You have now 3 tasks in the list Sir. +____________________________________________________________ +____________________________________________________________ +As you please Sir, I've added the task: +[D][ ] finish assignment (by: Saturday) +You have now 4 tasks in the list Sir. +____________________________________________________________ +____________________________________________________________ +As you please Sir, I've added the task: +[T][ ] start on vlog +You have now 5 tasks in the list Sir. +____________________________________________________________ +____________________________________________________________ +Here are the task in your list Sir: +1.[T][ ] borrow book +2.[D][ ] return book (by: Sunday) +3.[E][ ] project meeting (from: Mon 2pm to: 4pm) +4.[D][ ] finish assignment (by: Saturday) +5.[T][ ] start on vlog +____________________________________________________________ +____________________________________________________________ +Roger that Sir, I've marked this task as done: +[T][X] borrow book +____________________________________________________________ +____________________________________________________________ +Roger that Sir, I've marked this task as done: +[E][X] project meeting (from: Mon 2pm to: 4pm) +____________________________________________________________ +____________________________________________________________ +Noted Sir, I've marked this task as NOT done yet: +[E][ ] project meeting (from: Mon 2pm to: 4pm) +____________________________________________________________ +____________________________________________________________ +Here are the task in your list Sir: +1.[T][X] borrow book +2.[D][ ] return book (by: Sunday) +3.[E][ ] project meeting (from: Mon 2pm to: 4pm) +4.[D][ ] finish assignment (by: Saturday) +5.[T][ ] start on vlog +____________________________________________________________ +____________________________________________________________ +Good bye Sir! +____________________________________________________________ diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index e69de29bb2..90f9ad616e 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -0,0 +1,11 @@ +todo borrow book +deadline return book /by Sunday +event project meeting /from Mon 2pm /to 4pm +deadline finish assignment /by Saturday +todo start on vlog +list +mark 1 +mark 3 +unmark 3 +list +bye \ No newline at end of file diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index c9ec870033..fb7eed2a2e 100644 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -20,7 +20,7 @@ then fi # run the program, feed commands from input.txt file and redirect the output to the ACTUAL.TXT -java -classpath ../bin Duke < input.txt > ACTUAL.TXT +java -classpath ../bin Jarvis < input.txt > ACTUAL.TXT # convert to UNIX format cp EXPECTED.TXT EXPECTED-UNIX.TXT From c59aaf2becc5e11d48638314ce5fcb069b4f5bca Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Wed, 23 Aug 2023 19:32:29 +0800 Subject: [PATCH 09/37] Level 5. Handle Errors. Added JarvisException.java which is the parent of IncorrectJarvisCommandException.java, InvalidTaskNumberException.java and WrongJarvisCommandFormatException.java Added logic to handle errors in Jarvis.java --- .../java/IncorrectJarvisCommandException.java | 5 + src/main/java/InvalidTaskNumberException.java | 5 + src/main/java/Jarvis.java | 148 +++++++++++++++--- src/main/java/JarvisException.java | 5 + .../WrongJarvisCommandFormatException.java | 5 + 5 files changed, 149 insertions(+), 19 deletions(-) create mode 100644 src/main/java/IncorrectJarvisCommandException.java create mode 100644 src/main/java/InvalidTaskNumberException.java create mode 100644 src/main/java/JarvisException.java create mode 100644 src/main/java/WrongJarvisCommandFormatException.java diff --git a/src/main/java/IncorrectJarvisCommandException.java b/src/main/java/IncorrectJarvisCommandException.java new file mode 100644 index 0000000000..9e5d27adb5 --- /dev/null +++ b/src/main/java/IncorrectJarvisCommandException.java @@ -0,0 +1,5 @@ +public class IncorrectJarvisCommandException extends JarvisException { + public IncorrectJarvisCommandException(String errorMsg) { + super(errorMsg); + } +} diff --git a/src/main/java/InvalidTaskNumberException.java b/src/main/java/InvalidTaskNumberException.java new file mode 100644 index 0000000000..b733bd86f6 --- /dev/null +++ b/src/main/java/InvalidTaskNumberException.java @@ -0,0 +1,5 @@ +public class InvalidTaskNumberException extends JarvisException { + public InvalidTaskNumberException(String errorMsg) { + super(errorMsg); + } +} diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index b87a23a48f..f62a261d46 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -2,7 +2,18 @@ import java.util.ArrayList; public class Jarvis { - private static ArrayList taskList = new ArrayList(); // list of Tasks + private static ArrayList taskList = new ArrayList<>(); // list of Tasks + private static ArrayList validCommands = new ArrayList<>(); // list of valid commands + + private static void addValidCommands() { + validCommands.add("list"); + validCommands.add("bye"); + validCommands.add("mark"); + validCommands.add("uncheck"); + validCommands.add("todo"); + validCommands.add("deadline"); + validCommands.add("event"); + } private static final String name = "Jarvis"; private static final String line = "____________________________________________________________"; @@ -11,9 +22,8 @@ public class Jarvis { private static final String signOff = "Good bye Sir!"; private static final String listInforming = "Here are the task in your list Sir:"; private static final String markInforming = "Roger that Sir, I've marked this task as done:"; - private static final String unmarkInforming = "Noted Sir, I've marked this task as NOT done yet:"; + private static final String uncheckInforming = "Noted Sir, I've marked this task as NOT done yet:"; private static final String taskInforming = "As you please Sir, I've added the task:"; - private static final String errorInforming = "My apologies Sir, this request cannot be processed."; private static void printGreeting() { System.out.println(line); @@ -46,9 +56,9 @@ private static void printMark(Task currentTask) { System.out.println(line); } - private static void printUnmark(Task currentTask) { + private static void printUncheck(Task currentTask) { System.out.println(line); - System.out.println(unmarkInforming); + System.out.println(uncheckInforming); System.out.println(currentTask.toString()); System.out.println(line); } @@ -61,14 +71,103 @@ private static void printTask(Task currentTask) { System.out.println(line); } - private static void printError() { - System.out.println(line); - System.out.println(errorInforming); - System.out.println(line); + private static void printError(String inputCommand) { + // check if command is one of the valid keywords + boolean isValidCommand = false; + String validInputCommand = ""; + for (String validCommand: validCommands) { + if (inputCommand.contains(validCommand)) { + isValidCommand = true; + validInputCommand = validCommand; + break; + } + } + + if (!isValidCommand) { + try { + throw new IncorrectJarvisCommandException("Apologies Sir, the command " + inputCommand + " is not a valid command."); + } catch (IncorrectJarvisCommandException e) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" This is the list of valid commands:"); + for (int i = 0; i < validCommands.size(); i++) { + int numbering = i + 1; + System.out.println(" " + numbering + ". " + validCommands.get(i)); + } + System.out.println(line); + return; + } + } + + // since command is valid, check if formatting of the command is correct + boolean markMatch = inputCommand.matches("mark \\d+"); + boolean uncheckMatch = inputCommand.matches("unmark \\d+"); + boolean todoMatch = inputCommand.matches("todo .+"); + boolean deadlineMatch = inputCommand.matches("deadline .+ /.+"); + boolean eventMatch = inputCommand.matches("event .+ /.+ /.+"); + + if (validInputCommand.equals("mark") && !markMatch) { + try { + throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the mark command you provided is incorrect."); + } catch (WrongJarvisCommandFormatException e) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" The following is the correct format:"); + System.out.println(" mark "); + System.out.println(line); + return; + } + } else if (validInputCommand.equals("unmark") && !uncheckMatch) { + try { + throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the uncheck command you provided is incorrect."); + } catch (WrongJarvisCommandFormatException e) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" The following is the correct format:"); + System.out.println(" uncheck "); + System.out.println(line); + return; + } + } else if (validInputCommand.equals("todo") && !todoMatch) { + try { + throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the todo command you provided is incorrect."); + } catch (WrongJarvisCommandFormatException e) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" The following is the correct format:"); + System.out.println(" todo "); + System.out.println(line); + return; + } + } else if (validInputCommand.equals("deadline") && !deadlineMatch) { + try { + throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the deadline command you provided is incorrect."); + } catch (WrongJarvisCommandFormatException e) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" The following is the correct format:"); + System.out.println(" deadline /by "); + System.out.println(line); + return; + } + } else if (validInputCommand.equals("event") && !eventMatch) { + try { + throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the event command you provided is incorrect."); + } catch (WrongJarvisCommandFormatException e) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" The following is the correct format:"); + System.out.println(" event /from /to "); + System.out.println(line); + return; + } + } + } public static void main(String[] args) { + addValidCommands(); // adding the list of valid commands to the validCommands arraylist printGreeting(); Scanner scanner = new Scanner(System.in); @@ -82,28 +181,39 @@ public static void main(String[] args) { printBye(); break; - } else if (command.contains("mark") || - command.contains("unmark")) { // if "mark" or "unmark" is entered + } else if (command.matches("mark \\d+") || + command.matches("uncheck \\d+")) { // if "mark" or "uncheck" is entered int taskNum = Integer.parseInt(command.substring(command.length() - 1)); - if (command.contains("unmark")) { // if "unmark" is entered + if (taskNum < 0 || taskNum > taskList.size()) { // check if task number is of valid range + try { + throw new InvalidTaskNumberException("Apologies Sir, the task number you provided is out of range."); + } catch (InvalidTaskNumberException e) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" There are currently " + taskList.size() + " tasks in the list."); + System.out.println(line); + continue; + } + } + if (command.matches("uncheck \\d+")) { // if "uncheck" is entered Task currentTask = taskList.get(taskNum - 1); currentTask.setDone(false); - printUnmark(currentTask); + printUncheck(currentTask); } else { // if "mark" is entered Task currentTask = taskList.get(taskNum - 1); currentTask.setDone(true); printMark(currentTask); } - } else if (command.contains("todo") || - command.contains("deadline") || - command.contains("event")) { // if task command is entered - if (command.contains("todo")) { // if "todo" is entered + } else if (command.matches("todo .+") || + command.matches("deadline .+ /.+") || + command.matches("event .+ /.+ /.+")) { // if task command is entered + if (command.matches("todo .+")) { // if "todo" is entered String taskDescription = command.substring(5); ToDo todo = new ToDo(taskDescription); taskList.add(todo); printTask(todo); - } else if (command.contains("deadline")) { // if "deadline" is entered + } else if (command.matches("deadline .+ /.+")) { // if "deadline" is entered String tempString = command.substring(9); String[] parts = tempString.split("/"); String taskDescription = parts[0]; @@ -123,7 +233,7 @@ public static void main(String[] args) { } } else { // if command given is invalid - printError(); + printError(command); } } scanner.close(); // closing the user input scanner diff --git a/src/main/java/JarvisException.java b/src/main/java/JarvisException.java new file mode 100644 index 0000000000..6767c0f56f --- /dev/null +++ b/src/main/java/JarvisException.java @@ -0,0 +1,5 @@ +public class JarvisException extends Exception { + public JarvisException(String errorMsg) { + super(errorMsg); + } +} diff --git a/src/main/java/WrongJarvisCommandFormatException.java b/src/main/java/WrongJarvisCommandFormatException.java new file mode 100644 index 0000000000..feb1140d92 --- /dev/null +++ b/src/main/java/WrongJarvisCommandFormatException.java @@ -0,0 +1,5 @@ +public class WrongJarvisCommandFormatException extends JarvisException { + public WrongJarvisCommandFormatException(String errorMsg) { + super(errorMsg); + } +} From 51a3755e4f9b32a8214cd7abdab28d0077421ce3 Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Thu, 24 Aug 2023 17:25:20 +0800 Subject: [PATCH 10/37] Level 6. Delete. Added logic to handle delete command. Added error handling for delete command. Organised error handling to become more modular and added regex matching. --- src/main/java/Event.java | 2 +- src/main/java/Jarvis.java | 177 +++++++++++++++++++++++++------------- 2 files changed, 116 insertions(+), 63 deletions(-) diff --git a/src/main/java/Event.java b/src/main/java/Event.java index a9ffba8322..d1378a3149 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -10,6 +10,6 @@ public Event(String description, String from, String to) { @Override public String toString() { - return "[E]" + super.toString() + " (from: " + from + "to: " + to + ")"; + return "[E]" + super.toString() + " (from: " + from + " to: " + to + ")"; } } diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index f62a261d46..359fabc559 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -1,5 +1,7 @@ import java.util.Scanner; import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class Jarvis { private static ArrayList taskList = new ArrayList<>(); // list of Tasks @@ -24,6 +26,7 @@ private static void addValidCommands() { private static final String markInforming = "Roger that Sir, I've marked this task as done:"; private static final String uncheckInforming = "Noted Sir, I've marked this task as NOT done yet:"; private static final String taskInforming = "As you please Sir, I've added the task:"; + private static final String deleteInforming = "Alright Sir, I've removed this task"; private static void printGreeting() { System.out.println(line); @@ -71,34 +74,16 @@ private static void printTask(Task currentTask) { System.out.println(line); } - private static void printError(String inputCommand) { - // check if command is one of the valid keywords - boolean isValidCommand = false; - String validInputCommand = ""; - for (String validCommand: validCommands) { - if (inputCommand.contains(validCommand)) { - isValidCommand = true; - validInputCommand = validCommand; - break; - } - } - - if (!isValidCommand) { - try { - throw new IncorrectJarvisCommandException("Apologies Sir, the command " + inputCommand + " is not a valid command."); - } catch (IncorrectJarvisCommandException e) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" This is the list of valid commands:"); - for (int i = 0; i < validCommands.size(); i++) { - int numbering = i + 1; - System.out.println(" " + numbering + ". " + validCommands.get(i)); - } - System.out.println(line); - return; - } - } + private static void printDelete(Task currentTask) { + System.out.println(line); + System.out.println(deleteInforming); + System.out.println(currentTask.toString()); + System.out.println("You have now " + taskList.size() + " tasks in the list Sir."); + System.out.println(line); + } + // identifies which command has wrong formatting and prints feedback to user + private static void printIncorrectFormat(String inputCommand, String validInputCommand) { // since command is valid, check if formatting of the command is correct boolean markMatch = inputCommand.matches("mark \\d+"); boolean uncheckMatch = inputCommand.matches("unmark \\d+"); @@ -117,7 +102,7 @@ private static void printError(String inputCommand) { System.out.println(line); return; } - } else if (validInputCommand.equals("unmark") && !uncheckMatch) { + } else if (validInputCommand.equals("uncheck") && !uncheckMatch) { try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the uncheck command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -165,6 +150,54 @@ private static void printError(String inputCommand) { } + // checks if command is valid and throws IncorrectJarvisCommandException + private static String isValidCommand(String inputCommand) { + // check if command is one of the valid keywords + boolean isValidCommand = false; + String validInputCommand = ""; + + for (String validCommand: validCommands) { + if (inputCommand.contains(validCommand)) { + isValidCommand = true; + validInputCommand = validCommand; + break; + } + } + + if (!isValidCommand) { + try { + throw new IncorrectJarvisCommandException("Apologies Sir, the command " + inputCommand + " is not a valid command."); + } catch (IncorrectJarvisCommandException e) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" This is the list of valid commands:"); + for (int i = 0; i < validCommands.size(); i++) { + int numbering = i + 1; + System.out.println(" " + numbering + ". " + validCommands.get(i)); + } + System.out.println(line); + } + } + return validInputCommand; + } + + // function check if task number is valid and throws InvalidTaskNumberException + private static boolean isValidTaskNumber(int taskNum) { + boolean isValid = true; + if (taskNum < 0 || taskNum > taskList.size()) { // check if task number is of valid range + try { + throw new InvalidTaskNumberException("Apologies Sir, the task number you provided is out of range."); + } catch (InvalidTaskNumberException e) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" There are currently " + taskList.size() + " tasks in the list."); + System.out.println(line); + isValid = false; + } + } + return isValid; + } + public static void main(String[] args) { addValidCommands(); // adding the list of valid commands to the validCommands arraylist @@ -173,68 +206,88 @@ public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (true) { String command = scanner.nextLine().trim(); + String nameOfValidCommand = isValidCommand(command); + if (nameOfValidCommand.equals("")) {continue;} - if (command.equals("list")) { // if "list" is entered + // if "list" is entered + if (command.matches("list")) { printList(); + continue; + } - } else if (command.equals("bye")) { // if "bye" is entered + // if "bye" is entered + if (command.matches("bye")) { printBye(); break; + } + + // if "mark" or "uncheck" is entered + if (command.matches("mark \\d+") || + command.matches("uncheck \\d+")) { - } else if (command.matches("mark \\d+") || - command.matches("uncheck \\d+")) { // if "mark" or "uncheck" is entered int taskNum = Integer.parseInt(command.substring(command.length() - 1)); - if (taskNum < 0 || taskNum > taskList.size()) { // check if task number is of valid range - try { - throw new InvalidTaskNumberException("Apologies Sir, the task number you provided is out of range."); - } catch (InvalidTaskNumberException e) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" There are currently " + taskList.size() + " tasks in the list."); - System.out.println(line); - continue; - } - } + if (!isValidTaskNumber(taskNum)) {continue;} + + Task currentTask = taskList.get(taskNum - 1); if (command.matches("uncheck \\d+")) { // if "uncheck" is entered - Task currentTask = taskList.get(taskNum - 1); currentTask.setDone(false); printUncheck(currentTask); + continue; } else { // if "mark" is entered - Task currentTask = taskList.get(taskNum - 1); currentTask.setDone(true); printMark(currentTask); + continue; } - } else if (command.matches("todo .+") || - command.matches("deadline .+ /.+") || - command.matches("event .+ /.+ /.+")) { // if task command is entered - if (command.matches("todo .+")) { // if "todo" is entered - String taskDescription = command.substring(5); + } + + // if task command is entered + Pattern todoPattern = Pattern.compile("(todo) (.+)"); + Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); + Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); + Matcher todoMatcher = todoPattern.matcher(command); + Matcher deadlineMatcher = deadlinePattern.matcher(command); + Matcher eventMatcher = eventPattern.matcher(command); + if (todoMatcher.matches() || deadlineMatcher.matches() || eventMatcher.matches()) { + if (todoMatcher.matches()) { // if "todo" is entered + String taskDescription = todoMatcher.group(2); ToDo todo = new ToDo(taskDescription); taskList.add(todo); printTask(todo); - } else if (command.matches("deadline .+ /.+")) { // if "deadline" is entered - String tempString = command.substring(9); - String[] parts = tempString.split("/"); - String taskDescription = parts[0]; - String by = parts[1].substring(3); + continue; + } else if (deadlineMatcher.matches()) { // if "deadline" is entered + String taskDescription = deadlineMatcher.group(2); + String by = deadlineMatcher.group(3); Deadline deadline = new Deadline(taskDescription, by); taskList.add(deadline); printTask(deadline); + continue; } else { // if "event" is entered - String tempString = command.substring(6); - String[] parts = tempString.split("/"); - String taskDescription = parts[0]; - String from = parts[1].substring(5); - String to = parts[2].substring(3); + String taskDescription = eventMatcher.group(2); + String from = eventMatcher.group(3); + String to = eventMatcher.group(4); Event event = new Event(taskDescription, from, to); taskList.add(event); printTask(event); + continue; } + } - } else { // if command given is invalid - printError(command); + // if delete is entered + Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); + Matcher deleteMatcher = deletePattern.matcher(command); + if (deleteMatcher.matches()) { + int taskNum = Integer.parseInt(deleteMatcher.group(2)); + if (isValidTaskNumber(taskNum)) { + Task deletedTask = taskList.get(taskNum - 1); + taskList.remove(taskNum - 1); + printDelete(deletedTask); + } + continue; } + + // if none of the above commands go through + printIncorrectFormat(command, nameOfValidCommand); } scanner.close(); // closing the user input scanner } From 4aea4a8f3eb100aec0be67c8e19fd8534808b43a Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Mon, 28 Aug 2023 16:15:44 +0800 Subject: [PATCH 11/37] Add Level 7. Save. Added save logic to allow for task list to be saved to local drive. Used gitignore on data.txt so that git will not track changes to data.txt as it is the file that stores the task list data. Further modularised and cleaned up code in main. --- .gitignore | 1 + src/main/java/Jarvis.java | 130 ++++++++++++++++++++++++-------------- 2 files changed, 83 insertions(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index 2873e189e1..7bf3ff1eb0 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT +data.txt diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index 359fabc559..6291d94cc8 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -2,6 +2,12 @@ import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.nio.file.Paths; +import java.nio.file.Path; +import java.nio.file.Files; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; public class Jarvis { private static ArrayList taskList = new ArrayList<>(); // list of Tasks @@ -84,6 +90,10 @@ private static void printDelete(Task currentTask) { // identifies which command has wrong formatting and prints feedback to user private static void printIncorrectFormat(String inputCommand, String validInputCommand) { + if (validInputCommand.equals("")) { // if input is empty + return; + } + // since command is valid, check if formatting of the command is correct boolean markMatch = inputCommand.matches("mark \\d+"); boolean uncheckMatch = inputCommand.matches("unmark \\d+"); @@ -91,7 +101,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC boolean deadlineMatch = inputCommand.matches("deadline .+ /.+"); boolean eventMatch = inputCommand.matches("event .+ /.+ /.+"); - if (validInputCommand.equals("mark") && !markMatch) { + if (validInputCommand.equals("mark") && !markMatch) { // if mark command but wrong format try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the mark command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -102,7 +112,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("uncheck") && !uncheckMatch) { + } else if (validInputCommand.equals("uncheck") && !uncheckMatch) { // if uncheck command but wrong format try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the uncheck command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -113,7 +123,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("todo") && !todoMatch) { + } else if (validInputCommand.equals("todo") && !todoMatch) { // if todo command but wrong format try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the todo command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -124,7 +134,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("deadline") && !deadlineMatch) { + } else if (validInputCommand.equals("deadline") && !deadlineMatch) { // if deadline command but wrong format try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the deadline command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -135,7 +145,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("event") && !eventMatch) { + } else if (validInputCommand.equals("event") && !eventMatch) { // if event command but wrong format try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the event command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -198,32 +208,69 @@ private static boolean isValidTaskNumber(int taskNum) { return isValid; } + // delete contents in data.txt and return empty data.txt + private static File deleteContentsDataFile(File dataFile) { + try (FileWriter writer = new FileWriter(dataFile)) { + // Write an empty string to the file + writer.write(""); + } catch (IOException e) { + System.err.println("An error occurred: " + e.getMessage()); + } + return dataFile; + } + + // write tasks toString() to data.txt + private static void writeTaskListToDataFile(File dataFile) { + for (int i = 0; i < taskList.size(); i++) { // writing the string of each task to the data file + Task currentTask = taskList.get(i); + try (FileWriter dataFileWriter = new FileWriter(dataFile, true)) { + dataFileWriter.write(currentTask.toString() + "\n"); + } catch (IOException e) { + System.err.println("An error occurred: " + e.getMessage()); + } + } + } + public static void main(String[] args) { addValidCommands(); // adding the list of valid commands to the validCommands arraylist printGreeting(); + // getting the file path to the save file + String home = System.getProperty("user.home"); + Path pathToSaveFile = Paths.get(home, "Desktop", "CS2103T", "IP", "data", "data.txt"); + boolean isFileExists = Files.exists(pathToSaveFile); + File dataFile = new File(pathToSaveFile.toString()); + try { + dataFile.createNewFile(); + } catch (IOException e) { + System.err.println("An error occurred: " + e.getMessage()); + } + + Pattern todoPattern = Pattern.compile("(todo) (.+)"); + Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); + Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); + Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); + Scanner scanner = new Scanner(System.in); while (true) { String command = scanner.nextLine().trim(); String nameOfValidCommand = isValidCommand(command); - if (nameOfValidCommand.equals("")) {continue;} - // if "list" is entered - if (command.matches("list")) { + Matcher todoMatcher = todoPattern.matcher(command); + Matcher deadlineMatcher = deadlinePattern.matcher(command); + Matcher eventMatcher = eventPattern.matcher(command); + Matcher deleteMatcher = deletePattern.matcher(command); + + if (command.matches("list")) { // if "list" is entered printList(); - continue; - } - // if "bye" is entered - if (command.matches("bye")) { + } else if (command.matches("bye")) { // if "bye" is entered printBye(); break; - } - // if "mark" or "uncheck" is entered - if (command.matches("mark \\d+") || - command.matches("uncheck \\d+")) { + } else if (command.matches("mark \\d+") || + command.matches("uncheck \\d+")) { // if "mark" or "uncheck" is entered int taskNum = Integer.parseInt(command.substring(command.length() - 1)); if (!isValidTaskNumber(taskNum)) {continue;} @@ -232,62 +279,49 @@ public static void main(String[] args) { if (command.matches("uncheck \\d+")) { // if "uncheck" is entered currentTask.setDone(false); printUncheck(currentTask); - continue; + } else { // if "mark" is entered currentTask.setDone(true); printMark(currentTask); - continue; } - } - - // if task command is entered - Pattern todoPattern = Pattern.compile("(todo) (.+)"); - Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); - Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); - Matcher todoMatcher = todoPattern.matcher(command); - Matcher deadlineMatcher = deadlinePattern.matcher(command); - Matcher eventMatcher = eventPattern.matcher(command); - if (todoMatcher.matches() || deadlineMatcher.matches() || eventMatcher.matches()) { + } else if (todoMatcher.matches() || + deadlineMatcher.matches() || + eventMatcher.matches()) { // if task command is entered + Task newTask; if (todoMatcher.matches()) { // if "todo" is entered String taskDescription = todoMatcher.group(2); - ToDo todo = new ToDo(taskDescription); - taskList.add(todo); - printTask(todo); - continue; + newTask = new ToDo(taskDescription); + } else if (deadlineMatcher.matches()) { // if "deadline" is entered String taskDescription = deadlineMatcher.group(2); String by = deadlineMatcher.group(3); - Deadline deadline = new Deadline(taskDescription, by); - taskList.add(deadline); - printTask(deadline); - continue; + newTask = new Deadline(taskDescription, by); + } else { // if "event" is entered String taskDescription = eventMatcher.group(2); String from = eventMatcher.group(3); String to = eventMatcher.group(4); - Event event = new Event(taskDescription, from, to); - taskList.add(event); - printTask(event); - continue; + newTask = new Event(taskDescription, from, to); + } - } + taskList.add(newTask); + printTask(newTask); - // if delete is entered - Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); - Matcher deleteMatcher = deletePattern.matcher(command); - if (deleteMatcher.matches()) { + } else if (deleteMatcher.matches()) { // if delete is entered int taskNum = Integer.parseInt(deleteMatcher.group(2)); if (isValidTaskNumber(taskNum)) { Task deletedTask = taskList.get(taskNum - 1); taskList.remove(taskNum - 1); printDelete(deletedTask); } - continue; } - // if none of the above commands go through - printIncorrectFormat(command, nameOfValidCommand); + else { // if none of the above commands go through + printIncorrectFormat(command, nameOfValidCommand); + } + + writeTaskListToDataFile(deleteContentsDataFile(dataFile)); // write task list to data file after every iteration } scanner.close(); // closing the user input scanner } From 8cfc1a6998e54913dce554928388c4da99f6dc4a Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Mon, 28 Aug 2023 17:53:54 +0800 Subject: [PATCH 12/37] Revert "Add Level 7. Save." This reverts commit 4aea4a8f3eb100aec0be67c8e19fd8534808b43a. --- .gitignore | 1 - src/main/java/Jarvis.java | 130 ++++++++++++++------------------------ 2 files changed, 48 insertions(+), 83 deletions(-) diff --git a/.gitignore b/.gitignore index 7bf3ff1eb0..2873e189e1 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,3 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT -data.txt diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index 6291d94cc8..359fabc559 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -2,12 +2,6 @@ import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.nio.file.Paths; -import java.nio.file.Path; -import java.nio.file.Files; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; public class Jarvis { private static ArrayList taskList = new ArrayList<>(); // list of Tasks @@ -90,10 +84,6 @@ private static void printDelete(Task currentTask) { // identifies which command has wrong formatting and prints feedback to user private static void printIncorrectFormat(String inputCommand, String validInputCommand) { - if (validInputCommand.equals("")) { // if input is empty - return; - } - // since command is valid, check if formatting of the command is correct boolean markMatch = inputCommand.matches("mark \\d+"); boolean uncheckMatch = inputCommand.matches("unmark \\d+"); @@ -101,7 +91,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC boolean deadlineMatch = inputCommand.matches("deadline .+ /.+"); boolean eventMatch = inputCommand.matches("event .+ /.+ /.+"); - if (validInputCommand.equals("mark") && !markMatch) { // if mark command but wrong format + if (validInputCommand.equals("mark") && !markMatch) { try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the mark command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -112,7 +102,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("uncheck") && !uncheckMatch) { // if uncheck command but wrong format + } else if (validInputCommand.equals("uncheck") && !uncheckMatch) { try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the uncheck command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -123,7 +113,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("todo") && !todoMatch) { // if todo command but wrong format + } else if (validInputCommand.equals("todo") && !todoMatch) { try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the todo command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -134,7 +124,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("deadline") && !deadlineMatch) { // if deadline command but wrong format + } else if (validInputCommand.equals("deadline") && !deadlineMatch) { try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the deadline command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -145,7 +135,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("event") && !eventMatch) { // if event command but wrong format + } else if (validInputCommand.equals("event") && !eventMatch) { try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the event command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -208,69 +198,32 @@ private static boolean isValidTaskNumber(int taskNum) { return isValid; } - // delete contents in data.txt and return empty data.txt - private static File deleteContentsDataFile(File dataFile) { - try (FileWriter writer = new FileWriter(dataFile)) { - // Write an empty string to the file - writer.write(""); - } catch (IOException e) { - System.err.println("An error occurred: " + e.getMessage()); - } - return dataFile; - } - - // write tasks toString() to data.txt - private static void writeTaskListToDataFile(File dataFile) { - for (int i = 0; i < taskList.size(); i++) { // writing the string of each task to the data file - Task currentTask = taskList.get(i); - try (FileWriter dataFileWriter = new FileWriter(dataFile, true)) { - dataFileWriter.write(currentTask.toString() + "\n"); - } catch (IOException e) { - System.err.println("An error occurred: " + e.getMessage()); - } - } - } - public static void main(String[] args) { addValidCommands(); // adding the list of valid commands to the validCommands arraylist printGreeting(); - // getting the file path to the save file - String home = System.getProperty("user.home"); - Path pathToSaveFile = Paths.get(home, "Desktop", "CS2103T", "IP", "data", "data.txt"); - boolean isFileExists = Files.exists(pathToSaveFile); - File dataFile = new File(pathToSaveFile.toString()); - try { - dataFile.createNewFile(); - } catch (IOException e) { - System.err.println("An error occurred: " + e.getMessage()); - } - - Pattern todoPattern = Pattern.compile("(todo) (.+)"); - Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); - Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); - Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); - Scanner scanner = new Scanner(System.in); while (true) { String command = scanner.nextLine().trim(); String nameOfValidCommand = isValidCommand(command); + if (nameOfValidCommand.equals("")) {continue;} - Matcher todoMatcher = todoPattern.matcher(command); - Matcher deadlineMatcher = deadlinePattern.matcher(command); - Matcher eventMatcher = eventPattern.matcher(command); - Matcher deleteMatcher = deletePattern.matcher(command); - - if (command.matches("list")) { // if "list" is entered + // if "list" is entered + if (command.matches("list")) { printList(); + continue; + } - } else if (command.matches("bye")) { // if "bye" is entered + // if "bye" is entered + if (command.matches("bye")) { printBye(); break; + } - } else if (command.matches("mark \\d+") || - command.matches("uncheck \\d+")) { // if "mark" or "uncheck" is entered + // if "mark" or "uncheck" is entered + if (command.matches("mark \\d+") || + command.matches("uncheck \\d+")) { int taskNum = Integer.parseInt(command.substring(command.length() - 1)); if (!isValidTaskNumber(taskNum)) {continue;} @@ -279,49 +232,62 @@ public static void main(String[] args) { if (command.matches("uncheck \\d+")) { // if "uncheck" is entered currentTask.setDone(false); printUncheck(currentTask); - + continue; } else { // if "mark" is entered currentTask.setDone(true); printMark(currentTask); + continue; } - } else if (todoMatcher.matches() || - deadlineMatcher.matches() || - eventMatcher.matches()) { // if task command is entered - Task newTask; + } + + // if task command is entered + Pattern todoPattern = Pattern.compile("(todo) (.+)"); + Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); + Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); + Matcher todoMatcher = todoPattern.matcher(command); + Matcher deadlineMatcher = deadlinePattern.matcher(command); + Matcher eventMatcher = eventPattern.matcher(command); + if (todoMatcher.matches() || deadlineMatcher.matches() || eventMatcher.matches()) { if (todoMatcher.matches()) { // if "todo" is entered String taskDescription = todoMatcher.group(2); - newTask = new ToDo(taskDescription); - + ToDo todo = new ToDo(taskDescription); + taskList.add(todo); + printTask(todo); + continue; } else if (deadlineMatcher.matches()) { // if "deadline" is entered String taskDescription = deadlineMatcher.group(2); String by = deadlineMatcher.group(3); - newTask = new Deadline(taskDescription, by); - + Deadline deadline = new Deadline(taskDescription, by); + taskList.add(deadline); + printTask(deadline); + continue; } else { // if "event" is entered String taskDescription = eventMatcher.group(2); String from = eventMatcher.group(3); String to = eventMatcher.group(4); - newTask = new Event(taskDescription, from, to); - + Event event = new Event(taskDescription, from, to); + taskList.add(event); + printTask(event); + continue; } - taskList.add(newTask); - printTask(newTask); + } - } else if (deleteMatcher.matches()) { // if delete is entered + // if delete is entered + Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); + Matcher deleteMatcher = deletePattern.matcher(command); + if (deleteMatcher.matches()) { int taskNum = Integer.parseInt(deleteMatcher.group(2)); if (isValidTaskNumber(taskNum)) { Task deletedTask = taskList.get(taskNum - 1); taskList.remove(taskNum - 1); printDelete(deletedTask); } + continue; } - else { // if none of the above commands go through - printIncorrectFormat(command, nameOfValidCommand); - } - - writeTaskListToDataFile(deleteContentsDataFile(dataFile)); // write task list to data file after every iteration + // if none of the above commands go through + printIncorrectFormat(command, nameOfValidCommand); } scanner.close(); // closing the user input scanner } From 9eadc16c03d39032157e6bd0cca32eac43468b7b Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Tue, 29 Aug 2023 12:09:43 +0800 Subject: [PATCH 13/37] Revert "Revert "Add Level 7. Save."" This reverts commit 8cfc1a6998e54913dce554928388c4da99f6dc4a. --- .gitignore | 1 + src/main/java/Jarvis.java | 130 ++++++++++++++++++++++++-------------- 2 files changed, 83 insertions(+), 48 deletions(-) diff --git a/.gitignore b/.gitignore index 2873e189e1..7bf3ff1eb0 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ bin/ /text-ui-test/ACTUAL.TXT text-ui-test/EXPECTED-UNIX.TXT +data.txt diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index 359fabc559..6291d94cc8 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -2,6 +2,12 @@ import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.nio.file.Paths; +import java.nio.file.Path; +import java.nio.file.Files; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; public class Jarvis { private static ArrayList taskList = new ArrayList<>(); // list of Tasks @@ -84,6 +90,10 @@ private static void printDelete(Task currentTask) { // identifies which command has wrong formatting and prints feedback to user private static void printIncorrectFormat(String inputCommand, String validInputCommand) { + if (validInputCommand.equals("")) { // if input is empty + return; + } + // since command is valid, check if formatting of the command is correct boolean markMatch = inputCommand.matches("mark \\d+"); boolean uncheckMatch = inputCommand.matches("unmark \\d+"); @@ -91,7 +101,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC boolean deadlineMatch = inputCommand.matches("deadline .+ /.+"); boolean eventMatch = inputCommand.matches("event .+ /.+ /.+"); - if (validInputCommand.equals("mark") && !markMatch) { + if (validInputCommand.equals("mark") && !markMatch) { // if mark command but wrong format try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the mark command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -102,7 +112,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("uncheck") && !uncheckMatch) { + } else if (validInputCommand.equals("uncheck") && !uncheckMatch) { // if uncheck command but wrong format try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the uncheck command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -113,7 +123,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("todo") && !todoMatch) { + } else if (validInputCommand.equals("todo") && !todoMatch) { // if todo command but wrong format try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the todo command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -124,7 +134,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("deadline") && !deadlineMatch) { + } else if (validInputCommand.equals("deadline") && !deadlineMatch) { // if deadline command but wrong format try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the deadline command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -135,7 +145,7 @@ private static void printIncorrectFormat(String inputCommand, String validInputC System.out.println(line); return; } - } else if (validInputCommand.equals("event") && !eventMatch) { + } else if (validInputCommand.equals("event") && !eventMatch) { // if event command but wrong format try { throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the event command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { @@ -198,32 +208,69 @@ private static boolean isValidTaskNumber(int taskNum) { return isValid; } + // delete contents in data.txt and return empty data.txt + private static File deleteContentsDataFile(File dataFile) { + try (FileWriter writer = new FileWriter(dataFile)) { + // Write an empty string to the file + writer.write(""); + } catch (IOException e) { + System.err.println("An error occurred: " + e.getMessage()); + } + return dataFile; + } + + // write tasks toString() to data.txt + private static void writeTaskListToDataFile(File dataFile) { + for (int i = 0; i < taskList.size(); i++) { // writing the string of each task to the data file + Task currentTask = taskList.get(i); + try (FileWriter dataFileWriter = new FileWriter(dataFile, true)) { + dataFileWriter.write(currentTask.toString() + "\n"); + } catch (IOException e) { + System.err.println("An error occurred: " + e.getMessage()); + } + } + } + public static void main(String[] args) { addValidCommands(); // adding the list of valid commands to the validCommands arraylist printGreeting(); + // getting the file path to the save file + String home = System.getProperty("user.home"); + Path pathToSaveFile = Paths.get(home, "Desktop", "CS2103T", "IP", "data", "data.txt"); + boolean isFileExists = Files.exists(pathToSaveFile); + File dataFile = new File(pathToSaveFile.toString()); + try { + dataFile.createNewFile(); + } catch (IOException e) { + System.err.println("An error occurred: " + e.getMessage()); + } + + Pattern todoPattern = Pattern.compile("(todo) (.+)"); + Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); + Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); + Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); + Scanner scanner = new Scanner(System.in); while (true) { String command = scanner.nextLine().trim(); String nameOfValidCommand = isValidCommand(command); - if (nameOfValidCommand.equals("")) {continue;} - // if "list" is entered - if (command.matches("list")) { + Matcher todoMatcher = todoPattern.matcher(command); + Matcher deadlineMatcher = deadlinePattern.matcher(command); + Matcher eventMatcher = eventPattern.matcher(command); + Matcher deleteMatcher = deletePattern.matcher(command); + + if (command.matches("list")) { // if "list" is entered printList(); - continue; - } - // if "bye" is entered - if (command.matches("bye")) { + } else if (command.matches("bye")) { // if "bye" is entered printBye(); break; - } - // if "mark" or "uncheck" is entered - if (command.matches("mark \\d+") || - command.matches("uncheck \\d+")) { + } else if (command.matches("mark \\d+") || + command.matches("uncheck \\d+")) { // if "mark" or "uncheck" is entered int taskNum = Integer.parseInt(command.substring(command.length() - 1)); if (!isValidTaskNumber(taskNum)) {continue;} @@ -232,62 +279,49 @@ public static void main(String[] args) { if (command.matches("uncheck \\d+")) { // if "uncheck" is entered currentTask.setDone(false); printUncheck(currentTask); - continue; + } else { // if "mark" is entered currentTask.setDone(true); printMark(currentTask); - continue; } - } - - // if task command is entered - Pattern todoPattern = Pattern.compile("(todo) (.+)"); - Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); - Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); - Matcher todoMatcher = todoPattern.matcher(command); - Matcher deadlineMatcher = deadlinePattern.matcher(command); - Matcher eventMatcher = eventPattern.matcher(command); - if (todoMatcher.matches() || deadlineMatcher.matches() || eventMatcher.matches()) { + } else if (todoMatcher.matches() || + deadlineMatcher.matches() || + eventMatcher.matches()) { // if task command is entered + Task newTask; if (todoMatcher.matches()) { // if "todo" is entered String taskDescription = todoMatcher.group(2); - ToDo todo = new ToDo(taskDescription); - taskList.add(todo); - printTask(todo); - continue; + newTask = new ToDo(taskDescription); + } else if (deadlineMatcher.matches()) { // if "deadline" is entered String taskDescription = deadlineMatcher.group(2); String by = deadlineMatcher.group(3); - Deadline deadline = new Deadline(taskDescription, by); - taskList.add(deadline); - printTask(deadline); - continue; + newTask = new Deadline(taskDescription, by); + } else { // if "event" is entered String taskDescription = eventMatcher.group(2); String from = eventMatcher.group(3); String to = eventMatcher.group(4); - Event event = new Event(taskDescription, from, to); - taskList.add(event); - printTask(event); - continue; + newTask = new Event(taskDescription, from, to); + } - } + taskList.add(newTask); + printTask(newTask); - // if delete is entered - Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); - Matcher deleteMatcher = deletePattern.matcher(command); - if (deleteMatcher.matches()) { + } else if (deleteMatcher.matches()) { // if delete is entered int taskNum = Integer.parseInt(deleteMatcher.group(2)); if (isValidTaskNumber(taskNum)) { Task deletedTask = taskList.get(taskNum - 1); taskList.remove(taskNum - 1); printDelete(deletedTask); } - continue; } - // if none of the above commands go through - printIncorrectFormat(command, nameOfValidCommand); + else { // if none of the above commands go through + printIncorrectFormat(command, nameOfValidCommand); + } + + writeTaskListToDataFile(deleteContentsDataFile(dataFile)); // write task list to data file after every iteration } scanner.close(); // closing the user input scanner } From dc10fae7b09c765a7c495e0d769887a1cb427ae3 Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Thu, 31 Aug 2023 15:07:31 +0800 Subject: [PATCH 14/37] Add Level 8. Dates and Times. Added logic in Deadline class to handle date recognition. Added empty function in Task class for inheritance in Deadline class. --- src/main/java/Deadline.java | 37 ++++++++++++++++++++++++++++++++++++- src/main/java/Jarvis.java | 1 + src/main/java/Task.java | 2 ++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 573b7b8793..ed6fa35b32 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,13 +1,48 @@ +import java.time.LocalDate; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.time.format.DateTimeFormatter; + public class Deadline extends Task { protected String by; + protected LocalDate dateBy; public Deadline(String description, String by) { super(description); this.by = by; } + @Override + public void stringToDate() { + Pattern datePattern = Pattern.compile( + "^((2000|2400|2800|(19|2[0-9])(0[48]|[2468][048]|[13579][26]))-02-29)$" + + "|^(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))$" + + "|^(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))$" + + "|^(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30))$"); + Matcher dateTimeMatcher = datePattern.matcher(this.by); + + if (!dateTimeMatcher.matches()) { // if datetime doesn't match, do nothing + this.dateBy = null; + } else { + Pattern dateTimePattern2 = Pattern.compile( + "(\\d{4})-(0[1-9]|[12][0-9]|3[01])-(0[1-9]|1[0-2])"); // YYYY-MM-DD + Matcher dateTimePattern2Matcher = dateTimePattern2.matcher(this.by); + dateTimePattern2Matcher.matches(); + int day = Integer.parseInt(dateTimePattern2Matcher.group(3)); + int month = Integer.parseInt(dateTimePattern2Matcher.group(2)); + int year = Integer.parseInt(dateTimePattern2Matcher.group(1)); + this.dateBy = LocalDate.of(year, month, day); + } + } + @Override public String toString() { - return "[D]" + super.toString() + " (by: " + by + ")"; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM d yyyy"); + if (dateBy == null) { + return "[D]" + super.toString() + " (by: " + by + ")"; + } else { + String formattedDate = this.dateBy.format(formatter); + return "[D]" + super.toString() + " (by: " + formattedDate + ")"; + } } } diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index 6291d94cc8..32d90226e4 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -297,6 +297,7 @@ public static void main(String[] args) { String taskDescription = deadlineMatcher.group(2); String by = deadlineMatcher.group(3); newTask = new Deadline(taskDescription, by); + newTask.stringToDate(); } else { // if "event" is entered String taskDescription = eventMatcher.group(2); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 3a3498364f..30f8c0d34c 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -11,6 +11,8 @@ public void setDone(boolean done) { this.isDone = done; } + public void stringToDate() {} + public String toString() { // generates the string of marking and task String marking = ""; if (this.isDone) { From d8cb2c5358e608e30bd233cdb1083ee9ac1381e2 Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Thu, 31 Aug 2023 15:58:03 +0800 Subject: [PATCH 15/37] Add TaskList.java TaskList.java added to extract out tasklist related code from main to keep code modular. appendTask, addTask, deleteTask, getTask, countTask, isValidTaskNumber, printTask, printDelete, printTaskList all added into TaskList.java --- src/main/java/Jarvis.java | 69 +++++++------------------------- src/main/java/TaskList.java | 78 +++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 56 deletions(-) create mode 100644 src/main/java/TaskList.java diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index 32d90226e4..e21a3351f4 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -10,7 +10,7 @@ import java.io.IOException; public class Jarvis { - private static ArrayList taskList = new ArrayList<>(); // list of Tasks + private static TaskList tasks; private static ArrayList validCommands = new ArrayList<>(); // list of valid commands private static void addValidCommands() { @@ -47,17 +47,6 @@ private static void printBye() { System.out.println(line); } - private static void printList() { - System.out.println(line); - System.out.println(listInforming); - for (int i = 0; i < taskList.size(); i++) { // listing out the current task - int count = i + 1; - Task currentTask = taskList.get(i); - System.out.println(count + "." + currentTask.toString()); - } - System.out.println(line); - } - private static void printMark(Task currentTask) { System.out.println(line); System.out.println(markInforming); @@ -72,22 +61,6 @@ private static void printUncheck(Task currentTask) { System.out.println(line); } - private static void printTask(Task currentTask) { - System.out.println(line); - System.out.println(taskInforming); - System.out.println(currentTask.toString()); - System.out.println("You have now " + taskList.size() + " tasks in the list Sir."); - System.out.println(line); - } - - private static void printDelete(Task currentTask) { - System.out.println(line); - System.out.println(deleteInforming); - System.out.println(currentTask.toString()); - System.out.println("You have now " + taskList.size() + " tasks in the list Sir."); - System.out.println(line); - } - // identifies which command has wrong formatting and prints feedback to user private static void printIncorrectFormat(String inputCommand, String validInputCommand) { if (validInputCommand.equals("")) { // if input is empty @@ -191,23 +164,6 @@ private static String isValidCommand(String inputCommand) { return validInputCommand; } - // function check if task number is valid and throws InvalidTaskNumberException - private static boolean isValidTaskNumber(int taskNum) { - boolean isValid = true; - if (taskNum < 0 || taskNum > taskList.size()) { // check if task number is of valid range - try { - throw new InvalidTaskNumberException("Apologies Sir, the task number you provided is out of range."); - } catch (InvalidTaskNumberException e) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" There are currently " + taskList.size() + " tasks in the list."); - System.out.println(line); - isValid = false; - } - } - return isValid; - } - // delete contents in data.txt and return empty data.txt private static File deleteContentsDataFile(File dataFile) { try (FileWriter writer = new FileWriter(dataFile)) { @@ -221,8 +177,8 @@ private static File deleteContentsDataFile(File dataFile) { // write tasks toString() to data.txt private static void writeTaskListToDataFile(File dataFile) { - for (int i = 0; i < taskList.size(); i++) { // writing the string of each task to the data file - Task currentTask = taskList.get(i); + for (int i = 0; i < tasks.countTask(); i++) { // writing the string of each task to the data file + Task currentTask = tasks.getTask(i); try (FileWriter dataFileWriter = new FileWriter(dataFile, true)) { dataFileWriter.write(currentTask.toString() + "\n"); } catch (IOException e) { @@ -252,6 +208,7 @@ public static void main(String[] args) { Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); + tasks = new TaskList(); Scanner scanner = new Scanner(System.in); while (true) { String command = scanner.nextLine().trim(); @@ -263,7 +220,7 @@ public static void main(String[] args) { Matcher deleteMatcher = deletePattern.matcher(command); if (command.matches("list")) { // if "list" is entered - printList(); + tasks.printTaskList(); } else if (command.matches("bye")) { // if "bye" is entered printBye(); @@ -273,9 +230,9 @@ public static void main(String[] args) { command.matches("uncheck \\d+")) { // if "mark" or "uncheck" is entered int taskNum = Integer.parseInt(command.substring(command.length() - 1)); - if (!isValidTaskNumber(taskNum)) {continue;} + if (!tasks.isValidTaskNumber(taskNum)) {continue;} - Task currentTask = taskList.get(taskNum - 1); + Task currentTask = tasks.getTask(taskNum - 1); if (command.matches("uncheck \\d+")) { // if "uncheck" is entered currentTask.setDone(false); printUncheck(currentTask); @@ -306,15 +263,15 @@ public static void main(String[] args) { newTask = new Event(taskDescription, from, to); } - taskList.add(newTask); - printTask(newTask); + tasks.appendTask(newTask); + tasks.printTask(newTask); } else if (deleteMatcher.matches()) { // if delete is entered int taskNum = Integer.parseInt(deleteMatcher.group(2)); - if (isValidTaskNumber(taskNum)) { - Task deletedTask = taskList.get(taskNum - 1); - taskList.remove(taskNum - 1); - printDelete(deletedTask); + if (tasks.isValidTaskNumber(taskNum)) { + Task deletedTask = tasks.getTask(taskNum - 1); + tasks.deleteTask(taskNum - 1); + tasks.printDelete(deletedTask); } } diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java new file mode 100644 index 0000000000..259485f05d --- /dev/null +++ b/src/main/java/TaskList.java @@ -0,0 +1,78 @@ +import java.util.ArrayList; + +public class TaskList { + private ArrayList taskList = new ArrayList<>(); + private static final String line = "____________________________________________________________"; + private static final String listInforming = "Here are the task in your list Sir:"; + private static final String taskInforming = "As you please Sir, I've added the task:"; + private static final String deleteInforming = "Alright Sir, I've removed this task"; + + public TaskList(String tasks) { + + } + + public void appendTask(Task task) { + this.taskList.add(task); + } + + public void addTask(Task task, int index) { + this.taskList.add(index, task); + } + + public void deleteTask(int index) { + this.taskList.remove(index); + } + + public Task getTask(int index) { + return this.taskList.get(index); + } + + public int countTask() { + return taskList.size(); + } + + // function checks if task number is valid and throws InvalidTaskNumberException + public boolean isValidTaskNumber(int taskNum) { + boolean isValid = true; + if (taskNum < 0 || taskNum > this.taskList.size()) { // check if task number is of valid range + try { + throw new InvalidTaskNumberException("Apologies Sir, the task number you provided is out of range."); + } catch (InvalidTaskNumberException e) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" There are currently " + this.taskList.size() + " tasks in the list."); + System.out.println(line); + isValid = false; + } + } + return isValid; + } + + public void printTask(Task currentTask) { + System.out.println(line); + System.out.println(taskInforming); + System.out.println(currentTask.toString()); + System.out.println("You have now " + taskList.size() + " tasks in the list Sir."); + System.out.println(line); + } + + public void printDelete(Task currentTask) { + System.out.println(line); + System.out.println(deleteInforming); + System.out.println(currentTask.toString()); + System.out.println("You have now " + taskList.size() + " tasks in the list Sir."); + System.out.println(line); + } + + public void printTaskList() { + System.out.println(line); + System.out.println(listInforming); + for (int i = 0; i < taskList.size(); i++) { // listing out the current task + int count = i + 1; + Task currentTask = taskList.get(i); + System.out.println(count + "." + currentTask.toString()); + } + System.out.println(line); + } + +} From 27a61526367480abe7eab7d8f0453aead83ee0df Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Thu, 31 Aug 2023 17:50:00 +0800 Subject: [PATCH 16/37] Add Storage.java Storage.java added to extract out loading and saving file related code from main to keep code modular. load, deleteContents, save methods added Logic for instantiating TaskList object from a saved file also added --- src/main/java/Jarvis.java | 36 ++++------------------- src/main/java/Storage.java | 58 +++++++++++++++++++++++++++++++++++++ src/main/java/TaskList.java | 41 ++++++++++++++++++++++++-- 3 files changed, 101 insertions(+), 34 deletions(-) create mode 100644 src/main/java/Storage.java diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index e21a3351f4..d4d0396e56 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -11,6 +11,7 @@ public class Jarvis { private static TaskList tasks; + private static Storage storage; private static ArrayList validCommands = new ArrayList<>(); // list of valid commands private static void addValidCommands() { @@ -164,29 +165,6 @@ private static String isValidCommand(String inputCommand) { return validInputCommand; } - // delete contents in data.txt and return empty data.txt - private static File deleteContentsDataFile(File dataFile) { - try (FileWriter writer = new FileWriter(dataFile)) { - // Write an empty string to the file - writer.write(""); - } catch (IOException e) { - System.err.println("An error occurred: " + e.getMessage()); - } - return dataFile; - } - - // write tasks toString() to data.txt - private static void writeTaskListToDataFile(File dataFile) { - for (int i = 0; i < tasks.countTask(); i++) { // writing the string of each task to the data file - Task currentTask = tasks.getTask(i); - try (FileWriter dataFileWriter = new FileWriter(dataFile, true)) { - dataFileWriter.write(currentTask.toString() + "\n"); - } catch (IOException e) { - System.err.println("An error occurred: " + e.getMessage()); - } - } - } - public static void main(String[] args) { addValidCommands(); // adding the list of valid commands to the validCommands arraylist @@ -196,19 +174,14 @@ public static void main(String[] args) { String home = System.getProperty("user.home"); Path pathToSaveFile = Paths.get(home, "Desktop", "CS2103T", "IP", "data", "data.txt"); boolean isFileExists = Files.exists(pathToSaveFile); - File dataFile = new File(pathToSaveFile.toString()); - try { - dataFile.createNewFile(); - } catch (IOException e) { - System.err.println("An error occurred: " + e.getMessage()); - } + storage = new Storage(pathToSaveFile.toString()); + tasks = new TaskList(storage.load()); Pattern todoPattern = Pattern.compile("(todo) (.+)"); Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); - tasks = new TaskList(); Scanner scanner = new Scanner(System.in); while (true) { String command = scanner.nextLine().trim(); @@ -279,7 +252,8 @@ public static void main(String[] args) { printIncorrectFormat(command, nameOfValidCommand); } - writeTaskListToDataFile(deleteContentsDataFile(dataFile)); // write task list to data file after every iteration + storage.deleteContents(); + storage.save(tasks); // save task list to data file after every iteration } scanner.close(); // closing the user input scanner } diff --git a/src/main/java/Storage.java b/src/main/java/Storage.java new file mode 100644 index 0000000000..00c3612b2a --- /dev/null +++ b/src/main/java/Storage.java @@ -0,0 +1,58 @@ +import java.io.File; +import java.io.FileWriter; +import java.io.FileReader; +import java.io.BufferedReader; +import java.io.IOException; + +public class Storage { + private File dataFile; + + public Storage(String filePath) { + this.dataFile = new File(filePath); + try { + this.dataFile.createNewFile(); + } catch (IOException e) { + System.err.println("An error occurred: " + e.getMessage()); + } + } + + // load data from dataFile + public String load() { + String fullData = ""; + try (BufferedReader reader = new BufferedReader(new FileReader(this.dataFile))) { + String line; + while ((line = reader.readLine()) != null) { // append each line and a \n to the fullData variable + if (fullData.equals("")) { + fullData = line; + } else { + fullData = fullData + "\n" + line; + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return fullData; + } + + // delete contents in dataFile + public void deleteContents() { + try (FileWriter writer = new FileWriter(this.dataFile)) { + // Write an empty string to the file + writer.write(""); + } catch (IOException e) { + System.err.println("An error occurred: " + e.getMessage()); + } + } + + // write tasks in taskList to dateFile + public void save(TaskList tasks) { + for (int i = 0; i < tasks.countTask(); i++) { // writing the string of each task to the data file + Task currentTask = tasks.getTask(i); + try (FileWriter dataFileWriter = new FileWriter(this.dataFile, true)) { + dataFileWriter.write(currentTask.toString() + "\n"); + } catch (IOException e) { + System.err.println("An error occurred: " + e.getMessage()); + } + } + } +} diff --git a/src/main/java/TaskList.java b/src/main/java/TaskList.java index 259485f05d..8e8d9601b1 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/TaskList.java @@ -1,14 +1,49 @@ import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class TaskList { - private ArrayList taskList = new ArrayList<>(); + private ArrayList taskList; private static final String line = "____________________________________________________________"; private static final String listInforming = "Here are the task in your list Sir:"; private static final String taskInforming = "As you please Sir, I've added the task:"; private static final String deleteInforming = "Alright Sir, I've removed this task"; - public TaskList(String tasks) { - + public TaskList(String tasks) { // tasks is a string + String[] stringTasks = tasks.split("\n"); + Pattern todoPattern = Pattern.compile( + "\\[T\\]\\[(X|\\s)\\] (.+)"); // [T][-] xxxx + Pattern deadlinePattern = Pattern.compile( + "\\[D\\]\\[(X|\\s)\\] (.+) \\(by: (.+)\\)"); // [D][-] xxxx (by: xxxxxx) + Pattern eventPattern = Pattern.compile( + "\\[E\\]\\[(X|\\s)\\] (.+) \\(from: (.+) to: (.+)\\)"); // [E][-] xxxx (from: xxxxxx to: xxxxxx) + + taskList = new ArrayList<>(); + for (int i = 0; i < stringTasks.length; i++) { + Matcher todoMatcher = todoPattern.matcher(stringTasks[i]); + Matcher deadlineMatcher = deadlinePattern.matcher(stringTasks[i]); + Matcher eventMatcher = eventPattern.matcher(stringTasks[i]); + + Task newTask; + if (todoMatcher.matches()) { + newTask = new ToDo(todoMatcher.group(2)); + if (todoMatcher.group(1).equals("X")) { + newTask.setDone(true); + } + } else if (deadlineMatcher.matches()) { + newTask = new Deadline(deadlineMatcher.group(2), deadlineMatcher.group(3)); + if (deadlineMatcher.group(1).equals("X")) { + newTask.setDone(true); + } + } else { + newTask = new Event(eventMatcher.group(2), eventMatcher.group(3), eventMatcher.group(4)); + if (eventMatcher.group(1).equals("X")) { + newTask.setDone(true); + } + } + + taskList.add(newTask); // add the task to the task list + } } public void appendTask(Task task) { From d3119d0702481e4f224fac2a50c5b91237b92e0c Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Thu, 31 Aug 2023 22:16:33 +0800 Subject: [PATCH 17/37] Add Parser and Ui class and changed Jarvis.java Parser.java added to process user commands and execute the proper actions needed, this logic was shifted from Jarvis.java for OOP Ui.java added to handle UI interfacing with users, printing the proper information needed for a pleasant user experience, this logic was shifted form Jarvis.java for OOP Jarvis.java edited to handle the increase in OOP --- src/main/java/Jarvis.java | 249 ++++---------------------------------- src/main/java/Parser.java | 168 +++++++++++++++++++++++++ src/main/java/Ui.java | 88 ++++++++++++++ 3 files changed, 277 insertions(+), 228 deletions(-) create mode 100644 src/main/java/Parser.java create mode 100644 src/main/java/Ui.java diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis.java index d4d0396e56..1b31893920 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -12,249 +12,42 @@ public class Jarvis { private static TaskList tasks; private static Storage storage; - private static ArrayList validCommands = new ArrayList<>(); // list of valid commands + private static Parser parser; + private static String fileName; - private static void addValidCommands() { - validCommands.add("list"); - validCommands.add("bye"); - validCommands.add("mark"); - validCommands.add("uncheck"); - validCommands.add("todo"); - validCommands.add("deadline"); - validCommands.add("event"); + public Jarvis(String fileName) { + this.fileName = fileName; } - private static final String name = "Jarvis"; - private static final String line = "____________________________________________________________"; - private static final String greeting = "Good day Sir! I'm "; - private static final String question = "How can I help you today Sir?"; - private static final String signOff = "Good bye Sir!"; - private static final String listInforming = "Here are the task in your list Sir:"; - private static final String markInforming = "Roger that Sir, I've marked this task as done:"; - private static final String uncheckInforming = "Noted Sir, I've marked this task as NOT done yet:"; - private static final String taskInforming = "As you please Sir, I've added the task:"; - private static final String deleteInforming = "Alright Sir, I've removed this task"; - - private static void printGreeting() { - System.out.println(line); - System.out.println(greeting + name + "!"); - System.out.println(question); - System.out.println(line); - } - - private static void printBye() { - System.out.println(line); - System.out.println(signOff); - System.out.println(line); - } - - private static void printMark(Task currentTask) { - System.out.println(line); - System.out.println(markInforming); - System.out.println(currentTask.toString()); - System.out.println(line); - } - - private static void printUncheck(Task currentTask) { - System.out.println(line); - System.out.println(uncheckInforming); - System.out.println(currentTask.toString()); - System.out.println(line); - } - - // identifies which command has wrong formatting and prints feedback to user - private static void printIncorrectFormat(String inputCommand, String validInputCommand) { - if (validInputCommand.equals("")) { // if input is empty - return; - } - - // since command is valid, check if formatting of the command is correct - boolean markMatch = inputCommand.matches("mark \\d+"); - boolean uncheckMatch = inputCommand.matches("unmark \\d+"); - boolean todoMatch = inputCommand.matches("todo .+"); - boolean deadlineMatch = inputCommand.matches("deadline .+ /.+"); - boolean eventMatch = inputCommand.matches("event .+ /.+ /.+"); - - if (validInputCommand.equals("mark") && !markMatch) { // if mark command but wrong format - try { - throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the mark command you provided is incorrect."); - } catch (WrongJarvisCommandFormatException e) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" The following is the correct format:"); - System.out.println(" mark "); - System.out.println(line); - return; - } - } else if (validInputCommand.equals("uncheck") && !uncheckMatch) { // if uncheck command but wrong format - try { - throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the uncheck command you provided is incorrect."); - } catch (WrongJarvisCommandFormatException e) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" The following is the correct format:"); - System.out.println(" uncheck "); - System.out.println(line); - return; - } - } else if (validInputCommand.equals("todo") && !todoMatch) { // if todo command but wrong format - try { - throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the todo command you provided is incorrect."); - } catch (WrongJarvisCommandFormatException e) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" The following is the correct format:"); - System.out.println(" todo "); - System.out.println(line); - return; - } - } else if (validInputCommand.equals("deadline") && !deadlineMatch) { // if deadline command but wrong format - try { - throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the deadline command you provided is incorrect."); - } catch (WrongJarvisCommandFormatException e) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" The following is the correct format:"); - System.out.println(" deadline /by "); - System.out.println(line); - return; - } - } else if (validInputCommand.equals("event") && !eventMatch) { // if event command but wrong format - try { - throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the event command you provided is incorrect."); - } catch (WrongJarvisCommandFormatException e) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" The following is the correct format:"); - System.out.println(" event /from /to "); - System.out.println(line); - return; - } - } - - } - - // checks if command is valid and throws IncorrectJarvisCommandException - private static String isValidCommand(String inputCommand) { - // check if command is one of the valid keywords - boolean isValidCommand = false; - String validInputCommand = ""; - - for (String validCommand: validCommands) { - if (inputCommand.contains(validCommand)) { - isValidCommand = true; - validInputCommand = validCommand; - break; - } - } - - if (!isValidCommand) { - try { - throw new IncorrectJarvisCommandException("Apologies Sir, the command " + inputCommand + " is not a valid command."); - } catch (IncorrectJarvisCommandException e) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" This is the list of valid commands:"); - for (int i = 0; i < validCommands.size(); i++) { - int numbering = i + 1; - System.out.println(" " + numbering + ". " + validCommands.get(i)); - } - System.out.println(line); - } - } - return validInputCommand; - } - - public static void main(String[] args) { - - addValidCommands(); // adding the list of valid commands to the validCommands arraylist - printGreeting(); - + public void run() { + Ui.printGreeting(); // getting the file path to the save file String home = System.getProperty("user.home"); - Path pathToSaveFile = Paths.get(home, "Desktop", "CS2103T", "IP", "data", "data.txt"); + Path pathToSaveFile = Paths.get(home, "Desktop", "CS2103T", "IP", "data", fileName); boolean isFileExists = Files.exists(pathToSaveFile); + storage = new Storage(pathToSaveFile.toString()); tasks = new TaskList(storage.load()); - - Pattern todoPattern = Pattern.compile("(todo) (.+)"); - Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); - Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); - Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); - + parser = new Parser(); Scanner scanner = new Scanner(System.in); while (true) { - String command = scanner.nextLine().trim(); - String nameOfValidCommand = isValidCommand(command); - - Matcher todoMatcher = todoPattern.matcher(command); - Matcher deadlineMatcher = deadlinePattern.matcher(command); - Matcher eventMatcher = eventPattern.matcher(command); - Matcher deleteMatcher = deletePattern.matcher(command); - - if (command.matches("list")) { // if "list" is entered - tasks.printTaskList(); - - } else if (command.matches("bye")) { // if "bye" is entered - printBye(); + try { + String command = scanner.nextLine().trim(); + Parser.parseCommand(storage, tasks, command); + } catch (IncorrectJarvisCommandException e) { + break; + } catch (InvalidTaskNumberException e) { + break; + } catch (WrongJarvisCommandFormatException e) { break; - - } else if (command.matches("mark \\d+") || - command.matches("uncheck \\d+")) { // if "mark" or "uncheck" is entered - - int taskNum = Integer.parseInt(command.substring(command.length() - 1)); - if (!tasks.isValidTaskNumber(taskNum)) {continue;} - - Task currentTask = tasks.getTask(taskNum - 1); - if (command.matches("uncheck \\d+")) { // if "uncheck" is entered - currentTask.setDone(false); - printUncheck(currentTask); - - } else { // if "mark" is entered - currentTask.setDone(true); - printMark(currentTask); - } - - } else if (todoMatcher.matches() || - deadlineMatcher.matches() || - eventMatcher.matches()) { // if task command is entered - Task newTask; - if (todoMatcher.matches()) { // if "todo" is entered - String taskDescription = todoMatcher.group(2); - newTask = new ToDo(taskDescription); - - } else if (deadlineMatcher.matches()) { // if "deadline" is entered - String taskDescription = deadlineMatcher.group(2); - String by = deadlineMatcher.group(3); - newTask = new Deadline(taskDescription, by); - newTask.stringToDate(); - - } else { // if "event" is entered - String taskDescription = eventMatcher.group(2); - String from = eventMatcher.group(3); - String to = eventMatcher.group(4); - newTask = new Event(taskDescription, from, to); - - } - tasks.appendTask(newTask); - tasks.printTask(newTask); - - } else if (deleteMatcher.matches()) { // if delete is entered - int taskNum = Integer.parseInt(deleteMatcher.group(2)); - if (tasks.isValidTaskNumber(taskNum)) { - Task deletedTask = tasks.getTask(taskNum - 1); - tasks.deleteTask(taskNum - 1); - tasks.printDelete(deletedTask); - } - } - - else { // if none of the above commands go through - printIncorrectFormat(command, nameOfValidCommand); } - storage.deleteContents(); storage.save(tasks); // save task list to data file after every iteration } scanner.close(); // closing the user input scanner } + + public static void main(String[] args) { + new Jarvis("data.txt").run(); + } } \ No newline at end of file diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 0000000000..f528ce0f38 --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,168 @@ +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Parser { + private static ArrayList validCommands; // list of valid commands + + public Parser() { + validCommands = new ArrayList<>(); + addValidCommands(); + } + + private void addValidCommands() { + validCommands.add("list"); + validCommands.add("bye"); + validCommands.add("mark"); + validCommands.add("uncheck"); + validCommands.add("todo"); + validCommands.add("deadline"); + validCommands.add("event"); + } + + // checks if command is valid and throws IncorrectJarvisCommandException + private static String isValidCommand(String inputCommand) { + // check if command is one of the valid keywords + boolean isValidCommand = false; + String validInputCommand = ""; + + for (String validCommand: validCommands) { + if (inputCommand.contains(validCommand)) { + isValidCommand = true; + validInputCommand = validCommand; + break; + } + } + + if (!isValidCommand) { + try { + throw new IncorrectJarvisCommandException("Apologies Sir, the command " + inputCommand + " is not a valid command."); + } catch (IncorrectJarvisCommandException e) { + Ui.printListOfCommands(validCommands, inputCommand, e); + } + } + return validInputCommand; + } + + // identifies which command has wrong formatting and prints feedback to user + public static void isWrongFormat(String inputCommand, String validInputCommand) { + if (validInputCommand.equals("")) { // if input is empty + return; + } + + // since command is valid, check if formatting of the command is correct + boolean markMatch = inputCommand.matches("mark \\d+"); + boolean uncheckMatch = inputCommand.matches("unmark \\d+"); + boolean todoMatch = inputCommand.matches("todo .+"); + boolean deadlineMatch = inputCommand.matches("deadline .+ /.+"); + boolean eventMatch = inputCommand.matches("event .+ /.+ /.+"); + + if (validInputCommand.equals("mark") && !markMatch) { // if mark command but wrong format + try { + throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the mark command you provided is incorrect."); + } catch (WrongJarvisCommandFormatException e) { + Ui.printWrongFormat("mark", e); + } + } else if (validInputCommand.equals("uncheck") && !uncheckMatch) { // if uncheck command but wrong format + try { + throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the uncheck command you provided is incorrect."); + } catch (WrongJarvisCommandFormatException e) { + Ui.printWrongFormat("uncheck", e); + } + } else if (validInputCommand.equals("todo") && !todoMatch) { // if todo command but wrong format + try { + throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the todo command you provided is incorrect."); + } catch (WrongJarvisCommandFormatException e) { + Ui.printWrongFormat("todo", e); + } + } else if (validInputCommand.equals("deadline") && !deadlineMatch) { // if deadline command but wrong format + try { + throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the deadline command you provided is incorrect."); + } catch (WrongJarvisCommandFormatException e) { + Ui.printWrongFormat("deadline", e); + } + } else if (validInputCommand.equals("event") && !eventMatch) { // if event command but wrong format + try { + throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the event command you provided is incorrect."); + } catch (WrongJarvisCommandFormatException e) { + Ui.printWrongFormat("event", e); + } + } + + } + + public static void parseCommand(Storage storage, TaskList tasks, String userInput) throws + IncorrectJarvisCommandException, InvalidTaskNumberException, WrongJarvisCommandFormatException { + Pattern todoPattern = Pattern.compile("(todo) (.+)"); + Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); + Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); + Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); + + Matcher todoMatcher = todoPattern.matcher(userInput); + Matcher deadlineMatcher = deadlinePattern.matcher(userInput); + Matcher eventMatcher = eventPattern.matcher(userInput); + Matcher deleteMatcher = deletePattern.matcher(userInput); + + String nameOfValidCommand = isValidCommand(userInput); + + if (userInput.matches("list")) { // if "list" is entered + tasks.printTaskList(); + + } else if (userInput.matches("bye")) { // if "bye" is entered + Ui.printBye(); + System.exit(0); + + } else if (userInput.matches("mark \\d+") || + userInput.matches("uncheck \\d+")) { // if "mark" or "uncheck" is entered + + int taskNum = Integer.parseInt(userInput.substring(userInput.length() - 1)); + if (!tasks.isValidTaskNumber(taskNum)) {return;} + + Task currentTask = tasks.getTask(taskNum - 1); + if (userInput.matches("uncheck \\d+")) { // if "uncheck" is entered + currentTask.setDone(false); + Ui.printUncheck(currentTask); + + } else { // if "mark" is entered + currentTask.setDone(true); + Ui.printMark(currentTask); + } + + } else if (todoMatcher.matches() || + deadlineMatcher.matches() || + eventMatcher.matches()) { // if task command is entered + Task newTask; + if (todoMatcher.matches()) { // if "todo" is entered + String taskDescription = todoMatcher.group(2); + newTask = new ToDo(taskDescription); + + } else if (deadlineMatcher.matches()) { // if "deadline" is entered + String taskDescription = deadlineMatcher.group(2); + String by = deadlineMatcher.group(3); + newTask = new Deadline(taskDescription, by); + newTask.stringToDate(); + + } else { // if "event" is entered + String taskDescription = eventMatcher.group(2); + String from = eventMatcher.group(3); + String to = eventMatcher.group(4); + newTask = new Event(taskDescription, from, to); + + } + tasks.appendTask(newTask); + tasks.printTask(newTask); + + } else if (deleteMatcher.matches()) { // if delete is entered + int taskNum = Integer.parseInt(deleteMatcher.group(2)); + if (tasks.isValidTaskNumber(taskNum)) { + Task deletedTask = tasks.getTask(taskNum - 1); + tasks.deleteTask(taskNum - 1); + tasks.printDelete(deletedTask); + } + } + + else { // if none of the above commands go through + isWrongFormat(userInput, nameOfValidCommand); + } + } +} diff --git a/src/main/java/Ui.java b/src/main/java/Ui.java new file mode 100644 index 0000000000..104d369626 --- /dev/null +++ b/src/main/java/Ui.java @@ -0,0 +1,88 @@ +import java.util.ArrayList; + +public class Ui { + private static final String name = "Jarvis"; + private static final String line = "____________________________________________________________"; + private static final String greeting = "Good day Sir! I'm "; + private static final String question = "How can I help you today Sir?"; + private static final String signOff = "Good bye Sir!"; + private static final String listInforming = "Here are the task in your list Sir:"; + private static final String markInforming = "Roger that Sir, I've marked this task as done:"; + private static final String uncheckInforming = "Noted Sir, I've marked this task as NOT done yet:"; + private static final String taskInforming = "As you please Sir, I've added the task:"; + private static final String deleteInforming = "Alright Sir, I've removed this task"; + + public static void printGreeting() { + System.out.println(line); + System.out.println(greeting + name + "!"); + System.out.println(question); + System.out.println(line); + } + + public static void printBye() { + System.out.println(line); + System.out.println(signOff); + System.out.println(line); + } + + public static void printMark(Task currentTask) { + System.out.println(line); + System.out.println(markInforming); + System.out.println(currentTask.toString()); + System.out.println(line); + } + + public static void printUncheck(Task currentTask) { + System.out.println(line); + System.out.println(uncheckInforming); + System.out.println(currentTask.toString()); + System.out.println(line); + } + + public static void printListOfCommands(ArrayList validCommands, String inputCommand, Exception e) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" This is the list of valid commands:"); + for (int i = 0; i < validCommands.size(); i++) { + int numbering = i + 1; + System.out.println(" " + numbering + ". " + validCommands.get(i)); + } + System.out.println(line); + } + + public static void printWrongFormat(String command, Exception e) { + if (command.equals("mark")) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" The following is the correct format:"); + System.out.println(" mark "); + System.out.println(line); + } else if (command.equals("uncheck")) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" The following is the correct format:"); + System.out.println(" uncheck "); + System.out.println(line); + } else if (command.equals("todo")) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" The following is the correct format:"); + System.out.println(" todo "); + System.out.println(line); + } else if (command.equals("deadline")) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" The following is the correct format:"); + System.out.println(" deadline /by "); + System.out.println(line); + } else if (command.equals("event")) { + System.out.println(line); + System.out.println(e.getMessage()); + System.out.println(" The following is the correct format:"); + System.out.println(" event /from /to "); + System.out.println(line); + } + + } + +} From 48cf1ab3807faca793ffe3ca94ce6a8ddece579f Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Thu, 31 Aug 2023 22:51:09 +0800 Subject: [PATCH 18/37] A-Packages. Organize into Packages. Organised all .java files into the Jarvis Package --- src/main/java/{ => Jarvis}/Deadline.java | 2 ++ src/main/java/{ => Jarvis}/Event.java | 2 ++ src/main/java/{ => Jarvis}/IncorrectJarvisCommandException.java | 2 ++ src/main/java/{ => Jarvis}/InvalidTaskNumberException.java | 2 ++ src/main/java/{ => Jarvis}/Jarvis.java | 2 ++ src/main/java/{ => Jarvis}/JarvisException.java | 2 ++ src/main/java/{ => Jarvis}/Parser.java | 2 ++ src/main/java/{ => Jarvis}/Storage.java | 2 ++ src/main/java/{ => Jarvis}/Task.java | 2 ++ src/main/java/{ => Jarvis}/TaskList.java | 2 ++ src/main/java/{ => Jarvis}/ToDo.java | 2 ++ src/main/java/{ => Jarvis}/Ui.java | 2 ++ .../java/{ => Jarvis}/WrongJarvisCommandFormatException.java | 2 ++ 13 files changed, 26 insertions(+) rename src/main/java/{ => Jarvis}/Deadline.java (99%) rename src/main/java/{ => Jarvis}/Event.java (95%) rename src/main/java/{ => Jarvis}/IncorrectJarvisCommandException.java (90%) rename src/main/java/{ => Jarvis}/InvalidTaskNumberException.java (90%) rename src/main/java/{ => Jarvis}/Jarvis.java (99%) rename src/main/java/{ => Jarvis}/JarvisException.java (88%) rename src/main/java/{ => Jarvis}/Parser.java (99%) rename src/main/java/{ => Jarvis}/Storage.java (99%) rename src/main/java/{ => Jarvis}/Task.java (97%) rename src/main/java/{ => Jarvis}/TaskList.java (99%) rename src/main/java/{ => Jarvis}/ToDo.java (92%) rename src/main/java/{ => Jarvis}/Ui.java (99%) rename src/main/java/{ => Jarvis}/WrongJarvisCommandFormatException.java (90%) diff --git a/src/main/java/Deadline.java b/src/main/java/Jarvis/Deadline.java similarity index 99% rename from src/main/java/Deadline.java rename to src/main/java/Jarvis/Deadline.java index ed6fa35b32..719d9dff28 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Jarvis/Deadline.java @@ -1,3 +1,5 @@ +package Jarvis; + import java.time.LocalDate; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/src/main/java/Event.java b/src/main/java/Jarvis/Event.java similarity index 95% rename from src/main/java/Event.java rename to src/main/java/Jarvis/Event.java index d1378a3149..4a403ffb56 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Jarvis/Event.java @@ -1,3 +1,5 @@ +package Jarvis; + public class Event extends Task { protected String from; protected String to; diff --git a/src/main/java/IncorrectJarvisCommandException.java b/src/main/java/Jarvis/IncorrectJarvisCommandException.java similarity index 90% rename from src/main/java/IncorrectJarvisCommandException.java rename to src/main/java/Jarvis/IncorrectJarvisCommandException.java index 9e5d27adb5..983815f722 100644 --- a/src/main/java/IncorrectJarvisCommandException.java +++ b/src/main/java/Jarvis/IncorrectJarvisCommandException.java @@ -1,3 +1,5 @@ +package Jarvis; + public class IncorrectJarvisCommandException extends JarvisException { public IncorrectJarvisCommandException(String errorMsg) { super(errorMsg); diff --git a/src/main/java/InvalidTaskNumberException.java b/src/main/java/Jarvis/InvalidTaskNumberException.java similarity index 90% rename from src/main/java/InvalidTaskNumberException.java rename to src/main/java/Jarvis/InvalidTaskNumberException.java index b733bd86f6..de294146a4 100644 --- a/src/main/java/InvalidTaskNumberException.java +++ b/src/main/java/Jarvis/InvalidTaskNumberException.java @@ -1,3 +1,5 @@ +package Jarvis; + public class InvalidTaskNumberException extends JarvisException { public InvalidTaskNumberException(String errorMsg) { super(errorMsg); diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis/Jarvis.java similarity index 99% rename from src/main/java/Jarvis.java rename to src/main/java/Jarvis/Jarvis.java index 1b31893920..b83c68f818 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis/Jarvis.java @@ -1,3 +1,5 @@ +package Jarvis; + import java.util.Scanner; import java.util.ArrayList; import java.util.regex.Matcher; diff --git a/src/main/java/JarvisException.java b/src/main/java/Jarvis/JarvisException.java similarity index 88% rename from src/main/java/JarvisException.java rename to src/main/java/Jarvis/JarvisException.java index 6767c0f56f..5c9eb1c565 100644 --- a/src/main/java/JarvisException.java +++ b/src/main/java/Jarvis/JarvisException.java @@ -1,3 +1,5 @@ +package Jarvis; + public class JarvisException extends Exception { public JarvisException(String errorMsg) { super(errorMsg); diff --git a/src/main/java/Parser.java b/src/main/java/Jarvis/Parser.java similarity index 99% rename from src/main/java/Parser.java rename to src/main/java/Jarvis/Parser.java index f528ce0f38..62eba7a4e1 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Jarvis/Parser.java @@ -1,3 +1,5 @@ +package Jarvis; + import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/src/main/java/Storage.java b/src/main/java/Jarvis/Storage.java similarity index 99% rename from src/main/java/Storage.java rename to src/main/java/Jarvis/Storage.java index 00c3612b2a..23946d5c26 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Jarvis/Storage.java @@ -1,3 +1,5 @@ +package Jarvis; + import java.io.File; import java.io.FileWriter; import java.io.FileReader; diff --git a/src/main/java/Task.java b/src/main/java/Jarvis/Task.java similarity index 97% rename from src/main/java/Task.java rename to src/main/java/Jarvis/Task.java index 30f8c0d34c..611389508c 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Jarvis/Task.java @@ -1,3 +1,5 @@ +package Jarvis; + public class Task { protected String description; protected boolean isDone; diff --git a/src/main/java/TaskList.java b/src/main/java/Jarvis/TaskList.java similarity index 99% rename from src/main/java/TaskList.java rename to src/main/java/Jarvis/TaskList.java index 8e8d9601b1..c57f8695c9 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/Jarvis/TaskList.java @@ -1,3 +1,5 @@ +package Jarvis; + import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/src/main/java/ToDo.java b/src/main/java/Jarvis/ToDo.java similarity index 92% rename from src/main/java/ToDo.java rename to src/main/java/Jarvis/ToDo.java index 38788ba661..fe0251ed7a 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/Jarvis/ToDo.java @@ -1,3 +1,5 @@ + +package Jarvis; public class ToDo extends Task { public ToDo(String description) { diff --git a/src/main/java/Ui.java b/src/main/java/Jarvis/Ui.java similarity index 99% rename from src/main/java/Ui.java rename to src/main/java/Jarvis/Ui.java index 104d369626..a7716ac80f 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Jarvis/Ui.java @@ -1,3 +1,5 @@ +package Jarvis; + import java.util.ArrayList; public class Ui { diff --git a/src/main/java/WrongJarvisCommandFormatException.java b/src/main/java/Jarvis/WrongJarvisCommandFormatException.java similarity index 90% rename from src/main/java/WrongJarvisCommandFormatException.java rename to src/main/java/Jarvis/WrongJarvisCommandFormatException.java index feb1140d92..0674d24944 100644 --- a/src/main/java/WrongJarvisCommandFormatException.java +++ b/src/main/java/Jarvis/WrongJarvisCommandFormatException.java @@ -1,3 +1,5 @@ +package Jarvis; + public class WrongJarvisCommandFormatException extends JarvisException { public WrongJarvisCommandFormatException(String errorMsg) { super(errorMsg); From 04a81646b53edd0d4b54c560602dd68f273447d6 Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Thu, 31 Aug 2023 22:53:10 +0800 Subject: [PATCH 19/37] Revert "A-Packages. Organize into Packages." This reverts commit 48cf1ab3807faca793ffe3ca94ce6a8ddece579f. --- src/main/java/{Jarvis => }/Deadline.java | 2 -- src/main/java/{Jarvis => }/Event.java | 2 -- src/main/java/{Jarvis => }/IncorrectJarvisCommandException.java | 2 -- src/main/java/{Jarvis => }/InvalidTaskNumberException.java | 2 -- src/main/java/{Jarvis => }/Jarvis.java | 2 -- src/main/java/{Jarvis => }/JarvisException.java | 2 -- src/main/java/{Jarvis => }/Parser.java | 2 -- src/main/java/{Jarvis => }/Storage.java | 2 -- src/main/java/{Jarvis => }/Task.java | 2 -- src/main/java/{Jarvis => }/TaskList.java | 2 -- src/main/java/{Jarvis => }/ToDo.java | 2 -- src/main/java/{Jarvis => }/Ui.java | 2 -- .../java/{Jarvis => }/WrongJarvisCommandFormatException.java | 2 -- 13 files changed, 26 deletions(-) rename src/main/java/{Jarvis => }/Deadline.java (99%) rename src/main/java/{Jarvis => }/Event.java (95%) rename src/main/java/{Jarvis => }/IncorrectJarvisCommandException.java (90%) rename src/main/java/{Jarvis => }/InvalidTaskNumberException.java (90%) rename src/main/java/{Jarvis => }/Jarvis.java (99%) rename src/main/java/{Jarvis => }/JarvisException.java (88%) rename src/main/java/{Jarvis => }/Parser.java (99%) rename src/main/java/{Jarvis => }/Storage.java (99%) rename src/main/java/{Jarvis => }/Task.java (97%) rename src/main/java/{Jarvis => }/TaskList.java (99%) rename src/main/java/{Jarvis => }/ToDo.java (92%) rename src/main/java/{Jarvis => }/Ui.java (99%) rename src/main/java/{Jarvis => }/WrongJarvisCommandFormatException.java (90%) diff --git a/src/main/java/Jarvis/Deadline.java b/src/main/java/Deadline.java similarity index 99% rename from src/main/java/Jarvis/Deadline.java rename to src/main/java/Deadline.java index 719d9dff28..ed6fa35b32 100644 --- a/src/main/java/Jarvis/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,5 +1,3 @@ -package Jarvis; - import java.time.LocalDate; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/src/main/java/Jarvis/Event.java b/src/main/java/Event.java similarity index 95% rename from src/main/java/Jarvis/Event.java rename to src/main/java/Event.java index 4a403ffb56..d1378a3149 100644 --- a/src/main/java/Jarvis/Event.java +++ b/src/main/java/Event.java @@ -1,5 +1,3 @@ -package Jarvis; - public class Event extends Task { protected String from; protected String to; diff --git a/src/main/java/Jarvis/IncorrectJarvisCommandException.java b/src/main/java/IncorrectJarvisCommandException.java similarity index 90% rename from src/main/java/Jarvis/IncorrectJarvisCommandException.java rename to src/main/java/IncorrectJarvisCommandException.java index 983815f722..9e5d27adb5 100644 --- a/src/main/java/Jarvis/IncorrectJarvisCommandException.java +++ b/src/main/java/IncorrectJarvisCommandException.java @@ -1,5 +1,3 @@ -package Jarvis; - public class IncorrectJarvisCommandException extends JarvisException { public IncorrectJarvisCommandException(String errorMsg) { super(errorMsg); diff --git a/src/main/java/Jarvis/InvalidTaskNumberException.java b/src/main/java/InvalidTaskNumberException.java similarity index 90% rename from src/main/java/Jarvis/InvalidTaskNumberException.java rename to src/main/java/InvalidTaskNumberException.java index de294146a4..b733bd86f6 100644 --- a/src/main/java/Jarvis/InvalidTaskNumberException.java +++ b/src/main/java/InvalidTaskNumberException.java @@ -1,5 +1,3 @@ -package Jarvis; - public class InvalidTaskNumberException extends JarvisException { public InvalidTaskNumberException(String errorMsg) { super(errorMsg); diff --git a/src/main/java/Jarvis/Jarvis.java b/src/main/java/Jarvis.java similarity index 99% rename from src/main/java/Jarvis/Jarvis.java rename to src/main/java/Jarvis.java index b83c68f818..1b31893920 100644 --- a/src/main/java/Jarvis/Jarvis.java +++ b/src/main/java/Jarvis.java @@ -1,5 +1,3 @@ -package Jarvis; - import java.util.Scanner; import java.util.ArrayList; import java.util.regex.Matcher; diff --git a/src/main/java/Jarvis/JarvisException.java b/src/main/java/JarvisException.java similarity index 88% rename from src/main/java/Jarvis/JarvisException.java rename to src/main/java/JarvisException.java index 5c9eb1c565..6767c0f56f 100644 --- a/src/main/java/Jarvis/JarvisException.java +++ b/src/main/java/JarvisException.java @@ -1,5 +1,3 @@ -package Jarvis; - public class JarvisException extends Exception { public JarvisException(String errorMsg) { super(errorMsg); diff --git a/src/main/java/Jarvis/Parser.java b/src/main/java/Parser.java similarity index 99% rename from src/main/java/Jarvis/Parser.java rename to src/main/java/Parser.java index 62eba7a4e1..f528ce0f38 100644 --- a/src/main/java/Jarvis/Parser.java +++ b/src/main/java/Parser.java @@ -1,5 +1,3 @@ -package Jarvis; - import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/src/main/java/Jarvis/Storage.java b/src/main/java/Storage.java similarity index 99% rename from src/main/java/Jarvis/Storage.java rename to src/main/java/Storage.java index 23946d5c26..00c3612b2a 100644 --- a/src/main/java/Jarvis/Storage.java +++ b/src/main/java/Storage.java @@ -1,5 +1,3 @@ -package Jarvis; - import java.io.File; import java.io.FileWriter; import java.io.FileReader; diff --git a/src/main/java/Jarvis/Task.java b/src/main/java/Task.java similarity index 97% rename from src/main/java/Jarvis/Task.java rename to src/main/java/Task.java index 611389508c..30f8c0d34c 100644 --- a/src/main/java/Jarvis/Task.java +++ b/src/main/java/Task.java @@ -1,5 +1,3 @@ -package Jarvis; - public class Task { protected String description; protected boolean isDone; diff --git a/src/main/java/Jarvis/TaskList.java b/src/main/java/TaskList.java similarity index 99% rename from src/main/java/Jarvis/TaskList.java rename to src/main/java/TaskList.java index c57f8695c9..8e8d9601b1 100644 --- a/src/main/java/Jarvis/TaskList.java +++ b/src/main/java/TaskList.java @@ -1,5 +1,3 @@ -package Jarvis; - import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/src/main/java/Jarvis/ToDo.java b/src/main/java/ToDo.java similarity index 92% rename from src/main/java/Jarvis/ToDo.java rename to src/main/java/ToDo.java index fe0251ed7a..38788ba661 100644 --- a/src/main/java/Jarvis/ToDo.java +++ b/src/main/java/ToDo.java @@ -1,5 +1,3 @@ - -package Jarvis; public class ToDo extends Task { public ToDo(String description) { diff --git a/src/main/java/Jarvis/Ui.java b/src/main/java/Ui.java similarity index 99% rename from src/main/java/Jarvis/Ui.java rename to src/main/java/Ui.java index a7716ac80f..104d369626 100644 --- a/src/main/java/Jarvis/Ui.java +++ b/src/main/java/Ui.java @@ -1,5 +1,3 @@ -package Jarvis; - import java.util.ArrayList; public class Ui { diff --git a/src/main/java/Jarvis/WrongJarvisCommandFormatException.java b/src/main/java/WrongJarvisCommandFormatException.java similarity index 90% rename from src/main/java/Jarvis/WrongJarvisCommandFormatException.java rename to src/main/java/WrongJarvisCommandFormatException.java index 0674d24944..feb1140d92 100644 --- a/src/main/java/Jarvis/WrongJarvisCommandFormatException.java +++ b/src/main/java/WrongJarvisCommandFormatException.java @@ -1,5 +1,3 @@ -package Jarvis; - public class WrongJarvisCommandFormatException extends JarvisException { public WrongJarvisCommandFormatException(String errorMsg) { super(errorMsg); From 6958f1b930f2cd404f7eb5ef7a90ec81432c880e Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Thu, 31 Aug 2023 22:57:17 +0800 Subject: [PATCH 20/37] A-Packages. Organise into packages. Organised classes into Jarvis package for better organisation --- src/main/java/{ => Jarvis}/Deadline.java | 2 ++ src/main/java/{ => Jarvis}/Event.java | 2 ++ .../{ => Jarvis}/IncorrectJarvisCommandException.java | 2 ++ .../java/{ => Jarvis}/InvalidTaskNumberException.java | 2 ++ src/main/java/{ => Jarvis}/Jarvis.java | 8 ++------ src/main/java/{ => Jarvis}/JarvisException.java | 2 ++ src/main/java/{ => Jarvis}/Parser.java | 4 +++- src/main/java/{ => Jarvis}/Storage.java | 2 ++ src/main/java/{ => Jarvis}/Task.java | 2 ++ src/main/java/{ => Jarvis}/TaskList.java | 4 +++- src/main/java/{ => Jarvis}/ToDo.java | 2 ++ src/main/java/{ => Jarvis}/Ui.java | 2 ++ .../{ => Jarvis}/WrongJarvisCommandFormatException.java | 2 ++ 13 files changed, 28 insertions(+), 8 deletions(-) rename src/main/java/{ => Jarvis}/Deadline.java (99%) rename src/main/java/{ => Jarvis}/Event.java (95%) rename src/main/java/{ => Jarvis}/IncorrectJarvisCommandException.java (90%) rename src/main/java/{ => Jarvis}/InvalidTaskNumberException.java (90%) rename src/main/java/{ => Jarvis}/Jarvis.java (90%) rename src/main/java/{ => Jarvis}/JarvisException.java (88%) rename src/main/java/{ => Jarvis}/Parser.java (98%) rename src/main/java/{ => Jarvis}/Storage.java (99%) rename src/main/java/{ => Jarvis}/Task.java (97%) rename src/main/java/{ => Jarvis}/TaskList.java (97%) rename src/main/java/{ => Jarvis}/ToDo.java (92%) rename src/main/java/{ => Jarvis}/Ui.java (99%) rename src/main/java/{ => Jarvis}/WrongJarvisCommandFormatException.java (90%) diff --git a/src/main/java/Deadline.java b/src/main/java/Jarvis/Deadline.java similarity index 99% rename from src/main/java/Deadline.java rename to src/main/java/Jarvis/Deadline.java index ed6fa35b32..719d9dff28 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Jarvis/Deadline.java @@ -1,3 +1,5 @@ +package Jarvis; + import java.time.LocalDate; import java.util.regex.Matcher; import java.util.regex.Pattern; diff --git a/src/main/java/Event.java b/src/main/java/Jarvis/Event.java similarity index 95% rename from src/main/java/Event.java rename to src/main/java/Jarvis/Event.java index d1378a3149..4a403ffb56 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Jarvis/Event.java @@ -1,3 +1,5 @@ +package Jarvis; + public class Event extends Task { protected String from; protected String to; diff --git a/src/main/java/IncorrectJarvisCommandException.java b/src/main/java/Jarvis/IncorrectJarvisCommandException.java similarity index 90% rename from src/main/java/IncorrectJarvisCommandException.java rename to src/main/java/Jarvis/IncorrectJarvisCommandException.java index 9e5d27adb5..983815f722 100644 --- a/src/main/java/IncorrectJarvisCommandException.java +++ b/src/main/java/Jarvis/IncorrectJarvisCommandException.java @@ -1,3 +1,5 @@ +package Jarvis; + public class IncorrectJarvisCommandException extends JarvisException { public IncorrectJarvisCommandException(String errorMsg) { super(errorMsg); diff --git a/src/main/java/InvalidTaskNumberException.java b/src/main/java/Jarvis/InvalidTaskNumberException.java similarity index 90% rename from src/main/java/InvalidTaskNumberException.java rename to src/main/java/Jarvis/InvalidTaskNumberException.java index b733bd86f6..de294146a4 100644 --- a/src/main/java/InvalidTaskNumberException.java +++ b/src/main/java/Jarvis/InvalidTaskNumberException.java @@ -1,3 +1,5 @@ +package Jarvis; + public class InvalidTaskNumberException extends JarvisException { public InvalidTaskNumberException(String errorMsg) { super(errorMsg); diff --git a/src/main/java/Jarvis.java b/src/main/java/Jarvis/Jarvis.java similarity index 90% rename from src/main/java/Jarvis.java rename to src/main/java/Jarvis/Jarvis.java index 1b31893920..226573099c 100644 --- a/src/main/java/Jarvis.java +++ b/src/main/java/Jarvis/Jarvis.java @@ -1,13 +1,9 @@ +package Jarvis; + import java.util.Scanner; -import java.util.ArrayList; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import java.nio.file.Paths; import java.nio.file.Path; import java.nio.file.Files; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; public class Jarvis { private static TaskList tasks; diff --git a/src/main/java/JarvisException.java b/src/main/java/Jarvis/JarvisException.java similarity index 88% rename from src/main/java/JarvisException.java rename to src/main/java/Jarvis/JarvisException.java index 6767c0f56f..5c9eb1c565 100644 --- a/src/main/java/JarvisException.java +++ b/src/main/java/Jarvis/JarvisException.java @@ -1,3 +1,5 @@ +package Jarvis; + public class JarvisException extends Exception { public JarvisException(String errorMsg) { super(errorMsg); diff --git a/src/main/java/Parser.java b/src/main/java/Jarvis/Parser.java similarity index 98% rename from src/main/java/Parser.java rename to src/main/java/Jarvis/Parser.java index f528ce0f38..2a2c2dbca7 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Jarvis/Parser.java @@ -1,3 +1,5 @@ +package Jarvis; + import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -20,7 +22,7 @@ private void addValidCommands() { validCommands.add("event"); } - // checks if command is valid and throws IncorrectJarvisCommandException + // checks if command is valid and throws Jarvis.IncorrectJarvisCommandException private static String isValidCommand(String inputCommand) { // check if command is one of the valid keywords boolean isValidCommand = false; diff --git a/src/main/java/Storage.java b/src/main/java/Jarvis/Storage.java similarity index 99% rename from src/main/java/Storage.java rename to src/main/java/Jarvis/Storage.java index 00c3612b2a..23946d5c26 100644 --- a/src/main/java/Storage.java +++ b/src/main/java/Jarvis/Storage.java @@ -1,3 +1,5 @@ +package Jarvis; + import java.io.File; import java.io.FileWriter; import java.io.FileReader; diff --git a/src/main/java/Task.java b/src/main/java/Jarvis/Task.java similarity index 97% rename from src/main/java/Task.java rename to src/main/java/Jarvis/Task.java index 30f8c0d34c..611389508c 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Jarvis/Task.java @@ -1,3 +1,5 @@ +package Jarvis; + public class Task { protected String description; protected boolean isDone; diff --git a/src/main/java/TaskList.java b/src/main/java/Jarvis/TaskList.java similarity index 97% rename from src/main/java/TaskList.java rename to src/main/java/Jarvis/TaskList.java index 8e8d9601b1..d8ecbf3f99 100644 --- a/src/main/java/TaskList.java +++ b/src/main/java/Jarvis/TaskList.java @@ -1,3 +1,5 @@ +package Jarvis; + import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -66,7 +68,7 @@ public int countTask() { return taskList.size(); } - // function checks if task number is valid and throws InvalidTaskNumberException + // function checks if task number is valid and throws Jarvis.InvalidTaskNumberException public boolean isValidTaskNumber(int taskNum) { boolean isValid = true; if (taskNum < 0 || taskNum > this.taskList.size()) { // check if task number is of valid range diff --git a/src/main/java/ToDo.java b/src/main/java/Jarvis/ToDo.java similarity index 92% rename from src/main/java/ToDo.java rename to src/main/java/Jarvis/ToDo.java index 38788ba661..0bc70f8266 100644 --- a/src/main/java/ToDo.java +++ b/src/main/java/Jarvis/ToDo.java @@ -1,3 +1,5 @@ +package Jarvis; + public class ToDo extends Task { public ToDo(String description) { diff --git a/src/main/java/Ui.java b/src/main/java/Jarvis/Ui.java similarity index 99% rename from src/main/java/Ui.java rename to src/main/java/Jarvis/Ui.java index 104d369626..a7716ac80f 100644 --- a/src/main/java/Ui.java +++ b/src/main/java/Jarvis/Ui.java @@ -1,3 +1,5 @@ +package Jarvis; + import java.util.ArrayList; public class Ui { diff --git a/src/main/java/WrongJarvisCommandFormatException.java b/src/main/java/Jarvis/WrongJarvisCommandFormatException.java similarity index 90% rename from src/main/java/WrongJarvisCommandFormatException.java rename to src/main/java/Jarvis/WrongJarvisCommandFormatException.java index feb1140d92..0674d24944 100644 --- a/src/main/java/WrongJarvisCommandFormatException.java +++ b/src/main/java/Jarvis/WrongJarvisCommandFormatException.java @@ -1,3 +1,5 @@ +package Jarvis; + public class WrongJarvisCommandFormatException extends JarvisException { public WrongJarvisCommandFormatException(String errorMsg) { super(errorMsg); From 5cf8a7fd1c0f66708b3df9842c7c86741cb6410c Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Thu, 31 Aug 2023 23:42:05 +0800 Subject: [PATCH 21/37] Add A-Gradle. Use Gradle. Changed the file name in the Gradle build file so that gradle can run the program. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a388517ae1..2d91928f29 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ test { } application { - mainClass.set("seedu.duke.Duke") + mainClass.set("Jarvis.Jarvis") } shadowJar { From f27d99a40299654e32cd8d5772192e82321ec1c4 Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Fri, 1 Sep 2023 00:24:50 +0800 Subject: [PATCH 22/37] A-JUnit. Add JUnit Tests. Added ToDoTest and DeadlineTest classes and used JUnit to test the toString() methods ToDo and Deadline classes respectively. --- src/main/java/Jarvis/Deadline.java | 1 + src/main/java/Jarvis/Parser.java | 1 - src/test/java/Jarvis/DeadlineTest.java | 12 ++++++++++++ src/test/java/Jarvis/ToDoTest.java | 12 ++++++++++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/test/java/Jarvis/DeadlineTest.java create mode 100644 src/test/java/Jarvis/ToDoTest.java diff --git a/src/main/java/Jarvis/Deadline.java b/src/main/java/Jarvis/Deadline.java index 719d9dff28..0b2ab62576 100644 --- a/src/main/java/Jarvis/Deadline.java +++ b/src/main/java/Jarvis/Deadline.java @@ -12,6 +12,7 @@ public class Deadline extends Task { public Deadline(String description, String by) { super(description); this.by = by; + stringToDate(); } @Override diff --git a/src/main/java/Jarvis/Parser.java b/src/main/java/Jarvis/Parser.java index 2a2c2dbca7..deb7e06e71 100644 --- a/src/main/java/Jarvis/Parser.java +++ b/src/main/java/Jarvis/Parser.java @@ -142,7 +142,6 @@ public static void parseCommand(Storage storage, TaskList tasks, String userInpu String taskDescription = deadlineMatcher.group(2); String by = deadlineMatcher.group(3); newTask = new Deadline(taskDescription, by); - newTask.stringToDate(); } else { // if "event" is entered String taskDescription = eventMatcher.group(2); diff --git a/src/test/java/Jarvis/DeadlineTest.java b/src/test/java/Jarvis/DeadlineTest.java new file mode 100644 index 0000000000..b6c174b642 --- /dev/null +++ b/src/test/java/Jarvis/DeadlineTest.java @@ -0,0 +1,12 @@ +package Jarvis; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class DeadlineTest { + @Test + public void deadline_correctInitialisation_toStringCorrect() { + Deadline deadline = new Deadline("make helmet", "2023-09-02"); + assertEquals("[D][ ] make helmet (by: Sep 2 2023)", deadline.toString()); + } +} diff --git a/src/test/java/Jarvis/ToDoTest.java b/src/test/java/Jarvis/ToDoTest.java new file mode 100644 index 0000000000..6c160d7247 --- /dev/null +++ b/src/test/java/Jarvis/ToDoTest.java @@ -0,0 +1,12 @@ +package Jarvis; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ToDoTest { + @Test + public void todo_correctInitialisation_toStringCorrect() { + ToDo todo = new ToDo("Mark XXVI is ready for you sir"); + assertEquals("[T][ ] Mark XXVI is ready for you sir", todo.toString()); + } +} From b02aef4da90c822f9db9d3c0e58a37ffd33d952f Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Fri, 1 Sep 2023 00:34:02 +0800 Subject: [PATCH 23/37] A-Jar. Create a JAR File. Added archiveFileName in order for .jar file to be named correctly --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2d91928f29..7ef4fdb6ac 100644 --- a/build.gradle +++ b/build.gradle @@ -32,8 +32,9 @@ application { } shadowJar { - archiveBaseName = "duke" + archiveBaseName = "Jarvis" archiveClassifier = null + archiveFileName = 'Jarvis.jar' dependsOn("distZip", "distTar") } From 29329cdab78957f1cd221c3d784264a9a987bb7f Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Fri, 1 Sep 2023 01:45:58 +0800 Subject: [PATCH 24/37] Add Level-9. Find. Added findTask to TaskList class to identify matching tasks and return them in a Task ArrayList. Added printFoundTask to Ui.java to show the user the found files. --- src/main/java/Jarvis/Parser.java | 13 +++++++--- src/main/java/Jarvis/TaskList.java | 37 ++++++--------------------- src/main/java/Jarvis/Ui.java | 41 +++++++++++++++++++++++++++++- 3 files changed, 58 insertions(+), 33 deletions(-) diff --git a/src/main/java/Jarvis/Parser.java b/src/main/java/Jarvis/Parser.java index deb7e06e71..8222ec6b2d 100644 --- a/src/main/java/Jarvis/Parser.java +++ b/src/main/java/Jarvis/Parser.java @@ -20,6 +20,7 @@ private void addValidCommands() { validCommands.add("todo"); validCommands.add("deadline"); validCommands.add("event"); + validCommands.add("find"); } // checks if command is valid and throws Jarvis.IncorrectJarvisCommandException @@ -99,16 +100,18 @@ public static void parseCommand(Storage storage, TaskList tasks, String userInpu Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); Pattern deletePattern = Pattern.compile("(delete) (\\d+)"); + Pattern findPattern = Pattern.compile("(find) (.+)"); Matcher todoMatcher = todoPattern.matcher(userInput); Matcher deadlineMatcher = deadlinePattern.matcher(userInput); Matcher eventMatcher = eventPattern.matcher(userInput); Matcher deleteMatcher = deletePattern.matcher(userInput); + Matcher findMatcher = findPattern.matcher(userInput); String nameOfValidCommand = isValidCommand(userInput); if (userInput.matches("list")) { // if "list" is entered - tasks.printTaskList(); + Ui.printTaskList(tasks); } else if (userInput.matches("bye")) { // if "bye" is entered Ui.printBye(); @@ -151,15 +154,19 @@ public static void parseCommand(Storage storage, TaskList tasks, String userInpu } tasks.appendTask(newTask); - tasks.printTask(newTask); + Ui.printTask(tasks ,newTask); } else if (deleteMatcher.matches()) { // if delete is entered int taskNum = Integer.parseInt(deleteMatcher.group(2)); if (tasks.isValidTaskNumber(taskNum)) { Task deletedTask = tasks.getTask(taskNum - 1); tasks.deleteTask(taskNum - 1); - tasks.printDelete(deletedTask); + Ui.printDelete(tasks ,deletedTask); } + + } else if (findMatcher.matches()) { // if find is entered + String keyword = findMatcher.group(2); + Ui.printFoundTask(tasks.findTask(keyword)); } else { // if none of the above commands go through diff --git a/src/main/java/Jarvis/TaskList.java b/src/main/java/Jarvis/TaskList.java index d8ecbf3f99..3cd9b7259b 100644 --- a/src/main/java/Jarvis/TaskList.java +++ b/src/main/java/Jarvis/TaskList.java @@ -6,10 +6,6 @@ public class TaskList { private ArrayList taskList; - private static final String line = "____________________________________________________________"; - private static final String listInforming = "Here are the task in your list Sir:"; - private static final String taskInforming = "As you please Sir, I've added the task:"; - private static final String deleteInforming = "Alright Sir, I've removed this task"; public TaskList(String tasks) { // tasks is a string String[] stringTasks = tasks.split("\n"); @@ -70,6 +66,7 @@ public int countTask() { // function checks if task number is valid and throws Jarvis.InvalidTaskNumberException public boolean isValidTaskNumber(int taskNum) { + final String line = "____________________________________________________________"; boolean isValid = true; if (taskNum < 0 || taskNum > this.taskList.size()) { // check if task number is of valid range try { @@ -85,31 +82,13 @@ public boolean isValidTaskNumber(int taskNum) { return isValid; } - public void printTask(Task currentTask) { - System.out.println(line); - System.out.println(taskInforming); - System.out.println(currentTask.toString()); - System.out.println("You have now " + taskList.size() + " tasks in the list Sir."); - System.out.println(line); - } - - public void printDelete(Task currentTask) { - System.out.println(line); - System.out.println(deleteInforming); - System.out.println(currentTask.toString()); - System.out.println("You have now " + taskList.size() + " tasks in the list Sir."); - System.out.println(line); - } - - public void printTaskList() { - System.out.println(line); - System.out.println(listInforming); - for (int i = 0; i < taskList.size(); i++) { // listing out the current task - int count = i + 1; - Task currentTask = taskList.get(i); - System.out.println(count + "." + currentTask.toString()); + public ArrayList findTask(String keyword) { + ArrayList foundTasks = new ArrayList<>(); + for (Task task: taskList) { + if (task.description.contains(keyword)) { + foundTasks.add(task); + } } - System.out.println(line); + return foundTasks; } - } diff --git a/src/main/java/Jarvis/Ui.java b/src/main/java/Jarvis/Ui.java index a7716ac80f..605dbc01b1 100644 --- a/src/main/java/Jarvis/Ui.java +++ b/src/main/java/Jarvis/Ui.java @@ -8,11 +8,12 @@ public class Ui { private static final String greeting = "Good day Sir! I'm "; private static final String question = "How can I help you today Sir?"; private static final String signOff = "Good bye Sir!"; - private static final String listInforming = "Here are the task in your list Sir:"; + private static final String listInforming = "Here are the tasks in your list Sir:"; private static final String markInforming = "Roger that Sir, I've marked this task as done:"; private static final String uncheckInforming = "Noted Sir, I've marked this task as NOT done yet:"; private static final String taskInforming = "As you please Sir, I've added the task:"; private static final String deleteInforming = "Alright Sir, I've removed this task"; + private static final String findInforming = "Here are the matching tasks in your list Sir:"; public static void printGreeting() { System.out.println(line); @@ -87,4 +88,42 @@ public static void printWrongFormat(String command, Exception e) { } + public static void printTask(TaskList tasks, Task currentTask) { + System.out.println(line); + System.out.println(taskInforming); + System.out.println(currentTask.toString()); + System.out.println("You have now " + tasks.countTask() + " tasks in the list Sir."); + System.out.println(line); + } + + public static void printDelete(TaskList tasks, Task currentTask) { + System.out.println(line); + System.out.println(deleteInforming); + System.out.println(currentTask.toString()); + System.out.println("You have now " + tasks.countTask() + " tasks in the list Sir."); + System.out.println(line); + } + + public static void printTaskList(TaskList tasks) { + System.out.println(line); + System.out.println(listInforming); + for (int i = 0; i < tasks.countTask() ; i++) { // listing out the current task + int count = i + 1; + Task currentTask = tasks.getTask(i); + System.out.println(count + "." + currentTask.toString()); + } + System.out.println(line); + } + + public static void printFoundTask(ArrayList foundTasks) { + System.out.println(line); + System.out.println(findInforming); + for (int i = 0; i < foundTasks.size() ; i++) { // listing out the current task + int count = i + 1; + Task currentTask = foundTasks.get(i); + System.out.println(count + "." + currentTask.toString()); + } + System.out.println(line); + } + } From c429a82aa1b710417c2b25014d2f62fac5bef6e5 Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Fri, 1 Sep 2023 10:59:51 +0800 Subject: [PATCH 25/37] Add. A-JavaDoc. JavaDoc. Added JavaDoc descriptions to the Deadline, Event, Jarvis, Parser, Task, TaskList and ToDo classes. --- src/main/java/Jarvis/Deadline.java | 22 ++++++++++++++++ src/main/java/Jarvis/Event.java | 19 ++++++++++++++ src/main/java/Jarvis/Jarvis.java | 27 ++++++++++++++++++++ src/main/java/Jarvis/Parser.java | 40 ++++++++++++++++++++++++++++++ src/main/java/Jarvis/Task.java | 25 +++++++++++++++++++ src/main/java/Jarvis/TaskList.java | 11 ++++++++ src/main/java/Jarvis/ToDo.java | 16 ++++++++++++ 7 files changed, 160 insertions(+) diff --git a/src/main/java/Jarvis/Deadline.java b/src/main/java/Jarvis/Deadline.java index 0b2ab62576..afd13b141b 100644 --- a/src/main/java/Jarvis/Deadline.java +++ b/src/main/java/Jarvis/Deadline.java @@ -5,16 +5,33 @@ import java.util.regex.Pattern; import java.time.format.DateTimeFormatter; +/** + * Represents a deadline task that extends the Task class. + *

+ * The Deadline class is a subclass of the Task class and has 2 additional attributes, by and dateby. + * By represents the time to complete the task by. + * dateBy is by in a Java LocalDate if the formatting of by is correct. + *

+ */ public class Deadline extends Task { protected String by; protected LocalDate dateBy; + /** + * Constructs a new Deadline object. + * + * @param description description of the deadline task. + * @param by when to complete the task by. + */ public Deadline(String description, String by) { super(description); this.by = by; stringToDate(); } + /** + * Checks and converts the by string to a valid Java LocalDate if the format is correct + */ @Override public void stringToDate() { Pattern datePattern = Pattern.compile( @@ -38,6 +55,11 @@ public void stringToDate() { } } + /** + * Converts the task to a user-friendly string representation + * + * @return A string representation of the task + */ @Override public String toString() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM d yyyy"); diff --git a/src/main/java/Jarvis/Event.java b/src/main/java/Jarvis/Event.java index 4a403ffb56..a33ae69e7c 100644 --- a/src/main/java/Jarvis/Event.java +++ b/src/main/java/Jarvis/Event.java @@ -1,15 +1,34 @@ package Jarvis; +/** + * Represents an event task with a start time and an end time. + *

+ * The Event class is a subclass of the Task class and has 2 additional attributes, + * from and to, the represent the start time and end time of the event. + *

+ */ public class Event extends Task { protected String from; protected String to; + /** + * Constructs a new Event object. + * + * @param description The description of the event. + * @param from The starting time of the event. + * @param to The ending time of the event. + */ public Event(String description, String from, String to) { super(description); this.from = from; this.to = to; } + /** + * Converts the task to a user-friendly string representation. + * + * @return A string representation of the task. + */ @Override public String toString() { return "[E]" + super.toString() + " (from: " + from + " to: " + to + ")"; diff --git a/src/main/java/Jarvis/Jarvis.java b/src/main/java/Jarvis/Jarvis.java index 226573099c..9763b84cfa 100644 --- a/src/main/java/Jarvis/Jarvis.java +++ b/src/main/java/Jarvis/Jarvis.java @@ -5,16 +5,38 @@ import java.nio.file.Path; import java.nio.file.Files; +/** + * Main application class for the Jarvis chatbot. + *

+ * This class is responsible initialising the task list, loading and saving tasks in storage and + * running the main event loop of the application. It delegates command parsing to the Parser class and storage + * operations to the Storage class. + *

+ */ public class Jarvis { private static TaskList tasks; private static Storage storage; private static Parser parser; private static String fileName; + /** + * Constructs a new Jarvis chatbot. + * + * @param fileName Name of the file to store the task data in. + */ public Jarvis(String fileName) { this.fileName = fileName; } + /** + * The main event loop of the Jarvis chatbot. + *

+ * The method keeps listening for user input until the user chooses to exit the application. + * All recognised commands are parsed and executed through the Parser class + * Existing data is loaded from the Storage class into an instance of the TaskList class, + * when the user chooses to exit the application, the data from the chatbot is saved through Storage class. + *

+ */ public void run() { Ui.printGreeting(); // getting the file path to the save file @@ -43,6 +65,11 @@ public void run() { scanner.close(); // closing the user input scanner } + /** + * The main entry point of the application + * + * @param args command-line arguments + */ public static void main(String[] args) { new Jarvis("data.txt").run(); } diff --git a/src/main/java/Jarvis/Parser.java b/src/main/java/Jarvis/Parser.java index deb7e06e71..c4a521377d 100644 --- a/src/main/java/Jarvis/Parser.java +++ b/src/main/java/Jarvis/Parser.java @@ -4,14 +4,28 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +/** + * Responsible for parsing user input, executing commands and handling any exceptions + *

+ * This class takes care of interpreting user commands and then calling the appropriate methods to perform + * the actions described by those commands. It also handles any exceptions and calls the appropriate methods + * to print the details of the exception for the user to read. + *

+ */ public class Parser { private static ArrayList validCommands; // list of valid commands + /** + * Constructs a new Parser object. + */ public Parser() { validCommands = new ArrayList<>(); addValidCommands(); } + /** + * Adds the list of valid commands into the validCommands ArrayList. + */ private void addValidCommands() { validCommands.add("list"); validCommands.add("bye"); @@ -20,8 +34,15 @@ private void addValidCommands() { validCommands.add("todo"); validCommands.add("deadline"); validCommands.add("event"); + validCommands.add("find"); } + /** + * checks if the user inputted a valid command in the validCommand ArrayList. + * + * @param inputCommand commands that the user inputs. + * @return the valid command that the user inputted, an empty string otherwise. + */ // checks if command is valid and throws Jarvis.IncorrectJarvisCommandException private static String isValidCommand(String inputCommand) { // check if command is one of the valid keywords @@ -46,6 +67,15 @@ private static String isValidCommand(String inputCommand) { return validInputCommand; } + /** + * checks if the command the user inputted has a wrong format, if the format of the command is wrong, + * print the details to the screen for the user to know how to correct it. This method assumes that + * isValidCommand has been run before this and the user has used a valid command. It just checks if + * the formatting of the command is correct. + * + * @param inputCommand the command the user inputted + * @param validInputCommand the valid command which the user inputted + */ // identifies which command has wrong formatting and prints feedback to user public static void isWrongFormat(String inputCommand, String validInputCommand) { if (validInputCommand.equals("")) { // if input is empty @@ -93,6 +123,16 @@ public static void isWrongFormat(String inputCommand, String validInputCommand) } + /** + * Parses and executes command specified in the given user input. + * + * @param storage The storage object responsible for task storage operations. + * @param tasks The task list that holds all tasks. + * @param userInput The string input from the user. + * @throws IncorrectJarvisCommandException If the command is incorrect. + * @throws InvalidTaskNumberException If the task number is out of the range of the number of tasks. + * @throws WrongJarvisCommandFormatException If the command is correct but its formatted incorrectly. + */ public static void parseCommand(Storage storage, TaskList tasks, String userInput) throws IncorrectJarvisCommandException, InvalidTaskNumberException, WrongJarvisCommandFormatException { Pattern todoPattern = Pattern.compile("(todo) (.+)"); diff --git a/src/main/java/Jarvis/Task.java b/src/main/java/Jarvis/Task.java index 611389508c..afd7c226da 100644 --- a/src/main/java/Jarvis/Task.java +++ b/src/main/java/Jarvis/Task.java @@ -1,20 +1,45 @@ package Jarvis; +/** + * Abstract class representing a task. + *

+ * This class serves as the parent for different types of tasks to inherit from and encapsulates + * the basic information and operations related to a task. + *

+ */ public class Task { protected String description; protected boolean isDone; + /** + * Constructs a new Task with the given description + * + * @param description The description of the task + */ public Task(String description) { this.description = description; this.isDone = false; } + /** + * Sets if the task is done or not + * + * @param done true if task is done, false otherwise + */ public void setDone(boolean done) { this.isDone = done; } + /** + * Abstract method for string to date conversion + */ public void stringToDate() {} + /** + * Converts the task to a user-friendly string representation + * + * @return A string representation of the task + */ public String toString() { // generates the string of marking and task String marking = ""; if (this.isDone) { diff --git a/src/main/java/Jarvis/TaskList.java b/src/main/java/Jarvis/TaskList.java index d8ecbf3f99..9bb47285ac 100644 --- a/src/main/java/Jarvis/TaskList.java +++ b/src/main/java/Jarvis/TaskList.java @@ -4,6 +4,12 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +/** + * Class representing a list of tasks. + *

+ * This class encapsulates the list of tasks and provides methods for adding, removing, and retrieving tasks. + *

+ */ public class TaskList { private ArrayList taskList; private static final String line = "____________________________________________________________"; @@ -11,6 +17,11 @@ public class TaskList { private static final String taskInforming = "As you please Sir, I've added the task:"; private static final String deleteInforming = "Alright Sir, I've removed this task"; + /** + * Constructs a new TaskList object from saved data. + * + * @param tasks The string that holds the saved data. + */ public TaskList(String tasks) { // tasks is a string String[] stringTasks = tasks.split("\n"); Pattern todoPattern = Pattern.compile( diff --git a/src/main/java/Jarvis/ToDo.java b/src/main/java/Jarvis/ToDo.java index 0bc70f8266..f951deafc7 100644 --- a/src/main/java/Jarvis/ToDo.java +++ b/src/main/java/Jarvis/ToDo.java @@ -1,11 +1,27 @@ package Jarvis; +/** + * Represents a ToDo task that extends the Task class. + *

+ * The ToDo class is a subclass of the Task class + *

+ */ public class ToDo extends Task { + /** + * Constructs a new ToDo object. + * + * @param description description of the deadline task. + */ public ToDo(String description) { super(description); } + /** + * Converts the task to a user-friendly string representation + * + * @return A string representation of the task + */ @Override public String toString() { return "[T]" + super.toString(); From 2c7c4caf2f27443309a845a40709e11dcd7f6bf8 Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Tue, 5 Sep 2023 14:36:09 +0800 Subject: [PATCH 26/37] Add A-CheckStyle. Use CheckStyle. Added CheckStyle to detect coding style violations, added logic in build.gradle to support checkstyle. Edited existing code after adding CheckStyle make sure coding style is not violated. --- build.gradle | 5 + config/checkstyle/checkstyle.xml | 434 +++++++++++++++++++++++++++++ config/checkstyle/suppressions.xml | 10 + src/main/java/Jarvis/Deadline.java | 3 +- src/main/java/Jarvis/Jarvis.java | 6 +- src/main/java/Jarvis/Parser.java | 35 ++- src/main/java/Jarvis/Storage.java | 4 +- src/main/java/Jarvis/TaskList.java | 2 +- src/main/java/Jarvis/Ui.java | 4 +- 9 files changed, 480 insertions(+), 23 deletions(-) create mode 100644 config/checkstyle/checkstyle.xml create mode 100644 config/checkstyle/suppressions.xml diff --git a/build.gradle b/build.gradle index 7ef4fdb6ac..94f8951566 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,11 @@ plugins { id 'java' id 'application' id 'com.github.johnrengelman.shadow' version '7.1.2' + id 'checkstyle' +} + +checkstyle { + toolVersion = '10.2' } repositories { diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 0000000000..eb761a9b9a --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,434 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/checkstyle/suppressions.xml b/config/checkstyle/suppressions.xml new file mode 100644 index 0000000000..39efb6e4ac --- /dev/null +++ b/config/checkstyle/suppressions.xml @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/src/main/java/Jarvis/Deadline.java b/src/main/java/Jarvis/Deadline.java index afd13b141b..7ed5f833c1 100644 --- a/src/main/java/Jarvis/Deadline.java +++ b/src/main/java/Jarvis/Deadline.java @@ -1,9 +1,10 @@ package Jarvis; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.time.format.DateTimeFormatter; + /** * Represents a deadline task that extends the Task class. diff --git a/src/main/java/Jarvis/Jarvis.java b/src/main/java/Jarvis/Jarvis.java index 9763b84cfa..c700365739 100644 --- a/src/main/java/Jarvis/Jarvis.java +++ b/src/main/java/Jarvis/Jarvis.java @@ -1,9 +1,9 @@ package Jarvis; -import java.util.Scanner; -import java.nio.file.Paths; -import java.nio.file.Path; import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Scanner; /** * Main application class for the Jarvis chatbot. diff --git a/src/main/java/Jarvis/Parser.java b/src/main/java/Jarvis/Parser.java index 7d9f7bef1a..a4d515e9db 100644 --- a/src/main/java/Jarvis/Parser.java +++ b/src/main/java/Jarvis/Parser.java @@ -59,7 +59,8 @@ private static String isValidCommand(String inputCommand) { if (!isValidCommand) { try { - throw new IncorrectJarvisCommandException("Apologies Sir, the command " + inputCommand + " is not a valid command."); + throw new IncorrectJarvisCommandException( + "Apologies Sir, the command " + inputCommand + " is not a valid command."); } catch (IncorrectJarvisCommandException e) { Ui.printListOfCommands(validCommands, inputCommand, e); } @@ -91,31 +92,36 @@ public static void isWrongFormat(String inputCommand, String validInputCommand) if (validInputCommand.equals("mark") && !markMatch) { // if mark command but wrong format try { - throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the mark command you provided is incorrect."); + throw new WrongJarvisCommandFormatException( + "Apologies Sir, the format of the mark command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { Ui.printWrongFormat("mark", e); } } else if (validInputCommand.equals("uncheck") && !uncheckMatch) { // if uncheck command but wrong format try { - throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the uncheck command you provided is incorrect."); + throw new WrongJarvisCommandFormatException( + "Apologies Sir, the format of the uncheck command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { Ui.printWrongFormat("uncheck", e); } } else if (validInputCommand.equals("todo") && !todoMatch) { // if todo command but wrong format try { - throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the todo command you provided is incorrect."); + throw new WrongJarvisCommandFormatException( + "Apologies Sir, the format of the todo command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { Ui.printWrongFormat("todo", e); } } else if (validInputCommand.equals("deadline") && !deadlineMatch) { // if deadline command but wrong format try { - throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the deadline command you provided is incorrect."); + throw new WrongJarvisCommandFormatException( + "Apologies Sir, the format of the deadline command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { Ui.printWrongFormat("deadline", e); } } else if (validInputCommand.equals("event") && !eventMatch) { // if event command but wrong format try { - throw new WrongJarvisCommandFormatException("Apologies Sir, the format of the event command you provided is incorrect."); + throw new WrongJarvisCommandFormatException( + "Apologies Sir, the format of the event command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { Ui.printWrongFormat("event", e); } @@ -133,6 +139,7 @@ public static void isWrongFormat(String inputCommand, String validInputCommand) * @throws InvalidTaskNumberException If the task number is out of the range of the number of tasks. * @throws WrongJarvisCommandFormatException If the command is correct but its formatted incorrectly. */ + @SuppressWarnings("checkstyle:RightCurly") public static void parseCommand(Storage storage, TaskList tasks, String userInput) throws IncorrectJarvisCommandException, InvalidTaskNumberException, WrongJarvisCommandFormatException { Pattern todoPattern = Pattern.compile("(todo) (.+)"); @@ -156,11 +163,11 @@ public static void parseCommand(Storage storage, TaskList tasks, String userInpu Ui.printBye(); System.exit(0); - } else if (userInput.matches("mark \\d+") || - userInput.matches("uncheck \\d+")) { // if "mark" or "uncheck" is entered + } else if (userInput.matches("mark \\d+") + || userInput.matches("uncheck \\d+")) { // if "mark" or "uncheck" is entered int taskNum = Integer.parseInt(userInput.substring(userInput.length() - 1)); - if (!tasks.isValidTaskNumber(taskNum)) {return;} + if (!tasks.isValidTaskNumber(taskNum)) { return; } Task currentTask = tasks.getTask(taskNum - 1); if (userInput.matches("uncheck \\d+")) { // if "uncheck" is entered @@ -172,9 +179,9 @@ public static void parseCommand(Storage storage, TaskList tasks, String userInpu Ui.printMark(currentTask); } - } else if (todoMatcher.matches() || - deadlineMatcher.matches() || - eventMatcher.matches()) { // if task command is entered + } else if (todoMatcher.matches() + || deadlineMatcher.matches() + || eventMatcher.matches()) { // if task command is entered Task newTask; if (todoMatcher.matches()) { // if "todo" is entered String taskDescription = todoMatcher.group(2); @@ -193,14 +200,14 @@ public static void parseCommand(Storage storage, TaskList tasks, String userInpu } tasks.appendTask(newTask); - Ui.printTask(tasks ,newTask); + Ui.printTask(tasks, newTask); } else if (deleteMatcher.matches()) { // if delete is entered int taskNum = Integer.parseInt(deleteMatcher.group(2)); if (tasks.isValidTaskNumber(taskNum)) { Task deletedTask = tasks.getTask(taskNum - 1); tasks.deleteTask(taskNum - 1); - Ui.printDelete(tasks ,deletedTask); + Ui.printDelete(tasks, deletedTask); } } else if (findMatcher.matches()) { // if find is entered diff --git a/src/main/java/Jarvis/Storage.java b/src/main/java/Jarvis/Storage.java index 23946d5c26..7fc6979b44 100644 --- a/src/main/java/Jarvis/Storage.java +++ b/src/main/java/Jarvis/Storage.java @@ -1,9 +1,9 @@ package Jarvis; +import java.io.BufferedReader; import java.io.File; -import java.io.FileWriter; import java.io.FileReader; -import java.io.BufferedReader; +import java.io.FileWriter; import java.io.IOException; public class Storage { diff --git a/src/main/java/Jarvis/TaskList.java b/src/main/java/Jarvis/TaskList.java index 2de07ff102..3acac4006e 100644 --- a/src/main/java/Jarvis/TaskList.java +++ b/src/main/java/Jarvis/TaskList.java @@ -19,7 +19,7 @@ public class TaskList { * @param tasks The string that holds the saved data. */ public TaskList(String tasks) { // tasks is a string - String[] stringTasks = tasks.split("\n"); + String[] stringTasks = tasks.split("\n"); Pattern todoPattern = Pattern.compile( "\\[T\\]\\[(X|\\s)\\] (.+)"); // [T][-] xxxx Pattern deadlinePattern = Pattern.compile( diff --git a/src/main/java/Jarvis/Ui.java b/src/main/java/Jarvis/Ui.java index 605dbc01b1..b1edf86d08 100644 --- a/src/main/java/Jarvis/Ui.java +++ b/src/main/java/Jarvis/Ui.java @@ -107,7 +107,7 @@ public static void printDelete(TaskList tasks, Task currentTask) { public static void printTaskList(TaskList tasks) { System.out.println(line); System.out.println(listInforming); - for (int i = 0; i < tasks.countTask() ; i++) { // listing out the current task + for (int i = 0; i < tasks.countTask(); i++) { // listing out the current task int count = i + 1; Task currentTask = tasks.getTask(i); System.out.println(count + "." + currentTask.toString()); @@ -118,7 +118,7 @@ public static void printTaskList(TaskList tasks) { public static void printFoundTask(ArrayList foundTasks) { System.out.println(line); System.out.println(findInforming); - for (int i = 0; i < foundTasks.size() ; i++) { // listing out the current task + for (int i = 0; i < foundTasks.size(); i++) { // listing out the current task int count = i + 1; Task currentTask = foundTasks.get(i); System.out.println(count + "." + currentTask.toString()); From 3e4610cdc2b56bcb30dfe67cb36991147b9b3867 Mon Sep 17 00:00:00 2001 From: Ting Yong Shen Amos Date: Thu, 7 Sep 2023 16:11:48 +0800 Subject: [PATCH 27/37] Add Level-10. GUI. Added DialogBox, Launcher, Main and MainWindow classes to support javaFx. Edited Jarvis, Parser, TaskList and Ui classes to support javaFx. --- build.gradle | 15 +++ src/main/java/DialogBox.java | 59 +++++++++++ src/main/java/Jarvis/Jarvis.java | 49 +++------ src/main/java/Jarvis/Parser.java | 54 +++++----- src/main/java/Jarvis/TaskList.java | 4 - src/main/java/Jarvis/Ui.java | 121 +++++++++-------------- src/main/java/Launcher.java | 10 ++ src/main/java/Main.java | 27 +++++ src/main/java/MainWindow.java | 50 ++++++++++ src/main/resources/images/jarvis.jpeg | Bin 0 -> 90162 bytes src/main/resources/images/tony_stark.jpg | Bin 0 -> 163722 bytes src/main/resources/view/DialogBox.fxml | 16 +++ src/main/resources/view/MainWindow.fxml | 19 ++++ 13 files changed, 278 insertions(+), 146 deletions(-) create mode 100644 src/main/java/DialogBox.java create mode 100644 src/main/java/Launcher.java create mode 100644 src/main/java/Main.java create mode 100644 src/main/java/MainWindow.java create mode 100644 src/main/resources/images/jarvis.jpeg create mode 100644 src/main/resources/images/tony_stark.jpg create mode 100644 src/main/resources/view/DialogBox.fxml create mode 100644 src/main/resources/view/MainWindow.fxml diff --git a/build.gradle b/build.gradle index 94f8951566..f747096e81 100644 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,21 @@ repositories { dependencies { testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.10.0' testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.10.0' + + String javaFxVersion = '17.0.7' + + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-controls', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-fxml', version: javaFxVersion, classifier: 'linux' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'win' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'mac' + implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'linux' } test { diff --git a/src/main/java/DialogBox.java b/src/main/java/DialogBox.java new file mode 100644 index 0000000000..f578c16b2c --- /dev/null +++ b/src/main/java/DialogBox.java @@ -0,0 +1,59 @@ +import java.io.IOException; +import java.util.Collections; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; + +/** + * An example of a custom control using FXML. + * This control represents a dialog box consisting of an ImageView to represent the speaker's face and a label + * containing text from the speaker. + */ +public class DialogBox extends HBox { + @FXML + private Label dialog; + @FXML + private ImageView displayPicture; + + private DialogBox(String text, Image img) { + try { + FXMLLoader fxmlLoader = new FXMLLoader(MainWindow.class.getResource("/view/DialogBox.fxml")); + fxmlLoader.setController(this); + fxmlLoader.setRoot(this); + fxmlLoader.load(); + } catch (IOException e) { + e.printStackTrace(); + } + + dialog.setText(text); + displayPicture.setImage(img); + } + + /** + * Flips the dialog box such that the ImageView is on the left and text on the right. + */ + private void flip() { + ObservableList tmp = FXCollections.observableArrayList(this.getChildren()); + Collections.reverse(tmp); + getChildren().setAll(tmp); + setAlignment(Pos.TOP_LEFT); + } + + public static DialogBox getUserDialog(String text, Image img) { + return new DialogBox(text, img); + } + + public static DialogBox getDukeDialog(String text, Image img) { + var db = new DialogBox(text, img); + db.flip(); + return db; + } +} diff --git a/src/main/java/Jarvis/Jarvis.java b/src/main/java/Jarvis/Jarvis.java index c700365739..51c269d570 100644 --- a/src/main/java/Jarvis/Jarvis.java +++ b/src/main/java/Jarvis/Jarvis.java @@ -17,7 +17,6 @@ public class Jarvis { private static TaskList tasks; private static Storage storage; private static Parser parser; - private static String fileName; /** * Constructs a new Jarvis chatbot. @@ -25,20 +24,6 @@ public class Jarvis { * @param fileName Name of the file to store the task data in. */ public Jarvis(String fileName) { - this.fileName = fileName; - } - - /** - * The main event loop of the Jarvis chatbot. - *

- * The method keeps listening for user input until the user chooses to exit the application. - * All recognised commands are parsed and executed through the Parser class - * Existing data is loaded from the Storage class into an instance of the TaskList class, - * when the user chooses to exit the application, the data from the chatbot is saved through Storage class. - *

- */ - public void run() { - Ui.printGreeting(); // getting the file path to the save file String home = System.getProperty("user.home"); Path pathToSaveFile = Paths.get(home, "Desktop", "CS2103T", "IP", "data", fileName); @@ -47,30 +32,18 @@ public void run() { storage = new Storage(pathToSaveFile.toString()); tasks = new TaskList(storage.load()); parser = new Parser(); - Scanner scanner = new Scanner(System.in); - while (true) { - try { - String command = scanner.nextLine().trim(); - Parser.parseCommand(storage, tasks, command); - } catch (IncorrectJarvisCommandException e) { - break; - } catch (InvalidTaskNumberException e) { - break; - } catch (WrongJarvisCommandFormatException e) { - break; - } - storage.deleteContents(); - storage.save(tasks); // save task list to data file after every iteration - } - scanner.close(); // closing the user input scanner } - /** - * The main entry point of the application - * - * @param args command-line arguments - */ - public static void main(String[] args) { - new Jarvis("data.txt").run(); + public String getResponse(String input) { + try { + return Parser.parseCommand(storage, tasks, input); + } catch (IncorrectJarvisCommandException e) { + return Ui.getListOfCommands(Parser.validCommands, e); + } catch (InvalidTaskNumberException e) { + return Ui.respond(e.getMessage() + "\n" + + " There are currently " + tasks.countTask() + " tasks in the list."); + } catch (WrongJarvisCommandFormatException e) { + return Ui.respond(""); + } } } \ No newline at end of file diff --git a/src/main/java/Jarvis/Parser.java b/src/main/java/Jarvis/Parser.java index a4d515e9db..574a953ca2 100644 --- a/src/main/java/Jarvis/Parser.java +++ b/src/main/java/Jarvis/Parser.java @@ -13,7 +13,7 @@ *

*/ public class Parser { - private static ArrayList validCommands; // list of valid commands + protected static ArrayList validCommands; // list of valid commands /** * Constructs a new Parser object. @@ -62,7 +62,7 @@ private static String isValidCommand(String inputCommand) { throw new IncorrectJarvisCommandException( "Apologies Sir, the command " + inputCommand + " is not a valid command."); } catch (IncorrectJarvisCommandException e) { - Ui.printListOfCommands(validCommands, inputCommand, e); + } } return validInputCommand; @@ -78,11 +78,7 @@ private static String isValidCommand(String inputCommand) { * @param validInputCommand the valid command which the user inputted */ // identifies which command has wrong formatting and prints feedback to user - public static void isWrongFormat(String inputCommand, String validInputCommand) { - if (validInputCommand.equals("")) { // if input is empty - return; - } - + public static String isWrongFormat(String inputCommand, String validInputCommand) { // since command is valid, check if formatting of the command is correct boolean markMatch = inputCommand.matches("mark \\d+"); boolean uncheckMatch = inputCommand.matches("unmark \\d+"); @@ -95,38 +91,37 @@ public static void isWrongFormat(String inputCommand, String validInputCommand) throw new WrongJarvisCommandFormatException( "Apologies Sir, the format of the mark command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { - Ui.printWrongFormat("mark", e); + return Ui.getWrongFormatMessage("mark", e); } } else if (validInputCommand.equals("uncheck") && !uncheckMatch) { // if uncheck command but wrong format try { throw new WrongJarvisCommandFormatException( "Apologies Sir, the format of the uncheck command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { - Ui.printWrongFormat("uncheck", e); + return Ui.getWrongFormatMessage("uncheck", e); } } else if (validInputCommand.equals("todo") && !todoMatch) { // if todo command but wrong format try { throw new WrongJarvisCommandFormatException( "Apologies Sir, the format of the todo command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { - Ui.printWrongFormat("todo", e); + return Ui.getWrongFormatMessage("todo", e); } } else if (validInputCommand.equals("deadline") && !deadlineMatch) { // if deadline command but wrong format try { throw new WrongJarvisCommandFormatException( "Apologies Sir, the format of the deadline command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { - Ui.printWrongFormat("deadline", e); + return Ui.getWrongFormatMessage("deadline", e); } - } else if (validInputCommand.equals("event") && !eventMatch) { // if event command but wrong format + } else { // if event command but wrong format try { throw new WrongJarvisCommandFormatException( "Apologies Sir, the format of the event command you provided is incorrect."); } catch (WrongJarvisCommandFormatException e) { - Ui.printWrongFormat("event", e); + return Ui.getWrongFormatMessage("event", e); } } - } /** @@ -139,9 +134,9 @@ public static void isWrongFormat(String inputCommand, String validInputCommand) * @throws InvalidTaskNumberException If the task number is out of the range of the number of tasks. * @throws WrongJarvisCommandFormatException If the command is correct but its formatted incorrectly. */ - @SuppressWarnings("checkstyle:RightCurly") - public static void parseCommand(Storage storage, TaskList tasks, String userInput) throws + public static String parseCommand(Storage storage, TaskList tasks, String userInput) throws IncorrectJarvisCommandException, InvalidTaskNumberException, WrongJarvisCommandFormatException { + Pattern todoPattern = Pattern.compile("(todo) (.+)"); Pattern deadlinePattern = Pattern.compile("(deadline) (.+) /by (.+)"); Pattern eventPattern = Pattern.compile("(event) (.+) /from (.+) /to (.+)"); @@ -157,26 +152,29 @@ public static void parseCommand(Storage storage, TaskList tasks, String userInpu String nameOfValidCommand = isValidCommand(userInput); if (userInput.matches("list")) { // if "list" is entered - Ui.printTaskList(tasks); + return Ui.getTaskList(tasks); } else if (userInput.matches("bye")) { // if "bye" is entered - Ui.printBye(); - System.exit(0); + storage.deleteContents(); + storage.save(tasks); // save task list to data file after bye is entered + return Ui.getByeMessage(); } else if (userInput.matches("mark \\d+") || userInput.matches("uncheck \\d+")) { // if "mark" or "uncheck" is entered int taskNum = Integer.parseInt(userInput.substring(userInput.length() - 1)); - if (!tasks.isValidTaskNumber(taskNum)) { return; } + if (!tasks.isValidTaskNumber(taskNum)) { + return null; + } Task currentTask = tasks.getTask(taskNum - 1); if (userInput.matches("uncheck \\d+")) { // if "uncheck" is entered currentTask.setDone(false); - Ui.printUncheck(currentTask); + return Ui.getUncheckMessage(currentTask); } else { // if "mark" is entered currentTask.setDone(true); - Ui.printMark(currentTask); + return Ui.getMarkMessage(currentTask); } } else if (todoMatcher.matches() @@ -200,23 +198,23 @@ public static void parseCommand(Storage storage, TaskList tasks, String userInpu } tasks.appendTask(newTask); - Ui.printTask(tasks, newTask); + return Ui.getTaskMessage(tasks, newTask); } else if (deleteMatcher.matches()) { // if delete is entered int taskNum = Integer.parseInt(deleteMatcher.group(2)); if (tasks.isValidTaskNumber(taskNum)) { Task deletedTask = tasks.getTask(taskNum - 1); tasks.deleteTask(taskNum - 1); - Ui.printDelete(tasks, deletedTask); + return Ui.getDeleteMessage(tasks, deletedTask); } } else if (findMatcher.matches()) { // if find is entered String keyword = findMatcher.group(2); - Ui.printFoundTask(tasks.findTask(keyword)); - } + return Ui.getFoundTaskMessage(tasks.findTask(keyword)); - else { // if none of the above commands go through - isWrongFormat(userInput, nameOfValidCommand); + } else { // if none of the above commands go through + return isWrongFormat(userInput, nameOfValidCommand); } + return null; } } diff --git a/src/main/java/Jarvis/TaskList.java b/src/main/java/Jarvis/TaskList.java index 3acac4006e..7bccac10df 100644 --- a/src/main/java/Jarvis/TaskList.java +++ b/src/main/java/Jarvis/TaskList.java @@ -83,10 +83,6 @@ public boolean isValidTaskNumber(int taskNum) { try { throw new InvalidTaskNumberException("Apologies Sir, the task number you provided is out of range."); } catch (InvalidTaskNumberException e) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" There are currently " + this.taskList.size() + " tasks in the list."); - System.out.println(line); isValid = false; } } diff --git a/src/main/java/Jarvis/Ui.java b/src/main/java/Jarvis/Ui.java index b1edf86d08..86085bfcd8 100644 --- a/src/main/java/Jarvis/Ui.java +++ b/src/main/java/Jarvis/Ui.java @@ -15,115 +15,84 @@ public class Ui { private static final String deleteInforming = "Alright Sir, I've removed this task"; private static final String findInforming = "Here are the matching tasks in your list Sir:"; - public static void printGreeting() { - System.out.println(line); - System.out.println(greeting + name + "!"); - System.out.println(question); - System.out.println(line); + public static String printGreeting() { + return greeting + name + "!" + "\n" + question; } - public static void printBye() { - System.out.println(line); - System.out.println(signOff); - System.out.println(line); + public static String getByeMessage() { + return signOff; } - public static void printMark(Task currentTask) { - System.out.println(line); - System.out.println(markInforming); - System.out.println(currentTask.toString()); - System.out.println(line); + public static String getMarkMessage(Task currentTask) { + return markInforming + "\n" + currentTask.toString(); } - public static void printUncheck(Task currentTask) { - System.out.println(line); - System.out.println(uncheckInforming); - System.out.println(currentTask.toString()); - System.out.println(line); + public static String getUncheckMessage(Task currentTask) { + return uncheckInforming + "\n" + currentTask.toString(); } - public static void printListOfCommands(ArrayList validCommands, String inputCommand, Exception e) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" This is the list of valid commands:"); - for (int i = 0; i < validCommands.size(); i++) { + public static String getListOfCommands(ArrayList validCommands, Exception e) { + String returnString = e.getMessage() + "\n"; + for (int i = 0; i < validCommands.size(); i++) { // listing out the current task int numbering = i + 1; - System.out.println(" " + numbering + ". " + validCommands.get(i)); + returnString = returnString + " " + numbering + ". " + validCommands.get(i) + "\n"; } - System.out.println(line); + return returnString; } - public static void printWrongFormat(String command, Exception e) { + public static String getWrongFormatMessage(String command, Exception e) { if (command.equals("mark")) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" The following is the correct format:"); - System.out.println(" mark "); - System.out.println(line); + return e.getMessage() + "\n" + + " The following is the correct format:" + "\n" + + " mark "; } else if (command.equals("uncheck")) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" The following is the correct format:"); - System.out.println(" uncheck "); - System.out.println(line); + return e.getMessage() + "\n" + + " The following is the correct format:" + "\n" + + " uncheck "; } else if (command.equals("todo")) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" The following is the correct format:"); - System.out.println(" todo "); - System.out.println(line); + return e.getMessage() + "\n" + + " The following is the correct format:" + "\n" + + " todo "; } else if (command.equals("deadline")) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" The following is the correct format:"); - System.out.println(" deadline /by "); - System.out.println(line); - } else if (command.equals("event")) { - System.out.println(line); - System.out.println(e.getMessage()); - System.out.println(" The following is the correct format:"); - System.out.println(" event /from /to "); - System.out.println(line); + return e.getMessage() + "\n" + + " The following is the correct format:" + "\n" + + " deadline /by "; + } else { + return e.getMessage() + "\n" + + " The following is the correct format:" + "\n" + + " event /from /to "; } - } - public static void printTask(TaskList tasks, Task currentTask) { - System.out.println(line); - System.out.println(taskInforming); - System.out.println(currentTask.toString()); - System.out.println("You have now " + tasks.countTask() + " tasks in the list Sir."); - System.out.println(line); + public static String getTaskMessage(TaskList tasks, Task currentTask) { + return taskInforming + "\n" + "You have now " + tasks.countTask() + " tasks in the list Sir."; } - public static void printDelete(TaskList tasks, Task currentTask) { - System.out.println(line); - System.out.println(deleteInforming); - System.out.println(currentTask.toString()); - System.out.println("You have now " + tasks.countTask() + " tasks in the list Sir."); - System.out.println(line); + public static String getDeleteMessage(TaskList tasks, Task currentTask) { + return deleteInforming + "\n" + "You have now " + tasks.countTask() + " tasks in the list Sir."; } - public static void printTaskList(TaskList tasks) { - System.out.println(line); - System.out.println(listInforming); + public static String getTaskList(TaskList tasks) { + String returnString = listInforming + "\n"; for (int i = 0; i < tasks.countTask(); i++) { // listing out the current task int count = i + 1; Task currentTask = tasks.getTask(i); - System.out.println(count + "." + currentTask.toString()); + returnString = returnString + count + "." + currentTask.toString() + "\n"; } - System.out.println(line); + return returnString; } - public static void printFoundTask(ArrayList foundTasks) { - System.out.println(line); - System.out.println(findInforming); + public static String getFoundTaskMessage(ArrayList foundTasks) { + String returnString = findInforming + "\n"; for (int i = 0; i < foundTasks.size(); i++) { // listing out the current task int count = i + 1; Task currentTask = foundTasks.get(i); - System.out.println(count + "." + currentTask.toString()); + returnString = returnString + count + "." + currentTask.toString() + "\n"; } - System.out.println(line); + return returnString; } + public static String respond(String message) { + return message; + } } diff --git a/src/main/java/Launcher.java b/src/main/java/Launcher.java new file mode 100644 index 0000000000..43d64c26fb --- /dev/null +++ b/src/main/java/Launcher.java @@ -0,0 +1,10 @@ +import javafx.application.Application; + +/** + * A launcher class to workaround classpath issues. + */ +public class Launcher { + public static void main(String[] args) { + Application.launch(Main.class, args); + } +} diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 0000000000..0478d82fdb --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,27 @@ +import java.io.IOException; + +import Jarvis.Jarvis; +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.layout.AnchorPane; +import javafx.stage.Stage; + + +public class Main extends Application { + private Jarvis jarvis = new Jarvis("data.txt"); + + @Override + public void start(Stage stage) { + try { + FXMLLoader fxmlLoader = new FXMLLoader(Main.class.getResource("/view/MainWindow.fxml")); + AnchorPane ap = fxmlLoader.load(); + Scene scene = new Scene(ap); + stage.setScene(scene); + fxmlLoader.getController().setJarvis(jarvis); + stage.show(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/MainWindow.java b/src/main/java/MainWindow.java new file mode 100644 index 0000000000..acf5f1592f --- /dev/null +++ b/src/main/java/MainWindow.java @@ -0,0 +1,50 @@ +import Jarvis.Jarvis; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.VBox; +/** + * Controller for MainWindow. Provides the layout for the other controls. + */ +public class MainWindow extends AnchorPane { + @FXML + private ScrollPane scrollPane; + @FXML + private VBox dialogContainer; + @FXML + private TextField userInput; + @FXML + private Button sendButton; + + private Jarvis jarvis; + + private Image userImage = new Image(this.getClass().getResourceAsStream("/images/tony_stark.jpg")); + private Image dukeImage = new Image(this.getClass().getResourceAsStream("/images/jarvis.jpeg")); + + @FXML + public void initialize() { + scrollPane.vvalueProperty().bind(dialogContainer.heightProperty()); + } + + public void setJarvis(Jarvis jarvis) { + this.jarvis = jarvis; + } + + /** + * Creates two dialog boxes, one echoing user input and the other containing Duke's reply and then appends them to + * the dialog container. Clears the user input after processing. + */ + @FXML + private void handleUserInput() { + String input = userInput.getText(); + String response = this.jarvis.getResponse(input); + dialogContainer.getChildren().addAll( + DialogBox.getUserDialog(input, userImage), + DialogBox.getDukeDialog(response, dukeImage) + ); + userInput.clear(); + } +} diff --git a/src/main/resources/images/jarvis.jpeg b/src/main/resources/images/jarvis.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..3f247c0164b088230943b9f134ac5b44da923fc5 GIT binary patch literal 90162 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 s8sD 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 imo#k~V>mR5i4zL^s literal 0 HcmV?d00001 diff --git a/src/main/resources/images/tony_stark.jpg b/src/main/resources/images/tony_stark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41c1d55c43baef2fed217096e07f238a94245e51 GIT binary patch literal 163722 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%0ATUgJ*vKw0_l-Fkvj)n>K`~DdVV$Eh{w8= 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

$v-=*ek;$p>+|Uo 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/view/DialogBox.fxml b/src/main/resources/view/DialogBox.fxml new file mode 100644 index 0000000000..d3e6e9db86 --- /dev/null +++ b/src/main/resources/view/DialogBox.fxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml new file mode 100644 index 0000000000..0d636bce2e --- /dev/null +++ b/src/main/resources/view/MainWindow.fxml @@ -0,0 +1,19 @@ + + + + + + + + + + + +