/* * Copyright 2004-2005 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import grails.util.BuildSettings import grails.util.GrailsNameUtils import org.codehaus.groovy.grails.plugins.GrailsPluginUtils import org.springframework.core.io.ClassPathResource import org.springframework.core.io.FileSystemResource import org.springframework.core.io.Resource import org.springframework.core.io.support.PathMatchingResourcePatternResolver import org.springframework.util.FileCopyUtils import grails.util.Environment import grails.util.Metadata import grails.util.BuildScope /** * Gant script containing build variables. * * @author Peter Ledbrook * * @since 1.1 */ // No point doing this stuff more than once. if (getBinding().variables.containsKey("_settings_called")) return _settings_called = true // Read build properties for Grails into ant properties. if (grailsSettings.grailsHome) { ant.property(file: "${grailsHome}/build.properties") } else { ant.property(resource: "build.properties") } /** * Resolves the value for a given property name. It first looks for a * system property, then in the BuildSettings configuration, and finally * uses the given default value if other options are exhausted. */ getPropertyValue = { String propName, defaultValue -> // First check whether we have a system property with the given name. def value = System.getProperty(propName) if (value != null) return value // Now try the BuildSettings settings. value = buildProps[propName] // Return the BuildSettings value if there is one, otherwise use the // default. return value != null ? value : defaultValue } // Set up various build settings. System properties take precedence // over those defined in BuildSettings, which in turn take precedence // over the defaults. isInteractive = true buildProps = buildConfig.toProperties() enableJndi = getPropertyValue("enable.jndi", false).toBoolean() enableProfile = getPropertyValue("grails.script.profile", false).toBoolean() pluginsHome = grailsSettings.projectPluginsDir.path // These are legacy settings... serverPort = getPropertyValue("server.port", 8080).toInteger() serverPortHttps = getPropertyValue("server.port.https", 8443).toInteger() serverHost = getPropertyValue("server.host", null) // ...which are superceded by these serverPort = getPropertyValue("grails.server.port.http", null)?.toInteger() ?: serverPort serverPortHttps = getPropertyValue("grails.server.port.https", null)?.toInteger() ?: serverPortHttps serverHost = getPropertyValue("grails.server.host", null) ?: serverHost // Load the application metadata (application.properties) grailsAppName = null grailsAppVersion = null appGrailsVersion = null servletVersion = getPropertyValue("servlet.version", "2.4") metadataFile = new File("${basedir}/application.properties") metadata = Metadata.getInstance(metadataFile) grailsAppName = metadata.getApplicationName() grailsAppVersion = metadata.getApplicationVersion() appGrailsVersion = metadata.getGrailsVersion() servletVersion = metadata.getServletVersion() ?: servletVersion // If no app name property (upgraded/new/edited project) default to basedir. if (!grailsAppName) { grailsAppName = grailsSettings.baseDir.name } if(grailsAppName.indexOf('/') >-1) appClassName = grailsAppName[grailsAppName.lastIndexOf('/')..-1] else appClassName = GrailsNameUtils.getClassNameRepresentation(grailsAppName) // Other useful properties. args = System.getProperty("grails.cli.args") classesDir = grailsSettings.classesDir grailsApp = null grailsWorkDir = grailsSettings.grailsWorkDir grailsTmp = "${grailsSettings.grailsWorkDir}/tmp" isPluginProject = grailsSettings.baseDir.listFiles().find { it.name.endsWith("GrailsPlugin.groovy") } shouldPackageTemplates = false config = new ConfigObject() scaffoldDir = "${basedir}/web-app/WEB-INF/templates/scaffolding" configFile = new File("${basedir}/grails-app/conf/Config.groovy") webXmlFile = new File("${resourcesDirPath}/web.xml") // Pattern that matches artefacts in the 'grails-app' directory. // Note that the capturing group matches any package directory // structure. artefactPattern = /\S+?\/grails-app\/\S+?\/(\S+?)\.groovy/ // Set up the Grails environment for this script. if (!System.getProperty("grails.env.set")) { if (grailsSettings.defaultEnv && getBinding().variables.containsKey("scriptEnv")) { grailsEnv = scriptEnv grailsSettings.grailsEnv = grailsEnv System.setProperty(Environment.KEY, grailsEnv) System.setProperty(Environment.DEFAULT, "") } println "Environment set to ${grailsEnv}" System.setProperty("grails.env.set", "true") } if(getBinding().variables.containsKey("scriptScope")) { buildScope = (scriptScope instanceof BuildScope) ? scriptScope : BuildScope.valueOf(scriptScope.toString()); buildScope.enable() } else { buildScope = BuildScope.ALL buildScope.enable() } // Prepare a configuration file parser based on the current environment. configSlurper = new ConfigSlurper(grailsEnv) configSlurper.setBinding(grailsHome:grailsHome, appName:grailsAppName, appVersion:grailsAppVersion, userHome:userHome, basedir:basedir, servletVersion:servletVersion) // Ant path based on the class loader for the scripts. This basically // includes all the Grails JARs, the plugin libraries, and any JARs // provided by the application. Useful for task definitions. ant.path(id: "core.classpath") { classLoader.URLs.each { URL url -> pathelement(location: url.file) } } // a resolver that doesn't throw exceptions when resolving resources resolver = new PathMatchingResourcePatternResolver() resolveResources = {String pattern -> try { return resolver.getResources(pattern) } catch (Throwable e) { return [] as Resource[] } } // Closure that returns a Spring Resource - either from $GRAILS_HOME // if that is set, or from the classpath. grailsResource = {String path -> if (grailsSettings.grailsHome) { return new FileSystemResource("${grailsSettings.grailsHome}/$path") } else { return new ClassPathResource(path) } } // Closure that copies a Spring resource to the file system. copyGrailsResource = { String targetFile, Resource resource -> FileCopyUtils.copy(resource.inputStream, new FileOutputStream(targetFile)) } // Copies a set of resources to a given directory. The set is specified // by an Ant-style path-matching pattern. copyGrailsResources = { String destDir, String pattern -> new File(destDir).mkdirs() Resource[] resources = resolveResources("classpath:${pattern}") resources.each { Resource res -> if (res.readable) { copyGrailsResource("${destDir}/${res.filename}", res) } } } // Closure for unpacking a JAR file that's on the classpath. grailsUnpack = {Map args -> def dir = args["dest"] ?: "." def src = args["src"] def overwriteOption = args["overwrite"] == null ? true : args["overwrite"] // Can't unjar a file from within a JAR, so we copy it to // the destination directory first. ant.copy(todir: dir) { javaresource(name: src) } // Now unjar it, excluding the META-INF directory. ant.unjar(dest: dir, src: "${dir}/${src}", overwrite: overwriteOption) { patternset { exclude(name: "META-INF/**") } } // Don't need the JAR file any more, so remove it. ant.delete(file: "${dir}/${src}") } /** * Modifies the application's metadata, as stored in the "application.properties" * file. If it doesn't exist, the file is created. */ updateMetadata = { Map entries -> if (!metadataFile.exists()) { ant.propertyfile( file: metadataFile, comment: "Do not edit app.grails.* properties, they may change automatically. " + "DO NOT put application configuration in here, it is not the right place!") metadata = Metadata.getInstance(metadataFile) } // Convert GStrings to Strings. def stringifiedEntries = [:] entries.each { key, value -> stringifiedEntries[key.toString()] = value.toString() } metadata.putAll(stringifiedEntries) metadata.persist() } /** * Times the execution of a closure, which can include a target. For * example, * * profile("compile", compile) * * where 'compile' is the target. */ profile = {String name, Closure callable -> if (enableProfile) { def now = System.currentTimeMillis() println "Profiling [$name] start" callable() def then = System.currentTimeMillis() - now println "Profiling [$name] finish. Took $then ms" } else { callable() } }