diff --git a/.idea/misc.xml b/.idea/misc.xml
index 5274667..f6a588b 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -8,7 +8,5 @@
-
-
-
+
\ No newline at end of file
diff --git a/src/main/java/Rational/Rational.java b/src/main/java/Rational/Rational.java
index 7bd840e..50344d6 100644
--- a/src/main/java/Rational/Rational.java
+++ b/src/main/java/Rational/Rational.java
@@ -53,43 +53,52 @@ 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
+ public Rational subtract(Rational other)
+ {
+ 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
+ public static Rational subtract(Rational r1, Rational r2)
+ {
+ 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
+ public Rational multiply(Rational other)
+ {
+ 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
+ public static Rational multiply(Rational r1, Rational r2)
+ {
+ 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
+ public Rational divide(Rational other)
+ {
+ if (other.numerator == 0)
+ {
+ throw new ArithmeticException("Cannot divide by 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
+ public static Rational divide(Rational r1, Rational r2)
+ {
+ 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..cc62da1 100644
--- a/src/main/java/movie/apis/Main.java
+++ b/src/main/java/movie/apis/Main.java
@@ -7,28 +7,35 @@ public class Main {
private static final MovieService movieService = new MovieService();
private static final Scanner scanner = new Scanner(System.in);
- public static void main(String[] args) {
+ public static void main(String[] args)
+ {
System.out.println("\n=== MOVIE API CLIENT ===\n");
boolean running = true;
- while (running) {
+ while (running)
+ {
displayMenu();
int choice = getIntInput("Enter your choice: ");
- switch (choice) {
+ switch (choice)
+ {
case 1:
movieService.displayGenres();
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: ");
+ movieService.displayMoviesByGenre(genreId, page);
break;
case 3:
// TODO (BONUS): Get movie ID from user, then call movieService.displayMovieDetails()
-
+ Long movieId = getLongInput("Enter movie ID: ");
+ movieService.displayMovieDetails(movieId);
break;
@@ -42,7 +49,8 @@ public class Main {
System.out.println("Invalid choice! Please enter 0-4");
}
- if (running) {
+ if (running)
+ {
System.out.println("\nPress Enter to continue...");
scanner.nextLine();
scanner.nextLine();
@@ -65,7 +73,8 @@ public class Main {
private static int getIntInput(String prompt) {
System.out.print(prompt);
- while (!scanner.hasNextInt()) {
+ while (!scanner.hasNextInt())
+ {
System.out.print("Invalid input. " + prompt);
scanner.next();
}
@@ -74,9 +83,11 @@ public class Main {
return input;
}
- private static Long getLongInput(String prompt) {
+ private static Long getLongInput(String prompt)
+ {
System.out.print(prompt);
- while (!scanner.hasNextLong()) {
+ while (!scanner.hasNextLong())
+ {
System.out.print("Invalid input. " + prompt);
scanner.next();
}
diff --git a/src/main/java/movie/apis/Movie.java b/src/main/java/movie/apis/Movie.java
index 969774a..dd59d13 100644
--- a/src/main/java/movie/apis/Movie.java
+++ b/src/main/java/movie/apis/Movie.java
@@ -16,9 +16,104 @@ public class Movie {
private String imdb_rating;
private 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;
+ 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() {}
+
+ 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;
+ }
+
+ @Override
+ public String toString()
+ {
+ return title + " (" + year + ") - IMDB: " + imdb_rating;
+ }
+}
// TODO: Create a constructor with all fields
// TODO: Create a simple constructor with id and title only
// 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..437d659 100644
--- a/src/main/java/movie/apis/MovieService.java
+++ b/src/main/java/movie/apis/MovieService.java
@@ -102,11 +102,39 @@ public class MovieService {
*
* 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
+ public void displayMoviesByGenre(Long genreId, Long page)
+ {
+ try
+ {
+ String json = getMoviesByGenreList(genreId, page);
+ if (json == null)
+ {
+ System.out.println("Failed to load movies");
+ return;
+ }
+
+ JsonObject root = JsonParser.parseString(json).getAsJsonObject();
+
+ long total = root.get("total").getAsLong();
+ long totalPages = root.get("total_pages").getAsLong();
+
+ JsonArray moviesArray = root.getAsJsonArray("movies");
+
+ System.out.println("\nMovies for genre " + genreId + " | Page " + page);
+ System.out.println("----------------------------------------------");
+
+ for (JsonElement element : moviesArray) {
+ JsonObject movieObj = element.getAsJsonObject();
+ Long id = movieObj.get("id").getAsLong();
+ String title = movieObj.get("title").getAsString();
+ String year = movieObj.get("year").getAsString();
+
+ System.out.println("ID: " + id + " | " + title + " (" + year + ")");
+ }
+
+ System.out.println("\nTotal Movies: " + total);
+ System.out.println("Total Pages: " + totalPages);
+ System.out.println();
} catch (Exception e) {
System.err.println("ERROR: " + e.getMessage());
@@ -114,25 +142,35 @@ public class MovieService {
}
+
/**
* 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();
+ 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();
+ } else {
+ System.out.println("HTTP error code: " + response.statusCode());
+ }
- return null;
} catch (Exception e) {
System.out.println("!!Exception : " + e.getMessage());
}
return null;
}
+
/*
BONUS TODO: Display complete movie details for a given movie ID
@@ -170,23 +208,44 @@ public class MovieService {
*/
- public void displayMovieDetails(Long movieId) {
- // Step 1: Get JSON response from API
+ public void displayMovieDetails(Long movieId)
+ {
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) {
+ if (jsonResponse == null)
+ {
System.out.println("Failed to get movie details for ID: " + movieId);
return;
}
- try {
- // TODO: Parse jsonResponse to JsonObject
- // HINT: Use JsonParser.parseString(jsonResponse).getAsJsonObject()
- // TODO: use Gson to parse the json
- // Your code here:
- } catch (Exception e) {
+
+ try
+ {
+ JsonObject root = JsonParser.parseString(jsonResponse).getAsJsonObject();
+
+ Gson gson = new Gson();
+ Movie movie = gson.fromJson(root, Movie.class);
+
+ System.out.println("\n=======================================================================");
+ System.out.println(" " + movie.getTitle() + " (" + movie.getYear() + ")");
+ System.out.println("=======================================================================");
+
+ System.out.println("Rating: " + movie.getImdb_rating());
+ System.out.println("Country: " + movie.getCountry());
+ System.out.println("Year: " + movie.getYear());
+
+ if (movie.getGenres() != null)
+ System.out.println("Genres: " + String.join(", ", movie.getGenres()));
+
+ System.out.println("\n=======================================================================");
+ System.out.println();
+
+ }
+ catch (Exception e)
+ {
System.err.println("ERROR parsing movie details: " + e.getMessage());
}
}
+
+
+
}
\ No newline at end of file