package com.sissi.protocol.muc; import java.util.HashSet; import java.util.Set; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElements; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlType; import com.sissi.context.JID; import com.sissi.field.Field; import com.sissi.field.Fields; import com.sissi.io.read.Collector; import com.sissi.io.read.Metadata; import com.sissi.protocol.presence.X; import com.sissi.ucenter.relation.muc.MucItem; import com.sissi.ucenter.relation.muc.status.CodeStatus; /** * @author kim 2014年2月11日 */ @Metadata(uri = XUser.XMLNS, localName = X.NAME) @XmlType(namespace = XUser.XMLNS) @XmlRootElement public class XUser extends X implements CodeStatus, Collector, Field<String> { public final static String XMLNS = "http://jabber.org/protocol/muc#user"; @SuppressWarnings("serial") private final static Set<ItemStatus> creator = new HashSet<ItemStatus>() { { add(ItemStatus.parse("201")); } }; private Set<ItemStatus> statuses; private Invite invite; private Decline decline; private Destory destory; private Password password; private boolean hidden; private Item item; private JID group; private JID jid; public XUser() { super(); } public XUser(JID group, JID jid, boolean hidden) { this.jid = jid; this.group = group; this.hidden = hidden; } public String group() { return this.group.asStringWithBare(); } public boolean loop() { return this.jid != null ? this.jid.same(this.item.getJid()) : false; } public boolean hidden() { return this.hidden; } public boolean contain() { return !this.statuses.isEmpty(); } public boolean contain(String code) { return this.statuses != null ? this.statuses.contains(ItemStatus.parse(code)) : false; } public XUser add(String code) { if (this.statuses == null) { this.statuses = new HashSet<ItemStatus>(); } this.statuses.add(ItemStatus.parse(code)); return this; } public XUser add(Set<String> codes) { for (String code : codes) { this.add(code); } return this; } public XUser clear() { if (this.statuses != null) { this.statuses.clear(); } return this; } public XUser item(Item item) { this.item = item; return this; } public XUser item(MucItem item) { if (item.getClass() == Item.class) { this.item(Item.class.cast(item)); } return this; } @XmlElement public Item getItem() { return this.item; } public XUser invite(Invite invite) { this.invite = invite; return this; } public boolean invite() { return this.getInvite() != null; } @XmlElement public Invite getInvite() { return this.invite; } @XmlElement public Decline getDecline() { return this.decline; } public boolean decline() { return this.getDecline() != null; } @XmlElement public Password getPassword() { return this.password; } public XUser password(String password) { this.password = password != null ? new Password(password) : null; return this; } public boolean password() { return this.getPassword() != null; } public XUser destory(Destory destory) { this.destory = destory; return this; } @XmlElement public Destory getDestory() { return destory; } @XmlElements({ @XmlElement(name = ItemStatus.NAME, type = ItemStatus.class) }) public Set<ItemStatus> getStatuses() { return this.statuses == null ? this.statuses : this.statuses.contains(ItemStatus.parse("201")) ? creator : this.statuses; } @Override public String getXmlns() { return XMLNS; } @Override public String getValue() { return null; } @Override public Fields getChildren() { return null; } @Override public boolean hasChild() { return false; } public <T extends CodeStatus> T cast(Class<T> clazz) { return clazz.cast(this); } @Override public void set(String localName, Object ob) { switch (localName) { case Invite.NAME: this.invite = Invite.class.cast(ob); return; case Decline.NAME: this.decline = Decline.class.cast(ob); return; case Password.NAME: this.password = Password.class.cast(ob); return; } } }