Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/GenerateAll.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion scripts/GenerateController.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
2 changes: 1 addition & 1 deletion scripts/GenerateViews.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
59 changes: 50 additions & 9 deletions scripts/_GrailsGenerate.groovy
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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)
}
}

Expand All @@ -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=<YourControllerName>"

throw new IllegalArgumentException(message)
}
else {
generateForControllerName = argsMap["controllerName"].capitalize()
}
}
}
2 changes: 1 addition & 1 deletion src/grails/templates/scaffolding/Controller.groovy
Original file line number Diff line number Diff line change
@@ -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"]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
}
Expand All @@ -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) {
Expand All @@ -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}")
Expand Down Expand Up @@ -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]
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,29 @@ 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
* @param destDir The destination directory to generate views to
*/
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).
*
Expand Down Expand Up @@ -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);
}