diff --git a/scripts/GenerateAll.groovy b/scripts/GenerateAll.groovy index 8208b4d238d..6ad7dfeb842 100755 --- a/scripts/GenerateAll.groovy +++ b/scripts/GenerateAll.groovy @@ -29,7 +29,7 @@ generateViews = true generateController = true target ('default': "Generates a CRUD interface (controller + views) for a domain class") { - depends(checkVersion, parseArguments, packageApp) + depends(checkVersion, parseArguments, packageApp, determineControllerNameParam) promptForName(type: "Domain Class") try { diff --git a/scripts/GenerateController.groovy b/scripts/GenerateController.groovy index 220dbd8b17c..cf6dd885048 100755 --- a/scripts/GenerateController.groovy +++ b/scripts/GenerateController.groovy @@ -26,7 +26,7 @@ includeTargets << grailsScript("_GrailsCreateArtifacts") includeTargets << grailsScript("_GrailsGenerate") target ('default': "Generates the CRUD controller for a specified domain class") { - depends(checkVersion, parseArguments, packageApp) + depends(checkVersion, parseArguments, packageApp, determineControllerNameParam) promptForName(type: "Domain Class") generateViews = false generateForName = argsMap["params"][0] diff --git a/scripts/GenerateViews.groovy b/scripts/GenerateViews.groovy index f507d0d3f51..ac3a4a73f1c 100755 --- a/scripts/GenerateViews.groovy +++ b/scripts/GenerateViews.groovy @@ -26,7 +26,7 @@ includeTargets << grailsScript("_GrailsCreateArtifacts") includeTargets << grailsScript("_GrailsGenerate") target ('default': "Generates the CRUD views for a specified domain class") { - depends(checkVersion, parseArguments, packageApp) + depends(checkVersion, parseArguments, packageApp, determineControllerNameParam) promptForName(type: "Domain Class") generateController = false generateForName = argsMap["params"][0] diff --git a/scripts/_GrailsGenerate.groovy b/scripts/_GrailsGenerate.groovy old mode 100644 new mode 100755 index c2d8980d302..0ff512c92f7 --- a/scripts/_GrailsGenerate.groovy +++ b/scripts/_GrailsGenerate.groovy @@ -30,11 +30,13 @@ includeTargets << grailsScript("_GrailsBootstrap") generateForName = null generateViews = true generateController = true +generateForControllerName = null target(generateForOne: "Generates controllers and views for only one domain class.") { depends(loadApp) def name = generateForName + def controllerShortName = generateForControllerName name = name.indexOf('.') > -1 ? name : GrailsNameUtils.getClassNameRepresentation(name) def domainClass = grailsApp.getDomainClass(name) @@ -45,12 +47,12 @@ target(generateForOne: "Generates controllers and views for only one domain clas } if (domainClass) { - generateForDomainClass(domainClass) + generateForDomainClass(domainClass, controllerShortName) event("StatusFinal", ["Finished generation for domain class ${domainClass.fullName}"]) } else { event("StatusFinal", ["No domain class found for name ${name}. Please try again and enter a valid domain class name"]) - exit(1) + exit(1) } } @@ -74,20 +76,59 @@ target(uberGenerate: "Generates controllers and views for all domain classes.") } } -def generateForDomainClass(domainClass) { +def generateForDomainClass(domainClass, controllerShortName) { def templateGenerator = new DefaultGrailsTemplateGenerator(classLoader) if (generateViews) { - event("StatusUpdate", ["Generating views for domain class ${domainClass.fullName}"]) - templateGenerator.generateViews(domainClass, basedir) + if (controllerShortName) { + event( + "StatusUpdate", + ["Generating views for controller ${domainClass.packageName}.${controllerShortName}Controller and domain class ${domainClass.fullName}"]) + } + else { + event("StatusUpdate", ["Generating views for domain class ${domainClass.fullName}"]) + } + + templateGenerator.generateViews(domainClass, basedir, controllerShortName) event("GenerateViewsEnd", [domainClass.fullName]) } if (generateController) { - event("StatusUpdate", ["Generating controller for domain class ${domainClass.fullName}"]) - templateGenerator.generateController(domainClass, basedir) - createUnitTest(name: domainClass.fullName, suffix: "Controller", - superClass: "ControllerUnitTestCase") + if (controllerShortName) { + event( + "StatusUpdate", + ["Generating controller ${domainClass.packageName}.${controllerShortName}Controller for domain class ${domainClass.fullName}"]) + } + else { + event("StatusUpdate", ["Generating controller for domain class ${domainClass.fullName}"]) + } + + templateGenerator.generateController(domainClass, basedir, controllerShortName) + + if (controllerShortName) { + createUnitTest( + name: "${domainClass.packageName}.${controllerShortName}", suffix: "Controller", + superClass: "ControllerUnitTestCase") + } + else { + createUnitTest(name: domainClass.fullName, suffix: "Controller", superClass: "ControllerUnitTestCase") + } + event("GenerateControllerEnd", [domainClass.fullName]) } } + +target(determineControllerNameParam: "Parse the arguments to determine controllerName param") { + if (argsMap["controllerName"]) { + if (argsMap["controllerName"] instanceof Boolean) { + def message = + "Please, check your syntax. Maybe '=' is missing. Parameter 'controllerName' must be specified as " + + "follows: --controllerName=" + + throw new IllegalArgumentException(message) + } + else { + generateForControllerName = argsMap["controllerName"].capitalize() + } + } +} \ No newline at end of file diff --git a/src/grails/templates/scaffolding/Controller.groovy b/src/grails/templates/scaffolding/Controller.groovy index a6fe78465a4..05cb138504f 100644 --- a/src/grails/templates/scaffolding/Controller.groovy +++ b/src/grails/templates/scaffolding/Controller.groovy @@ -1,4 +1,4 @@ -<%=packageName ? "package ${packageName}\n\n" : ''%>class ${className}Controller { +<%=packageName ? "package ${packageName}\n\n" : ''%>class ${controllerName}Controller { static allowedMethods = [save: "POST", update: "POST", delete: "POST"] diff --git a/src/java/org/codehaus/groovy/grails/scaffolding/DefaultGrailsTemplateGenerator.groovy b/src/java/org/codehaus/groovy/grails/scaffolding/DefaultGrailsTemplateGenerator.groovy index 04f906b5f98..4a7d1ecb5b9 100644 --- a/src/java/org/codehaus/groovy/grails/scaffolding/DefaultGrailsTemplateGenerator.groovy +++ b/src/java/org/codehaus/groovy/grails/scaffolding/DefaultGrailsTemplateGenerator.groovy @@ -16,6 +16,7 @@ package org.codehaus.groovy.grails.scaffolding import grails.util.BuildSettingsHolder +import grails.util.GrailsNameUtils import groovy.text.SimpleTemplateEngine import groovy.text.Template import org.apache.commons.logging.Log @@ -92,9 +93,21 @@ class DefaultGrailsTemplateGenerator implements GrailsTemplateGenerator, Resourc } void generateViews(GrailsDomainClass domainClass, String destdir) { + generateViews(domainClass, destdir, null) + } + + void generateViews(GrailsDomainClass domainClass, String destdir, String controllerShortNameParam) { Assert.hasText destdir, "Argument [destdir] not specified" - def viewsDir = new File("${destdir}/grails-app/views/${domainClass.propertyName}") + String controllerShortName + if (controllerShortNameParam) { + controllerShortName = GrailsNameUtils.getPropertyNameRepresentation(controllerShortNameParam) + } + else { + controllerShortName = domainClass.propertyName + } + + def viewsDir = new File("${destdir}/grails-app/views/${controllerShortName}") if (!viewsDir.exists()) { viewsDir.mkdirs() } @@ -106,6 +119,10 @@ class DefaultGrailsTemplateGenerator implements GrailsTemplateGenerator, Resourc } void generateController(GrailsDomainClass domainClass, String destdir) { + generateController(domainClass, destdir, null) + } + + void generateController(GrailsDomainClass domainClass, String destdir, String controllerShortNameParam) { Assert.hasText destdir, "Argument [destdir] not specified" if (domainClass) { @@ -117,12 +134,20 @@ class DefaultGrailsTemplateGenerator implements GrailsTemplateGenerator, Resourc pkg = fullName[0..pos] } - def destFile = new File("${destdir}/grails-app/controllers/${pkg.replace('.' as char, '/' as char)}${domainClass.shortName}Controller.groovy") + String controllerShortName + if (controllerShortNameParam) { + controllerShortName = controllerShortNameParam + } + else { + controllerShortName = domainClass.shortName + } + + def destFile = new File("${destdir}/grails-app/controllers/${pkg.replace('.' as char, '/' as char)}${controllerShortName}Controller.groovy") if (canWrite(destFile)) { destFile.parentFile.mkdirs() destFile.withWriter { w -> - generateController(domainClass, w) + generateController(domainClass, w, controllerShortName) } LOG.info("Controller generated at ${destFile}") @@ -199,11 +224,16 @@ class DefaultGrailsTemplateGenerator implements GrailsTemplateGenerator, Resourc } void generateController(GrailsDomainClass domainClass, Writer out) { + generateController(domainClass, out, domainClass.shortName) + } + + void generateController(GrailsDomainClass domainClass, Writer out, String controllerShortName) { def templateText = getTemplateText("Controller.groovy") boolean hasHibernate = PluginManagerHolder.pluginManager.hasGrailsPlugin('hibernate') def binding = [packageName: domainClass.packageName, domainClass: domainClass, + controllerName: controllerShortName, className: domainClass.shortName, propertyName: getPropertyName(domainClass), comparator: hasHibernate ? DomainClassPropertyComparator : SimpleDomainClassPropertyComparator] @@ -278,7 +308,7 @@ class DefaultGrailsTemplateGenerator implements GrailsTemplateGenerator, Resourc } def grailsHome = BuildSettingsHolder.settings?.grailsHome - if (grailsHome) { + if (grailsHome && !resources) { try { def grailsHomeTemplates = resolver.getResources("file:${grailsHome}/src/grails/templates/scaffolding/*.gsp").filename.collect(filter) resources.addAll(grailsHomeTemplates) @@ -288,7 +318,7 @@ class DefaultGrailsTemplateGenerator implements GrailsTemplateGenerator, Resourc LOG.debug("Error locating templates from GRAILS_HOME: ${e.message}", e) } } - else { + else if (!resources) { try { def templates = resolver.getResources("classpath:src/grails/templates/scaffolding/*.gsp").filename.collect(filter) resources.addAll(templates) diff --git a/src/java/org/codehaus/groovy/grails/scaffolding/GrailsTemplateGenerator.java b/src/java/org/codehaus/groovy/grails/scaffolding/GrailsTemplateGenerator.java index e5ab24dcf43..4b92ecf057c 100644 --- a/src/java/org/codehaus/groovy/grails/scaffolding/GrailsTemplateGenerator.java +++ b/src/java/org/codehaus/groovy/grails/scaffolding/GrailsTemplateGenerator.java @@ -42,6 +42,14 @@ public interface GrailsTemplateGenerator { */ void generateViews(GrailsDomainClass domainClass, String destDir); + /** + * Generates the necessary views for the supplied domain class and controller name. + * @param domainClass The DomainClass to generate views for + * @param destDir The destination directory to generate views to + * @param controllerName The name of the controller for which views are generated + */ + void generateViews(GrailsDomainClass domainClass, String destDir, String controllerName); + /** * Generates a controller for the supplied domain class. * @param domainClass The DomainClass to generate views for @@ -49,6 +57,14 @@ public interface GrailsTemplateGenerator { */ void generateController(GrailsDomainClass domainClass, String destDir); + /** + * Generates a controller for the supplied domain class and controller name. + * @param domainClass The DomainClass to generate views for + * @param destDir The destination directory to generate views to + * @param controllerName The name of the controller for which views are generated + */ + void generateController(GrailsDomainClass domainClass, String destDir, String controllerName); + /** * Whether the generator should overwrite existing files (defaults to false). * @@ -82,4 +98,14 @@ public interface GrailsTemplateGenerator { * @param out The Writer to write to */ void generateController(GrailsDomainClass domainClass, Writer out); + + /** + * Generates a controller for the specified domain class and controller name, writing the result to the specified + * java.io.Writer instance. + * + * @param domainClass The domain class to generate a controller for + * @param out The Writer to write to + * @param controllerName The name of the controller for which views are generated + */ + void generateController(GrailsDomainClass domainClass, Writer out, String controllerName); }