001: package org.hibernate.intercept;
002:
003: import org.hibernate.engine.SessionImplementor;
004: import org.hibernate.intercept.cglib.CGLIBHelper;
005: import org.hibernate.intercept.javassist.JavassistHelper;
006:
007: import java.util.Set;
008:
009: /**
010: * Helper class for dealing with enhanced entity classes.
011: *
012: * @author Steve Ebersole
013: */
014: public class FieldInterceptionHelper {
015:
016: // VERY IMPORTANT!!!! - This class needs to be free of any static references
017: // to any CGLIB or Javassist classes. Otherwise, users will always need both
018: // on their classpaths no matter which (if either) they use.
019: //
020: // Another option here would be to remove the Hibernate.isPropertyInitialized()
021: // method and have the users go through the SessionFactory to get this information.
022:
023: private FieldInterceptionHelper() {
024: }
025:
026: public static boolean isInstrumented(Class entityClass) {
027: Class[] definedInterfaces = entityClass.getInterfaces();
028: for (int i = 0; i < definedInterfaces.length; i++) {
029: if ("net.sf.cglib.transform.impl.InterceptFieldEnabled"
030: .equals(definedInterfaces[i].getName())
031: || "org.hibernate.bytecode.javassist.FieldHandled"
032: .equals(definedInterfaces[i].getName())) {
033: return true;
034: }
035: }
036: return false;
037: }
038:
039: public static boolean isInstrumented(Object entity) {
040: return entity != null && isInstrumented(entity.getClass());
041: }
042:
043: public static FieldInterceptor extractFieldInterceptor(Object entity) {
044: if (entity == null) {
045: return null;
046: }
047: Class[] definedInterfaces = entity.getClass().getInterfaces();
048: for (int i = 0; i < definedInterfaces.length; i++) {
049: if ("net.sf.cglib.transform.impl.InterceptFieldEnabled"
050: .equals(definedInterfaces[i].getName())) {
051: // we have a CGLIB enhanced entity
052: return CGLIBHelper.extractFieldInterceptor(entity);
053: } else if ("org.hibernate.bytecode.javassist.FieldHandled"
054: .equals(definedInterfaces[i].getName())) {
055: // we have a Javassist enhanced entity
056: return JavassistHelper.extractFieldInterceptor(entity);
057: }
058: }
059: return null;
060: }
061:
062: public static FieldInterceptor injectFieldInterceptor(
063: Object entity, String entityName,
064: Set uninitializedFieldNames, SessionImplementor session) {
065: if (entity != null) {
066: Class[] definedInterfaces = entity.getClass()
067: .getInterfaces();
068: for (int i = 0; i < definedInterfaces.length; i++) {
069: if ("net.sf.cglib.transform.impl.InterceptFieldEnabled"
070: .equals(definedInterfaces[i].getName())) {
071: // we have a CGLIB enhanced entity
072: return CGLIBHelper.injectFieldInterceptor(entity,
073: entityName, uninitializedFieldNames,
074: session);
075: } else if ("org.hibernate.bytecode.javassist.FieldHandled"
076: .equals(definedInterfaces[i].getName())) {
077: // we have a Javassist enhanced entity
078: return JavassistHelper.injectFieldInterceptor(
079: entity, entityName,
080: uninitializedFieldNames, session);
081: }
082: }
083: }
084: return null;
085: }
086:
087: public static void clearDirty(Object entity) {
088: FieldInterceptor interceptor = extractFieldInterceptor(entity);
089: if (interceptor != null) {
090: interceptor.clearDirty();
091: }
092: }
093:
094: public static void markDirty(Object entity) {
095: FieldInterceptor interceptor = extractFieldInterceptor(entity);
096: if (interceptor != null) {
097: interceptor.dirty();
098: }
099: }
100: }
|