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}