Extension.java

 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}