Open Source Repository

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



org/hibernate/tuple/component/ComponentEntityModeToTuplizerMapping.java
package org.hibernate.tuple.component;

import org.hibernate.tuple.EntityModeToTuplizerMapping;
import org.hibernate.tuple.Tuplizer;
import org.hibernate.mapping.Component;
import org.hibernate.mapping.PersistentClass;
import org.hibernate.EntityMode;

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

/**
 * Handles mapping {@link EntityMode}s to {@link ComponentTuplizer}s.
 <p/>
 * Most of the handling is really in the super class; here we just create
 * the tuplizers and add them to the superclass
 *
 @author Steve Ebersole
 */
class ComponentEntityModeToTuplizerMapping extends EntityModeToTuplizerMapping implements Serializable {

  // todo : move this to SF per HHH-3517; also see HHH-1907 and ComponentMetamodel
  private ComponentTuplizerFactory componentTuplizerFactory = new ComponentTuplizerFactory();

  public ComponentEntityModeToTuplizerMapping(Component component) {
    PersistentClass owner = component.getOwner();

    // create our own copy of the user-supplied tuplizer impl map
    Map userSuppliedTuplizerImpls = new HashMap();
    if component.getTuplizerMap() != null ) {
      userSuppliedTuplizerImpls.putAllcomponent.getTuplizerMap() );
    }

    // Build the dynamic-map tuplizer...
    Tuplizer dynamicMapTuplizer;
    String tuplizerClassName = String userSuppliedTuplizerImpls.removeEntityMode.MAP );
    if tuplizerClassName == null ) {
      dynamicMapTuplizer = componentTuplizerFactory.constructDefaultTuplizerEntityMode.MAP, component );
    }
    else {
      dynamicMapTuplizer = componentTuplizerFactory.constructTuplizertuplizerClassName, component );
    }

    // then the pojo tuplizer, using the dynamic-map tuplizer if no pojo representation is available
    tuplizerClassName = String userSuppliedTuplizerImpls.removeEntityMode.POJO );
    Tuplizer pojoTuplizer;
    if owner.hasPojoRepresentation() && component.hasPojoRepresentation() ) {
      if tuplizerClassName == null ) {
        pojoTuplizer = componentTuplizerFactory.constructDefaultTuplizerEntityMode.POJO, component );
      }
      else {
        pojoTuplizer = componentTuplizerFactory.constructTuplizertuplizerClassName, component );
      }
    }
    else {
      pojoTuplizer = dynamicMapTuplizer;
    }

    // then dom4j tuplizer, if dom4j representation is available
    Tuplizer dom4jTuplizer;
    tuplizerClassName = String userSuppliedTuplizerImpls.removeEntityMode.DOM4J );
    if owner.hasDom4jRepresentation() ) {
      if tuplizerClassName == null ) {
        dom4jTuplizer = componentTuplizerFactory.constructDefaultTuplizerEntityMode.DOM4J, component );
      }
      else {
        dom4jTuplizer = componentTuplizerFactory.constructTuplizertuplizerClassName, component );
      }
    }
    else {
      dom4jTuplizer = null;
    }

    // put the "standard" tuplizers into the tuplizer map first
    if pojoTuplizer != null ) {
      addTuplizerEntityMode.POJO, pojoTuplizer );
    }
    if dynamicMapTuplizer != null ) {
      addTuplizerEntityMode.MAP, dynamicMapTuplizer );
    }
    if dom4jTuplizer != null ) {
      addTuplizerEntityMode.DOM4J, dom4jTuplizer );
    }

    // then handle any user-defined entity modes...
    if !userSuppliedTuplizerImpls.isEmpty() ) {
      Iterator itr = userSuppliedTuplizerImpls.entrySet().iterator();
      while itr.hasNext() ) {
        final Map.Entry entry = Map.Entry itr.next();
        final EntityMode entityMode = EntityMode entry.getKey();
        final String userTuplizerClassName = String entry.getValue();
        ComponentTuplizer tuplizer = componentTuplizerFactory.constructTuplizeruserTuplizerClassName, component );
        addTuplizerentityMode, tuplizer );
      }
    }
  }
}