From 8025f72d00c3b995546aebb8a778a7a4555d3213 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Mon, 25 Oct 2010 19:18:49 -0400 Subject: [PATCH] adding basic gradle config --- build.gradle | 214 +++++++++++++++ gradle.properties | 43 ++++ gradle/bundlor.gradle | 91 +++++++ gradle/checks.gradle | 90 +++++++ gradle/dist.gradle | 133 ++++++++++ gradle/docbook.gradle | 315 +++++++++++++++++++++++ gradle/maven-deployment.gradle | 122 +++++++++ gradle/version.gradle | 69 +++++ gradle/wrapper.gradle | 32 +++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 12538 bytes gradle/wrapper/gradle-wrapper.properties | 9 + gradlew | 142 ++++++++++ gradlew.bat | 126 +++++++++ settings.gradle | 17 ++ 14 files changed, 1403 insertions(+) create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/bundlor.gradle create mode 100644 gradle/checks.gradle create mode 100644 gradle/dist.gradle create mode 100644 gradle/docbook.gradle create mode 100644 gradle/maven-deployment.gradle create mode 100644 gradle/version.gradle create mode 100644 gradle/wrapper.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100755 gradlew.bat create mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..9e45b055f0 --- /dev/null +++ b/build.gradle @@ -0,0 +1,214 @@ +/* + * Copyright 2002-2010 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. + */ + + +// ----------------------------------------------------------------------------- +// Main gradle build file for Spring Integration +// +// - run `./gradlew(.bat) build` to kick off a complete compile-test-package +// +// - the imports above are from groovy and/or java classes in buildSrc/ +// or from jars on 'buildscript' classpath (in our case, it's all buildSrc) +// sources in buildSrc are compiled and placed on the classpath automatically +// +// @author cbeams +// ----------------------------------------------------------------------------- + + +// ----------------------------------------------------------------------------- +// Configuration for all projects including this one (the root project) +// +// @see settings.gradle for list of all subprojects +// ----------------------------------------------------------------------------- + +apply from: "$rootDir/gradle/version.gradle" +apply plugin: 'idea' + + +allprojects { + // group will translate to groupId during pom generation and deployment + group = 'org.springframework.integration' + + // version will be used in maven pom generation as well as determining + // where artifacts should be deployed, based on release type of snapshot, + // milestone or release. + // @see org.springframework.build.Version under buildSrc/ for more info + // @see gradle.properties for the declaration of this property. + version = createVersion(springIntegrationVersion) + + // default set of maven repositories to be used when resolving dependencies + repositories { + mavenRepo urls: 'http://maven.springframework.org/snapshot' + mavenCentral() + mavenRepo urls: 'http://maven.springframework.org/release' + mavenRepo urls: 'http://maven.springframework.org/milestone' + mavenRepo urls: 'http://repository.springsource.com/maven/bundles/external' + mavenRepo urls: 'http://repository.springsource.com/maven/bundles/release' + mavenRepo urls: 'http://repository.springsource.com/maven/bundles/milestone' + } + +} + + +// ----------------------------------------------------------------------------- +// Create collections of subprojects - each will receive their own configuration +// - all subprojects that start with spring-integration-* are 'java projects' +// - documentation-related subprojects are not collected here +// +// @see configure(*) sections below +// ----------------------------------------------------------------------------- + +javaprojects = subprojects.findAll { project -> + project.path.startsWith(':spring-integration-') +} + +// ----------------------------------------------------------------------------- +// Configuration for all java subprojects +// ----------------------------------------------------------------------------- +configure(javaprojects) { + + apply plugin: 'java' // tasks for conventional java lifecycle + apply plugin: 'maven' // `gradle install` to push jars to local .m2 cache + apply plugin: 'eclipse' // `gradle eclipse` to generate .classpath/.project + apply plugin: 'idea' // `gradle idea` to generate .ipr/.iml + + // all core projects should be OSGi-compliant bundles + // add the bundlor task to ensure proper manifests + apply from: "$rootDir/gradle/bundlor.gradle" + apply from: "$rootDir/gradle/maven-deployment.gradle" + + springVersion = '3.0.5.RELEASE' + + // dependencies that are common across all java projects + dependencies { + testCompile 'junit:junit:4.7' + testCompile "log4j:log4j:1.2.12" + } + + // enable all compiler warnings (GRADLE-1077) + [compileJava, compileTestJava]*.options*.compilerArgs = ['-Xlint:all'] + + // generate .classpath files without GRADLE_CACHE variable (GRADLE-1079) + eclipseClasspath.variables = [:] +} + + +// ----------------------------------------------------------------------------- +// Configuration for each individual core java subproject +// +// @see configure(javaprojects) above for general config +// ----------------------------------------------------------------------------- +project('spring-integration-core') { + description = 'Spring Integration Core' + dependencies { + compile "org.codehaus.jackson:jackson-mapper-asl:1.4.3" + compile "org.springframework:spring-aop:3.0.5.RELEASE" + compile "org.springframework:spring-context:3.0.5.RELEASE" + compile "org.springframework:spring-tx:3.0.5.RELEASE" + testCompile "org.hamcrest:hamcrest-all:1.1" + testCompile "org.easymock:easymock:2.3" + testCompile "org.mockito:mockito-all:1.8.4" + testCompile "org.springframework:spring-test:3.0.5.RELEASE" + testCompile "org.aspectj:aspectjrt:1.6.5" + testCompile "org.aspectj:aspectjweaver:1.6.5" + testCompile "cglib:cglib-nodep:2.2" + } +} + +/* +project('spring-integration-event') { +} + +project('spring-integration-feed') { +} + +project('spring-integration-file') { +} + +project('spring-integration-ftp') { +} + +project('spring-integration-groovy') { +} + +project('spring-integration-http') { +} + +project('spring-integration-httpinvoker') { +} + +project('spring-integration-ip') { +} + +project('spring-integration-jdbc') { +} + +project('spring-integration-jms') { +} + +project('spring-integration-jmx') { +} + +project('spring-integration-mail') { +} + +project('spring-integration-rmi') { +} + +project('spring-integration-security') { +} + +project('spring-integration-sftp') { +} + +project('spring-integration-stream') { +} + +project('spring-integration-test') { +} + +project('spring-integration-twitter') { +} + +project('spring-integration-ws') { +} + +project('spring-integration-xml') { +} + +project('spring-integration-xmpp') { +} +*/ + +// add basic tasks like 'clean' and 'assemble' to the root project. e.g.: allows +// running `gradle clean` from the root project and deleting the build directory +apply plugin: 'base' + +// add tasks like 'distArchive' +//apply from: "$rootDir/gradle/dist.gradle" + +// add tasks like 'snapshotDependencyCheck' +apply from: "${rootDir}/gradle/checks.gradle" + + +// ----------------------------------------------------------------------------- +// Import tasks related to releasing and managing the project +// depending on the role played by the current user. +// +// @see gradle.properties for more information on roles +// ----------------------------------------------------------------------------- +// add management tasks like `wrapper` for generating the gradlew* scripts +apply from: "$rootDir/gradle/wrapper.gradle" diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000000..b301df9c31 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,43 @@ +# Copyright 2002-2010 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. + + +# ------------------------------------------------------------------------------ +# version to be applied to all projects in this multi-project build. this is +# the one and only location version changes need to be made. +# ------------------------------------------------------------------------------ +springIntegrationVersion=2.0.0.BUILD-SNAPSHOT + +# ------------------------------------------------------------------------------ +# build system user roles +# role may be either 'developer' or 'buildmaster' +# ------------------------------------------------------------------------------ +role=developer + +# ------------------------------------------------------------------------------ +# for buildmasters: create a $HOME/.gradle/gradle.properties with the following +# properties. They'll be necessary uploading artifacts to s3, maven repos, and +# static.springframework.org. By placing them in your home directory, there's +# no need to change/check in this file. Remember that properties can also be +# specified at the gradle command line with -P, e.g.: -Prole=buildmaster +# ------------------------------------------------------------------------------ +# role = buildmaster # overrides default 'role = developer' above +# s3AccessKey= +# s3SecretAccessKey= +# docsHost=static.springsource.org +# sshHost=static.springsource.org +# sshUsername= +# sshPrivateKey= +# mavenSyncRepoDir= diff --git a/gradle/bundlor.gradle b/gradle/bundlor.gradle new file mode 100644 index 0000000000..870159da03 --- /dev/null +++ b/gradle/bundlor.gradle @@ -0,0 +1,91 @@ +/* + * Copyright 2002-2010 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. + */ + +// ----------------------------------------------------------------------------- +// Task definitions and configuration relating to the SpringSource 'bundlor' +// OSGi manifest generation utility. +// +// @author cbeams +// see: http://www.springsource.org/bundlor +// ----------------------------------------------------------------------------- + +/** + * Generate an OSGi manifest using the ant bundlor task. + * + * @author ltaylor + * @author cbeams + * @see http://static.springsource.org/s2-bundlor/1.0.x/user-guide/html/ch04s02.html + */ +task bundlor(dependsOn: compileJava) { + description = 'Generates an OSGi-compatibile MANIFEST.MF file.' + + def template = new File(projectDir, 'template.mf') + def bundlorDir = new File("${project.buildDir}/bundlor") + def manifest = file("${bundlorDir}/META-INF/MANIFEST.MF") + + // inform gradle what directory this task writes so that + // it can be removed when issuing `gradle cleanBundlor` + outputs.dir bundlorDir + + // incremental build configuration + // if the $manifest output file already exists, the bundlor + // task will be skipped *unless* any of the following are true + // * template.mf has been changed + // * main classpath dependencies have been changed + // * main java sources for this project have been modified + outputs.files manifest + inputs.files template, project.sourceSets.main.runtimeClasspath + + // tell the jar task to use bundlor manifest instead of the default + jar.manifest.from manifest + + // the bundlor manifest should be evaluated as part of the jar task's + // incremental build + jar.inputs.files manifest + + // configuration that will be used when creating the ant taskdef classpath + configurations { bundlorconf } + dependencies { + bundlorconf 'com.springsource.bundlor:com.springsource.bundlor.ant:1.0.0.RELEASE', + 'com.springsource.bundlor:com.springsource.bundlor:1.0.0.RELEASE', + 'com.springsource.bundlor:com.springsource.bundlor.blint:1.0.0.RELEASE' + } + + doFirst { + ant.taskdef(resource: 'com/springsource/bundlor/ant/antlib.xml', + classpath: configurations.bundlorconf.asPath) + + // the bundlor ant task writes directly to standard out + // redirect it to INFO level logging, which gradle will + // deal with gracefully + logging.captureStandardOutput(LogLevel.INFO) + + // the ant task will throw unless this dir exists + if (!bundlorDir.isDirectory()) + bundlorDir.mkdir() + + // execute the ant task, and write out the $manifest file + ant.bundlor(inputPath: sourceSets.main.classesDir, + outputPath: bundlorDir, manifestTemplatePath: template) { + property(name: 'version', value: project.version) + property(name: 'spring.version', value: project.springVersion) + } + } +} + +// ensure that the bundlor task runs prior to the jar task +jar.dependsOn bundlor + diff --git a/gradle/checks.gradle b/gradle/checks.gradle new file mode 100644 index 0000000000..2240111289 --- /dev/null +++ b/gradle/checks.gradle @@ -0,0 +1,90 @@ + +/* + * Copyright 2002-2010 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. + */ + +/** + * Issue a snapshot dependency report across all Java projects. Detects not + * only direct snapshot dependencies, but transitive as well. + * + * @author cbeams + * @see snapshotDependencyCheck + */ +task snapshotDependencyReport { + description = 'Issues a snapshot dependency report across all Java projects' + + doFirst() { + def snapshotDependencies = new HashMap>() + + javaprojects.each { project -> + project.sourceSets.main.compileClasspath.allDependencies.each { dep -> + if (dep.version.endsWith('SNAPSHOT')) { + if (snapshotDependencies[project] == null) + snapshotDependencies[project] = new ArrayList() + snapshotDependencies[project].add(dep) + } + } + } + + project.hasSnapshotDependencies = snapshotDependencies.size() > 0 + + if (project.hasSnapshotDependencies) { + println "The following snapshot dependencies were found:" + snapshotDependencies.each { entry -> + println "${entry.key} depends on:" + entry.value.each { dep -> + println " ${dep}" + } + } + } + } +} + + +/** + * Abort the build if any Java projects have snapshot dependencies. It important + * that any non-snapshot release be checked for snapshot dependencies before + * final publication, as snapshot dependencies may change and thus make the + * release unstable and/or unreproducable. + * + * This task will be added to the build lifecycle automatically if the release + * is non-snapshot. + * + * -PignoreSnapshotDependencies will bypass aborting the build. A use case for + * this option would be if a transitive dependency out of your control is a + * snapshot release and you wish to proceed with releasing anyway. + * + * @author cbeams + * @see snapshotDependencyReport + */ +task snapshotDependencyCheck(dependsOn: snapshotDependencyReport) { + group = 'Verification' + description = 'Aborts the build if any Java project has snapshot dependencies.' + + // bind to build lifecycle if we're a non-snapshot release + if (version.releaseType != 'SNAPSHOT') { + check.dependsOn snapshotDependencyCheck + } + + onlyIf { + project.hasSnapshotDependencies && + !project.hasProperty('ignoreSnapshotDependencies') + } + doFirst { + throw new GradleException( + "aborting '${name}' task due to snapshot dependencies. " + + "supply -PignoreSnapshotDependencies to override") + } +} diff --git a/gradle/dist.gradle b/gradle/dist.gradle new file mode 100644 index 0000000000..0a75974679 --- /dev/null +++ b/gradle/dist.gradle @@ -0,0 +1,133 @@ +/* + * Copyright 2002-2010 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. + */ + +// ----------------------------------------------------------------------------- +// Task definitions related to releasing the project +// +// @author cbeams +// ----------------------------------------------------------------------------- + +// ensure that every project has been evaluated before this script +// this allows us to look up tasks below and dereference dynamically +// assigned properties like 'docsSpec' below +project.subprojects.each { project -> + evaluationDependsOn project.path +} + +task check { + group = 'Verification' +} + +task build(dependsOn: [check, assemble]) { + group = 'Build' +} + +/** + * Build the distribution zip file. + * + * @author cbeams + */ +task distArchive(type: Zip) { + group = 'Build' + + destinationDir = buildDir + archiveName = "${project.name}-${project.version}.zip" + checksumPath = "${destinationDir}/${archiveName}.sha1" + def zipRootDir = "${project.name}-${project.version}" + + description = "Builds the distribution zip file at ${project.relativePath(destinationDir)}/${archiveName}" + + // depend on all projects with an assemble task + dependsOn subprojects*.tasks*.matching { task -> task.name == 'assemble' } + + // we need the docsSpec to be defined before evaluating this task + project.evaluationDependsOn(':docs') + + // set up outputs for use by incremental build and by tasks like 'cleanDist' + // the archive zip file will be added automatically to outputs.files + // but we must add the sha1 checksum ourselves + outputs.files file(checksumPath) + + // configure the contents of the zip file. remember that this is a + // configuration phase event. no zip is being created yet. the Zip + // task we extend will do that for us during the execution phase. + into(zipRootDir) { + with(project(':docs').docsSpec) + + // add each subproject, but only add the 'src' dir and 'pom.xml' + project('spring-amqp-samples').subprojects.each { sample -> + into("${zipRootDir}/samples/${sample.name}") { + from(sample.projectDir) { + include 'src/**/*' + include 'pom.xml' + } + } + } + // add all jars and source jars from all core java projects + // (i.e.: don't include sample project jars!) + into('dist') { + from coreprojects.collect { project -> project.libsDir } + } + } + + // once the zip has been written, create a sha1 hash for it + // this will write out the file at ${checksumPath} + doLast { + ant.checksum(file: archivePath, algorithm: 'SHA1', fileext: '.sha1') + assert file(checksumPath).isFile(): "${checksumPath} was not created" + } +} + +/** + * Upload the distribution zip file. + * + * @author ltaylor + * @author cbeams + */ +task uploadArchives(overwrite: true, dependsOn: distArchive) { // base plugin adds one we need to overwrite + group = 'Buildmaster' + description = 'Uploads the distribution zip file.' + + configurations { antlibs } + dependencies { + antlibs "org.springframework.build:org.springframework.build.aws.ant:3.0.3.RELEASE", + "net.java.dev.jets3t:jets3t:0.6.1" + } + + def releaseType = version.releaseType.toString().toLowerCase() + + doLast() { + println "Uploading: ${distArchive.archivePath} to s3" + project.ant { + taskdef(resource: 'org/springframework/build/aws/ant/antlib.xml', + classpath: configurations.antlibs.asPath) + s3(accessKey: s3AccessKey, secretKey: s3SecretAccessKey) { + upload(bucketName: 'dist.springframework.org', file: distArchive.archivePath, + toFile: releaseType + "/AMQP/${distArchive.archiveName}", publicRead: 'true') { + metadata(name: 'project.name', value: 'Spring AMQP') + metadata(name: 'release.type', value: releaseType) + metadata(name: 'bundle.version', value: version) + metadata(name: 'package.file.name', value: distArchive.archiveName) + } + upload(bucketName: 'dist.springframework.org', file: "${distArchive.archivePath}.sha1", + toFile: releaseType + "/AMQP/${distArchive.archiveName}.sha1", publicRead: 'true') + } + } + } +} + + + diff --git a/gradle/docbook.gradle b/gradle/docbook.gradle new file mode 100644 index 0000000000..f60b9d62ed --- /dev/null +++ b/gradle/docbook.gradle @@ -0,0 +1,315 @@ +/* + * Copyright 2002-2010 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 org.xml.sax.XMLReader; +import org.xml.sax.InputSource; +import org.apache.xml.resolver.CatalogManager; +import org.apache.xml.resolver.tools.CatalogResolver; + +import javax.xml.parsers.SAXParserFactory; +import javax.xml.transform.*; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.sax.SAXResult; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; +import java.util.zip.*; + +import org.apache.fop.apps.*; + +import org.gradle.api.logging.LogLevel; + +import com.icl.saxon.TransformerFactoryImpl; +import ch.qos.logback.classic.Level; +import org.slf4j.LoggerFactory; + +buildscript { + repositories { + mavenCentral() + mavenRepo name: 'Shibboleth Repo', urls: 'http://shibboleth.internet2.edu/downloads/maven2' + } + dependencies { + def fopDeps = ['org.apache.xmlgraphics:fop:0.95-1@jar', + 'org.apache.xmlgraphics:xmlgraphics-commons:1.3', + 'org.apache.xmlgraphics:batik-bridge:1.7@jar', + 'org.apache.xmlgraphics:batik-util:1.7@jar', + 'org.apache.xmlgraphics:batik-css:1.7@jar', + 'org.apache.xmlgraphics:batik-dom:1.7', + 'org.apache.xmlgraphics:batik-svg-dom:1.7@jar', + 'org.apache.avalon.framework:avalon-framework-api:4.3.1'] + + classpath 'org.apache.xerces:resolver:2.9.1', + 'saxon:saxon:6.5.3', + 'org.apache.xerces:xercesImpl:2.9.1', + fopDeps, + 'net.sf.xslthl:xslthl:2.0.1', + 'net.sf.docbook:docbook-xsl:1.75.2:resources@zip' + } + +} + +/** + * Gradle Docbook plugin implementation. + *

