From 4846c863bc16e1d628077f471ca76eefb7f85185 Mon Sep 17 00:00:00 2001 From: Matin-Ardestani Date: Mon, 27 Apr 2026 14:42:46 +0330 Subject: [PATCH 1/5] Implement Rational --- src/main/java/Rational/Rational.java | 30 +++++++++++++++------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/Rational/Rational.java b/src/main/java/Rational/Rational.java index 7bd840e..b6c9483 100644 --- a/src/main/java/Rational/Rational.java +++ b/src/main/java/Rational/Rational.java @@ -54,42 +54,44 @@ public class Rational { // TODO: Instance method - this - other // Formula: a/b - c/d = (a*d - c*b) / (b*d) public Rational subtract(Rational other) { - // YOUR CODE HERE - return null; // Remove this line when implemented + int newNumerator = this.numerator * other.denominator - other.numerator * this.denominator; + int newDenominator = this.denominator * other.denominator; + return new Rational(newNumerator, newDenominator); } // TODO: Static method - r1 - r2 public static Rational subtract(Rational r1, Rational r2) { - // YOUR CODE HERE - return null; // Remove this line when implemented + return r1.subtract(r2); } // TODO: Instance method - this * other // Formula: (a/b) * (c/d) = (a*c) / (b*d) public Rational multiply(Rational other) { - // YOUR CODE HERE - return null; // Remove this line when implemented + int newNumerator = this.numerator * other.numerator; + int newDenominator = this.denominator * other.denominator; + return new Rational(newNumerator, newDenominator); } // TODO: Static method - r1 * r2 public static Rational multiply(Rational r1, Rational r2) { - // YOUR CODE HERE - return null; // Remove this line when implemented + return r1.multiply(r2); } // TODO: Instance method - this / other // Formula: (a/b) รท (c/d) = (a*d) / (b*c) public Rational divide(Rational other) { - // YOUR CODE HERE - // HINT: Division is multiplication by reciprocal - // Don't forget to check if other.numerator is zero! - return null; // Remove this line when implemented + if(other.numerator == 0){ + throw new IllegalArgumentException("Denominator cannot be zero"); + } + + int newNumerator = this.numerator * other.denominator; + int newDenominator = this.denominator * other.numerator; + return new Rational(newNumerator, newDenominator); } // TODO: Static method - r1 / r2 public static Rational divide(Rational r1, Rational r2) { - // YOUR CODE HERE - return null; // Remove this line when implemented + return r1.divide(r2); } // PROVIDED - String representation -- 2.54.0 From 5cd5b97411ac917dac0af5ae2794b0a03aa8cefd Mon Sep 17 00:00:00 2001 From: Matin-Ardestani Date: Sat, 2 May 2026 23:52:34 +0330 Subject: [PATCH 2/5] Implement Movie class --- src/main/java/movie/apis/Movie.java | 60 +++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/main/java/movie/apis/Movie.java b/src/main/java/movie/apis/Movie.java index 98c50cf..cfb3e06 100644 --- a/src/main/java/movie/apis/Movie.java +++ b/src/main/java/movie/apis/Movie.java @@ -17,8 +17,68 @@ public class Movie { private String country; // TODO: Create a constructor with all fields + public Movie(Long id, String title, List genres, String images, String year, String imdb_rating, String country){ + this.id = id; + this.title = title; + this.genres = genres; + this.images = images; + this.year = year; + this.imdb_rating = imdb_rating; + this.country = country; + } // TODO: Create a simple constructor with id and title only + public Movie(Long id, String title){ + this.id = id; + this.title = title; + } // TODO: Create getters and setters for all fields + public Long getId() { + return id; + } + + public String getTitle() { + return title; + } + + public List getGenres() { + return genres; + } + + public String getImages() { + return images; + } + + public String getImdb_rating() { + return imdb_rating; + } + + public String getYear() { + return year; + } + + public String getCountry() { + return country; + } + + public void setGenres(List genres) { + this.genres = genres; + } + + public void setImages(String images) { + this.images = images; + } + + public void setImdb_rating(String imdb_rating) { + this.imdb_rating = imdb_rating; + } + + public void setYear(String year) { + this.year = year; + } + + public void setCountry(String country) { + this.country = country; + } } \ No newline at end of file -- 2.54.0 From 737a521018ab9c0d2328c638b13b7ff59a0b74fd Mon Sep 17 00:00:00 2001 From: Matin-Ardestani Date: Sun, 3 May 2026 08:41:34 +0330 Subject: [PATCH 3/5] fix: Add toString method to Movie class --- src/main/java/movie/apis/Movie.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/movie/apis/Movie.java b/src/main/java/movie/apis/Movie.java index cfb3e06..c9e80d4 100644 --- a/src/main/java/movie/apis/Movie.java +++ b/src/main/java/movie/apis/Movie.java @@ -81,4 +81,9 @@ public class Movie { public void setCountry(String country) { this.country = country; } + + @Override + public String toString() { + return id + ". " + title; + } } \ No newline at end of file -- 2.54.0 From 6ad5db53115af0fa34360d13a1f5da2d76c30f9d Mon Sep 17 00:00:00 2001 From: Matin-Ardestani Date: Sun, 3 May 2026 23:17:53 +0330 Subject: [PATCH 4/5] Comple not bonus methods --- src/main/java/movie/apis/Main.java | 4 +- src/main/java/movie/apis/MovieService.java | 43 +++++++++++----------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/main/java/movie/apis/Main.java b/src/main/java/movie/apis/Main.java index f0e713d..99cdf8d 100644 --- a/src/main/java/movie/apis/Main.java +++ b/src/main/java/movie/apis/Main.java @@ -22,7 +22,9 @@ public class Main { case 2: // TODO: Get genre ID and page from user, then call movieService.displayMoviesByGenre() - + Long genreId = getLongInput("Enter genre ID: "); + Long page = getLongInput("Enter page number: "); + movieService.displayMoviesByGenre(genreId, page); break; diff --git a/src/main/java/movie/apis/MovieService.java b/src/main/java/movie/apis/MovieService.java index 3f053f5..5e4490f 100644 --- a/src/main/java/movie/apis/MovieService.java +++ b/src/main/java/movie/apis/MovieService.java @@ -87,26 +87,27 @@ public class MovieService { } } - /** - * TODO 1: Display movies for a specific genre and page - * - * Open this link in your browser (and check Pretty-print checkbox) to view json format: - * https://api.meshcomp.ir/api/v1/genres/1/movies - * - * Steps: - * - Call getMoviesByGenreList(genreId, page) to get JSON - * - Parse JSON to JsonObject - * - Get "movies" array (NOT "data") - * - Loop through array and print: "ID: {id} | {title} ({year})" - * - Also print total and total_pages - * - * PUT ALL PARSING CODE INSIDE try-catch - */ public void displayMoviesByGenre(Long genreId, Long page) { // TODO: Write your code here - // All parsing code must be inside try-catch try { - // Your code here + + String jsonAsString = getMoviesByGenreList(genreId, page); + JsonObject jsonObj = JsonParser.parseString(jsonAsString).getAsJsonObject(); + JsonArray moviesArray = jsonObj.getAsJsonArray("movies"); + + List movies = new ArrayList<>(); + + for(JsonElement movie : moviesArray){ + JsonObject movieAsObj = movie.getAsJsonObject(); + System.out.printf("ID: %d | %s (%d)\n\n", + movieAsObj.get("id").getAsLong(), movieAsObj.get("title").getAsString(), movieAsObj.get("year").getAsLong()); + + movies.add(new Movie(movieAsObj.get("id").getAsLong(), + movieAsObj.get("title").getAsString())); + } + + System.out.printf("Total: %d, total_pages: %d\n\n", + jsonObj.get("total").getAsLong(), jsonObj.get("total_pages").getAsLong()); } catch (Exception e) { System.err.println("ERROR: " + e.getMessage()); @@ -121,10 +122,10 @@ public class MovieService { private String getMovieById(Long movieId) { try { // TODO: Complete this method - // String url = MOVIE_BY_ID_URL + movieId; - // HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build(); - // HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - // if (response.statusCode() == 200) return response.body(); + String url = MOVIE_BY_ID_URL + movieId; + HttpRequest request = HttpRequest.newBuilder().uri(URI.create(url)).build(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() == 200) return response.body(); return null; } catch (Exception e) { -- 2.54.0 From b901078b619435127d9e595c6110f3b023fd9ff5 Mon Sep 17 00:00:00 2001 From: Matin-Ardestani Date: Sun, 3 May 2026 23:59:27 +0330 Subject: [PATCH 5/5] Implement Bonus exercise - movie details --- src/main/java/movie/apis/Main.java | 4 +- src/main/java/movie/apis/Movie.java | 100 ++++++++++++++++++--- src/main/java/movie/apis/MovieService.java | 55 ++++-------- 3 files changed, 106 insertions(+), 53 deletions(-) diff --git a/src/main/java/movie/apis/Main.java b/src/main/java/movie/apis/Main.java index 99cdf8d..eaa2b98 100644 --- a/src/main/java/movie/apis/Main.java +++ b/src/main/java/movie/apis/Main.java @@ -30,8 +30,8 @@ public class Main { case 3: // TODO (BONUS): Get movie ID from user, then call movieService.displayMovieDetails() - - + Long movieId = getLongInput("Enter movie id: "); + movieService.displayMovieDetails(movieId); break; case 0: diff --git a/src/main/java/movie/apis/Movie.java b/src/main/java/movie/apis/Movie.java index c9e80d4..068d3cc 100644 --- a/src/main/java/movie/apis/Movie.java +++ b/src/main/java/movie/apis/Movie.java @@ -11,13 +11,26 @@ public class Movie { private Long id; private String title; private List genres; - private String images; + private List images; private String year; private String imdb_rating; private String country; + private String actors; + private String awards; + private String director; + private String imdb_id; + private String imdb_votes; + private String metascore; + private String plot; + private String rated; + private String released; + private String runtime; + private String type; + private String writer; + // TODO: Create a constructor with all fields - public Movie(Long id, String title, List genres, String images, String year, String imdb_rating, String country){ + public Movie(Long id, String title, List genres, List images, String year, String imdb_rating, String country){ this.id = id; this.title = title; this.genres = genres; @@ -37,46 +50,107 @@ public class Movie { public Long getId() { return id; } - public String getTitle() { return title; } - public List getGenres() { return genres; } - - public String getImages() { + public List getImages() { return images; } - public String getImdb_rating() { return imdb_rating; } - public String getYear() { return year; } - public String getCountry() { return country; } + public String getActors() { + return actors; + } + public String getAwards() { + return awards; + } + public String getDirector() { + return director; + } + public String getImdb_id() { + return imdb_id; + } + public String getImdb_votes() { + return imdb_votes; + } + public String getMetascore() { + return metascore; + } + public String getPlot() { + return plot; + } + public String getRated() { + return rated; + } + public String getReleased() { + return released; + } + public String getRuntime() { + return runtime; + } + public String getType() { + return type; + } + public String getWriter() { + return writer; + } public void setGenres(List genres) { this.genres = genres; } - - public void setImages(String images) { + public void setImages(List images) { this.images = images; } - public void setImdb_rating(String imdb_rating) { this.imdb_rating = imdb_rating; } - public void setYear(String year) { this.year = year; } + public void setAwards(String awards) { + this.year = awards; + } + public void setDirector(String director) { + this.year = director; + } + public void setMetascoret(String metascore) { + this.year = metascore; + } + public void setPlot(String plot) { + this.year = plot; + } + public void setImdb_id(String imdb_id) { + this.year = imdb_id; + } + public void setImdb_votes(String imdb_votes) { + this.year = imdb_votes; + } + public void setRated(String rated) { + this.year = rated; + } + public void setReleased(String released) { + this.year = released; + } + public void setType(String type) { + this.year = type; + } + public void setRuntime(String runtime) { + this.year = runtime; + } + public void setWriter(String writer) { + this.year = writer; + } + public void setCountry(String country) { this.country = country; diff --git a/src/main/java/movie/apis/MovieService.java b/src/main/java/movie/apis/MovieService.java index 5e4490f..c960070 100644 --- a/src/main/java/movie/apis/MovieService.java +++ b/src/main/java/movie/apis/MovieService.java @@ -134,46 +134,10 @@ public class MovieService { return null; } - /* - BONUS TODO: Display complete movie details for a given movie ID - - Open this link in your browser (and check Pretty-print checkbox) to view json format: - https://api.meshcomp.ir/api/v1/movies/1 - - INSTRUCTIONS: - 1. Call getMovieById(movieId) to get the JSON response string - 2. Check if response is null (if yes, print error and return) - 3. Parse the JSON string to JsonObject (inside try-catch) - 4. Use Gson to extract all fields from the JSON and map them to your Movie class: - - Add missing JSON fields to your Movie class first (actors, awards, director, - imdb_id, imdb_votes, metascore, plot, rated, released, runtime, type, writer) - - Then use Gson to parse your json string - 5. Print all movie details in a readable format - - (PUT ALL PARSING CODE INSIDE THE EXISTING try-catch) - */ - - /* EXAMPLE OUTPUT: - - ======================================================================= - THE SHAWSHANK REDEMPTION (1994) - ======================================================================= - Rating: 9.3/10 | Votes: 1,738,596 - Director: Frank Darabont - Cast: Tim Robbins, Morgan Freeman, Bob Gunton, William Sadler - Genre: Crime, Drama - Runtime: 142 min | Rated: R - Country: USA | Released: 14 Oct 1994 - Plot: Two imprisoned men bond over a number of years, finding - solace and eventual redemption through acts of common decency. - Awards: Nominated for 7 Oscars. Another 19 wins & 30 nominations. - ======================================================================= - - */ - public void displayMovieDetails(Long movieId) { // Step 1: Get JSON response from API String jsonResponse = getMovieById(movieId); +// System.out.println(jsonResponse + "\n"); // Step 2: Check if we got valid data // Step 3-5: Parse JSON and display details (PUT YOUR CODE INSIDE try-catch) @@ -184,8 +148,23 @@ public class MovieService { try { // TODO: Parse jsonResponse to JsonObject // HINT: Use JsonParser.parseString(jsonResponse).getAsJsonObject() + JsonObject moviesObj = JsonParser.parseString(jsonResponse).getAsJsonObject(); // TODO: use Gson to parse the json - // Your code here: + Gson gson = new Gson(); + Movie movie = gson.fromJson(moviesObj, Movie.class); + String output = " =======================================================================\n" + + " "+ movie.getTitle() +"\n" + + " =======================================================================\n" + + " Rating: "+ movie.getImdb_rating() +" | Votes: "+ movie.getImdb_votes() + "\n" + + " Director: "+ movie.getDirector() +"\n" + + " Cast: "+ movie.getActors() +"\n" + + " Genre: "+ movie.getGenres() +"\n" + + " Runtime: "+ movie.getRuntime() +" | Rated: "+ movie.getRated() +"\n" + + " Country: "+ movie.getCountry() +" | Released: "+ movie.getReleased() +"\n" + + " Plot: " + movie.getPlot() + + "\n ======================================================================="; + System.out.println(output); + } catch (Exception e) { System.err.println("ERROR parsing movie details: " + e.getMessage()); } -- 2.54.0