source: trunk/grails-app/services/AssetService.groovy @ 350

Last change on this file since 350 was 350, checked in by gav, 10 years ago

Move Asset delete to a service method and configure cascade deletion checks.

File size: 7.7 KB
Line 
1class AssetService {
2
3    boolean transactional = false
4
5    def assetSubItemService
6
7    /**
8    * Determines and returns a possible list of asset sub items.
9    * @returns A list of the possible assetSubItems.
10    */
11    def possibleAssetSubItems() {
12        def criteria = AssetSubItem.createCriteria()
13        def possibleAssetSubItems = criteria.list() {
14            isNull("parentItem")
15        }
16    }
17
18    def delete(params) {
19        Asset.withTransaction { status ->
20            def result = [:]
21
22            def fail = { Map m ->
23                status.setRollbackOnly()
24                if(result.assetInstance && m.field)
25                    result.assetInstance.errors.rejectValue(m.field, m.code)
26                result.error = [ code: m.code, args: ["Asset", params.id] ]
27                return result
28            }
29
30            result.assetInstance = Asset.get(params.id)
31
32            if(!result.assetInstance)
33                return fail(code:"default.not.found")
34
35            if(result.assetInstance.maintenanceActions)
36                return fail(code:"maintenanceActions.still.associated")
37
38            // Remove orphan assetSubItems.
39            def assetSubItems = new ArrayList(result.assetInstance.assetSubItems) // avoid ConcurrentModificationException.
40            def r
41            for(assetSubItem in assetSubItems) {
42                result.assetInstance.removeFromAssetSubItems(assetSubItem)
43                if(!assetSubItem.assets && !assetSubItem.parentItem) {
44                    r = assetSubItemService.delete(id: assetSubItem.id)
45                    if(r.error) {
46                        fail(code:"asset.subItems.delete.failure")
47                        break
48                    }
49                }
50            }
51
52            if(result.error)
53                return result
54
55            try {
56                result.assetInstance.delete(flush:true)
57                return result //Success.
58            }
59            catch(org.springframework.dao.DataIntegrityViolationException e) {
60                return fail(code:"default.delete.failure")
61            }
62
63        } // end withTransaction
64    } // end delete()
65
66    def create(params) {
67        def result = [:]
68        def fail = { Map m ->
69            result.error = [ code: m.code, args: ["Asset", params.id] ]
70            return result
71        }
72
73        result.assetInstance = new Asset()
74        result.assetInstance.properties = params
75
76        // success
77        return result
78    }
79
80    def copy(params) {
81        def result = [:]
82        def fail = { Map m ->
83            result.error = [ code: m.code, args: ["Asset", params.id] ]
84            return result
85        }
86
87        result.assetToCopy = Asset.get(params.assetToCopy?.id)
88
89        if(!result.assetToCopy)
90            return fail(code: "asset.copy.asset.required")
91
92        result.assetInstance = new Asset(name: result.assetToCopy.name,
93                                                            description: result.assetToCopy.description,
94                                                            comment: result.assetToCopy.comment,
95                                                            section: result.assetToCopy.section)
96
97        result.assetInstance.properties = params
98
99        // success
100        return result
101    }
102
103    def save(params) {
104        def result = [:]
105        def fail = { Map m ->
106            if(result.assetInstance && m.field) 
107                result.assetInstance.errors.rejectValue(m.field, m.code)
108            result.error = [ code: m.code, args: ["Asset", params.id] ]
109            return result
110        }
111
112        result.assetInstance = new Asset(params)
113
114        if(result.assetInstance.hasErrors() || !result.assetInstance.save(flush: true))
115            return fail(code:"default.create.failure")
116
117        // success
118        return result
119    }
120
121    def saveCopy(params) {
122        Asset.withTransaction { status ->
123            def result = [:]
124
125            def fail = { Map m ->
126                status.setRollbackOnly()
127                if(result.assetInstance && m.field)
128                    result.assetInstance.errors.rejectValue(m.field, m.code)
129                result.error = [ code: m.code, args: ["Asset", params.id] ]
130                return result
131            }
132
133            result.assetToCopy = Asset.get(params.assetToCopy?.id)
134            if(!result.assetToCopy)
135                return fail(code:"default.not.found")
136
137            if(!params.copyMethod)
138                fail(code:"asset.copy.method.required")
139
140            result.assetInstance =  new Asset(params)
141
142            if(result.assetInstance.hasErrors() || !result.assetInstance.save())
143                return fail(code:"default.create.failure")
144
145            def assetSubItemInstance1
146
147            // Copy subItems from level 2 and bellow.
148            def copyAssetSubItem = { assetSubItemToCopy, parentItem ->
149                def assetSubItemInstance = new AssetSubItem(name: assetSubItemToCopy.name,
150                                                                                            description: assetSubItemToCopy.description,
151                                                                                            parentItem: parentItem)
152
153                if(assetSubItemInstance.hasErrors() || !assetSubItemInstance.save())
154                    return fail(field:"subItems", code:"default.create.failure")
155
156                def i = 0
157                for(assetSubItem in assetSubItemToCopy.subItems) {
158                    call(assetSubItem, assetSubItemInstance)
159                    // Protect against endless recurrsion.
160                    i++
161                    if(i > 100)
162                        fail(code:"default.create.failure")
163                    // Stop if an error is flagged.
164                    if(result.error)
165                        break
166                }
167            } //copyAssetSubItem
168
169            // Copy the 1st level of subItems.
170            def copyAssetSubItem1 = { assetSubItemToCopy ->
171                assetSubItemInstance1 = new AssetSubItem(name: assetSubItemToCopy.name,
172                                                                                        description: assetSubItemToCopy.description,
173                                                                                        asset: result.assetInstance)
174
175                if(assetSubItemInstance1.hasErrors() || !assetSubItemInstance1.save())
176                    return fail(field:"assetSubItems", code:"default.create.failure")
177
178                result.assetInstance.addToAssetSubItems(assetSubItemInstance1)
179
180                def i = 0
181                for(assetSubItem in assetSubItemToCopy.subItems) {
182                    copyAssetSubItem(assetSubItem, assetSubItemInstance1)
183                    // Protect against endless recurrsion.
184                    i++
185                    if(i > 100)
186                        fail(code:"default.create.failure")
187                    // Stop if an error is flagged.
188                    if(result.error)
189                        break
190                }
191            } //copyAssetSubItem1
192
193            def linkAssetSubItem = { assetSubItemToLink ->
194                result.assetInstance.addToAssetSubItems(assetSubItemToLink)
195            }
196
197            def i = 0
198            for(assetSubItem in result.assetToCopy.assetSubItems) {
199
200                if(params.copyMethod == "copy")
201                    copyAssetSubItem1(assetSubItem)
202                else
203                    linkAssetSubItem(assetSubItem)
204                // Protect against endless recurrsion.
205                i++
206                if(i > 100)
207                    fail(code:"default.create.failure")
208                // Stop if an error is flagged.
209                if(result.error)
210                    break
211            }
212
213            // Success or not.
214            return result
215
216        } // end withTransaction
217    } // end saveCopySrvce
218
219} // end class
Note: See TracBrowser for help on using the repository browser.