package com.gmail.dpierron.calibre.opds; /** * Class for defining methods that define a tag sub catalog */ import com.gmail.dpierron.calibre.configuration.Icons; import com.gmail.dpierron.calibre.datamodel.Book; import com.gmail.dpierron.calibre.datamodel.DataModel; import com.gmail.dpierron.calibre.datamodel.Tag; import com.gmail.dpierron.tools.i18n.Localization; import com.gmail.dpierron.calibre.trook.TrookSpecificSearchDatabaseManager; 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 TagListSubCatalog extends TagsSubCatalog { private final static Logger logger = LogManager.getLogger(TagListSubCatalog.class); public TagListSubCatalog(List<Object> stuffToFilterOut, List<Book> books) { super(stuffToFilterOut, books); setCatalogType(Constants.TAGLIST_TYPE); } public TagListSubCatalog(List<Book> books) { super(books); setCatalogType(Constants.TAGLIST_TYPE); } @Override //Composite<Element, String> getCatalog(Breadcrumbs pBreadcrumbs, boolean inSubDir) throws IOException { Element getCatalog(Breadcrumbs pBreadcrumbs, boolean inSubDir) throws IOException { return getListOfTags(pBreadcrumbs, getTags(), pBreadcrumbs.size() > 1, 0, Localization.Main.getText("tags.title"), getTags().size() > 1 ? Localization.Main.getText("tags.alphabetical", getTags().size()) : (getTags().size() == 1 ? Localization.Main.getText("authors.alphabetical.single") : "") , Constants.INITIAL_URN_PREFIX + getCatalogType() + getCatalogLevel(), getCatalogBaseFolderFileName(), null); } // private Composite<Element, String> getListOfTags( private Element getListOfTags( Breadcrumbs pBreadcrumbs, List<Tag> listTags, boolean inSubDir, int from, String title, String summary, String urn, String pFilename, SplitOption splitOption) throws IOException { if (listTags == null) listTags = getTags(); if (listTags.size() == 0) { if (logger.isDebugEnabled()) logger.debug("getSubCatalog: Return 'null' as no tag entries found"); return null; } if (from != 0) inSubDir = true; if (pBreadcrumbs.size() > 1) inSubDir = true; int pageNumber = Summarizer.getPageNumber(from + 1); int catalogSize; String filename = pFilename + Constants.PAGE_DELIM + pageNumber ; logger.debug("getListOfTags: generating " + filename); Map<String, List<Tag>> mapOfTagsByLetter = null; String urlExt = optimizeCatalogURL(CatalogManager.getCatalogFileUrl(filename + Constants.XML_EXTENSION, inSubDir)); Element feed = FeedHelper.getFeedRootElement(pBreadcrumbs, title, urn, urlExt, true /*inSubDir*/); if (splitOption == null) { splitOption = ((maxSplitLevels > 0) && (from == 0)) ? SplitOption.SplitByLetter : SplitOption.Paginate; if (logger.isTraceEnabled()) logger.trace("getListOfTags: splitOption was null - set to " + splitOption); } // andle special case where split-by-letter depth exceeds tag name length if (splitOption == SplitOption.SplitByLetter) { while (listTags.size() > 0 && pFilename.toUpperCase().endsWith(Constants.TYPE_SEPARATOR + listTags.get(0).getName().toUpperCase())) { Tag tag = listTags.get(0); listTags.remove(0); Element element; Breadcrumbs breadcrumbs = Breadcrumbs.addBreadcrumb(pBreadcrumbs, title, urlExt); element = getDetailedEntry(breadcrumbs, tag, urn, ""); assert element != null; if (element != null) { feed.addContent(element); } } } boolean willSplitByLetter = checkSplitByLetter(splitOption, listTags.size()); if (willSplitByLetter) { mapOfTagsByLetter = DataModel.splitTagsByLetter(listTags); catalogSize = 0; } else catalogSize = listTags.size(); int maxPages = Summarizer.getPageNumber(catalogSize); // list the entries (or split them) List<Element> result; if (willSplitByLetter && listTags.size() > 1) { Breadcrumbs breadcrumbs = Breadcrumbs.addBreadcrumb(pBreadcrumbs, title, urlExt); logger.debug("calling getListOfTagsSplitByLetter"); result = getListOfTagsSplitByLetter(breadcrumbs, mapOfTagsByLetter, inSubDir, title, urn, pFilename); } else { logger.debug("no split by letter"); result = new LinkedList<Element>(); for (int i = from; i < listTags.size(); i++) { if ((splitOption != SplitOption.DontSplitNorPaginate) && ((i - from) >= maxBeforePaginate)) { Element nextLink = getListOfTags(pBreadcrumbs, listTags, inSubDir, i, title, summary, urn, pFilename, splitOption != SplitOption.DontSplitNorPaginate ? SplitOption.Paginate : splitOption)/*.getFirstElement()*/; result.add(0, nextLink); break; } else { Tag tag = listTags.get(i); Breadcrumbs breadcrumbs = Breadcrumbs.addBreadcrumb(pBreadcrumbs, title, urlExt); logger.debug("getObjectEntry:" + tag); Element entry = getDetailedEntry(breadcrumbs, tag, urn, null); if (entry != null) { logger.debug("adding tag to the TROOK database:" + tag); result.add(entry); TrookSpecificSearchDatabaseManager.addTag(tag, entry); } } } // End of tags for loop } feed.addContent(result); Element entry; entry = createPaginateLinks(feed, filename, pageNumber, maxPages); createFilesFromElement(feed, filename, HtmlManager.FeedType.Catalog, true); if (from == 0) { if (logger.isDebugEnabled()) logger.trace("getListOfTags" + pBreadcrumbs.toString()); if (title.equals("Science Fiction")) { int x = 1; } entry = FeedHelper.getCatalogEntry(title, urn, urlExt, summary, useExternalIcons ? getIconPrefix(inSubDir) + Icons.ICONFILE_TAGS : Icons.ICON_TAGS); } return entry; } private List<Element> getListOfTagsSplitByLetter(Breadcrumbs pBreadcrumbs, Map<String, List<Tag>> mapOfTagsByLetter, boolean inSubDir, String baseTitle, String baseUrn, String baseFilename) throws IOException { if (Helper.isNullOrEmpty(mapOfTagsByLetter)) return null; if (pBreadcrumbs.size() > 1) inSubDir = true; String sTitle = baseTitle; if (Helper.isNotNullOrEmpty(sTitle)) sTitle += ", "; List<Element> result = new LinkedList<Element>(); SortedSet<String> letters = new TreeSet<String>(mapOfTagsByLetter.keySet()); // assert baseFilename.endsWith(Constants.XML_EXTENSION); for (String letter : letters) { String letterFilename = Helper.getSplitString(baseFilename,letter, Constants.TYPE_SEPARATOR); String letterUrn = Helper.getSplitString(baseUrn,letter,Constants.URN_SEPARATOR); String letterTitle; if (letter.equals("_")) letterTitle = Localization.Main.getText("splitByLetter.tag.other"); else letterTitle = Localization.Main.getText("splitByLetter.letter", Localization.Main.getText("tagword.title"), letter.length() > 1 ? letter.substring(0,1) + letter.substring(1).toLowerCase() : letter); List<Tag> tagsInThisLetter = mapOfTagsByLetter.get(letter); String summary = Summarizer.summarizeTags(tagsInThisLetter); Element element = null; if (tagsInThisLetter.size() > 0) { logger.debug("calling getListOfTags for the letter " + letter); element = getListOfTags(pBreadcrumbs, tagsInThisLetter, inSubDir, 0, letterTitle, summary, letterUrn, letterFilename, checkSplitByLetter(letter))/*.getFirstElement()*/; } if (element != null) result.add(element); } return result; } }