package com.sissi.pipeline.in.iq;
import java.util.Set;
import com.sissi.context.JIDContext;
import com.sissi.pipeline.Input;
import com.sissi.pipeline.InputFinder;
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.IQ;
/**
* @author kim 2013-10-24
*/
public class IQForkProcessor implements Input {
private final Error error = new ServerError().type(ProtocolType.AUTH).add(Forbidden.DETAIL);
private final Set<Class<? extends Protocol>> ignores;
private final InputFinder finder;
private final Input noChild;
/**
* @param ignores 忽略context.auth的IQ子节
* @param finder
* @param noChild 如果不存在匹配
*/
public IQForkProcessor(Set<Class<? extends Protocol>> ignores, InputFinder finder, Input noChild) {
super();
this.finder = finder;
this.noChild = noChild;
this.ignores = ignores;
}
@Override
public boolean input(JIDContext context, Protocol protocol) {
for (Protocol sub : protocol.cast(IQ.class).list()) {
return (context.auth() || this.ignores.contains(sub.getClass())) ? this.finder.find(sub).input(context, sub) : this.writeAndReturn(context, protocol);
}
return this.noChild.input(context, protocol);
}
private boolean writeAndReturn(JIDContext context, Protocol protocol) {
context.write(protocol.parent().reply().setError(this.error));
return false;
}
}