Index: trunk/grails-app/services/AssetSubItemService.groovy
===================================================================
--- trunk/grails-app/services/AssetSubItemService.groovy	(revision 285)
+++ trunk/grails-app/services/AssetSubItemService.groovy	(revision 285)
@@ -0,0 +1,56 @@
+class AssetSubItemService {
+
+    boolean transactional = false
+
+    def create(params) {
+        def result = [:]
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["AssetSubItem", params.id] ]
+            return result
+        }
+
+        result.assetSubItemInstance = new AssetSubItem()
+        result.assetSubItemInstance.properties = params
+
+        // pass in an asset to link to if provided.
+        if(params.asset?.id)
+            result.assetInstance = Asset.get(params.asset.id)
+
+        // success
+        return result
+    }
+
+    def save(params) {
+        Asset.withTransaction { status ->
+            def result = [:]
+
+            def fail = { Map m ->
+                status.setRollbackOnly()
+                if(result.assetSubItemInstance && m.field)
+                    result.assetSubItemInstance.errors.rejectValue(m.field, m.code)
+                result.error = [ code: m.code, args: ["AssetSubItem", params.id] ]
+                return result
+            }
+
+            result.assetSubItemInstance = new AssetSubItem(params)
+
+            if(params.asset?.id) {
+                result.assetInstance = Asset.get(params.asset.id)
+
+                if(!result.assetInstance)
+                    return fail(code:"assetSubItem.asset.not.found")
+            }
+
+            if(result.assetSubItemInstance.hasErrors() || !result.assetSubItemInstance.save(flush: true))
+                return fail(code:"default.create.failure")
+
+            if(result.assetInstance)
+                result.assetInstance.addToAssetSubItems(result.assetSubItemInstance)
+
+            // Success.
+            return result
+
+        } //end withTransaction
+    } // save()
+
+} // end class
