package com.gmail.dpierron.calibre.opds; import com.gmail.dpierron.calibre.configuration.Icons; import com.gmail.dpierron.calibre.datamodel.Book; import com.gmail.dpierron.calibre.datamodel.BookRating; import com.gmail.dpierron.calibre.datamodel.Option; import com.gmail.dpierron.tools.i18n.Localization; import com.gmail.dpierron.tools.i18n.LocalizationHelper; import com.gmail.dpierron.tools.Helper; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.jdom2.Element; import java.io.IOException; import java.util.*; public class RatingsSubCatalog extends BooksSubCatalog { private final static Logger logger = LogManager.getLogger(RatingsSubCatalog.class); private List<BookRating> ratings; Map<BookRating, List<Book>> mapOfBooksByRating; public RatingsSubCatalog(List<Object> stuffToFilterOut, List<Book> books) { super(stuffToFilterOut, books); setCatalogType(Constants.RATED_TYPE); } public RatingsSubCatalog(List<Book> books) { super(books); setCatalogType(Constants.RATED_TYPE); } List<BookRating> getRatings() { if (ratings == null) { ratings = new LinkedList<BookRating>(); for (Book book : getBooks()) { if (!ratings.contains(book.getRating())) ratings.add(book.getRating()); } // sort the ratings Collections.sort(ratings, new Comparator<BookRating>() { public int compare(BookRating o1, BookRating o2) { int val1 = (o1 == null ? -1 : o1.getValue()); int val2 = (o2 == null ? -1 : o2.getValue()); return new Integer(val1).compareTo(new Integer(val2)); } }); } return ratings; } private Map<BookRating, List<Book>> getMapOfBooksByRating() { if (mapOfBooksByRating == null) { mapOfBooksByRating = new HashMap<BookRating, List<Book>>(); for (Book book : getBooks()) { List<Book> books = mapOfBooksByRating.get(book.getRating()); if (books == null) { books = new LinkedList<Book>(); BookRating rating = book.getRating(); if (rating != null) mapOfBooksByRating.put(rating, books); } books.add(book); } } return mapOfBooksByRating; } public Element getCatalog(Breadcrumbs pBreadcrumbs, boolean inSubDir) throws IOException { if (Helper.isNullOrEmpty(getRatings())) return null; String filename = getCatalogBaseFolderFileName(); String title = Localization.Main.getText("rating.title"); String urn = Constants.INITIAL_URN_PREFIX + getCatalogType(); String summary = Localization.Main.getText("rating.summary", Summarizer.getBookWord(getBooks().size())); String urlExt = CatalogManager.getCatalogFileUrl(filename + Constants.XML_EXTENSION, inSubDir); Element feed = FeedHelper.getFeedRootElement(pBreadcrumbs, title, urn, urlExt, true /* inSubDir */); // list the entries (or split them) List<Element> result; result = new LinkedList<Element>(); for (int i = 0; i < BookRating.sortedRatings().length; i++) { BookRating rating = BookRating.sortedRatings()[i]; Breadcrumbs breadcrumbs = Breadcrumbs.addBreadcrumb(pBreadcrumbs, title, urlExt); Element entry = getDetailedEntry(breadcrumbs, rating, urn); if (entry != null) result.add(entry); } feed.addContent(result); createFilesFromElement(feed, filename, HtmlManager.FeedType.Catalog, true); String urlInItsSubfolder = CatalogManager.getCatalogFileUrl(filename + Constants.XML_EXTENSION, inSubDir); Element result2 = FeedHelper.getCatalogEntry(title, urn, urlInItsSubfolder, summary, // #751211: Use external icons option useExternalIcons ? getIconPrefix(inSubDir) + Icons.ICONFILE_RATING : Icons.ICON_RATING); return result2; } /** * * @param pBreadcrumbs * @param ratingObject * @param opts * @return * @throws IOException */ // public Element getRatingEntry(Breadcrumbs pBreadcrumbs, BookRating rating, String baseurn) throws IOException { public Element getDetailedEntry(Breadcrumbs pBreadcrumbs, BookRating rating, Object... opts) throws IOException { assert opts[0] != null && opts[0].getClass().equals(String.class); String baseurn = (String)opts[0]; List<Book> books = getMapOfBooksByRating().get(rating); if (Helper.isNullOrEmpty(books)) return null; boolean inSubDir = getCatalogLevel().length() > 0 || pBreadcrumbs.size() > 1; if (books == null) books = new LinkedList<Book>(); String filename = getCatalogBaseFolderFileName() + Constants.TYPE_SEPARATOR + rating.getId(); String title = LocalizationHelper.getEnumConstantHumanName(rating); String urn = baseurn + Constants.URN_SEPARATOR + rating.getId(); // sort books by title BooksSubCatalog.sortBooksByTitle(getBooks()); // try and list the items to make the summary String summary = Summarizer.summarizeBooks(books); // logger.trace("getAuthor Breadcrumbs=" + pBreadcrumbs.toString()); SplitOption splitOption = maxSplitLevels > 0 ? SplitOption.SplitByLetter : SplitOption.Paginate; Element result = getListOfBooks(pBreadcrumbs, books, true, 0, title, summary, urn, filename, splitOption, // #751211: Use external icons option useExternalIcons ? getIconPrefix(inSubDir) + Icons.ICONFILE_RATING : Icons.ICON_RATING, null, Option.DONOTINCLUDE_RATING); rating.setDone(); return result; } }