X-Git-Url: https://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FMetaResultList.java;fp=src%2Fbe%2Fnikiroo%2Ffanfix%2Flibrary%2FMetaResultList.java;h=3aa167f99e16e44ce8fd36d51362bfbf3269a029;hb=1f2a7d5fe14f98b5dd762207eeaff90494fe102e;hp=0000000000000000000000000000000000000000;hpb=d66deb8d8b30cff6b54db352eef34a3508939f84;p=fanfix.git diff --git a/src/be/nikiroo/fanfix/library/MetaResultList.java b/src/be/nikiroo/fanfix/library/MetaResultList.java new file mode 100644 index 0000000..3aa167f --- /dev/null +++ b/src/be/nikiroo/fanfix/library/MetaResultList.java @@ -0,0 +1,158 @@ +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 metas; + + // Lazy lists: + // TODO: sync-protect them? + private List sources; + private List authors; + private List tags; + + // can be null (will consider it empty) + public MetaResultList(List metas) { + if (metas == null) { + metas = new ArrayList(); + } + + Collections.sort(metas); + this.metas = metas; + } + + // not NULL + // sorted + public List getMetas() { + return metas; + } + + public List getSources() { + if (sources == null) { + sources = new ArrayList(); + 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 getSources(String source) { + List linked = new ArrayList(); + 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 getAuthors() { + if (authors == null) { + authors = new ArrayList(); + for (MetaData meta : metas) { + if (!authors.contains(meta.getAuthor())) + authors.add(meta.getAuthor()); + } + } + + return authors; + } + + public List getTags() { + if (tags == null) { + tags = new ArrayList(); + 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 filter(List sources, List authors, List 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 folders = new ArrayList(); + List leaves = new ArrayList(); + 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 result = new ArrayList(); + 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; + } +}