1package im.conversations.android.xmpp.model.pubsub;
 2
 3import com.google.common.base.Strings;
 4import com.google.common.collect.ImmutableMap;
 5import com.google.common.collect.Iterables;
 6import im.conversations.android.xmpp.model.Extension;
 7import im.conversations.android.xmpp.model.pubsub.event.Retract;
 8import java.util.Collection;
 9import java.util.Map;
10import java.util.NoSuchElementException;
11
12public interface Items {
13
14    Collection<? extends Item> getItems();
15
16    String getNode();
17
18    Collection<Retract> getRetractions();
19
20    default <T extends Extension> Map<String, T> getItemMap(final Class<T> clazz) {
21        final ImmutableMap.Builder<String, T> builder = ImmutableMap.builder();
22        for (final Item item : getItems()) {
23            final var id = item.getId();
24            final T extension = item.getExtension(clazz);
25            if (extension == null || Strings.isNullOrEmpty(id)) {
26                continue;
27            }
28            builder.put(id, extension);
29        }
30        return builder.buildKeepingLast();
31    }
32
33    default <T extends Extension> T getItemOrThrow(final String id, final Class<T> clazz) {
34        final var map = getItemMap(clazz);
35        final var item = map.get(id);
36        if (item == null) {
37            throw new NoSuchElementException(
38                    String.format("An item with id %s does not exist", id));
39        }
40        return item;
41    }
42
43    default <T extends Extension> T getFirstItem(final Class<T> clazz) {
44        final var map = getItemMap(clazz);
45        return Iterables.getFirst(map.values(), null);
46    }
47
48    default <T extends Extension> Map.Entry<String, T> getFirstItemWithId(final Class<T> clazz) {
49        final var entries = getItemMap(clazz).entrySet();
50        return Iterables.getFirst(entries, null);
51    }
52
53    default <T extends Extension> T getOnlyItem(final Class<T> clazz) {
54        final var map = getItemMap(clazz);
55        return Iterables.getOnlyElement(map.values());
56    }
57}