Ignore:
Timestamp:
May 27, 2010, 8:47:06 PM (9 years ago)
Author:
gav
Message:

Add InventoryItemService savePicture().
Add bulk tests for inventory items.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/services/InventoryItemService.groovy

    r441 r548  
    226226    }
    227227
     228    /**
     229    * Save an inventory item picture.
     230    * @param pictureSource A supported source to get the picture image from.
     231    * Supported sources:
     232    * HttpServletRequest e.g: 'request' var from controller to run getFile('file') against.
     233    * ServletContextResource e.g: grailsApplication.mainContext.getResource('images/logo.png')
     234    */
     235    def savePicture(params, pictureSource) {
     236        InventoryItem.withTransaction { status ->
     237            def result = [:]
     238
     239            def kByteMultiplier = 1000
     240
     241            def fail = { Map m ->
     242                status.setRollbackOnly()
     243                if(result.inventoryItemInstance && m.field)
     244                    result.inventoryItemInstance.errors.rejectValue(m.field, m.code)
     245                result.error = [ code: m.code, args: m.args ?: ["InventoryItem", params.id] ]
     246                return result
     247            }
     248
     249            result.inventoryItemInstance = InventoryItem.get(params.id)
     250
     251            if(!result.inventoryItemInstance)
     252                return fail(code:"default.not.found")
     253
     254            // Optimistic locking check.
     255            if(params.version) {
     256                if(result.inventoryItemInstance.version > params.version.toLong())
     257                    return fail(field:"version", code:"default.optimistic.locking.failure")
     258            }
     259
     260            if(result.inventoryItemInstance.picture)
     261                return fail(field:"picture", code:"inventory.item.already.has.picture")
     262
     263            def picture = new Picture(inventoryItem: result.inventoryItemInstance)
     264            def imaging = new Imaging()
     265            def images = null
     266            def pictureFile
     267            def pictureFileName = ''
     268            def pictureInputStream
     269
     270            if(pictureSource instanceof javax.servlet.http.HttpServletRequest) {
     271                def multiPartFile = pictureSource.getFile('file')
     272                pictureFileName = multiPartFile.originalFilename
     273
     274                if(!multiPartFile || multiPartFile.isEmpty())
     275                    return fail(code: "default.file.not.supplied")
     276
     277                if (multiPartFile.getSize() > Image.MAX_SIZE)
     278                    return fail(code: "default.file.over.max.size", args: [Image.MAX_SIZE/kByteMultiplier, "kB"])
     279
     280                pictureInputStream = multiPartFile.inputStream
     281            }
     282            else if(pictureSource instanceof org.springframework.web.context.support.ServletContextResource) {
     283                pictureFile = pictureSource.getFile()
     284                pictureFileName = pictureFile.name
     285
     286                if ( !pictureFile.isFile() || (pictureFile.length() == 0) )
     287                    return fail(code:"default.file.not.supplied")
     288
     289                if (pictureFile.length() > Image.MAX_SIZE)
     290                    return fail(code:"default.file.over.max.size", args: [Image.MAX_SIZE/kByteMultiplier, "kB"])
     291
     292                pictureInputStream = pictureSource.inputStream
     293            }
     294            else {
     295                    return fail(code:"default.file.not.supplied")
     296            }
     297
     298            try {
     299                images = imaging.createAll(result.inventoryItemInstance, picture, pictureInputStream)
     300            }
     301            catch(Exception ex) {
     302                log.error("picture save", ex)
     303                return fail(code:"inventory.item.picture.file.unrecognised", args: [pictureFileName])
     304            }
     305
     306            images.each { image ->
     307                picture.addToImages(image)
     308            }
     309
     310            if(picture.hasErrors() || !picture.save())
     311                return fail(code:"default.create.failure", args: ["Picture"])
     312
     313            result.inventoryItemInstance.picture = picture
     314
     315            if(result.inventoryItemInstance.hasErrors() || !result.inventoryItemInstance.save())
     316                return fail(code:"default.create.failure")
     317
     318            // success
     319            return result
     320
     321        } //end withTransaction
     322    }
     323
    228324} // end class
Note: See TracChangeset for help on using the changeset viewer.