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/git b/git
new file mode 100644
index 0000000..e69de29
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..28c2e47 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();
}
@@ -84,4 +95,4 @@ public class Main {
scanner.nextLine();
return input;
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/movie/apis/Movie.java b/src/main/java/movie/apis/Movie.java
index 969774a..3756854 100644
--- a/src/main/java/movie/apis/Movie.java
+++ b/src/main/java/movie/apis/Movie.java
@@ -6,19 +6,216 @@ import java.util.List;
* Model class representing a movie
* Fields: id, title, genres, images
*/
+
public class Movie {
private Long id;
private String title;
+
private List genres;
private List images;
+
private String year;
- private String imdb_rating;
+ private String imdb_id;
+ private String rated;
+ private String released;
+ private String runtime;
+
+ private String director;
+ private String writer;
+ private String actors;
+ private String plot;
+ private String language;
private String country;
+ private String awards;
+ private String poster;
+ private Double imdb_rating;
+ private String imdb_votes;
+ private String type;
+ private String metascore;
- // TODO: Create a constructor with all fields
+ private String genre;
- // TODO: Create a simple constructor with id and title only
+ public String getGenre() {
+ return genre;
+ }
- // TODO: Create getters and setters for all fields
-}
\ No newline at end of file
+ public void setGenre(String genre) {
+ this.genre = genre;
+ }
+
+ public Movie(Long id, String title, List genres, List images,
+ String year, Double 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 String getDirector() { return director; }
+ public String getWriter() { return writer; }
+ public String getActors() { return actors; }
+ public String getPlot() { return plot; }
+ public String getLanguage() { return language; }
+ public String getAwards() { return awards; }
+ public String getPoster() { return poster; }
+ public String getImdb_votes() { return imdb_votes; }
+ public String getType() { return type; }
+ public String getMetascore() { return metascore; }
+ public String getRated() { return rated; }
+ public String getReleased() { return released; }
+ public String getRuntime() { return runtime; }
+ public String getImdb_id() { return imdb_id; }
+
+
+ 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 Double getImdb_rating()
+ {
+ return imdb_rating;
+ }
+
+ public void setImdb_rating(Double imdb_rating)
+ {
+ this.imdb_rating = imdb_rating;
+ }
+
+ public String getCountry()
+ {
+ return country;
+ }
+
+ public void setCountry(String country)
+ {
+ this.country = country;
+ }
+
+ public void setDirector(String director) {
+ this.director = director;
+ }
+
+ public void setWriter(String writer) {
+ this.writer = writer;
+ }
+
+ public void setActors(String actors) {
+ this.actors = actors;
+ }
+
+ public void setPlot(String plot) {
+ this.plot = plot;
+ }
+
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+
+ public void setAwards(String awards) {
+ this.awards = awards;
+ }
+
+ public void setPoster(String poster) {
+ this.poster = poster;
+ }
+
+ public void setImdb_votes(String imdb_votes) {
+ this.imdb_votes = imdb_votes;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public void setMetascore(String metascore) {
+ this.metascore = metascore;
+ }
+
+ public void setRated(String rated) {
+ this.rated = rated;
+ }
+
+ public void setReleased(String released) {
+ this.released = released;
+ }
+
+ public void setRuntime(String runtime) {
+ this.runtime = runtime;
+ }
+
+ public void setImdb_id(String imdb_id) {
+ this.imdb_id = imdb_id;
+ }
+
+
+ @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..b0370ab 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,50 @@ 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
+ {
+ Gson gson = new Gson();
+ Movie movie = gson.fromJson(jsonResponse, Movie.class);
+
+ System.out.println("\n=======================================================================");
+ System.out.println(" " + movie.getTitle() + " (" + movie.getYear() + ")");
+ System.out.println("=======================================================================\n");
+
+ System.out.println("Rating: " + movie.getImdb_rating() + "/10 | Votes: " + movie.getImdb_votes());
+
+ System.out.println("Director: " + movie.getDirector());
+ System.out.println("Cast: " + movie.getActors());
+
+ if (movie.getGenres() != null) {
+ System.out.println("Genre: " + String.join(", ", movie.getGenres()));
+ }
+
+
+ System.out.println("Runtime: " + movie.getRuntime() + " | Rated: " + movie.getRated());
+ System.out.println("Country: " + movie.getCountry() + " | Released: " + movie.getReleased());
+
+ System.out.println("Plot: " + movie.getPlot());
+
+ System.out.println("Awards: " + movie.getAwards());
+
+ System.out.println("=======================================================================\n");
+
+ }
+ catch (Exception e)
+ {
System.err.println("ERROR parsing movie details: " + e.getMessage());
}
}
-}
\ No newline at end of file
+
+
+}