+ * Creates three tasks: docbookHtml, docbookHtmlSingle and docbookPdf. + * Each task takes a single File on which it operates. + * + * @author ltaylor + */ +// Add the plugin tasks to the project +task docbookHtml(type: DocbookHtml) { + setDescription('Generates chunked docbook html output.') + xdir = 'html' + classpath = buildscript.configurations.classpath +} + +task docbookHtmlSingle(type: Docbook) { + setDescription('Generates single page docbook html output.') + xdir = 'htmlsingle' + classpath = buildscript.configurations.classpath +} + +task docbookPdf(type: DocbookFoPdf) { + setDescription('Generates PDF docbook output.') + extension = 'fo' + xdir = 'pdf' + classpath = buildscript.configurations.classpath +} + +/** + */ +public class Docbook extends DefaultTask { + @Input + String extension = 'html'; + + @Input + boolean XIncludeAware = true; + + @Input + boolean highlightingEnabled = true; + + String admonGraphicsPath; + + @InputDirectory + File sourceDirectory = new File(project.getProjectDir(), "build/reference-work"); + + @Input + String sourceFileName; + + @InputFile + File stylesheet; + + @OutputDirectory + File docsDir = new File(project.getBuildDir(), "reference"); + + @InputFiles + Configuration classpath + + @TaskAction + public final void transform() { + // the docbook tasks issue spurious content to the console. redirect to INFO level + // so it doesn't show up in the default log level of LIFECYCLE unless the user has + // run gradle with '-d' or '-i' switches -- in that case show them everything + switch (project.gradle.startParameter.logLevel) { + case LogLevel.DEBUG: + case LogLevel.INFO: + break; + default: + logging.captureStandardOutput(LogLevel.INFO) + logging.captureStandardError(LogLevel.INFO) + } + + SAXParserFactory factory = new org.apache.xerces.jaxp.SAXParserFactoryImpl(); + factory.setXIncludeAware(XIncludeAware); + docsDir.mkdirs(); + + File srcFile = new File(sourceDirectory, sourceFileName); + String outputFilename = srcFile.getName().substring(0, srcFile.getName().length() - 4) + '.' + extension; + + File oDir = new File(getDocsDir(), xdir) + File outputFile = new File(oDir, outputFilename); + + Result result = new StreamResult(outputFile.getAbsolutePath()); + CatalogResolver resolver = new CatalogResolver(createCatalogManager()); + InputSource inputSource = new InputSource(srcFile.getAbsolutePath()); + + XMLReader reader = factory.newSAXParser().getXMLReader(); + reader.setEntityResolver(resolver); + TransformerFactory transformerFactory = new TransformerFactoryImpl(); + transformerFactory.setURIResolver(resolver); + URL url = stylesheet.toURL(); + Source source = new StreamSource(url.openStream(), url.toExternalForm()); + Transformer transformer = transformerFactory.newTransformer(source); + + if (highlightingEnabled) { + File highlightingDir = new File(getProject().getBuildDir(), "highlighting"); + if (!highlightingDir.exists()) { + highlightingDir.mkdirs(); + extractHighlightFiles(highlightingDir); + } + + transformer.setParameter("highlight.xslthl.config", new File(highlightingDir, "xslthl-config.xml").toURI().toURL()); + + if (admonGraphicsPath != null) { + transformer.setParameter("admon.graphics", "1"); + transformer.setParameter("admon.graphics.path", admonGraphicsPath); + } + } + + preTransform(transformer, srcFile, outputFile); + + transformer.transform(new SAXSource(reader, inputSource), result); + + postTransform(outputFile); + } + + private void extractHighlightFiles(File toDir) { + File docbookZip = classpath.files.find { file -> file.name.contains('docbook-xsl-')}; + + if (docbookZip == null) { + throw new GradleException("Docbook zip file not found"); + } + + ZipFile zipFile = new ZipFile(docbookZip); + + Enumeration e = zipFile.entries(); + while (e.hasMoreElements()) { + ZipEntry ze = (ZipEntry) e.nextElement(); + if (ze.getName().matches(".*/highlighting/.*\\.xml")) { + String filename = ze.getName().substring(ze.getName().lastIndexOf("/highlighting/") + 14); + copyFile(zipFile.getInputStream(ze), new File(toDir, filename)); + } + } + } + + private void copyFile(InputStream source, File destFile) { + destFile.createNewFile(); + FileOutputStream to = null; + try { + to = new FileOutputStream(destFile); + byte[] buffer = new byte[4096]; + int bytesRead; + + while ((bytesRead = source.read(buffer)) > 0) { + to.write(buffer, 0, bytesRead); + } + } finally { + if (source != null) { + source.close(); + } + if (to != null) { + to.close(); + } + } + } + + protected void preTransform(Transformer transformer, File sourceFile, File outputFile) { + } + + protected void postTransform(File outputFile) { + } + + private CatalogManager createCatalogManager() { + CatalogManager manager = new CatalogManager(); + manager.setIgnoreMissingProperties(true); + ClassLoader classLoader = this.getClass().getClassLoader(); + StringBuilder builder = new StringBuilder(); + String docbookCatalogName = "docbook/catalog.xml"; + URL docbookCatalog = classLoader.getResource(docbookCatalogName); + + if (docbookCatalog == null) { + throw new IllegalStateException("Docbook catalog " + docbookCatalogName + " could not be found in " + classLoader); + } + + builder.append(docbookCatalog.toExternalForm()); + + Enumeration enumeration = classLoader.getResources("/catalog.xml"); + while (enumeration.hasMoreElements()) { + builder.append(';'); + URL resource = (URL) enumeration.nextElement(); + builder.append(resource.toExternalForm()); + } + String catalogFiles = builder.toString(); + manager.setCatalogFiles(catalogFiles); + return manager; + } +} + +/** + */ +class DocbookHtml extends Docbook { + + @Override + protected void preTransform(Transformer transformer, File sourceFile, File outputFile) { + String rootFilename = outputFile.getName(); + rootFilename = rootFilename.substring(0, rootFilename.lastIndexOf('.')); + transformer.setParameter("root.filename", rootFilename); + transformer.setParameter("base.dir", outputFile.getParent() + File.separator); + } +} + +/** + */ +class DocbookFoPdf extends Docbook { + + /** + * From the FOP usage guide + */ + @Override + protected void postTransform(File foFile) { + FopFactory fopFactory = FopFactory.newInstance(); + + OutputStream out = null; + final File pdfFile = getPdfOutputFile(foFile); + logger.debug("Transforming 'fo' file " + foFile + " to PDF: " + pdfFile); + + try { + out = new BufferedOutputStream(new FileOutputStream(pdfFile)); + + Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, out); + + TransformerFactory factory = TransformerFactory.newInstance(); + Transformer transformer = factory.newTransformer(); + + Source src = new StreamSource(foFile); + + Result res = new SAXResult(fop.getDefaultHandler()); + + switch (project.gradle.startParameter.logLevel) { + case LogLevel.DEBUG: + case LogLevel.INFO: + break; + default: + // only show verbose fop output if the user has specified 'gradle -d' or 'gradle -i' + LoggerFactory.getILoggerFactory().getLogger('org.apache.fop').level = Level.ERROR + } + + transformer.transform(src, res); + + } finally { + if (out != null) { + out.close(); + } + } + + if (!foFile.delete()) { + logger.warn("Failed to delete 'fo' file " + foFile); + } + } + + private File getPdfOutputFile(File foFile) { + String name = foFile.getAbsolutePath(); + return new File(name.substring(0, name.length() - 2) + "pdf"); + } +} diff --git a/gradle/maven-deployment.gradle b/gradle/maven-deployment.gradle new file mode 100644 index 0000000000..5f9b4165b1 --- /dev/null +++ b/gradle/maven-deployment.gradle @@ -0,0 +1,122 @@ +/* + * Copyright 2002-2010 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. + */ + +// ----------------------------------------------------------------------------- +// Tasks related to deploying Maven artifacts. +// +// @author cbeams +// ----------------------------------------------------------------------------- + + +// check that upload-related properties are defined and fail early if not +// these properties ('s3AccessKey', etc) should be defined in +// 'gradle.properties' in $HOME/.gradle/gradle.properties +def requiredProps = version.releaseType == 'RELEASE' ? ['mavenSyncRepoDir'] : ['s3AccessKey', 's3SecretAccessKey'] +checkForProps(taskPath: project.path + ':uploadArchives', requiredProps: requiredProps) + +/** + * Builds a source jar artifact for all main java sources. + * + * @author ltaylor + */ +task sourceJar(type: Jar) { + description = 'Builds a source jar artifact suitable for maven deployment.' + classifier = 'sources' + from sourceSets.main.java +} +build.dependsOn sourceJar + +// Add the source jar archive to the set of artifacts for this project. +// Note that the regular 'jar' archive is already added by default. +artifacts { + archives sourceJar +} + + +/** + * Deploy gradle-built artifacts to a remote maven repository. Overrides and + * further customizes the 'uploadArchives' task contributed by the 'maven' + * plugin. + * + * The repository that artifacts are deployed to is determined conditionally + * based on the release type of the project version. Snapshot builds will + * be deployed via s3 to the springframework maven snapshot repository; + * milestone builds will happen via s3 as well; release builds will be deployed + * to the local filesystem to be sync'd via sourceforge CVS and ultimately + * deployed to maven central. + * + * Gradle will generate Maven poms on-the-fly during the deployment process. + * This process is customized to add ASL license information, and for projects + * that have the erlangLicense property set to true, the Erlang License will be + * added to the pom as well. + * + * @author cbeams + * @see 'mavenSyncRepoDir' in gradle.properties + * @see `gradle install` for deploying artifacts to the local .m2 cache + * @see http://maven.apache.org/guides/mini/guide-central-repository-upload.html + */ +uploadArchives { + group = 'Buildmaster' + description = "Does a maven deploy of archives artifacts to " // url appended below + + def releaseRepositoryUrl = "file://${project.properties.mavenSyncRepoDir}" + def milestoneRepositoryUrl = 's3://maven.springframework.org/milestone' + def snapshotRepositoryUrl = 's3://maven.springframework.org/snapshot' + + // add a configuration with a classpath that includes our s3 maven deployer + configurations { deployerJars } + dependencies { + deployerJars "org.springframework.build.aws:org.springframework.build.aws.maven:3.0.0.RELEASE" + } + + repositories.mavenDeployer { + switch (version.releaseType) { + case 'RELEASE': + repository(url: releaseRepositoryUrl) + description += releaseRepositoryUrl + break; + + case 'MILESTONE': + description += milestoneRepositoryUrl + // fall through and pick up config below + + case 'SNAPSHOT': + description += snapshotRepositoryUrl + s3credentials = [userName: project.properties.s3AccessKey, passphrase: project.properties.s3SecretAccessKey] + configuration = configurations.deployerJars + repository(url: milestoneRepositoryUrl) { + authentication(s3credentials) + } + snapshotRepository(url: snapshotRepositoryUrl) { + authentication(s3credentials) + } + break; + + default: + throw new GradleException("unknown ReleaseType") + } + + pom.project { + licenses { + license { + name 'The Apache Software License, Version 2.0' + url 'http://www.apache.org/licenses/LICENSE-2.0.txt' + distribution 'repo' + } + } + } + } +} diff --git a/gradle/version.gradle b/gradle/version.gradle new file mode 100644 index 0000000000..b434f44998 --- /dev/null +++ b/gradle/version.gradle @@ -0,0 +1,69 @@ +class Version { + /** + * Indicates whether a version is a release, milestone, or snapshot + */ + static final String RELEASE = 'RELEASE' + static final String MILESTONE = 'MILESTONE' + static final String SNAPSHOT = 'SNAPSHOT' + + String value + String releaseType + + /** + * @param dotted -quad version spec, e.g.: 1.0.0.RELEASE + */ + public Version(String value) { + this.value = value; + this.releaseType = releaseTypeFor(value); + } + + /** + * @return 1.0.x style + */ + public String getWildcardValue() { + return "1.0.x"; + } + + /** + * @return the version string returned by {@link getValue ( )} + */ + public String toString() { + return this.getValue(); + } + + /** + * @param dotted -quad version spec, e.g.: 1.0.0.RELEASE + */ + public static String releaseTypeFor(String version) { + if (version.endsWith("RELEASE")) return RELEASE; + if (version.endsWith("SNAPSHOT")) return SNAPSHOT; + if (version.matches(".*\\.M[0-9]+\$")) return MILESTONE; + + throw new InvalidUserDataException("unknown version scheme: " + + "versions must end in (RELEASE|SNAPSHOT|M[0-9]+), " + + "but got (" + version + ")"); + } +} + +project.createVersion = { value -> + new Version(value) +} + +def requiredPropSets = [] + +gradle.taskGraph.whenReady { graph -> + requiredPropSets.each { args -> + if (graph.hasTask(args.taskPath)) { + def missingProps = args.requiredProps.findAll { prop -> + !project.hasProperty(prop) + } + if (missingProps) { + throw new GradleException("For executing the ${args.taskPath} task you need to set all ${missingProps} properties") + } + } + } +} +project.checkForProps = { Map args -> + requiredPropSets.add args +} + diff --git a/gradle/wrapper.gradle b/gradle/wrapper.gradle new file mode 100644 index 0000000000..e7bb303b1a --- /dev/null +++ b/gradle/wrapper.gradle @@ -0,0 +1,32 @@ +/* + * Copyright 2002-2010 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. + */ + +/** + * Generate gradlew and gradlew.bat scripts and associated files. These + * convenience scripts allow users to operate the build without being forced to + * download and install gradle. + * + * @author cbeams + * @see http://gradle.org/0.9-preview-3/docs/userguide/userguide_single.html#gradle_wrapper + */ +task wrapper(type: Wrapper) { + group = 'Buildmaster' + description = "Generates gradlew and gradlew.bat bootstrap scripts" + gradleVersion = '0.9-preview-3' + // place jar file and properties into a + // subdirectory to avoid root dir clutter + jarPath = 'gradle/wrapper' +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..4eb13be9e5c3355b057b87d44e59956b99e34b29 GIT binary patch literal 12538 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/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +"$JAVACMD" $JAVA_OPTS $GRADLE_OPTS \ + -classpath "$CLASSPATH" \ + -Dorg.gradle.wrapper.properties="$WRAPPER_PROPERTIES" \ + $STARTER_MAIN_CLASS \ + "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100755 index 0000000000..114aaa4c7d --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,126 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem ## +@rem Gradle startup script for Windows ## +@rem ## +@rem ########################################################################## + +@rem +@rem $Revision: 10602 $ $Date: 2008-01-25 02:49:54 +0100 (ven., 25 janv. 2008) $ +@rem + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Uncomment those lines to set JVM options. GRADLE_OPTS and JAVA_OPTS can be used together. +@rem set GRADLE_OPTS=%GRADLE_OPTS% -Xmx512 +@rem set JAVA_OPTS=%JAVA_OPTS% -Xmx512 + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=.\ + +@rem Determine the command interpreter to execute the "CD" later +set COMMAND_COM="cmd.exe" +if exist "%SystemRoot%\system32\cmd.exe" set COMMAND_COM="%SystemRoot%\system32\cmd.exe" +if exist "%SystemRoot%\command.com" set COMMAND_COM="%SystemRoot%\command.com" + +@rem Use explicit find.exe to prevent cygwin and others find.exe from being used +set FIND_EXE="find.exe" +if exist "%SystemRoot%\system32\find.exe" set FIND_EXE="%SystemRoot%\system32\find.exe" +if exist "%SystemRoot%\command\find.exe" set FIND_EXE="%SystemRoot%\command\find.exe" + +:check_JAVA_HOME +@rem Make sure we have a valid JAVA_HOME +if not "%JAVA_HOME%" == "" goto have_JAVA_HOME + +echo. +echo ERROR: Environment variable JAVA_HOME has not been set. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. +echo. +goto end + +:have_JAVA_HOME +@rem Validate JAVA_HOME +%COMMAND_COM% /C DIR "%JAVA_HOME%" 2>&1 | %FIND_EXE% /I /C "%JAVA_HOME%" >nul +if not errorlevel 1 goto init + +echo. +echo ERROR: JAVA_HOME might be set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation if there are problems. +echo. + +:init +@rem get name of script to launch with full path +@rem Get command-line arguments, handling Windowz variants +SET _marker=%JAVA_HOME: =% +@rem IF NOT "%_marker%" == "%JAVA_HOME%" ECHO JAVA_HOME "%JAVA_HOME%" contains spaces. Please change to a location without spaces if this causes problems. + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%eval[2+2]" == "4" goto 4NT_args + +IF "%_marker%" == "%JAVA_HOME%" goto :win9xME_args + +set _FIXPATH= +call :fixpath "%JAVA_HOME%" +set JAVA_HOME=%_FIXPATH:~1% + +goto win9xME_args + +:fixpath +if not %1.==. ( +for /f "tokens=1* delims=;" %%a in (%1) do ( +call :shortfilename "%%a" & call :fixpath "%%b" +) +) +goto :EOF +:shortfilename +for %%i in (%1) do set _FIXPATH=%_FIXPATH%;%%~fsi +goto :EOF + + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set STARTER_MAIN_CLASS=org.gradle.wrapper.GradleWrapperMain +set CLASSPATH=%DIRNAME%\gradle\wrapper\gradle-wrapper.jar +set WRAPPER_PROPERTIES=%DIRNAME%\gradle\wrapper\gradle-wrapper.properties +set JAVA_EXE=%JAVA_HOME%\bin\java.exe + +set GRADLE_OPTS=%JAVA_OPTS% %GRADLE_OPTS% -Dorg.gradle.wrapper.properties="%WRAPPER_PROPERTIES%" + +"%JAVA_EXE%" %GRADLE_OPTS% -classpath "%CLASSPATH%" %STARTER_MAIN_CLASS% %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +if not "%OS%"=="Windows_NT" echo 1 > nul | choice /n /c:1 + +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit "%ERRORLEVEL%" +exit /b "%ERRORLEVEL%" + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000000..d3e834281c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,17 @@ +/* + * Copyright 2002-2010 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. + */ + +include 'spring-integration-core'