package com.sissi.ucenter.relation.muc.affiliation.impl; import com.mongodb.BasicDBObjectBuilder; import com.mongodb.MongoException; import com.mongodb.WriteConcern; import com.sissi.config.Dictionary; import com.sissi.config.MongoConfig; import com.sissi.config.impl.MongoUtils; import com.sissi.context.JID; import com.sissi.protocol.muc.ItemAffiliation; import com.sissi.ucenter.relation.muc.affiliation.AffiliationBuilder; import com.sissi.ucenter.relation.muc.affiliation.AffiliationUpdater; /** * 索引策略: {"jid":1,"affiliations.jid":1} * @author kim 2014年3月9日 */ public class MongoAffiliationBuilder implements AffiliationBuilder { private final MongoConfig config; public MongoAffiliationBuilder(MongoConfig config) { super(); this.config = config; } @Override public AffiliationUpdater build(JID group) { return new MongoAffiliationUpdater(group); } private final class MongoAffiliationUpdater implements AffiliationUpdater { private final JID group; public MongoAffiliationUpdater(JID group) { super(); this.group = group; } @Override public boolean update(JID jid, String affiliation) { try { // {"affiliations.$.affiliation":Xxx} BasicDBObjectBuilder entity = BasicDBObjectBuilder.start().add(Dictionary.FIELD_AFFILIATIONS + ".$." + Dictionary.FIELD_AFFILIATION, affiliation); if (ItemAffiliation.OWNER.equals(affiliation)) { // {"creator":jid.bare} // 如果为Owner则同时更新创建者 entity.add(Dictionary.FIELD_CREATOR, jid.asStringWithBare()); } // {"jid":group.bare,"affiliations.jid":jid.bare"},{"$set":...entity...} return MongoUtils.success(MongoAffiliationBuilder.this.config.collection().update(BasicDBObjectBuilder.start().add(Dictionary.FIELD_JID, this.group.asStringWithBare()).add(Dictionary.FIELD_AFFILIATIONS + "." + Dictionary.FIELD_JID, jid.asStringWithBare()).get(), BasicDBObjectBuilder.start().add("$set", entity.get()).get(), true, false, WriteConcern.SAFE)); } catch (MongoException e) { // {"jid":group.bare},{"$addToSet":{"affiliations":{"jid":Xxx,"affiliation":Xxx}}} return MongoUtils.success(MongoAffiliationBuilder.this.config.collection().update(BasicDBObjectBuilder.start().add(Dictionary.FIELD_JID, this.group.asStringWithBare()).get(), BasicDBObjectBuilder.start("$addToSet", BasicDBObjectBuilder.start(Dictionary.FIELD_AFFILIATIONS, BasicDBObjectBuilder.start().add(Dictionary.FIELD_JID, jid.asStringWithBare()).add(Dictionary.FIELD_AFFILIATION, affiliation).get()).get()).get(), true, false, WriteConcern.SAFE)); } } } }