*/
public abstract Image getCover(String luid) throws IOException;
+ // TODO: ensure it is the main used interface
+ public synchronized MetaResultList getList(Progress pg) throws IOException {
+ return new MetaResultList(getMetas(pg));
+ }
+
+ //TODO: make something for (normal and custom) not-story covers
+
/**
* Return the cover image associated to this source.
* <p>
/**
* Return the list of stories (represented by their {@link MetaData}, which
* <b>MAY</b> not have the cover included).
+ * <p>
+ * The returned list <b>MUST</b> be a copy, not the original one.
*
* @param pg
* the optional {@link Progress}
}
/**
- * List all the stories of the given source type in the {@link BasicLibrary}
- * , or all the stories if NULL is passed as a type.
+ * List all the stories of the given source type in the {@link BasicLibrary} ,
+ * or all the stories if NULL is passed as a type.
* <p>
* Cover images not included.
*
- * @param type
- * the type of story to retrieve, or NULL for all
+ * @param source the type of story to retrieve, or NULL for all
*
* @return the stories
*
- * @throws IOException
- * in case of IOException
+ * @throws IOException in case of IOException
+ *
+ * @deprecated use {@link BasicLibrary#getList(Progress)} and
+ * {@link MetaResultList#filter(List, List, List)}
*/
- public synchronized List<MetaData> getListBySource(String type)
- throws IOException {
- List<MetaData> list = new ArrayList<MetaData>();
- for (MetaData meta : getMetas(null)) {
- String storyType = meta.getSource();
- if (type == null || type.equalsIgnoreCase(storyType)) {
- list.add(meta);
- }
+ @Deprecated
+ public synchronized List<MetaData> getListBySource(String source) throws IOException {
+ List<String> sources = null;
+ if (source != null) {
+ sources = new ArrayList<String>();
+ sources.add(source);
}
- Collections.sort(list);
- return list;
+ return getList(null).filter(sources, null, null);
}
/**
*
* @throws IOException
* in case of IOException
+ *
+ * @deprecated use {@link BasicLibrary#getList(Progress)} and
+ * {@link MetaResultList#filter(List, List, List)}
*/
- public synchronized List<MetaData> getListByAuthor(String author)
- throws IOException {
- List<MetaData> list = new ArrayList<MetaData>();
- for (MetaData meta : getMetas(null)) {
- String storyAuthor = meta.getAuthor();
- if (author == null || author.equalsIgnoreCase(storyAuthor)) {
- list.add(meta);
- }
+ public synchronized List<MetaData> getListByAuthor(String author) throws IOException {
+ List<String> authors = null;
+ if (author != null) {
+ authors = new ArrayList<String>();
+ authors.add(author);
}
- Collections.sort(list);
- return list;
+ return getList(null).filter(null, authors, null);
}
/**
--- /dev/null
+package be.nikiroo.fanfix.library;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import be.nikiroo.fanfix.data.MetaData;
+
+public class MetaResultList {
+ private List<MetaData> metas;
+
+ // Lazy lists:
+ // TODO: sync-protect them?
+ private List<String> sources;
+ private List<String> authors;
+ private List<String> tags;
+
+ // can be null (will consider it empty)
+ public MetaResultList(List<MetaData> metas) {
+ if (metas == null) {
+ metas = new ArrayList<MetaData>();
+ }
+
+ Collections.sort(metas);
+ this.metas = metas;
+ }
+
+ // not NULL
+ // sorted
+ public List<MetaData> getMetas() {
+ return metas;
+ }
+
+ public List<String> getSources() {
+ if (sources == null) {
+ sources = new ArrayList<String>();
+ for (MetaData meta : metas) {
+ if (!sources.contains(meta.getSource()))
+ sources.add(meta.getSource());
+ }
+ }
+
+ return sources;
+ }
+
+ // A -> (A), A/ -> (A, A/*) if we can find something for "*"
+ public List<String> getSources(String source) {
+ List<String> linked = new ArrayList<String>();
+ if (source != null && !source.isEmpty()) {
+ if (!source.endsWith("/")) {
+ linked.add(source);
+ } else {
+ linked.add(source.substring(0, source.length() - 1));
+ for (String src : getSources()) {
+ if (src.startsWith(source)) {
+ linked.add(src);
+ }
+ }
+ }
+ }
+
+ return linked;
+ }
+
+ public List<String> getAuthors() {
+ if (authors == null) {
+ authors = new ArrayList<String>();
+ for (MetaData meta : metas) {
+ if (!authors.contains(meta.getAuthor()))
+ authors.add(meta.getAuthor());
+ }
+ }
+
+ return authors;
+ }
+
+ public List<String> getTags() {
+ if (tags == null) {
+ tags = new ArrayList<String>();
+ for (MetaData meta : metas) {
+ for (String tag : meta.getTags()) {
+ if (!tags.contains(tag))
+ tags.add(tag);
+ }
+ }
+ }
+
+ return authors;
+ }
+
+ // null or empty -> no check, rest = must be included
+ // source: a source ending in "/" means "this or any source starting with this",
+ // i;e., to enable source hierarchy
+ // + sorted
+ public List<MetaData> filter(List<String> sources, List<String> authors, List<String> tags) {
+ if (sources != null && sources.isEmpty())
+ sources = null;
+ if (authors != null && authors.isEmpty())
+ authors = null;
+ if (tags != null && tags.isEmpty())
+ tags = null;
+
+ // Quick check
+ if (sources == null && authors == null && tags == null) {
+ return metas;
+ }
+
+ // allow "sources/" hierarchy
+ if (sources != null) {
+ List<String> folders = new ArrayList<String>();
+ List<String> leaves = new ArrayList<String>();
+ for (String source : sources) {
+ if (source.endsWith("/")) {
+ if (!folders.contains(source))
+ folders.add(source);
+ } else {
+ if (!leaves.contains(source))
+ leaves.add(source);
+ }
+ }
+
+ sources = leaves;
+ for (String folder : folders) {
+ for (String otherLeaf : getSources(folder)) {
+ if (!sources.contains(otherLeaf)) {
+ sources.add(otherLeaf);
+ }
+ }
+ }
+ }
+
+ List<MetaData> result = new ArrayList<MetaData>();
+ for (MetaData meta : metas) {
+ if (sources != null && !sources.contains(meta.getSource())) {
+ continue;
+ }
+ if (authors != null && !authors.contains(meta.getAuthor())) {
+ continue;
+ }
+
+ if (tags != null) {
+ boolean keep = false;
+ for (String thisTag : meta.getTags()) {
+ if (tags.contains(thisTag))
+ keep = true;
+ }
+
+ if (!keep)
+ continue;
+ }
+
+ result.add(meta);
+ }
+
+ Collections.sort(result);
+ return result;
+ }
+}