public void enhance(CtClass managedCtClass) { // add the ManagedEntity interface managedCtClass.addInterface( loadCtClassFromClass( ManagedEntity.class ) ); addEntityInstanceHandling( managedCtClass ); addEntityEntryHandling( managedCtClass ); addLinkedPreviousHandling( managedCtClass ); addLinkedNextHandling( managedCtClass ); addInterceptorHandling( managedCtClass ); if ( enhancementContext.doDirtyCheckingInline( managedCtClass ) ) { addInLineDirtyHandling( managedCtClass ); } super.enhance( managedCtClass ); }
private void addInLineDirtyHandling(CtClass managedCtClass) { managedCtClass.addInterface( loadCtClassFromClass( SelfDirtinessTracker.class ) ); FieldWriter.addField( managedCtClass, loadCtClassFromClass( DirtyTracker.class ), EnhancerConstants.TRACKER_FIELD_NAME ); if ( collectCollectionFields( managedCtClass ).isEmpty() ) { createDirtyTrackerMethodsWithoutCollections( managedCtClass ); } else { FieldWriter.addField( managedCtClass, loadCtClassFromClass( CollectionTracker.class ), EnhancerConstants.TRACKER_COLLECTION_NAME ); createDirtyTrackerMethodsWithCollections( managedCtClass ); } }
private Collection<CtField> collectInheritCollectionFields(CtClass managedCtClass) { if ( managedCtClass == null || Object.class.getName().equals( managedCtClass.getName() ) ) { return Collections.emptyList(); } try { CtClass managedCtSuperclass = managedCtClass.getSuperclass(); if ( !enhancementContext.isMappedSuperclassClass( managedCtSuperclass ) ) { return collectInheritCollectionFields( managedCtSuperclass ); } List<CtField> collectionList = new ArrayList<CtField>(); for ( CtField ctField : managedCtSuperclass.getDeclaredFields() ) { if ( !Modifier.isStatic( ctField.getModifiers() ) ) { if ( enhancementContext.isPersistentField( ctField ) && !enhancementContext.isMappedCollection( ctField ) ) { if ( PersistentAttributesHelper.isAssignable( ctField, Collection.class.getName() ) || PersistentAttributesHelper.isAssignable( ctField, Map.class.getName() ) ) { collectionList.add( ctField ); } } } } collectionList.addAll( collectInheritCollectionFields( managedCtSuperclass ) ); return collectionList; } catch ( NotFoundException nfe ) { return Collections.emptyList(); } }
); createCollectionDirtyCheckMethod( managedCtClass ); createCollectionDirtyCheckGetFieldsMethod( managedCtClass ); createClearDirtyCollectionMethod( managedCtClass );
new EntityEnhancer( enhancementContext ).enhance( managedCtClass ); return true;
private void createCollectionDirtyCheckMethod(CtClass managedCtClass) { try { final StringBuilder body = new StringBuilder(); body.append( String.format( "private boolean %1$s() {%n" + " if (%2$s == null) { return false; }%n%n", EnhancerConstants.TRACKER_COLLECTION_CHANGED_NAME, EnhancerConstants.TRACKER_COLLECTION_NAME ) ); for ( CtField ctField : collectCollectionFields( managedCtClass ) ) { body.append( String.format( " // collection field [%1$s]%n" + " if (%1$s == null && %2$s.getSize(\"%1$s\") != -1) { return true; }%n" + " if (%1$s != null && %2$s.getSize(\"%1$s\") != %1$s.size()) { return true; }%n%n", ctField.getName(), EnhancerConstants.TRACKER_COLLECTION_NAME ) ); } body.append( " return false;%n}" ); MethodWriter.write( managedCtClass, body.toString() ); } catch (CannotCompileException cce) { throw new RuntimeException( "createCollectionDirtyCheckMethod failed", cce ); } }
); createCollectionDirtyCheckMethod( managedCtClass ); createCollectionDirtyCheckGetFieldsMethod( managedCtClass ); createClearDirtyCollectionMethod( managedCtClass );
new EntityEnhancer( enhancementContext ).enhance( managedCtClass ); return true;
private void createCollectionDirtyCheckGetFieldsMethod(CtClass managedCtClass) { try { final StringBuilder body = new StringBuilder(); body.append( String.format( "private void %1$s(%3$s tracker) {%n" + " if (%2$s == null) { return; }%n%n", EnhancerConstants.TRACKER_COLLECTION_CHANGED_FIELD_NAME, EnhancerConstants.TRACKER_COLLECTION_NAME, DirtyTracker.class.getName() ) ); for ( CtField ctField : collectCollectionFields( managedCtClass ) ) { body.append( String.format( " // Collection field [%1$s]%n" + " if (%1$s == null && %2$s.getSize(\"%1$s\") != -1) { tracker.add(\"%1$s\"); }%n" + " if (%1$s != null && %2$s.getSize(\"%1$s\") != %1$s.size()) { tracker.add(\"%1$s\"); }%n%n", ctField.getName(), EnhancerConstants.TRACKER_COLLECTION_NAME ) ); } body.append( "}" ); MethodWriter.write( managedCtClass, body.toString() ); } catch (CannotCompileException cce) { throw new RuntimeException( "createCollectionDirtyCheckGetFieldsMethod failed", cce ); } }
public void enhance(CtClass managedCtClass) { // add the ManagedEntity interface managedCtClass.addInterface( loadCtClassFromClass( ManagedEntity.class ) ); addEntityInstanceHandling( managedCtClass ); addEntityEntryHandling( managedCtClass ); addLinkedPreviousHandling( managedCtClass ); addLinkedNextHandling( managedCtClass ); addInterceptorHandling( managedCtClass ); if ( enhancementContext.doDirtyCheckingInline( managedCtClass ) ) { addInLineDirtyHandling( managedCtClass ); } super.enhance( managedCtClass ); }
private void addInLineDirtyHandling(CtClass managedCtClass) { managedCtClass.addInterface( loadCtClassFromClass( SelfDirtinessTracker.class ) ); FieldWriter.addField( managedCtClass, loadCtClassFromClass( DirtyTracker.class ), EnhancerConstants.TRACKER_FIELD_NAME ); if ( collectCollectionFields( managedCtClass ).isEmpty() ) { createDirtyTrackerMethodsWithoutCollections( managedCtClass ); } else { FieldWriter.addField( managedCtClass, loadCtClassFromClass( CollectionTracker.class ), EnhancerConstants.TRACKER_COLLECTION_NAME ); createDirtyTrackerMethodsWithCollections( managedCtClass ); } }
for ( CtField ctField : collectCollectionFields( managedCtClass ) ) { body.append( String.format(
private List<CtField> collectCollectionFields(CtClass managedCtClass) { List<CtField> collectionList = new ArrayList<>(); for ( CtField ctField : managedCtClass.getDeclaredFields() ) { // skip static fields and skip fields added by enhancement if ( Modifier.isStatic( ctField.getModifiers() ) || ctField.getName().startsWith( "$$_hibernate_" ) ) { continue; } if ( enhancementContext.isPersistentField( ctField ) && !enhancementContext.isMappedCollection( ctField ) ) { if ( PersistentAttributesHelper.isAssignable( ctField, Collection.class.getName() ) || PersistentAttributesHelper.isAssignable( ctField, Map.class.getName() ) ) { collectionList.add( ctField ); } } } // HHH-10646 Add fields inherited from @MappedSuperclass // HHH-10981 There is no need to do it for @MappedSuperclass if ( !enhancementContext.isMappedSuperclassClass( managedCtClass ) ) { collectionList.addAll( collectInheritCollectionFields( managedCtClass ) ); } return collectionList; }
private void createCollectionDirtyCheckGetFieldsMethod(CtClass managedCtClass) { try { final StringBuilder body = new StringBuilder(); body.append( String.format( "private void %1$s(%3$s tracker) {%n" + " if (%2$s == null) { return; }%n%n", EnhancerConstants.TRACKER_COLLECTION_CHANGED_FIELD_NAME, EnhancerConstants.TRACKER_COLLECTION_NAME, DirtyTracker.class.getName() ) ); for ( CtField ctField : collectCollectionFields( managedCtClass ) ) { body.append( String.format( " // Collection field [%1$s]%n" + " if (%1$s == null && %2$s.getSize(\"%1$s\") != -1) { tracker.add(\"%1$s\"); }%n" + " if (%1$s != null && %2$s.getSize(\"%1$s\") != %1$s.size()) { tracker.add(\"%1$s\"); }%n%n", ctField.getName(), EnhancerConstants.TRACKER_COLLECTION_NAME ) ); } body.append( "}" ); MethodWriter.write( managedCtClass, body.toString() ); } catch (CannotCompileException cce) { throw new RuntimeException( "createCollectionDirtyCheckGetFieldsMethod failed", cce ); } }
private Collection<CtField> collectInheritCollectionFields(CtClass managedCtClass) { if ( managedCtClass == null || Object.class.getName().equals( managedCtClass.getName() ) ) { return Collections.emptyList(); } try { CtClass managedCtSuperclass = managedCtClass.getSuperclass(); if ( !enhancementContext.isMappedSuperclassClass( managedCtSuperclass ) ) { return collectInheritCollectionFields( managedCtSuperclass ); } List<CtField> collectionList = new ArrayList<CtField>(); for ( CtField ctField : managedCtSuperclass.getDeclaredFields() ) { if ( !Modifier.isStatic( ctField.getModifiers() ) ) { if ( enhancementContext.isPersistentField( ctField ) && !enhancementContext.isMappedCollection( ctField ) ) { if ( PersistentAttributesHelper.isAssignable( ctField, Collection.class.getName() ) || PersistentAttributesHelper.isAssignable( ctField, Map.class.getName() ) ) { collectionList.add( ctField ); } } } } collectionList.addAll( collectInheritCollectionFields( managedCtSuperclass ) ); return collectionList; } catch ( NotFoundException nfe ) { return Collections.emptyList(); } }
private void createCollectionDirtyCheckMethod(CtClass managedCtClass) { try { final StringBuilder body = new StringBuilder(); body.append( String.format( "private boolean %1$s() {%n" + " if (%2$s == null) { return false; }%n%n", EnhancerConstants.TRACKER_COLLECTION_CHANGED_NAME, EnhancerConstants.TRACKER_COLLECTION_NAME ) ); for ( CtField ctField : collectCollectionFields( managedCtClass ) ) { body.append( String.format( " // collection field [%1$s]%n" + " if (%1$s == null && %2$s.getSize(\"%1$s\") != -1) { return true; }%n" + " if (%1$s != null && %2$s.getSize(\"%1$s\") != %1$s.size()) { return true; }%n%n", ctField.getName(), EnhancerConstants.TRACKER_COLLECTION_NAME ) ); } body.append( " return false;%n}" ); MethodWriter.write( managedCtClass, body.toString() ); } catch (CannotCompileException cce) { throw new RuntimeException( "createCollectionDirtyCheckMethod failed", cce ); } }
private List<CtField> collectCollectionFields(CtClass managedCtClass) { List<CtField> collectionList = new ArrayList<>(); for ( CtField ctField : managedCtClass.getDeclaredFields() ) { // skip static fields and skip fields added by enhancement if ( Modifier.isStatic( ctField.getModifiers() ) || ctField.getName().startsWith( "$$_hibernate_" ) ) { continue; } if ( enhancementContext.isPersistentField( ctField ) && !enhancementContext.isMappedCollection( ctField ) ) { if ( PersistentAttributesHelper.isAssignable( ctField, Collection.class.getName() ) || PersistentAttributesHelper.isAssignable( ctField, Map.class.getName() ) ) { collectionList.add( ctField ); } } } // HHH-10646 Add fields inherited from @MappedSuperclass // HHH-10981 There is no need to do it for @MappedSuperclass if ( !enhancementContext.isMappedSuperclassClass( managedCtClass ) ) { collectionList.addAll( collectInheritCollectionFields( managedCtClass ) ); } return collectionList; }
for ( CtField ctField : collectCollectionFields( managedCtClass ) ) { body.append( String.format(