module VideoRentalStore { enum MediaType {VHS, DVD}; struct Date { short day; short month; short year; }; // Forward interface declarations interface Movie; interface MovieCopy; interface Customer; // Auxiliary sequence definitions typedef sequence<string> StringList; typedef sequence<Movie> MovieList; typedef sequence<MovieCopy> MovieCopyList; typedef sequence<Customer> CustomerList; // Exception definitions exception CreateException { string detail; }; exception RemoveException { string detail; }; exception NotFoundException { }; exception AlreadyRentedException { }; exception NotRentedException { }; // Definitions of entity interfaces (Movie, MovieCopy and Customer) // and their corresponding home (factory and finder) interfaces interface Movie { long getId(); string getName(); // movie name string getDirector(); // name of director StringList getGenre(); // list of genre names (comedy, action, etc) StringList getCast(); // list of actor/actress names short getYear(); // production year short getDuration(); // movie duration in minutes MovieCopyList getCopies(); // the copies of this movie }; interface MovieHome { Movie create(in long id, in string name, in string director, in StringList genre, in StringList cast, in short year, in short duration) raises(CreateException); void remove(in long id) raises(RemoveException); Movie findById(in long id) raises(NotFoundException); MovieList findByName(in string name); MovieList findByDirector(in string director); MovieList findByGenreAndYear(in string genre, in short year); }; interface MovieCopy { long getId(); Movie getMovie(); MediaType getMediaType(); boolean isRented(); void rentTo(in Customer customer, in Date returnDate) raises(AlreadyRentedException); void unrent() raises(NotRentedException); Customer getTaker() raises(NotRentedException); Date getReturnDate() raises(NotRentedException); }; interface MovieCopyHome { MovieCopy create(in long id, in Movie movie, in MediaType mediaType) raises(CreateException); void remove(in long id) raises(RemoveException); MovieCopy findById(in long id) raises(NotFoundException); MovieCopyList findByMovieIdAndMediaType(in long movieId, in MediaType mediaType); }; interface Customer { long getId(); string getName(); string getPhone(); void setPhone(in string phone); MovieCopyList getTakenMovieCopies(); }; interface CustomerHome { Customer create(in long id, in string name, in string phone) raises(CreateException); void remove(in long id) raises(RemoveException); Customer findById(in long id) raises(NotFoundException); CustomerList findByName(in string name); CustomerList findByPhone(in string phone); }; // Additional structure and sequence definitions for service interface struct RentedMovieCopyInfo { long movieCopyId; string customerName; string customerPhone; Date returnDate; }; typedef sequence<RentedMovieCopyInfo> RentedMovieCopies; typedef sequence<long> InStoreMovieCopies; // sequence of MovieCopy ids struct MovieInfo { long id; string name; string director; StringList genre; StringList cast; short year; // production year short duration; // movie duration in minutes InStoreMovieCopies inStoreCopies; RentedMovieCopies rentedCopies; }; typedef sequence<MovieInfo> MatchingMovies; // Additional exception definitions for service interface exception InvalidMovieCopyIdException { }; exception InvalidCustomerIdException { }; // Definition of service interface interface RentalService { MovieInfo findMovieById(in long id) raises(NotFoundException); MatchingMovies findMovieByName(in string name); MatchingMovies findMovieByDirector(in string name); MatchingMovies findMovieByGenreAndYear(in string genre, in short year); void startRental(in long movieCopyId, in long customerId, in Date returnDate) raises(InvalidMovieCopyIdException, AlreadyRentedException, InvalidCustomerIdException); void endRental(in long movieCopyId) raises(InvalidMovieCopyIdException, NotRentedException); }; };