package be.nikiroo.fanfix.library; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; 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()); } sort(sources); } 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); } } } } sort(linked); return linked; } public List getAuthors() { if (authors == null) { authors = new ArrayList(); for (MetaData meta : metas) { if (!authors.contains(meta.getAuthor())) authors.add(meta.getAuthor()); } sort(authors); } 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); } } sort(tags); } return tags; } // helper public List filter(String source, String author, String tag) { List sources = source == null ? null : Arrays.asList(source); List authors = author == null ? null : Arrays.asList(author); List tags = tag == null ? null : Arrays.asList(tag); return filter(sources, authors, tags); } // 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; } /** * Sort the given {@link String} values, ignoring case. * * @param values * the values to sort */ private void sort(List values) { Collections.sort(values, new Comparator() { @Override public int compare(String o1, String o2) { return ("" + o1).compareToIgnoreCase("" + o2); } }); } }