package com.sissi.pipeline.in.presence.roster;
import java.util.UUID;
import com.sissi.context.JID;
import com.sissi.context.JIDContext;
import com.sissi.pipeline.in.ProxyProcessor;
import com.sissi.protocol.Protocol;
import com.sissi.protocol.ProtocolType;
import com.sissi.protocol.iq.IQ;
import com.sissi.protocol.iq.roster.GroupItem;
import com.sissi.protocol.iq.roster.Roster;
import com.sissi.protocol.iq.roster.RosterSubscription;
import com.sissi.protocol.presence.Presence;
import com.sissi.protocol.presence.PresenceType;
import com.sissi.ucenter.relation.roster.RosterRelation;
/**
* 自动批准,自身已订阅.</p>1,名册推送 2,Presence type = subscribed 3,To所有资源对当前JID上线
*
* @author kim 2014年1月24日
*/
public class PresenceRosterSubscribe2ReplySelfsProcessor extends ProxyProcessor {
private final String[] relations = new String[] { RosterSubscription.TO.toString(), RosterSubscription.BOTH.toString() };
@Override
public boolean input(JIDContext context, Protocol protocol) {
JID to = super.build(protocol.getTo());
return super.ourRelation(context.jid(), to).cast(RosterRelation.class).in(this.relations) ? this.writeAndReturn(context, to, protocol.cast(Presence.class)) : true;
}
private boolean writeAndReturn(JIDContext context, JID to, Presence presence) {
this.writeRoster(context, to).writeSubscribed(context, to, presence).writeAvailable(context, to, presence);
return false;
}
private PresenceRosterSubscribe2ReplySelfsProcessor writeRoster(JIDContext context, JID to) {
super.broadcast(context.jid(), new IQ().setId(UUID.randomUUID().toString()).add(new Roster(new GroupItem(super.ourRelation(context.jid(), to).cast(RosterRelation.class)))).setType(ProtocolType.SET));
return this;
}
private PresenceRosterSubscribe2ReplySelfsProcessor writeSubscribed(JIDContext context, JID to, Presence presence) {
super.broadcast(context.jid(), presence.type(PresenceType.SUBSCRIBED).setFrom(to.asStringWithBare()));
return this;
}
private PresenceRosterSubscribe2ReplySelfsProcessor writeAvailable(JIDContext context, JID to, Presence presence) {
for (JID resource : super.resources(to)) {
super.broadcast(context.jid(), presence.type(PresenceType.AVAILABLE).setFrom(resource).clauses(super.findOne(resource, true).status().clauses()));
}
return this;
}
}