Package com.sissi.ucenter.impl

Source Code of com.sissi.ucenter.impl.MongoFieldsContext

package com.sissi.ucenter.impl;

import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DBObject;
import com.sissi.field.Field;
import com.sissi.field.FieldMapping;
import com.sissi.field.Fields;
import com.sissi.field.impl.DirectFieldMapping;

/**
* Fields提取器
*
* @author kim 2013年12月12日
*/
abstract public class MongoFieldsContext {

  private final FieldMapping mapping;

  public MongoFieldsContext() {
    super();
    this.mapping = DirectFieldMapping.MAPPING;
  }

  public MongoFieldsContext(FieldMapping mapping) {
    super();
    this.mapping = mapping;
  }

  protected DBObject entities(Fields fields, BasicDBObjectBuilder builder) {
    for (Field<?> field : fields) {
      this.entity(field, builder, false);
    }
    return builder.get();
  }

  protected DBObject entity(Field<?> field, BasicDBObjectBuilder builder) {
    return this.entity(field, builder, true);
  }

  /**
   * @param field
   * @param builder
   * @param build 是否构建并返回
   * @return
   */
  private DBObject entity(Field<?> field, BasicDBObjectBuilder builder, boolean build) {
    String name = null;
    if (field.hasChild()) {
      this.embed(field, builder);
    } else if ((name = this.mapping.mapping(field)) != null) {
      // 如果不存在Field子节点则保存值并终止
      builder.add(name, field.getValue());
    }
    return build ? builder.get() : null;
  }

  private void embed(Field<?> field, BasicDBObjectBuilder builder) {
    Fields fields = field.getChildren();
    String name = null;
    if (fields.isEmbed()) {
      this.entities(fields, builder);
    } else if ((name = this.mapping.mapping(field)) != null) {
      // 非嵌入式则创建新Key保存Field子节点,Key = Field.name
      builder.add(name, this.entities(fields, BasicDBObjectBuilder.start()));
    }
  }
}
TOP

Related Classes of com.sissi.ucenter.impl.MongoFieldsContext

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.