From ddc638ca57616ce45c6ee8082a786e936a389d04 Mon Sep 17 00:00:00 2001 From: Peter Kurfer <peter.kurfer@fh-rosenheim.de> Date: Mon, 18 Dec 2017 10:34:55 +0100 Subject: [PATCH] Completed first draft of code spec --- .gitignore | 40 ++++ build.gradle | 40 ++++ gradle.properties | 5 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 ++++++++++++++++++ gradlew.bat | 84 +++++++++ settings.gradle | 18 ++ src/main/java/de/fhro/inf/prg3/a11/App.java | 130 +++++++++++++ .../de/fhro/inf/prg3/a11/MenuSelection.java | 13 ++ .../inf/prg3/a11/openmensa/OpenMensaAPI.java | 54 ++++++ .../a11/openmensa/OpenMensaAPIService.java | 37 ++++ .../inf/prg3/a11/openmensa/model/Canteen.java | 90 +++++++++ .../inf/prg3/a11/openmensa/model/Meal.java | 86 +++++++++ .../prg3/a11/openmensa/model/PageInfo.java | 87 +++++++++ .../inf/prg3/a11/openmensa/model/State.java | 66 +++++++ .../inf/prg3/a11/tests/OpenMensaApiTests.java | 84 +++++++++ 17 files changed, 1011 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle.properties 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 create mode 100644 settings.gradle create mode 100644 src/main/java/de/fhro/inf/prg3/a11/App.java create mode 100644 src/main/java/de/fhro/inf/prg3/a11/MenuSelection.java create mode 100644 src/main/java/de/fhro/inf/prg3/a11/openmensa/OpenMensaAPI.java create mode 100644 src/main/java/de/fhro/inf/prg3/a11/openmensa/OpenMensaAPIService.java create mode 100644 src/main/java/de/fhro/inf/prg3/a11/openmensa/model/Canteen.java create mode 100644 src/main/java/de/fhro/inf/prg3/a11/openmensa/model/Meal.java create mode 100644 src/main/java/de/fhro/inf/prg3/a11/openmensa/model/PageInfo.java create mode 100644 src/main/java/de/fhro/inf/prg3/a11/openmensa/model/State.java create mode 100644 src/test/java/de/fhro/inf/prg3/a11/tests/OpenMensaApiTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6c234cd --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +# Created by .ignore support plugin (hsz.mobi) +### Gradle template +.gradle +/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Cache of project +.gradletasknamecache + +# User-specific stuff: +**/.idea/ + +# CMake +cmake-build-debug/ + +## File-based project format: +*.iws +*.iml + +## Plugin-specific files: + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..265d280 --- /dev/null +++ b/build.gradle @@ -0,0 +1,40 @@ +buildscript { + repositories { + jcenter() + } + + dependencies { + classpath 'com.github.ben-manes:gradle-versions-plugin:0.17.0' + } +} + +// Apply the java plugin to add support for Java +apply plugin: 'java' + +// Apply the application plugin to add support for building an application +apply plugin: 'application' + +apply plugin: 'com.github.ben-manes.versions' + +repositories { + jcenter() +} + +// Define the main class for the application +mainClassName = 'App' + +dependencies { + /* Commons Lang3 */ + implementation "org.apache.commons:commons-lang3:$commons_lang_version" + + /* Retrofit */ + implementation "com.squareup.retrofit2:retrofit:$retrofit2_version" + implementation "com.squareup.retrofit2:converter-gson:$retrofit2_version" + + /* JUnit 5 */ + testImplementation("org.junit.jupiter:junit-jupiter-api:${junitJupiterVersion}") + testRuntime("org.junit.jupiter:junit-jupiter-engine:${junitJupiterVersion}") + testRuntime("org.junit.platform:junit-platform-launcher:${junitPlatformVersion}") + testRuntime("org.apache.logging.log4j:log4j-core:${log4jVersion}") + testRuntime("org.apache.logging.log4j:log4j-jul:${log4jVersion}") +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..0f59cd8 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,5 @@ +commons_lang_version=3.7 +retrofit2_version=2.3.0 +junitPlatformVersion = 1.1.0-M1 +junitJupiterVersion = 5.1.0-M1 +log4jVersion = 2.10.0 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..01b8bf6b1f99cad9213fc495b33ad5bbab8efd20 GIT binary patch literal 54329 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%0A;te<=4=4U^A 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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 0000000..933b647 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-bin.zip diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..cccdd3d --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## 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="" + +# 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, switch paths to Windows format before running java +if $cygwin ; 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=$((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" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@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 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= + +@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/settings.gradle b/settings.gradle new file mode 100644 index 0000000..17d6647 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/4.4/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = '11-futures-cli' diff --git a/src/main/java/de/fhro/inf/prg3/a11/App.java b/src/main/java/de/fhro/inf/prg3/a11/App.java new file mode 100644 index 0000000..aa61eb1 --- /dev/null +++ b/src/main/java/de/fhro/inf/prg3/a11/App.java @@ -0,0 +1,130 @@ +package de.fhro.inf.prg3.a11; + +import de.fhro.inf.prg3.a11.openmensa.OpenMensaAPI; +import de.fhro.inf.prg3.a11.openmensa.OpenMensaAPIService; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.Locale; +import java.util.Scanner; +import java.util.stream.IntStream; + +/** + * @author Peter Kurfer + * Created on 12/16/17. + */ +public class App { + private static final String OPEN_MENSA_DATE_FORMAT = "yyyy-MM-dd"; + + private static final SimpleDateFormat dateFormat = new SimpleDateFormat(OPEN_MENSA_DATE_FORMAT, Locale.getDefault()); + private static final Scanner inputScanner = new Scanner(System.in); + private static final OpenMensaAPI openMensaAPI = OpenMensaAPIService.getInstance().getOpenMensaAPI(); + private static final Calendar currentDate = Calendar.getInstance(); + private static int currentCanteenId = -1; + + public static void main(String[] args) throws ParseException { + MenuSelection selection; + /* loop while true to get back to the menu every time an action was performed */ + do { + selection = menu(); + switch (selection) { + case SHOW_CANTEENS: + printCanteens(); + break; + case SET_CANTEEN: + readCanteen(); + break; + case SHOW_MEALS: + printMeals(); + break; + case SET_DATE: + readDate(); + break; + case QUIT: + System.exit(0); + + } + } while (true); + } + + private static void printCanteens() { + System.out.print("Fetching canteens ["); + /* TODO fetch all canteens and print them to STDOUT + * at first get a page without an index to be able to extract the required pagination information + * afterwards you can iterate the remaining pages + * keep in mind that you should await the process as the user has to select canteen with a specific id */ + } + + private static void printMeals() { + /* TODO fetch all meals for the currently selected canteen + * to avoid errors retrieve at first the state of the canteen and check if the canteen is opened at the selected day + * don't forget to check if a canteen was selected previously! */ + } + + /** + * Utility method to select a canteen + */ + private static void readCanteen() { + /* typical input reading pattern */ + boolean readCanteenId = false; + do { + try { + System.out.println("Enter canteen id:"); + currentCanteenId = inputScanner.nextInt(); + readCanteenId = true; + }catch (Exception e) { + System.out.println("Sorry could not read the canteen id"); + } + }while (!readCanteenId); + } + + /** + * Utility method to read a date and update the calendar + */ + private static void readDate() { + /* typical input reading pattern */ + boolean readDate = false; + do { + try { + System.out.println("Pleae enter date in the format yyyy-mm-dd:"); + Date d = dateFormat.parse(inputScanner.next()); + currentDate.setTime(d); + readDate = true; + }catch (ParseException p) { + System.out.println("Sorry, the entered date could not be parsed."); + } + }while (!readDate); + + } + + /** + * Utility method to print menu and read the user selection + * @return user selection as MenuSelection + */ + private static MenuSelection menu() { + IntStream.range(0, 20).forEach(i -> System.out.print("#")); + System.out.println(); + System.out.println("1) Show canteens"); + System.out.println("2) Set canteen"); + System.out.println("3) Show meals"); + System.out.println("4) Set date"); + System.out.println("5) Quit"); + IntStream.range(0, 20).forEach(i -> System.out.print("#")); + System.out.println(); + + switch (inputScanner.nextInt()) { + case 1: + return MenuSelection.SHOW_CANTEENS; + case 2: + return MenuSelection.SET_CANTEEN; + case 3: + return MenuSelection.SHOW_MEALS; + case 4: + return MenuSelection.SET_DATE; + default: + return MenuSelection.QUIT; + } + } +} diff --git a/src/main/java/de/fhro/inf/prg3/a11/MenuSelection.java b/src/main/java/de/fhro/inf/prg3/a11/MenuSelection.java new file mode 100644 index 0000000..5d73375 --- /dev/null +++ b/src/main/java/de/fhro/inf/prg3/a11/MenuSelection.java @@ -0,0 +1,13 @@ +package de.fhro.inf.prg3.a11; + +/** + * @author Peter Kurfer + * Created on 12/18/17. + */ +public enum MenuSelection { + SHOW_CANTEENS, + SET_CANTEEN, + SHOW_MEALS, + SET_DATE, + QUIT +} diff --git a/src/main/java/de/fhro/inf/prg3/a11/openmensa/OpenMensaAPI.java b/src/main/java/de/fhro/inf/prg3/a11/openmensa/OpenMensaAPI.java new file mode 100644 index 0000000..bcd2040 --- /dev/null +++ b/src/main/java/de/fhro/inf/prg3/a11/openmensa/OpenMensaAPI.java @@ -0,0 +1,54 @@ +package de.fhro.inf.prg3.a11.openmensa; + +import de.fhro.inf.prg3.a11.openmensa.model.Canteen; +import de.fhro.inf.prg3.a11.openmensa.model.Meal; +import de.fhro.inf.prg3.a11.openmensa.model.State; +import retrofit2.Response; +import retrofit2.http.GET; +import retrofit2.http.Path; +import retrofit2.http.Query; + +import java.util.List; +import java.util.concurrent.CompletableFuture; + +/** + * @author Peter Kurfer + */ +public interface OpenMensaAPI { + + /** + * Retrieve the first page of all canteens + * includes the response wrapper to be able to extract required headers for further pagination handling + * @return first page of canteens wrapped in a response object + */ + @GET("canteens") + CompletableFuture<Response<List<Canteen>>> getCanteens(); + + /** + * Retrieve any page of all canteens + * does not include the response wrapper because the required information should be retrieved before this method is used + * @param pageNumber index of the page to retrieve + * @return List of canteens as async future + */ + @GET("canteens") + CompletableFuture<List<Canteen>> getCanteens(@Query("page")int pageNumber); + + /** + * Get the state of a canteen specified by its id at the specified date + * @param canteenId id of the canteen + * @param date date for which the state should be looked up + * @return state of the mensa - may be closed or !closed + */ + @GET("canteens/{canteenId}/days/{date}") + CompletableFuture<State> getMensaState(@Path("canteenId") int canteenId, @Path("date") String date); + + /** + * Retrieve the meals for specified date served at canteen specified by its id + * @param canteenId id of the canteen + * @param date date for which the meals should be retrieved + * @return List of meals wrapped as async future + */ + @GET("canteens/{canteenId}/days/{date}/meals") + CompletableFuture<List<Meal>> getMeals(@Path("canteenId") int canteenId, @Path("date") String date); + +} diff --git a/src/main/java/de/fhro/inf/prg3/a11/openmensa/OpenMensaAPIService.java b/src/main/java/de/fhro/inf/prg3/a11/openmensa/OpenMensaAPIService.java new file mode 100644 index 0000000..53e00b0 --- /dev/null +++ b/src/main/java/de/fhro/inf/prg3/a11/openmensa/OpenMensaAPIService.java @@ -0,0 +1,37 @@ +package de.fhro.inf.prg3.a11.openmensa; + +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +/** + * OpenMensaAPI service + * holds an instance of OpenMensaAPI to avoid multiple instantiations of the API + * @author Peter Kurfer + */ + +public final class OpenMensaAPIService { + + /* singleton instance */ + private static final OpenMensaAPIService ourInstance = new OpenMensaAPIService(); + private final OpenMensaAPI openMensaAPI; + + /* singleton accessor */ + public static OpenMensaAPIService getInstance() { + return ourInstance; + } + + private OpenMensaAPIService() { + + /* Initialize Retrofit */ + Retrofit retrofit = new Retrofit.Builder() + .baseUrl("http://openmensa.org/api/v2/") + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + openMensaAPI = retrofit.create(OpenMensaAPI.class); + } + + public OpenMensaAPI getOpenMensaAPI() { + return openMensaAPI; + } +} diff --git a/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/Canteen.java b/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/Canteen.java new file mode 100644 index 0000000..fa8a9be --- /dev/null +++ b/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/Canteen.java @@ -0,0 +1,90 @@ +package de.fhro.inf.prg3.a11.openmensa.model; + +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; + +/** + * Data transfer object for a canteen retrieved from the OpenMensaAPI + * @author Peter Kurfer + */ + +public final class Canteen { + private int id; + private String name; + private String city; + private String address; + private double[] coordinates; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public double[] getCoordinates() { + return coordinates; + } + + public void setCoordinates(double[] coordinates) { + this.coordinates = coordinates; + } + + @Override + public String toString() { + return String.format("%s\t%s", getId(), getName()); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (!(o instanceof Canteen)) return false; + + Canteen canteen = (Canteen) o; + + return new EqualsBuilder() + .append(getId(), canteen.getId()) + .append(getName(), canteen.getName()) + .append(getCity(), canteen.getCity()) + .append(getAddress(), canteen.getAddress()) + .append(getCoordinates(), canteen.getCoordinates()) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(getId()) + .append(getName()) + .append(getCity()) + .append(getAddress()) + .append(getCoordinates()) + .toHashCode(); + } +} diff --git a/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/Meal.java b/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/Meal.java new file mode 100644 index 0000000..b55511c --- /dev/null +++ b/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/Meal.java @@ -0,0 +1,86 @@ +package de.fhro.inf.prg3.a11.openmensa.model; + +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; + +import java.util.LinkedList; +import java.util.List; + +/** + * Data transfer object for a meal retrieved from the OpenMensaAPI + * @author Peter Kurfer + */ + +public final class Meal { + private int id; + private String name; + private String category; + private List<String> notes; + + public Meal() { + notes = new LinkedList<>(); + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public List<String> getNotes() { + return notes; + } + + public void setNotes(List<String> notes) { + this.notes = notes; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (!(o instanceof Meal)) return false; + + Meal meal = (Meal) o; + + return new EqualsBuilder() + .append(getId(), meal.getId()) + .append(getName(), meal.getName()) + .append(getCategory(), meal.getCategory()) + .append(getNotes(), meal.getNotes()) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(getId()) + .append(getName()) + .append(getCategory()) + .append(getNotes()) + .toHashCode(); + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/PageInfo.java b/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/PageInfo.java new file mode 100644 index 0000000..e85a6f1 --- /dev/null +++ b/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/PageInfo.java @@ -0,0 +1,87 @@ +package de.fhro.inf.prg3.a11.openmensa.model; + +import okhttp3.Headers; +import retrofit2.Response; + +import java.util.function.Function; + +/** + * Utility class to handle HTTP response header containing the pagination information + * required to fetch all pages of an entity + * + * @author Peter Kurfer + */ + +public final class PageInfo { + + private static final String TOTAL_PAGES_HEADER = "X-Total-Pages"; + private static final String TOTAL_ITEM_COUNT_HEADER = "X-Total-Count"; + private static final String ITEM_COUNT_PER_PAGE_HEADER = "X-Per-Page"; + private static final String CURRENT_PAGE_INDEX_HEADER = "X-Current-Page"; + + private final int totalCountOfPages; + private final int totalCountOfItems; + private final int itemCountPerPage; + private final int currentPageIndex; + + /** + * Default constructor + * only used by 'factory method' `extractFromReponse(...)` + */ + private PageInfo(int totalCountOfPages, int totalCountOfItems, int itemCountPerPage, int currentPageIndex) { + this.totalCountOfPages = totalCountOfPages; + this.totalCountOfItems = totalCountOfItems; + this.itemCountPerPage = itemCountPerPage; + this.currentPageIndex = currentPageIndex; + } + + /** + * @return total count of pages or -1 if required header was not present + */ + public int getTotalCountOfPages() { + return totalCountOfPages; + } + + /** + * @return total item count or -1 if required header was not present + */ + public int getTotalCountOfItems() { + return totalCountOfItems; + } + + /** + * @return item count on every page or -1 if required header was not present + */ + public int getItemCountPerPage() { + return itemCountPerPage; + } + + /** + * @return current page index or -1 if required header was not present + */ + public int getCurrentPageIndex() { + return currentPageIndex; + } + + /** + * Factory method to create a PageInfo by parsing the headers of a response which includes the required information + * + * @param apiResponse response object to parse + * @param <T> concrete response type + * @return PageInfo instance - may contain default fallback values see getters + */ + public static <T extends Response<?>> PageInfo extractFromResponse(T apiResponse) { + Headers headers = apiResponse.headers(); + int totalPages = extractFromHeaders(headers, TOTAL_PAGES_HEADER, -1); + int totalItemCount = extractFromHeaders(headers, TOTAL_ITEM_COUNT_HEADER, -1); + int itemCountPerPage = extractFromHeaders(headers, ITEM_COUNT_PER_PAGE_HEADER, -1); + int currentPageIndex = extractFromHeaders(headers, CURRENT_PAGE_INDEX_HEADER, -1); + + return new PageInfo(totalPages, totalItemCount, itemCountPerPage, currentPageIndex); + } + + private static int extractFromHeaders(Headers headers, String headerName, int fallback) { + String headerValue = headers.get(headerName); + return headerValue == null ? fallback : Integer.parseInt(headerValue); + } +} diff --git a/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/State.java b/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/State.java new file mode 100644 index 0000000..352a84b --- /dev/null +++ b/src/main/java/de/fhro/inf/prg3/a11/openmensa/model/State.java @@ -0,0 +1,66 @@ +package de.fhro.inf.prg3.a11.openmensa.model; + +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.apache.commons.lang3.builder.HashCodeBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; + +/** + * Data transfer object for a state of a canteen retrieved from the OpenMensaAPI + * @author Peter Kurfer + */ + +public final class State { + + private String date; + private boolean closed = true; + + public State() { + date = ""; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public boolean isClosed() { + return closed; + } + + public void setClosed(boolean closed) { + this.closed = closed; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + + if (!(o instanceof State)) return false; + + State state = (State) o; + + return new EqualsBuilder() + .append(isClosed(), state.isClosed()) + .append(getDate(), state.getDate()) + .isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder(17, 37) + .append(getDate()) + .append(isClosed()) + .toHashCode(); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("date", date) + .append("closed", closed) + .toString(); + } +} diff --git a/src/test/java/de/fhro/inf/prg3/a11/tests/OpenMensaApiTests.java b/src/test/java/de/fhro/inf/prg3/a11/tests/OpenMensaApiTests.java new file mode 100644 index 0000000..4ad44f2 --- /dev/null +++ b/src/test/java/de/fhro/inf/prg3/a11/tests/OpenMensaApiTests.java @@ -0,0 +1,84 @@ +package de.fhro.inf.prg3.a11.tests; + +import de.fhro.inf.prg3.a11.openmensa.OpenMensaAPI; +import de.fhro.inf.prg3.a11.openmensa.OpenMensaAPIService; +import de.fhro.inf.prg3.a11.openmensa.model.Canteen; +import de.fhro.inf.prg3.a11.openmensa.model.PageInfo; +import de.fhro.inf.prg3.a11.openmensa.model.State; +import org.junit.jupiter.api.Test; +import retrofit2.Response; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.ExecutionException; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * @author Peter Kurfer + */ + +class OpenMensaApiTests { + + private static final int FHRO_MENSA_ID = 229; + private static final String OPEN_MENSA_DATE_FORMAT = "yyyy-MM-dd"; + private final SimpleDateFormat dateFormat; + private final OpenMensaAPI openMensaAPI; + private final Calendar calendar; + + OpenMensaApiTests() { + dateFormat = new SimpleDateFormat(OPEN_MENSA_DATE_FORMAT, Locale.getDefault()); + openMensaAPI = OpenMensaAPIService.getInstance().getOpenMensaAPI(); + calendar = Calendar.getInstance(); + } + + @Test + void testGetFirstMensaPage() throws ExecutionException, InterruptedException { + Response<List<Canteen>> canteensResponse = openMensaAPI.getCanteens().get(); + + assertNotNull(canteensResponse); + assertNotNull(canteensResponse.body()); + assertNotEquals(0, canteensResponse.body().size()); + + for (Canteen c : canteensResponse.body()) { + System.out.println(c.getName()); + } + } + + @Test + void testExtractPageInfo() throws ExecutionException, InterruptedException { + Response<List<Canteen>> canteensResponse = openMensaAPI.getCanteens().get(); + + PageInfo pageInfo = PageInfo.extractFromResponse(canteensResponse); + + assertNotNull(pageInfo); + assertEquals(canteensResponse.body().size(), pageInfo.getItemCountPerPage()); + assertTrue(pageInfo.getTotalCountOfItems() > 0); + assertTrue(pageInfo.getTotalCountOfPages() > 0); + assertTrue(pageInfo.getCurrentPageIndex() > 0); + } + + @Test + void testGetMensaState() throws ExecutionException, InterruptedException { + State mensaState = openMensaAPI.getMensaState(FHRO_MENSA_ID, dateFormat.format(calendar.getTime())).get(); + + assertNotNull(mensaState); + } + + @Test + void testGetMultiplePages() throws ExecutionException, InterruptedException { + Response<List<Canteen>> firstPage = openMensaAPI.getCanteens().get(); + + assertNotNull(firstPage); + assertNotNull(firstPage.body()); + + PageInfo pageInfo = PageInfo.extractFromResponse(firstPage); + for(int i = 2; i <= pageInfo.getTotalCountOfPages(); i++) { + List<Canteen> canteensPage = openMensaAPI.getCanteens(i).get(); + assertNotNull(canteensPage); + assertNotEquals(0, canteensPage.size()); + } + } +} -- GitLab