Open Source Repository

Home /hibernate/hibernate-3.2.4.ga | Repository Home


org/hibernate/tuple/DynamicMapInstantiator.java
//$Id: DynamicMapInstantiator.java 7674 2005-07-29 06:14:16Z oneovthafew $
package org.hibernate.tuple;

import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import org.hibernate.mapping.PersistentClass;


public class DynamicMapInstantiator implements Instantiator {
  public static final String KEY = "$type$";

  private String entityName;
  private Set isInstanceEntityNames = new HashSet();

  public DynamicMapInstantiator() {
    this.entityName = null;
  }

  public DynamicMapInstantiator(PersistentClass mappingInfo) {
    this.entityName = mappingInfo.getEntityName();
    isInstanceEntityNames.addentityName );
    if mappingInfo.hasSubclasses() ) {
      Iterator itr = mappingInfo.getSubclassClosureIterator();
      while itr.hasNext() ) {
        final PersistentClass subclassInfo = PersistentClass itr.next();
        isInstanceEntityNames.addsubclassInfo.getEntityName() );
      }
    }
  }

  public final Object instantiate(Serializable id) {
    return instantiate();
  }

  public final Object instantiate() {
    Map map = generateMap();
    if entityName!=null ) {
      map.putKEY, entityName );
    }
    return map;
  }

  public final boolean isInstance(Object object) {
    if object instanceof Map ) {
      if entityName == null ) {
        return true;
      }
      String type = String ) ( ( Map object ).getKEY );
      return type == null || isInstanceEntityNames.containstype );
    }
    else {
      return false;
    }
  }

  protected Map generateMap() {
    return new HashMap();
  }
}