package asmack.org.jivesoftware.smackx.packet; import asmack.org.jivesoftware.smack.packet.IQ; import asmack.org.jivesoftware.smack.packet.PacketExtension; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class DiscoverInfo extends IQ { private final List<Feature> features = new CopyOnWriteArrayList(); private final List<Identity> identities = new CopyOnWriteArrayList(); private String node; public static class Feature { private String variable; public Feature(String str) { this.variable = str; } public String getVar() { return this.variable; } public String toXML() { return "<feature var=\"" + this.variable + "\"/>"; } } public static class Identity { private String category; private String name; private String type; public Identity(String str, String str2) { this.category = str; this.name = str2; } public String getCategory() { return this.category; } public String getName() { return this.name; } public String getType() { return this.type; } public void setType(String str) { this.type = str; } public String toXML() { StringBuilder sb = new StringBuilder(); sb.append("<identity category=\""); sb.append(this.category); sb.append("\""); sb.append(" name=\""); sb.append(this.name); sb.append("\""); if (this.type != null) { sb.append(" type=\""); sb.append(this.type); sb.append("\""); } sb.append("/>"); return sb.toString(); } } private void addFeature(Feature feature) { synchronized (this.features) { this.features.add(feature); } } public void addFeature(String str) { addFeature(new Feature(str)); } public void addIdentity(Identity identity) { synchronized (this.identities) { this.identities.add(identity); } } public DiscoverInfo clone() { DiscoverInfo discoverInfo = new DiscoverInfo(); discoverInfo.setNode(getNode()); synchronized (this.features) { for (Feature feature : this.features) { discoverInfo.addFeature(feature); } } synchronized (this.identities) { for (Identity identity : this.identities) { discoverInfo.addIdentity(identity); } } for (PacketExtension packetExtension : getExtensions()) { discoverInfo.addExtension(packetExtension); } return discoverInfo; } public boolean containsFeature(String str) { Iterator<Feature> features2 = getFeatures(); while (features2.hasNext()) { if (str.equals(features2.next().getVar())) { return true; } } return false; } @Override // asmack.org.jivesoftware.smack.packet.IQ public String getChildElementXML() { StringBuilder sb = new StringBuilder(); sb.append("<query xmlns=\"http://jabber.org/protocol/disco#info\""); if (getNode() != null) { sb.append(" node=\""); sb.append(getNode()); sb.append("\""); } sb.append(">"); synchronized (this.identities) { for (Identity identity : this.identities) { sb.append(identity.toXML()); } } synchronized (this.features) { for (Feature feature : this.features) { sb.append(feature.toXML()); } } sb.append(getExtensionsXML()); sb.append("</query>"); return sb.toString(); } public Iterator<Feature> getFeatures() { Iterator<Feature> it2; synchronized (this.features) { it2 = Collections.unmodifiableList(this.features).iterator(); } return it2; } public Iterator<Identity> getIdentities() { Iterator<Identity> it2; synchronized (this.identities) { it2 = Collections.unmodifiableList(this.identities).iterator(); } return it2; } public String getNode() { return this.node; } public void setNode(String str) { this.node = str; } }