Open Source Repository

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


org/hibernate/event/def/WrapVisitor.java
//$Id: WrapVisitor.java 7181 2005-06-17 19:36:08Z oneovthafew $
package org.hibernate.event.def;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.EntityMode;
import org.hibernate.HibernateException;
import org.hibernate.collection.PersistentCollection;
import org.hibernate.engine.PersistenceContext;
import org.hibernate.engine.SessionImplementor;
import org.hibernate.event.EventSource;
import org.hibernate.persister.collection.CollectionPersister;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.type.AbstractComponentType;
import org.hibernate.type.CollectionType;
import org.hibernate.type.Type;

/**
 * Wrap collections in a Hibernate collection
 * wrapper.
 @author Gavin King
 */
public class WrapVisitor extends ProxyVisitor {

  private static final Log log = LogFactory.getLog(WrapVisitor.class);

  boolean substitute = false;

  boolean isSubstitutionRequired() {
    return substitute;
  }

  WrapVisitor(EventSource session) {
    super(session);
  }

  Object processCollection(Object collection, CollectionType collectionType)
  throws HibernateException {

    if collection!=null && (collection instanceof PersistentCollection) ) {

      final SessionImplementor session = getSession();
      PersistentCollection coll = (PersistentCollectioncollection;
      if coll.setCurrentSession(session) ) {
        reattachCollectioncoll, collectionType );
      }
      return null;

    }
    else {
      return processArrayOrNewCollection(collection, collectionType);
    }

  }

  final Object processArrayOrNewCollection(Object collection, CollectionType collectionType)
  throws HibernateException {

    final SessionImplementor session = getSession();

    if (collection==null) {
      //do nothing
      return null;
    }
    else {
      CollectionPersister persister = session.getFactory().getCollectionPersistercollectionType.getRole() );

      final PersistenceContext persistenceContext = session.getPersistenceContext();
      //TODO: move into collection type, so we can use polymorphism!
      if collectionType.hasHoldersession.getEntityMode() ) ) {
        
        if (collection==CollectionType.UNFETCHED_COLLECTIONreturn null;

        PersistentCollection ah = persistenceContext.getCollectionHolder(collection);
        if (ah==null) {
          ah = collectionType.wrap(session, collection);
          persistenceContext.addNewCollectionpersister, ah );
          persistenceContext.addCollectionHolder(ah);
        }
        return null;
      }
      else {

        PersistentCollection persistentCollection = collectionType.wrap(session, collection);
        persistenceContext.addNewCollectionpersister, persistentCollection );

        if log.isTraceEnabled() ) log.trace"Wrapped collection in role: " + collectionType.getRole() );

        return persistentCollection; //Force a substitution!

      }

    }

  }

  void processValue(int i, Object[] values, Type[] types) {
    Object result = processValuevalues[i], types[i] );
    if (result!=null) {
      substitute = true;
      values[i= result;
    }
  }

  Object processComponent(Object component, AbstractComponentType componentType)
  throws HibernateException {

    if (component!=null) {
      Object[] values = componentType.getPropertyValuescomponent, getSession() );
      Type[] types = componentType.getSubtypes();
      boolean substituteComponent = false;
      for int i=0; i<types.length; i++ ) {
        Object result = processValuevalues[i], types[i] );
        if (result!=null) {
          values[i= result;
          substituteComponent = true;
        }
      }
      if (substituteComponent) {
        componentType.setPropertyValuescomponent, values, getSession().getEntityMode() );
      }
    }

    return null;
  }

  void process(Object object, EntityPersister persisterthrows HibernateException {
    EntityMode entityMode = getSession().getEntityMode();
    Object[] values = persister.getPropertyValuesobject, entityMode );
    Type[] types = persister.getPropertyTypes();
    processEntityPropertyValues(values, types);
    if isSubstitutionRequired() ) {
      persister.setPropertyValuesobject, values, entityMode );
    }
  }

}