Open Source Repository

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


org/hibernate/proxy/pojo/javassist/SerializableProxy.java
package org.hibernate.proxy.pojo.javassist;

import java.io.Serializable;
import java.lang.reflect.Method;

import org.hibernate.HibernateException;
import org.hibernate.type.AbstractComponentType;

/**
 * Serializable placeholder for Javassist proxies
 */
public final class SerializableProxy implements Serializable {

  private String entityName;
  private Class persistentClass;
  private Class[] interfaces;
  private Serializable id;
  private Class getIdentifierMethodClass;
  private Class setIdentifierMethodClass;
  private String getIdentifierMethodName;
  private String setIdentifierMethodName;
  private Class[] setIdentifierMethodParams;
  private AbstractComponentType componentIdType;

  public SerializableProxy() {}

  public SerializableProxy(
    final String entityName,
      final Class persistentClass,
      final Class[] interfaces,
      final Serializable id,
      final Method getIdentifierMethod,
      final Method setIdentifierMethod,
      AbstractComponentType componentIdType
  ) {
    this.entityName = entityName;
    this.persistentClass = persistentClass;
    this.interfaces = interfaces;
    this.id = id;
    if (getIdentifierMethod!=null) {
      getIdentifierMethodClass = getIdentifierMethod.getDeclaringClass();
      getIdentifierMethodName = getIdentifierMethod.getName();
    }
    if (setIdentifierMethod!=null) {
      setIdentifierMethodClass = setIdentifierMethod.getDeclaringClass();
      setIdentifierMethodName = setIdentifierMethod.getName();
      setIdentifierMethodParams = setIdentifierMethod.getParameterTypes();
    }
    this.componentIdType = componentIdType;
  }

  private Object readResolve() {
    try {
      return JavassistLazyInitializer.getProxy(
        entityName,
        persistentClass,
        interfaces,
        getIdentifierMethodName==null ?
          null :
          getIdentifierMethodClass.getDeclaredMethod(getIdentifierMethodName, null),
        setIdentifierMethodName==null ?
          null :
          setIdentifierMethodClass.getDeclaredMethod(setIdentifierMethodName, setIdentifierMethodParams),
          componentIdType,
        id,
        null
      );
    }
    catch (NoSuchMethodException nsme) {
      throw new HibernateException("could not create proxy for entity: " + entityName, nsme);
    }
  }

}