KotlinCS 124 LogoJava
PrevIndexNext
Kotlin
Java
  • Implementing a Map : 04/26/2024

  • Streams : 04/25/2024

  • Generics : 04/24/2024

  • Hashing : 04/23/2024

  • Binary Search : 04/22/2024

  • MP3: Course Ratings : 04/19/2024

  • Quicksort : 04/18/2024

  • Merge Sort : 04/17/2024

  • Sorting Algorithms : 04/16/2024

  • MP Debugging Part 1 : 04/15/2024

  • MP2: Course Activity : 04/12/2024

  • Practice with Recursion : 04/11/2024

  • MP Debugging Part 0 : 04/10/2024

  • MP2: API Client : 04/09/2024

  • MP2: API Server : 04/08/2024

  • Trees and Recursion : 04/05/2024

  • Trees : 04/04/2024

  • Recursion : 04/03/2024

  • MP1: Filtering and Search : 04/02/2024

  • MP1: Loading and Sorting : 04/01/2024

  • Lists Review and Performance : 03/29/2024

  • Linked Lists : 03/28/2024

  • Algorithms and Lists : 03/27/2024

  • Continuing MP0 : 03/26/2024

  • Getting Started with MP0 : 03/25/2024

  • Lambda Expressions : 03/22/2024

  • Anonymous Classes : 03/21/2024

  • Practice with Interfaces : 03/20/2024

  • Implementing Interfaces : 03/19/2024

  • Using Interfaces : 03/18/2024

  • Working with Exceptions : 03/08/2024

  • Throwing Exceptions : 03/07/2024

  • Catching Exceptions : 03/06/2024

  • References and Polymorphism : 03/05/2024

  • References : 03/04/2024

  • Data Modeling 2 : 03/01/2024

  • Equality and Object Copying : 02/29/2024

  • Polymorphism : 02/28/2024

  • Inheritance : 02/27/2024

  • Data Modeling 1 : 02/26/2024

  • Static : 02/23/2024

  • Encapsulation : 02/22/2024

  • Constructors : 02/21/2024

  • Objects, Continued : 02/20/2024

  • Introduction to Objects : 02/19/2024

  • Compilation and Type Inference : 02/16/2024

  • Practice with Collections : 02/15/2024

  • Maps and Sets : 02/14/2024

  • Lists and Type Parameters : 02/13/2024

  • Imports and Libraries : 02/12/2024

  • Multidimensional Arrays : 02/09/2024

  • Practice with Strings : 02/08/2024

  • null : 02/07/2024

  • Algorithms and Strings : 02/06/2024

  • Strings : 02/05/2024

  • Functions and Algorithms : 02/02/2024

  • Practice with Functions : 02/01/2024

  • More About Functions : 01/31/2024

  • Errors and Debugging : 01/30/2024

  • Functions : 01/29/2024

  • Practice with Loops and Algorithms : 01/26/2024

  • Algorithms : 01/25/2024

  • Loops : 01/24/2024

  • Arrays : 01/23/2024

  • Compound Conditionals : 01/22/2024

  • Conditional Expressions and Statements : 01/19/2024

  • Operations on Variables : 01/18/2024

  • Variables and Types : 01/17/2024

  • Welcome to CS 124 : 01/16/2024

MP2: API Server

Let’s continue our work on the machine project! We’ll begin our next project checkpoint, MP2, by delving in to how our API server works. We’ll install the test suites and begin work on our first few test cases.

Getting Started
Getting Started

For MP2 we’ll be continuing on with the project that you started working on for MP0. You’ll need the environment that you set up during that checkpoint to proceed, and you’ll need to have completed MP1.

Note that, as we continue with the MP, these walkthroughs will get shorter, and we’ll expect you to do more work on your own. Don’t be worried! You can do it. Use the code we’ve provided as a guide, and get support when you need it.

