Ignore:
Timestamp:
Feb 3, 2011, 5:12:40 AM (13 years ago)
Author:
gav
Message:

Add optimistic locking checks and transactional save for TaskProcedure.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/features/taskProcedureRework/grails-app/services/TaskProcedureService.groovy

    r774 r775  
    2222                    result.taskProcedureInstance.errors.rejectValue(m.field, m.code)
    2323                result.error = [ code: m.code, args: ["TaskProcedure", params.id] ]
     24                // Fetch to prevent lazy initialization error.
     25                result.taskProcedureInstance?.linkedTask.primaryAsset
     26                result.taskProcedureInstance?.createdBy
    2427                return result
    2528            }
     
    6366                // Populate maintenanceAction errors for display.
    6467                result.taskProcedureInstance.maintenanceActions.each { it.validate() }
    65                 // Fetch to prevent lazy initialization error.
    66                 result.taskProcedureInstance.linkedTask.primaryAsset
    67                 result.taskProcedureInstance.createdBy
    6868                return fail(code:"default.update.failure")
    6969            }
     
    7575    }  // end update()
    7676
     77    /**
     78    * Creates a new taskProcedure with the given params.
     79    * @param params The params to use when creating the new taskProcedure.
     80    * @returns A map containing result.error (if any error) and result.taskProcedure.
     81    */
     82    def save(params) {
     83        def result = [:]
     84        TaskProcedure.withTransaction { status ->
     85            def fail = { Map m ->
     86                status.setRollbackOnly()
     87                if(result.taskProcedureInstance && m.field)
     88                    result.taskProcedureInstance.errors.rejectValue(m.field, m.code)
     89                result.error = [ code: m.code, args: ["TaskProcedure", params.id] ]
     90                // Fetch to prevent lazy initialization error.
     91                result.taskProcedureInstance.linkedTask.primaryAsset
     92                return result
     93            }
     94
     95            result.taskProcedureInstance = new TaskProcedure(params)
     96
     97            // Optimistic locking check on linkedTask.
     98            if(result.taskProcedureInstance.linkedTask.taskProcedure)
     99                    return fail(field:"version", code:"default.optimistic.locking.failure")
     100
     101            result.taskProcedureInstance.createdBy = authService.currentUser
     102            result.taskProcedureInstance.lastUpdatedBy = authService.currentUser
     103
     104            // Gaps in the html index's can be created by adding 2 items and removing the first one.
     105            // This creates a gap at the missing index where LazyList will return a null.
     106            def nullMaintenanceActions = result.taskProcedureInstance.maintenanceActions.findAll {!it}
     107            if (nullMaintenanceActions) {
     108                result.taskProcedureInstance.maintenanceActions.removeAll(nullMaintenanceActions)
     109            }
     110
     111            // Also sets: taskInstance.taskProcedure = taskProcedureInstance
     112            result.taskProcedureInstance.addToTasks(result.taskProcedureInstance.linkedTask)
     113
     114            if(result.taskProcedureInstance.hasErrors() || !result.taskProcedureInstance.save()) {
     115                // Populate maintenanceAction errors for display.
     116                result.taskProcedureInstance.maintenanceActions.each { it.validate() }
     117                return fail(code:"default.create.failure")
     118            }
     119
     120        } //end withTransaction
     121
     122        result.taskProcedureInstance.lastUpdated = new Date() // Required to trigger version increment to 1.
     123
     124        // success
     125        return result
     126    }  // end save()
     127
    77128} // end class
Note: See TracChangeset for help on using the changeset viewer.