1package im.conversations.android.xmpp.model;
2
3import com.google.common.base.Preconditions;
4import com.google.common.collect.Collections2;
5import com.google.common.collect.Iterables;
6
7import eu.siacs.conversations.xml.Element;
8
9import im.conversations.android.xmpp.ExtensionFactory;
10
11import java.util.Collection;
12
13public class Extension extends Element {
14
15 private Extension(final ExtensionFactory.Id id) {
16 super(id.name, id.namespace);
17 }
18
19 public Extension(final Class<? extends Extension> clazz) {
20 this(
21 Preconditions.checkNotNull(
22 ExtensionFactory.id(clazz),
23 String.format(
24 "%s does not seem to be annotated with @XmlElement",
25 clazz.getName())));
26 Preconditions.checkArgument(
27 getClass().equals(clazz), "clazz passed in constructor must match class");
28 }
29
30 public <E extends Extension> boolean hasExtension(final Class<E> clazz) {
31 return Iterables.any(getChildren(), clazz::isInstance);
32 }
33
34 public <E extends Extension> E getExtension(final Class<E> clazz) {
35 final var extension = Iterables.find(getChildren(), clazz::isInstance, null);
36 if (extension == null) {
37 return null;
38 }
39 return clazz.cast(extension);
40 }
41
42 public <E extends Extension> Collection<E> getExtensions(final Class<E> clazz) {
43 return Collections2.transform(
44 Collections2.filter(getChildren(), clazz::isInstance), clazz::cast);
45 }
46
47 public Collection<ExtensionFactory.Id> getExtensionIds() {
48 return Collections2.transform(
49 getChildren(), c -> new ExtensionFactory.Id(c.getName(), c.getNamespace()));
50 }
51
52 public <T extends Extension> T addExtension(T child) {
53 this.addChild(child);
54 return child;
55 }
56
57 public void addExtensions(final Collection<? extends Extension> extensions) {
58 for (final Extension extension : extensions) {
59 addExtension(extension);
60 }
61 }
62}