Before you can get to work on MP2 we need to install the MP2 test suites. Before we continue, please commit your work. You should make sure to commit both immediately before and immediately after we install the MP2 test suites. (If there are no changes to commit beforehand, that’s fine.)

You’ll receive the MP2 Java test suites via email. Move the file to the app/src/test/java/edu/illinois/cs/cs124/ay2023/mp/test/ directory in your machine project. You’ll also want to reconfigure grade.yaml in the root directory of your project to request that we grade Checkpoint 2. Just like MP1, there’ll also be a few compilation errors to fix as well. Let’s look at how to do these things together:

Course Class
Course Class

Your first task is to create a Course class. It should store the same information about each course that the existing Summary class does, but should also include the description as a String property named description, with a getDescription getter. You can accomplish this in a compact way by using inheritance. Note that, to be compatible with our serialization library Jackson, your Course class must have an empty constructor.

When you have completed this task, you will pass test0_CourseClassDesign.

Server GET /course/ Route
Server GET /course/ Route

Our next challenge is to add support in our API server for returning complete details about a course. Currently we only receive a list of summaries, which do not include the course description. We’ll add a new route on our server to return details about a single course. Along the way, we’ll delve into the role of the server in our app.

When you have completed this task, you will pass test1_ServerCourseRoute.

There is one approach here that uses a Summary as a key to a map. This is not the only way to do this, and it may not even be the better way. But please note that, to use any class as a map key, it needs to implement both equals and hashCode. Android Studio can help you add these methods to your Summary class if needed.

Testing Notes
Testing Notes

Note that there are a few things that you should not do in your GET /course/ route. These are not only bad ideas: they will cause you to fail our test suites!

  1. Reread courses.json
  2. Parse the JSON in courses.json again
  3. Loop through a linear data structure like a list to find the requested course

The provided code already opens and parses courses.json, so doing that on every new request for course information is unnecessary and inefficient. In addition, you should be able add code to your server class to store course data in a map to allow efficient lookups in the GET /course/ route. At that point, once you determine the key to use from the request, the remainder of the route handler is straightforward.

Server Method and Field Visibility
Server Method and Field Visibility

You will need to add methods to your Server class to complete MP2, and in general you are free to modify that code as needed to complete the remaining MP checkpoints.

However, any new methods or fields you add to the Server class must be private. This is checked when the MP2 test suites start up, and unfortunately a failure results in a rather cryptic and unhelpful error message:

java.lang.NullPointerException: Cannot invoke "org.robolectric.internal.TestEnvironment.resetState()" because the return value of "org.robolectric.RobolectricTestRunner$RobolectricFrameworkMethod.getTestEnvironment()" is null
at org.robolectric.RobolectricTestRunner.lambda$finallyAfterTest$0(RobolectricTestRunner.java:370)
at org.robolectric.util.PerfStatsCollector.measure(PerfStatsCollector.java:86)
at org.robolectric.RobolectricTestRunner.finallyAfterTest(RobolectricTestRunner.java:368)
at org.robolectric.internal.SandboxTestRunner$2.lambda$evaluate$2(SandboxTestRunner.java:298)
at org.robolectric.internal.bytecode.Sandbox.lambda$runOnMainThread$0(Sandbox.java:101)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)

Your Goal Today
Your Goal Today

As a reminder, on lessons where we focus on the machine project we will not assign a homework problem! However, the lesson will usually focus on helping you complete a particular part of the MP test suite, and so we encourage you to spend time on that in lieu of a homework problem.

Right now your goal should be to

  1. install the MP2 test suites and make the changes required for them to compile
  2. load full course information from the JSON provided, and
  3. complete the server GET /course/ route as described above
  4. at that point you’ll be passing test0_CourseClassDesign and test1_ServerCourseRoute

If you get stuck, find us for help on the tutoring site or forum. If you have extra time after today’s lesson, you may want to move on and begin work on the next lesson, which also covers MP2.

MP2 Scores
MP2 Scores