Package org.nutz.dao.impl.entity.field

Source Code of org.nutz.dao.impl.entity.field.AbstractLinkField

package org.nutz.dao.impl.entity.field;

import java.util.Collection;
import java.util.Map;

import org.nutz.castor.Castors;
import org.nutz.dao.entity.Entity;
import org.nutz.dao.entity.LinkField;
import org.nutz.dao.entity.MappingField;
import org.nutz.dao.impl.EntityHolder;
import org.nutz.dao.impl.entity.info.LinkInfo;
import org.nutz.dao.impl.sql.pojo.PojoFetchEntityCallback;
import org.nutz.dao.impl.sql.pojo.PojoQueryEntityCallback;
import org.nutz.dao.sql.PojoCallback;
import org.nutz.lang.Mirror;

public abstract class AbstractLinkField extends AbstractEntityField implements LinkField {

  protected EntityHolder holder;

  protected Class<?> targetType;

  protected Entity<?> target;

  private PojoCallback callback;

  protected String mapKey;

  protected MappingField hostField;

  protected MappingField linkedField;
 
  private boolean[] lock = new boolean[0];//最小化的锁对象

  public AbstractLinkField(Entity<?> entity, EntityHolder holder, LinkInfo info) {
    super(entity);
    this.holder = holder;

    this.setName(info.name);
    this.setInjecting(info.injecting);
    this.setEjecting(info.ejecting);

    this.setType(info.fieldType);

    if (getTypeMirror().isOf(Collection.class)) {
      callback = new PojoQueryEntityCallback();
    } else if (getTypeMirror().isOf(Map.class)) {
      callback = new PojoQueryEntityCallback();
    } else if (getTypeClass().isArray()) {
      callback = new PojoQueryEntityCallback();
    } else {
      callback = new PojoFetchEntityCallback();
    }
  }

  @Override
  public void setValue(Object obj, Object value) {
    if (null != value) {
      if (!Mirror.me(value).canCastToDirectly(this.getTypeClass()))
        value = Castors.me().cast(value, value.getClass(), this.getTypeClass(), mapKey);
    }
    super.setValue(obj, value);
  }

  public Entity<?> getLinkedEntity() {
    if (null == target) {
      synchronized (lock) {
        if (null == target) {
          if (targetType.equals(getEntity().getType()))
            target = getEntity();
          else
            target = holder.getEntity(targetType);
        }
      }
    }
    return target;
  }

  public PojoCallback getCallback() {
    return callback;
  }

  public MappingField getHostField() {
    return hostField;
  }

  public MappingField getLinkedField() {
    return linkedField;
  }

}
TOP

Related Classes of org.nutz.dao.impl.entity.field.AbstractLinkField

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.