Index: trunk/grails-app/controllers/AssetSubItemDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/AssetSubItemDetailedController.groovy	(revision 274)
+++ trunk/grails-app/controllers/AssetSubItemDetailedController.groovy	(revision 274)
@@ -0,0 +1,161 @@
+import org.codehaus.groovy.grails.plugins.springsecurity.Secured
+
+class AssetSubItemDetailedController extends BaseController {
+    
+    def index = { redirect(controller: "assetDetailed", params:params) }
+
+    // the delete, save and update actions only accept POST requests
+    static allowedMethods = [delete:'POST', save:'POST', update:'POST']
+
+    def show = {
+        def assetSubItemInstance = AssetSubItem.get( params.id )
+
+        if(!assetSubItemInstance) {
+            flash.message = "AssetSubItem not found with id ${params.id}"
+            redirect(controller: "assetDetailed", action: "search")
+        }
+        else { return [ assetSubItemInstance : assetSubItemInstance ] }
+    }
+
+    def delete = {
+        def assetSubItemInstance = AssetSubItem.get( params.id )
+        if(assetSubItemInstance) {
+            try {
+                assetSubItemInstance.delete(flush:true)
+                flash.message = "AssetSubItem ${params.id} deleted"
+                redirect(controller: "assetDetailed", action: "search")
+            }
+            catch(org.springframework.dao.DataIntegrityViolationException e) {
+                flash.message = "AssetSubItem ${params.id} could not be deleted"
+                redirect(action:show,id:params.id)
+            }
+        }
+        else {
+            flash.message = "AssetSubItem not found with id ${params.id}"
+            redirect(controller: "assetDetailed", action: "search")
+        }
+    }
+
+    def edit = {
+        def assetSubItemInstance = AssetSubItem.get( params.id )
+
+        if(!assetSubItemInstance) {
+            flash.message = "AssetSubItem not found with id ${params.id}"
+            redirect(controller: "assetDetailed", action: "search")
+        }
+        else {
+            return [ assetSubItemInstance : assetSubItemInstance ]
+        }
+    }
+
+    def update = {
+        def assetSubItemInstance = AssetSubItem.get( params.id )
+        if(assetSubItemInstance) {
+            if(params.version) {
+                def version = params.version.toLong()
+                if(assetSubItemInstance.version > version) {
+
+                    assetSubItemInstance.errors.rejectValue("version", "assetSubItem.optimistic.locking.failure", "Another user has updated this AssetSubItem while you were editing.")
+                    render(view:'edit',model:[assetSubItemInstance:assetSubItemInstance])
+                    return
+                }
+            }
+
+            assetSubItemInstance.properties = params
+
+            if(!assetSubItemInstance.asset && !assetSubItemInstance.parentItem) {
+                flash.message = "Either an asset or parentItem is required."
+                render(view:'edit',model:[assetSubItemInstance:assetSubItemInstance])
+                return
+            }
+
+            if(assetSubItemInstance.asset && assetSubItemInstance.parentItem) {
+            flash.message = "Both an asset and parentItem may not be specified at the same time."
+                render(view:'edit',model:[parentItem:parentItem])
+                return
+            }
+
+            if(!assetSubItemInstance.hasErrors() && assetSubItemInstance.save(flush: true)) {
+                flash.message = "AssetSubItem ${params.id} updated"
+
+                if(assetSubItemInstance.asset)
+                    redirect(controller: "assetDetailed", action:"show", id: assetSubItemInstance.asset.id)
+                else {
+                    //Get the top parentItem.
+                    def parentItem = assetSubItemInstance.parentItem
+                    def i = 0
+                    while(parentItem?.parentItem) {
+                        parentItem = parentItem.parentItem
+                        // Protect against infinite recurrsion.
+                        i++
+                        if(i > 100)
+                            break
+                    }
+
+                    if(parentItem.asset)
+                        redirect(controller: "assetDetailed", action:"show", id: parentItem.asset.id)
+                    else
+                        redirect(action:"show", id: assetSubItemInstance.id) // End stop if all else fails.
+                }
+            }
+            else {
+                render(view:'edit',model:[assetSubItemInstance:assetSubItemInstance])
+            }
+        }
+        else {
+            flash.message = "AssetSubItem not found with id ${params.id}"
+            redirect(controller: "assetDetailed", action: "search")
+        }
+    }
+
+    def create = {
+        def assetSubItemInstance = new AssetSubItem()
+        assetSubItemInstance.properties = params
+        return ['assetSubItemInstance':assetSubItemInstance]
+    }
+
+    def save = {
+        def assetSubItemInstance = new AssetSubItem(params)
+
+        if(!assetSubItemInstance.asset && !assetSubItemInstance.parentItem) {
+            flash.message = "Either an asset or parentItem is required."
+            render(view:'create',model:[assetSubItemInstance:assetSubItemInstance])
+            return
+        }
+
+        if(assetSubItemInstance.asset && assetSubItemInstance.parentItem) {
+            flash.message = "Both an asset and parentItem may not be specified at the same time."
+            render(view:'create',model:[assetSubItemInstance:assetSubItemInstance])
+            return
+        }
+
+        if(!assetSubItemInstance.hasErrors() && assetSubItemInstance.save(flush: true)) {
+            flash.message = "AssetSubItem ${assetSubItemInstance.id} created"
+
+            if(assetSubItemInstance.asset)
+                redirect(controller: "assetDetailed", action:"show", id: assetSubItemInstance.asset.id)
+            else {
+                //Get the top parentItem.
+                def parentItem = assetSubItemInstance.parentItem
+                def i = 0
+                while(parentItem?.parentItem) {
+                    parentItem = parentItem.parentItem
+                    // Protect against infinite recurrsion.
+                    i++
+                    if(i > 100)
+                        break
+                }
+
+                if(parentItem.asset)
+                    redirect(controller: "assetDetailed", action:"show", id: parentItem.asset.id)
+                else
+                    redirect(action:"show", id: assetSubItemInstance.id) // End stop if all else fails.
+            }
+
+        }
+        else {
+            render(view:'create',model:[assetSubItemInstance:assetSubItemInstance])
+        }
+    } // end save()
+
+} // end class
Index: trunk/grails-app/controllers/AssetSubItemExtendedAttributeDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/AssetSubItemExtendedAttributeDetailedController.groovy	(revision 274)
+++ trunk/grails-app/controllers/AssetSubItemExtendedAttributeDetailedController.groovy	(revision 274)
@@ -0,0 +1,99 @@
+import org.codehaus.groovy.grails.plugins.springsecurity.Secured
+
+class AssetSubItemExtendedAttributeDetailedController extends BaseController {
+    
+    def index = { redirect(action:list,params:params) }
+
+    // the delete, save and update actions only accept POST requests
+    static allowedMethods = [delete:'POST', save:'POST', update:'POST']
+
+    def list = {
+        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
+        [ assetSubItemExtendedAttributeInstanceList: AssetSubItemExtendedAttribute.list( params ), assetSubItemExtendedAttributeInstanceTotal: AssetSubItemExtendedAttribute.count() ]
+    }
+
+    def show = {
+        def assetSubItemExtendedAttributeInstance = AssetSubItemExtendedAttribute.get( params.id )
+
+        if(!assetSubItemExtendedAttributeInstance) {
+            flash.message = "AssetSubItemExtendedAttribute not found with id ${params.id}"
+            redirect(action:list)
+        }
+        else { return [ assetSubItemExtendedAttributeInstance : assetSubItemExtendedAttributeInstance ] }
+    }
+
+    def delete = {
+        def assetSubItemExtendedAttributeInstance = AssetSubItemExtendedAttribute.get( params.id )
+        if(assetSubItemExtendedAttributeInstance) {
+            try {
+                assetSubItemExtendedAttributeInstance.delete(flush:true)
+                flash.message = "AssetSubItemExtendedAttribute ${params.id} deleted"
+                redirect(action:list)
+            }
+            catch(org.springframework.dao.DataIntegrityViolationException e) {
+                flash.message = "AssetSubItemExtendedAttribute ${params.id} could not be deleted"
+                redirect(action:show,id:params.id)
+            }
+        }
+        else {
+            flash.message = "AssetSubItemExtendedAttribute not found with id ${params.id}"
+            redirect(action:list)
+        }
+    }
+
+    def edit = {
+        def assetSubItemExtendedAttributeInstance = AssetSubItemExtendedAttribute.get( params.id )
+
+        if(!assetSubItemExtendedAttributeInstance) {
+            flash.message = "AssetSubItemExtendedAttribute not found with id ${params.id}"
+            redirect(action:list)
+        }
+        else {
+            return [ assetSubItemExtendedAttributeInstance : assetSubItemExtendedAttributeInstance ]
+        }
+    }
+
+    def update = {
+        def assetSubItemExtendedAttributeInstance = AssetSubItemExtendedAttribute.get( params.id )
+        if(assetSubItemExtendedAttributeInstance) {
+            if(params.version) {
+                def version = params.version.toLong()
+                if(assetSubItemExtendedAttributeInstance.version > version) {
+                    
+                    assetSubItemExtendedAttributeInstance.errors.rejectValue("version", "assetSubItemExtendedAttribute.optimistic.locking.failure", "Another user has updated this AssetSubItemExtendedAttribute while you were editing.")
+                    render(view:'edit',model:[assetSubItemExtendedAttributeInstance:assetSubItemExtendedAttributeInstance])
+                    return
+                }
+            }
+            assetSubItemExtendedAttributeInstance.properties = params
+            if(!assetSubItemExtendedAttributeInstance.hasErrors() && assetSubItemExtendedAttributeInstance.save(flush: true)) {
+                flash.message = "AssetSubItemExtendedAttribute ${params.id} updated"
+                redirect(action:show,id:assetSubItemExtendedAttributeInstance.id)
+            }
+            else {
+                render(view:'edit',model:[assetSubItemExtendedAttributeInstance:assetSubItemExtendedAttributeInstance])
+            }
+        }
+        else {
+            flash.message = "AssetSubItemExtendedAttribute not found with id ${params.id}"
+            redirect(action:list)
+        }
+    }
+
+    def create = {
+        def assetSubItemExtendedAttributeInstance = new AssetSubItemExtendedAttribute()
+        assetSubItemExtendedAttributeInstance.properties = params
+        return ['assetSubItemExtendedAttributeInstance':assetSubItemExtendedAttributeInstance]
+    }
+
+    def save = {
+        def assetSubItemExtendedAttributeInstance = new AssetSubItemExtendedAttribute(params)
+        if(!assetSubItemExtendedAttributeInstance.hasErrors() && assetSubItemExtendedAttributeInstance.save(flush: true)) {
+            flash.message = "AssetSubItemExtendedAttribute ${assetSubItemExtendedAttributeInstance.id} created"
+            redirect(action:show,id:assetSubItemExtendedAttributeInstance.id)
+        }
+        else {
+            render(view:'create',model:[assetSubItemExtendedAttributeInstance:assetSubItemExtendedAttributeInstance])
+        }
+    }
+}
