package com.sissi.context.impl; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import com.mongodb.DBCursor; import com.sissi.config.Dictionary; import com.sissi.config.impl.MongoUtils; import com.sissi.context.JID; import com.sissi.context.JIDs; /** * 线程安全的JIDs实现 * * @author kim 2014年3月6日 */ public class ShareJIDs implements JIDs { private final AtomicInteger counter = new AtomicInteger(); private final List<String> resources = new ArrayList<String>(); private final JID jid; public ShareJIDs(JID source, DBCursor cursor) { this.jid = source.bare(); try (DBCursor iterator = cursor) { while (iterator.hasNext()) { this.resources.add(MongoUtils.asString(iterator.next(), Dictionary.FIELD_RESOURCE)); } } } public ShareJIDs(JID source, String[] resources) { this.jid = source.bare(); for (String resource : resources) { this.resources.add(resource); } } public JID jid() { return this.jid; } public Iterator<JID> iterator() { return new JIDIterator(); } public boolean isEmpty() { return this.resources.isEmpty(); } public boolean lessThan(Integer counter) { return this.resources.size() < counter; } @Override public boolean same(JID jid) { return this.like(jid) && this.resources.contains(jid.resource()); } public boolean like(JID jid) { return this.jid.like(jid); } private boolean hasNext() { return this.counter.get() < this.resources.size(); } private JID next() { return this.jid.resource(this.resources.get(this.counter.incrementAndGet() - 1)); } private class JIDIterator implements Iterator<JID> { @Override public boolean hasNext() { return ShareJIDs.this.hasNext(); } @Override public JID next() { return ShareJIDs.this.next(); } @Override public void remove() { } } }