Ignore:
Timestamp:
Feb 21, 2011, 8:30:42 PM (8 years ago)
Author:
gav
Message:

Add isDirty() during bootstrap, must be removed after upgrading to Grails-1.3 >.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/conf/BootStrap.groovy

    r622 r814  
    11class BootStrap
    22{
     3
     4    def sessionFactory // used by isDirty().
     5    def grailsApplication // used by isDirty().
    36    def createDataService
    47
    58    def init = { servletContext ->
     9
     10        /** Add isDirty() to domainClasses.
     11        * @todo remove after upgrading to Grails-1.3 >.
     12        * See: http://grails.1312388.n4.nabble.com/beforeUpdate-Compare-with-previous-set-value-isDirty-not-working-in-Events-td1695661.html
     13        */
     14        addDirtyCheckMethods()
    615
    716        /** Environment specific settings.
     
    3746    }
    3847
     48   private void addDirtyCheckMethods() {
     49      for (dc in grailsApplication.domainClasses) {
     50         addDirtyCheckMethods dc.clazz.metaClass
     51      }
     52   }
     53
     54    private void addDirtyCheckMethods(metaClass) {
     55      metaClass.isDirty = { ->
     56         def session = sessionFactory.currentSession
     57         def entry = findEntityEntry(delegate, session)
     58         if (!entry) {
     59            return false
     60         }
     61
     62         Object[] values = entry.persister.getPropertyValues(delegate, session.entityMode)
     63         def dirtyProperties = entry.persister.findDirty(values, entry.loadedState, delegate, session)
     64         return dirtyProperties != null
     65      }
     66
     67      metaClass.isDirty = { String fieldName ->
     68         def session = sessionFactory.currentSession
     69         def entry = findEntityEntry(delegate, session)
     70         if (!entry) {
     71            return false
     72         }
     73
     74         Object[] values = entry.persister.getPropertyValues(delegate, session.entityMode)
     75         int[] dirtyProperties = entry.persister.findDirty(values, entry.loadedState, delegate, session)
     76         int fieldIndex = entry.persister.propertyNames.findIndexOf { fieldName == it }
     77         return fieldIndex in dirtyProperties
     78      }
     79
     80      metaClass.getDirtyPropertyNames = { ->
     81         def session = sessionFactory.currentSession
     82         def entry = findEntityEntry(delegate, session)
     83         if (!entry) {
     84            return []
     85         }
     86
     87         Object[] values = entry.persister.getPropertyValues(delegate, session.entityMode)
     88         int[] dirtyProperties = entry.persister.findDirty(values, entry.loadedState, delegate, session)
     89         def names = []
     90         for (index in dirtyProperties) {
     91            names << entry.persister.propertyNames[index]
     92         }
     93         names
     94      }
     95
     96      metaClass.getPersistentValue = { String fieldName ->
     97         def session = sessionFactory.currentSession
     98         def entry = findEntityEntry(delegate, session, false)
     99         if (!entry) {
     100            return null
     101         }
     102
     103         int fieldIndex = entry.persister.propertyNames.findIndexOf { fieldName == it }
     104         return fieldIndex == -1 ? null : entry.loadedState[fieldIndex]
     105      }
     106   }
     107
     108   private findEntityEntry(instance, session, boolean forDirtyCheck = true) {
     109      def entry = session.persistenceContext.getEntry(instance)
     110      if (!entry) {
     111         return null
     112      }
     113
     114      if (forDirtyCheck && !entry.requiresDirtyCheck(instance) && entry.loadedState) {
     115         return null
     116      }
     117
     118      entry
     119   }
     120
    39121} // end class
Note: See TracChangeset for help on using the changeset viewer.