package com.sissi.protocol.iq.register;
import java.util.Iterator;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
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.field.Field;
import com.sissi.field.Fields;
import com.sissi.field.impl.BeanFields;
import com.sissi.io.read.Collector;
import com.sissi.io.read.Metadata;
import com.sissi.protocol.Protocol;
import com.sissi.protocol.iq.data.XData;
import com.sissi.protocol.iq.register.simple.Password;
import com.sissi.protocol.iq.register.simple.Redirect;
import com.sissi.protocol.iq.register.simple.Registered;
import com.sissi.protocol.iq.register.simple.Username;
/**
* @author kim 2013年12月3日
*/
@Metadata(uri = Register.XMLNS, localName = Register.NAME)
@XmlType(namespace = Register.XMLNS)
@XmlRootElement(name = Register.NAME)
public class Register extends Protocol implements Fields, Collector {
public final static String XMLNS = "jabber:iq:register";
public final static String NAME = "query";
private final BeanFields fields = new BeanFields(true);
private String instructions;
private Remove remove;
public Register() {
}
public Register(String instructions) {
this();
this.instructions = instructions;
}
public boolean form(boolean needForm) {
return (this.fields.findField(XData.NAME, XData.class) != null) == needForm;
}
@XmlElement
public String getInstructions() {
return this.instructions;
}
@XmlAttribute
public String getXmlns() {
return XMLNS;
}
public Register add(Field<?> field) {
this.fields.add(field);
return this;
}
public Register add(Fields fields) {
this.fields.add(fields);
return this;
}
public boolean valid() {
return this.remove() ^ !this.fields.isEmpty();
}
public boolean remove() {
return this.getRemove() != null;
}
@XmlElement
public Remove getRemove() {
return this.remove;
}
@XmlElements({ @XmlElement(name = XData.NAME, type = XData.class), @XmlElement(name = Username.NAME, type = Username.class), @XmlElement(name = Password.NAME, type = Password.class), @XmlElement(name = Registered.NAME, type = Registered.class), @XmlElement(name = Redirect.NAME, type = Redirect.class) })
public List<Field<?>> getFields() {
return this.fields.getFields();
}
public void set(String localName, Object ob) {
switch (localName) {
case Remove.NAME:
this.remove = Remove.class.cast(ob);
return;
default:
this.fields.add(Field.class.cast(ob));
return;
}
}
public Register clear() {
this.fields.reset();
return this;
}
@Override
public Iterator<Field<?>> iterator() {
return this.fields.iterator();
}
@Override
public boolean isEmbed() {
return this.fields.isEmbed();
}
public boolean isEmpty() {
return this.fields.isEmpty();
}
public Fields findFields(String name) {
return this.fields.findFields(name);
}
@Override
public <T extends Field<?>> T findField(String name, Class<T> clazz) {
return this.fields.findField(name, clazz);
}
}