1package im.conversations.android.xmpp.model.rsm;
2
3import com.google.common.base.Strings;
4import im.conversations.android.annotation.XmlElement;
5import im.conversations.android.xmpp.Page;
6import im.conversations.android.xmpp.Range;
7import im.conversations.android.xmpp.model.Extension;
8
9@XmlElement
10public class Set extends Extension {
11
12 public Set() {
13 super(Set.class);
14 }
15
16 public static Set of(final Range range, final Integer max) {
17 final var set = new Set();
18 if (range.order == Range.Order.NORMAL) {
19 final var after = set.addExtension(new After());
20 after.setContent(range.id);
21 } else if (range.order == Range.Order.REVERSE) {
22 final var before = set.addExtension(new Before());
23 before.setContent(range.id);
24 } else {
25 throw new IllegalArgumentException("Invalid order");
26 }
27 if (max != null) {
28 set.addExtension(new Max()).setMax(max);
29 }
30 return set;
31 }
32
33 public Page asPage() {
34 final var first = this.getExtension(First.class);
35 final var last = this.getExtension(Last.class);
36
37 final var firstId = first == null ? null : first.getContent();
38 final var lastId = last == null ? null : last.getContent();
39 if (Strings.isNullOrEmpty(firstId) || Strings.isNullOrEmpty(lastId)) {
40 throw new IllegalStateException("Invalid page. Missing first or last");
41 }
42 return new Page(firstId, lastId, this.getCount());
43 }
44
45 public boolean isEmpty() {
46 final var first = this.getExtension(First.class);
47 final var last = this.getExtension(Last.class);
48 return first == null && last == null;
49 }
50
51 public Integer getCount() {
52 final var count = this.getExtension(Count.class);
53 return count == null ? null : count.getCount();
54 }
55}