package com.sissi.ucenter.register.impl;
import java.util.Set;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DBObject;
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.JIDBuilder;
import com.sissi.field.Field;
import com.sissi.field.Fields;
import com.sissi.protocol.iq.data.XValue;
import com.sissi.protocol.iq.register.simple.Username;
import com.sissi.ucenter.impl.MongoFieldsContext;
import com.sissi.ucenter.register.RegisterContext;
/**
* 索引策略: {"username":1}
*
* @author kim 2013年12月3日
*/
public class MongoRegisterContext extends MongoFieldsContext implements RegisterContext {
private final DBObject remove = BasicDBObjectBuilder.start("$set", BasicDBObjectBuilder.start(Dictionary.FIELD_ACTIVATE, false).get()).get();
private final MongoConfig config;
private final JIDBuilder jidBuilder;
/**
* 保留用户名
*/
private final Set<String> reserved;
/**
* @param reserved 保留用户名
* @param config
* @param jidBuilder
*/
public MongoRegisterContext(Set<String> reserved, MongoConfig config, JIDBuilder jidBuilder) {
super();
this.config = config;
this.reserved = reserved;
this.jidBuilder = jidBuilder;
}
@Override
public boolean register(String username, Fields fields) {
try {
return this.valid(fields) ? MongoUtils.success(this.config.collection().update(BasicDBObjectBuilder.start(Dictionary.FIELD_USERNAME, username).get(), BasicDBObjectBuilder.start("$set", BasicDBObjectBuilder.start(super.entities(fields, BasicDBObjectBuilder.start()).toMap()).add(Dictionary.FIELD_ACTIVATE, true).get()).get(), true, false, WriteConcern.SAFE)) : false;
} catch (MongoException e) {
return false;
}
}
public boolean unregister(String username) {
return MongoUtils.success(this.config.collection().update(BasicDBObjectBuilder.start(Dictionary.FIELD_USERNAME, username).get(), this.remove, false, false, WriteConcern.SAFE));
}
private boolean valid(Fields fields) {
Field<?> register = fields.findField(Username.NAME, Field.class);
// 简易表单/复杂表单
return register.hasChild() ? this.username(this.username(register)) : this.username(String.class.cast(register.getValue()));
}
/**
* 用户名有效性校验.1,不为Null 2,不为空 3,JIDBuilder.value(true) 4,非保留用户名
*
* @param username
* @return
*/
private boolean username(String username) {
return username != null && !username.isEmpty() && this.jidBuilder.build(username, null).valid(true) && !this.reserved.contains(username);
}
/**
* 获取用户名
*
* @param register
* @return
*/
private String username(Field<?> register) {
for (Field<?> field : register.getChildren()) {
if (field.getClass() == XValue.class) {
return String.class.cast(field.getValue());
}
}
return null;
}
}