package com.sissi.pipeline.in;
import com.sissi.context.JIDContext;
import com.sissi.protocol.Error;
import com.sissi.protocol.Protocol;
import com.sissi.protocol.ProtocolType;
import com.sissi.protocol.error.ServerError;
import com.sissi.protocol.error.detail.Forbidden;
import com.sissi.protocol.iq.roster.RosterSubscription;
import com.sissi.ucenter.relation.roster.RosterRelation;
/**
* 订阅关系校验,至少为TO或BOTH
*
* @author kim 2014年1月26日
*/
public class CheckRelationProcessor extends ProxyProcessor {
private final Error error = new ServerError().type(ProtocolType.CANCEL).add(Forbidden.DETAIL);
private final String[] relations = new String[] { RosterSubscription.TO.toString(), RosterSubscription.BOTH.toString() };
private final boolean shortcut;
/**
* @param shortcut 是否忽略订阅关系
*/
public CheckRelationProcessor(boolean shortcut) {
super();
this.shortcut = shortcut;
}
/*
* 1, shortcut 2, Loop 3, 存在指定订阅关系
*
* @see com.sissi.pipeline.Input#input(com.sissi.context.JIDContext, com.sissi.protocol.Protocol)
*/
@Override
public boolean input(JIDContext context, Protocol protocol) {
return this.shortcut || context.jid().like(protocol.parent().getTo()) || this.ourRelation(context, protocol) ? true : this.writeAndReturn(context, protocol);
}
/**
* 订阅关系校验,至少为TO或BOTH
*
* @param context
* @param protocol
* @return
*/
protected boolean ourRelation(JIDContext context, Protocol protocol) {
return super.ourRelation(context.jid(), super.build(protocol.parent().getTo())).cast(RosterRelation.class).in(this.relations);
}
protected boolean writeAndReturn(JIDContext context, Protocol protocol) {
context.write(protocol.parent().reply().setError(this.error));
return false;
}
}