From ec23019dcfcf8eaf454a08c8cb65394b6a1075cb Mon Sep 17 00:00:00 2001 From: navid Date: Fri, 1 May 2026 16:52:22 +0330 Subject: [PATCH 1/2] -third Assignment in the Advanced Programming --- src/main/java/Rational/Rational.java | 45 +++--- src/main/java/movie/apis/Main.java | 19 +-- src/main/java/movie/apis/Movie.java | 70 ++++++++- src/main/java/movie/apis/MovieService.java | 169 ++++++++------------- 4 files changed, 160 insertions(+), 143 deletions(-) diff --git a/src/main/java/Rational/Rational.java b/src/main/java/Rational/Rational.java index 7bd840e..19618a9 100644 --- a/src/main/java/Rational/Rational.java +++ b/src/main/java/Rational/Rational.java @@ -51,45 +51,44 @@ public class Rational { return r1.add(r2); } - // TODO: Instance method - this - other - // Formula: a/b - c/d = (a*d - c*b) / (b*d) + // COMPLETED - Instance method: this - other 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 + // COMPLETED - 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) + // COMPLETED - Instance method: this * other 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 + // COMPLETED - 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) + // COMPLETED - Instance method: this / other 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("Cannot divide by zero: the divisor's numerator is zero"); + } + int newNumerator = this.numerator * other.denominator ; + int newDenominator = this.denominator * other.numerator; + + return new Rational(newNumerator, newDenominator); } - // TODO: Static method - r1 / r2 + // COMPLETED - 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 diff --git a/src/main/java/movie/apis/Main.java b/src/main/java/movie/apis/Main.java index f0e713d..7f2c231 100644 --- a/src/main/java/movie/apis/Main.java +++ b/src/main/java/movie/apis/Main.java @@ -21,17 +21,16 @@ public class Main { break; 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 (1, 2, ...): "); + if (page < 1) { + System.out.println("Page number must be 1 or greater."); + break; + } + movieService.displayMoviesByGenre(genreId, page); break; - case 3: - // TODO (BONUS): Get movie ID from user, then call movieService.displayMovieDetails() - - - break; - case 0: running = false; System.out.println("Goodbye!"); @@ -39,13 +38,12 @@ public class Main { break; default: - System.out.println("Invalid choice! Please enter 0-4"); + System.out.println("Invalid choice! Please enter 0-2"); } if (running) { System.out.println("\nPress Enter to continue..."); scanner.nextLine(); - scanner.nextLine(); } } @@ -58,7 +56,6 @@ public class Main { System.out.println("================================"); System.out.println("1. Get all genres"); System.out.println("2. Get movies by genre ID"); - System.out.println("3. Get movie details by ID"); System.out.println("0. Exit"); System.out.println("================================"); } diff --git a/src/main/java/movie/apis/Movie.java b/src/main/java/movie/apis/Movie.java index 969774a..eab05f5 100644 --- a/src/main/java/movie/apis/Movie.java +++ b/src/main/java/movie/apis/Movie.java @@ -2,10 +2,6 @@ package movie.apis; import java.util.List; -/** - * Model class representing a movie - * Fields: id, title, genres, images - */ public class Movie { private Long id; @@ -16,9 +12,69 @@ public class Movie { private String imdb_rating; private String country; - // TODO: Create a constructor with all fields + public Movie(Long id , String title , List genres , Listimages, 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; + } + public Movie(Long id , String title){ + this.id = id; + this.title = title; + } + public Movie(){ + } - // TODO: Create a simple constructor with id and title only + public Long getId(){ + return id; + } + public void setId(Long id){ + this.id = id; + } + + public String getTitle(){ + return title; + } + public void setTitle(String title){ + this.title = title; + } + + public List getGenres(){ + return genres; + } + public void setGenres(List genres){ + this.genres = genres; + } + + public List getImages(){ + return images; + } + public void setImages(List images){ + this.images = images; + } + + public String getYear(){ + return year; + } + public void setYear(String year) { + this.year = year; + } + + public String getImdb_rating(){ + return imdb_rating; + } + public void setImdb_rating(String imdb_rating) { + this.imdb_rating = imdb_rating; + } + + public String getCountry(){ + return country; + } + public void setCountry(String country) { + this.country = country; + } - // TODO: Create getters and setters for all fields } \ No newline at end of file diff --git a/src/main/java/movie/apis/MovieService.java b/src/main/java/movie/apis/MovieService.java index 3f053f5..994058d 100644 --- a/src/main/java/movie/apis/MovieService.java +++ b/src/main/java/movie/apis/MovieService.java @@ -71,122 +71,87 @@ public class MovieService { } try { - JsonObject rootObject = JsonParser.parseString(jsonResponse).getAsJsonObject(); - JsonArray genresArray = rootObject.getAsJsonArray("genres"); - Type genreListType = new TypeToken>(){}.getType(); Gson gson = new Gson(); - List genres = gson.fromJson(genresArray, genreListType); + JsonObject rootObject = JsonParser.parseString(jsonResponse).getAsJsonObject(); - System.out.println("\nALL GENRES:"); - for (Genre genre : genres) { - System.out.println(genre.getId() + ". " + genre.getName()); + if (rootObject.has("genres")) { + JsonArray genresArray = rootObject.getAsJsonArray("genres"); + Type genreListType = new TypeToken>(){}.getType(); + List genres = gson.fromJson(genresArray, genreListType); + + System.out.println("\nALL GENRES:"); + for (Genre genre : genres) { + System.out.println(genre.getId() + ". " + genre.getName()); + } + System.out.println(); + } else { + Type genreListType = new TypeToken>(){}.getType(); + List genres = gson.fromJson(jsonResponse, genreListType); + + System.out.println("\nALL GENRES:"); + for (Genre genre : genres) { + System.out.println(genre.getId() + ". " + genre.getName()); + } + System.out.println(); } - System.out.println(); } catch (Exception e) { System.err.println("ERROR parsing genres: " + e.getMessage()); + e.printStackTrace(); } } - /** - * 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 - */ + + private List extractMoviesFromJson(JsonObject rootObject) { + List movies = new ArrayList<>(); + try { + if (rootObject.has("movies")) { + JsonArray moviesArray = rootObject.getAsJsonArray("movies"); + Gson gson = new Gson(); + + for (JsonElement element : moviesArray) { + Movie movie = gson.fromJson(element, Movie.class); + movies.add(movie); + } + } + } catch (Exception e) { + System.err.println("ERROR parsing movies array: " + e.getMessage()); + } + return movies; + } + + 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 jsonResponse = getMoviesByGenreList(genreId, page); - } catch (Exception e) { - System.err.println("ERROR: " + e.getMessage()); - } - } - - - /** - * BONUS: Fetch movie details from API using movie ID - * URL format: https://api.meshcomp.ir/api/v1/movies/{movieId} - */ - 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(); - - return null; - } catch (Exception e) { - System.out.println("!!Exception : " + e.getMessage()); - } - 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); - - // Step 2: Check if we got valid data - // Step 3-5: Parse JSON and display details (PUT YOUR CODE INSIDE try-catch) if (jsonResponse == null) { - System.out.println("Failed to get movie details for ID: " + movieId); + System.out.println("Failed to get movies for genre " + genreId); return; } + try { - // TODO: Parse jsonResponse to JsonObject - // HINT: Use JsonParser.parseString(jsonResponse).getAsJsonObject() - // TODO: use Gson to parse the json - // Your code here: + JsonObject rootObject = JsonParser.parseString(jsonResponse).getAsJsonObject(); + + int total = rootObject.get("total").getAsInt(); + int totalPages = rootObject.get("total_pages").getAsInt(); + int currentPage = rootObject.get("page").getAsInt(); + + System.out.println("\n===== Page " + currentPage + " of " + totalPages + " (Total Movies: " + total + ") ====="); + + List movies = extractMoviesFromJson(rootObject); + + if (movies.isEmpty()) { + System.out.println("No movies found on this page."); + } else { + for (Movie movie : movies) { + System.out.println("ID: " + movie.getId() + " | " + movie.getTitle() + " (" + movie.getYear() + ")"); + } + } + System.out.println(); + } catch (Exception e) { - System.err.println("ERROR parsing movie details: " + e.getMessage()); + System.err.println("ERROR parsing movies: " + e.getMessage()); + e.printStackTrace(); } } -} \ No newline at end of file + +} From 1933f080dd59d59506bb04aecaea611b5fc6dbe7 Mon Sep 17 00:00:00 2001 From: navid Date: Fri, 1 May 2026 17:09:24 +0330 Subject: [PATCH 2/2] fix: restore original structure and implement missing features --- src/main/java/movie/apis/MovieService.java | 70 ++++++++++++---------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/src/main/java/movie/apis/MovieService.java b/src/main/java/movie/apis/MovieService.java index 994058d..7a4567d 100644 --- a/src/main/java/movie/apis/MovieService.java +++ b/src/main/java/movie/apis/MovieService.java @@ -71,32 +71,19 @@ public class MovieService { } try { - Gson gson = new Gson(); JsonObject rootObject = JsonParser.parseString(jsonResponse).getAsJsonObject(); + JsonArray genresArray = rootObject.getAsJsonArray("genres"); + Type genreListType = new TypeToken>(){}.getType(); + Gson gson = new Gson(); + List genres = gson.fromJson(genresArray, genreListType); - if (rootObject.has("genres")) { - JsonArray genresArray = rootObject.getAsJsonArray("genres"); - Type genreListType = new TypeToken>(){}.getType(); - List genres = gson.fromJson(genresArray, genreListType); - - System.out.println("\nALL GENRES:"); - for (Genre genre : genres) { - System.out.println(genre.getId() + ". " + genre.getName()); - } - System.out.println(); - } else { - Type genreListType = new TypeToken>(){}.getType(); - List genres = gson.fromJson(jsonResponse, genreListType); - - System.out.println("\nALL GENRES:"); - for (Genre genre : genres) { - System.out.println(genre.getId() + ". " + genre.getName()); - } - System.out.println(); + System.out.println("\nALL GENRES:"); + for (Genre genre : genres) { + System.out.println(genre.getId() + ". " + genre.getName()); } + System.out.println(); } catch (Exception e) { System.err.println("ERROR parsing genres: " + e.getMessage()); - e.printStackTrace(); } } @@ -129,22 +116,42 @@ public class MovieService { } try { + Gson gson = new Gson(); JsonObject rootObject = JsonParser.parseString(jsonResponse).getAsJsonObject(); + int total = 0; + int totalPages = 0; + int currentPage = 1; - int total = rootObject.get("total").getAsInt(); - int totalPages = rootObject.get("total_pages").getAsInt(); - int currentPage = rootObject.get("page").getAsInt(); + if (rootObject.has("total")) { + total = rootObject.get("total").getAsInt(); + } + if (rootObject.has("total_pages")) { + totalPages = rootObject.get("total_pages").getAsInt(); + } + if (rootObject.has("page")) { + currentPage = rootObject.get("page").getAsInt(); + } System.out.println("\n===== Page " + currentPage + " of " + totalPages + " (Total Movies: " + total + ") ====="); - List movies = extractMoviesFromJson(rootObject); + if (rootObject.has("movies")) { + JsonArray moviesArray = rootObject.getAsJsonArray("movies"); - if (movies.isEmpty()) { - System.out.println("No movies found on this page."); - } else { - for (Movie movie : movies) { - System.out.println("ID: " + movie.getId() + " | " + movie.getTitle() + " (" + movie.getYear() + ")"); + if (moviesArray.size() == 0) { + System.out.println("No movies found on this page."); + } else { + for (JsonElement element : moviesArray) { + Movie movie = gson.fromJson(element, Movie.class); + if (movie != null) { + String yearDisplay = (movie.getYear() != null && !movie.getYear().isEmpty()) + ? movie.getYear() : "N/A"; + System.out.println("ID: " + movie.getId() + " | " + movie.getTitle() + + " (" + yearDisplay + ")"); + } + } } + } else { + System.out.println("No 'movies' array found in response"); } System.out.println(); @@ -153,5 +160,6 @@ public class MovieService { e.printStackTrace(); } } + -} +} \ No newline at end of file