package com.sissi.context.impl; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.Collection; import com.sissi.context.JID; import com.sissi.context.JIDContext; import com.sissi.context.JIDContextBuilder; import com.sissi.context.JIDContextParam; import com.sissi.context.Status; import com.sissi.context.StatusClauses; import com.sissi.pipeline.Output; import com.sissi.protocol.Element; import com.sissi.protocol.presence.PresenceType; import com.sissi.ucenter.vcard.VCardContext; /** * 离线JIDContext * * @author kim 2013-11-19 */ public class OfflineContextBuilder implements JIDContextBuilder { private final SocketAddress address = new InetSocketAddress(InetAddress.getByName("0.0.0.0"), 0); private final int priority = -1; private final VCardContext vCardContext; private final String domain; private final Output output; private final String lang; /** * @param lang 默认语言 * @param domain 默认域 * @param output * @param vCardContext * @throws Exception */ public OfflineContextBuilder(String lang, String domain, Output output, VCardContext vCardContext) throws Exception { super(); this.lang = lang; this.domain = domain; this.output = output; this.vCardContext = vCardContext; } @Override public JIDContext build(JID jid, JIDContextParam param) { return new OfflineContext(jid); } private class OfflineContext implements JIDContext { private final JID jid; private final Status status; /** * 使用VCard加载离线签名及最后活跃时间 * * @param jid */ public OfflineContext(JID jid) { this.status = new OfflineStatus(new OfflineStatusClauses(OfflineContextBuilder.this.vCardContext.pull(jid, VCardContext.FIELD_SIGNATURE).getValue())); this.jid = jid; } public long index() { return -1; } @Override public JIDContext auth(boolean canAccess) { return this; } @Override public boolean auth() { return false; } public boolean authRetry() { return false; } public JIDContext bind() { return this; } public boolean binding() { return false; } @Override public JIDContext jid(JID jid) { return this; } @Override public JID jid() { return this.jid; } @Override public Status status() { return this.status; } @Override public JIDContext priority(int priority) { return this; } @Override public int priority() { return OfflineContextBuilder.this.priority; } public JIDContext domain(String domain) { return this; } public JIDContext lang(String lang) { return this; } public String lang() { return OfflineContextBuilder.this.lang; } public String domain() { return OfflineContextBuilder.this.domain; } public SocketAddress address() { return OfflineContextBuilder.this.address; } @Override public boolean encrypt() { return false; } public boolean encrypted() { return false; } public JIDContext online() { return this; } public boolean onlined() { return true; } public JIDContext offline() { return this; } public long idle() { String idle = OfflineContextBuilder.this.vCardContext.pull(this.jid(), VCardContext.FIELD_LOGOUT).getValue(); return idle == null ? 0L : Long.valueOf(idle); } public boolean closePrepare() { return false; } public boolean closeTimeout() { return false; } @Override public boolean close() { return false; } public JIDContext reset() { return this; } public JIDContext ping() { return this; } public JIDContext ping(int ping) { return this; } public JIDContext pong(Element element) { return this; } @Override public JIDContext write(Element element) { OfflineContextBuilder.this.output.output(this, element.setTo(this.jid.asString())); return this; } public JIDContext write(Element element, boolean force) { return this.write(element); } public JIDContext write(Element element, boolean force, boolean bare) { return this.write(element); } public JIDContext write(Collection<Element> elements) { for (Element element : elements) { this.write(element); } return this; } public JIDContext write(Collection<Element> elements, boolean force) { return this.write(elements); } public JIDContext write(Collection<Element> elements, boolean force, boolean bare) { return this.write(elements); } } private class OfflineStatusClauses implements StatusClauses { private final String signature; private OfflineStatusClauses(String signature) { this.signature = signature; } @Override public String find(String key) { switch (key) { case StatusClauses.KEY_TYPE: return PresenceType.UNAVAILABLE.toString(); case StatusClauses.KEY_STATUS: return this.signature; } return null; } } }