package com.gmail.dpierron.calibre.opds; import com.gmail.dpierron.calibre.configuration.ConfigurationManager; import com.gmail.dpierron.calibre.datamodel.Author; import com.gmail.dpierron.calibre.datamodel.Book; import com.gmail.dpierron.calibre.datamodel.Series; import com.gmail.dpierron.calibre.datamodel.Tag; import com.gmail.dpierron.tools.i18n.Localization; import com.gmail.dpierron.tools.Composite; import com.gmail.dpierron.tools.TreeNode; import java.util.Collection; import java.util.Iterator; import java.util.List; public class Summarizer { public static int getPageNumber(int itemNumber) { double pageSize = ConfigurationManager.getCurrentProfile().getMaxBeforePaginate(); double dItemNumber = itemNumber; double result = dItemNumber / pageSize; return (int) Math.ceil(result); } public static String summarizeBooks(List elements) { InternalSummarizer summarizer = new InternalSummarizer() { @Override String getWord(int itemsCount) { return getBookWord(itemsCount); } @Override String getTitle(Object o) { return ((Book) o).getTitle(); } }; return summarizer.summarize(elements); } public static String summarizeTags(List elements) { InternalSummarizer summarizer = new InternalSummarizer() { @Override String getWord(int itemsCount) { return getTagWord(itemsCount); } @Override String getTitle(Object o) { return ((Tag) o).getName(); } }; return summarizer.summarize(elements); } public static String summarizeTagLevels(List elements) { InternalSummarizer summarizer = new InternalSummarizer() { @Override String getWord(int itemsCount) { return getTagLevelWord(itemsCount); } @Override String getTitle(Object o) { return ((TreeNode) o).getId(); } }; return summarizer.summarize(elements); } public static String summarizeAuthors(List elements) { InternalSummarizer summarizer = new InternalSummarizer() { @Override String getWord(int itemsCount) { return getAuthorWord(itemsCount); } @Override String getTitle(Object o) { // return ((Author) o).getLastName(); return ConfigurationManager.getCurrentProfile().getDisplayAuthorSort() ? ((Author) o).getSort() : ((Author) o).getName(); } }; return summarizer.summarize(elements); } public static String summarizeSeries(List elements) { InternalSummarizer summarizer = new InternalSummarizer() { @Override String getWord(int itemsCount) { return getSeriesWord(itemsCount); } @Override String getTitle(Object o) { return ((Series) o).getName(); } }; return summarizer.summarize(elements); } public static String getBookWord(int nb) { if (nb == 0) return Localization.Main.getText("bookword.none"); else if (nb == 1) return Localization.Main.getText("bookword.one"); else return Localization.Main.getText("bookword.many", nb); } public static String getAuthorWord(int nb) { if (nb == 0) return Localization.Main.getText("authorword.none"); else if (nb == 1) return Localization.Main.getText("authorword.one"); else return Localization.Main.getText("authorword.many", nb); } public static String getTagLevelWord(int nb) { if (nb == 0) return Localization.Main.getText("taglevelword.none"); else if (nb == 1) return Localization.Main.getText("taglevelword.one"); else return Localization.Main.getText("taglevelword.many", nb); } public static String getSeriesWord(int nb) { if (nb == 0) return Localization.Main.getText("seriesword.none"); else if (nb == 1) return Localization.Main.getText("seriesword.one"); else return Localization.Main.getText("seriesword.many", nb); } public static String getTagWord(int nb) { if (nb == 0) return Localization.Main.getText("tagword.none"); else if (nb == 1) return Localization.Main.getText("tagword.one"); else return Localization.Main.getText("tagword.many", nb); } private static abstract class InternalSummarizer { abstract String getWord(int itemsCount); abstract String getTitle(Object o); public Composite<Integer, String> concatenateListWhileShortening(String separator, Collection toConcatenate, int maxSize) { Composite<Integer, String> badResult = new Composite<Integer, String>(0, null); try { if (toConcatenate == null || toConcatenate.size() == 0) return badResult; StringBuffer lines = new StringBuffer(); String theSeparator = (separator == null ? ", " : separator); Iterator iter = toConcatenate.iterator(); int howMuch = 0; while (iter.hasNext() && lines.length() < maxSize) { Object o = iter.next(); String result = null; result = getTitle(o); if (result == null) result = o.toString(); if (lines.length() < (maxSize - result.length())) { lines.append(result); howMuch++; if (iter.hasNext() && lines.length() < (maxSize - theSeparator.length())) lines.append(theSeparator); } else { lines.append("..."); break; } } return new Composite<Integer, String>(howMuch, lines.toString()); } catch (RuntimeException e) { return badResult; } } public String summarize(List elements) { return summarize(elements, false); } public String summarize(List elements, boolean includePagesCount) { if (elements == null) return ""; int itemsCount = elements.size(); // try and list the items to make the summary Composite<Integer, String> shortList = concatenateListWhileShortening(", ", elements, ConfigurationManager.getCurrentProfile().getMaxSummaryLength()); int shortListItemCount = shortList.getFirstElement(); String summary = shortList.getSecondElement(); if (shortListItemCount < itemsCount) { // too many items in this list, we cannot simply list them String itemsCountSummary = getWord(itemsCount); summary = itemsCountSummary; if (includePagesCount) { int maxPages = getPageNumber(itemsCount); if (maxPages > 1) summary = Localization.Main.getText("title.numberOfPages", itemsCountSummary, maxPages); } } return summary; } } }