diff --git a/build.gradle b/build.gradle index 697cdbea53d6..f67e2740c0c9 100644 --- a/build.gradle +++ b/build.gradle @@ -753,18 +753,18 @@ configure(rootProject) { apply plugin: "docbook-reference" apply plugin: "groovy" apply from: "${gradleScriptDir}/jdiff.gradle" - apply plugin: org.springframework.build.gradle.SplitPackageDetectorPlugin + apply plugin: org.springframework.build.gradle.SplitPackageDetectorPlugin - reference { + reference { sourceDir = file("src/reference/docbook") pdfFilename = "spring-framework-reference.pdf" } - diagnoseSplitPackages { - projectsToScan = project.subprojects - project(":spring-instrument-tomcat") // SPR-10150 - } + diagnoseSplitPackages { + projectsToScan = project.subprojects - project(":spring-instrument-tomcat") // SPR-10150 + } - // don"t publish the default jar for the root project + // don"t publish the default jar for the root project configurations.archives.artifacts.clear() dependencies { // for integration tests @@ -788,7 +788,7 @@ configure(rootProject) { testCompile("hsqldb:hsqldb:${hsqldbVersion}") } - check.dependsOn diagnoseSplitPackages + check.dependsOn diagnoseSplitPackages task api(type: Javadoc) { group = "Documentation" diff --git a/buildSrc/src/main/groovy/org/springframework/build/gradle/SplitPackageDetectorPlugin.groovy b/buildSrc/src/main/groovy/org/springframework/build/gradle/SplitPackageDetectorPlugin.groovy index 01c36fad7a22..eddfec385c4c 100644 --- a/buildSrc/src/main/groovy/org/springframework/build/gradle/SplitPackageDetectorPlugin.groovy +++ b/buildSrc/src/main/groovy/org/springframework/build/gradle/SplitPackageDetectorPlugin.groovy @@ -31,101 +31,101 @@ import org.gradle.plugins.ide.eclipse.model.EclipseClasspath import org.gradle.plugins.ide.idea.IdeaPlugin class SplitPackageDetectorPlugin implements Plugin { - public void apply(Project project) { - Task diagnoseSplitPackages = project.tasks.add('diagnoseSplitPackages', SplitPackageDetectorTask.class) - diagnoseSplitPackages.setDescription('Detects packages which will be split across JARs') - } + public void apply(Project project) { + Task diagnoseSplitPackages = project.tasks.add('diagnoseSplitPackages', SplitPackageDetectorTask.class) + diagnoseSplitPackages.setDescription('Detects packages which will be split across JARs') + } } public class SplitPackageDetectorTask extends DefaultTask { - @Input - Set projectsToScan - - @TaskAction - public final void diagnoseSplitPackages() { - def Map mergeMap = [:] - def projects = projectsToScan.findAll { it.plugins.findPlugin(org.springframework.build.gradle.MergePlugin) }.findAll { it.merge.into } - projects.each { p -> - mergeMap.put(p, p.merge.into) - } - def splitFound = new org.springframework.build.gradle.SplitPackageDetector(projectsToScan, mergeMap, project.logger).diagnoseSplitPackages(); - assert !splitFound // see error log messages for details of split packages - } + @Input + Set projectsToScan + + @TaskAction + public final void diagnoseSplitPackages() { + def Map mergeMap = [:] + def projects = projectsToScan.findAll { it.plugins.findPlugin(org.springframework.build.gradle.MergePlugin) }.findAll { it.merge.into } + projects.each { p -> + mergeMap.put(p, p.merge.into) + } + def splitFound = new org.springframework.build.gradle.SplitPackageDetector(projectsToScan, mergeMap, project.logger).diagnoseSplitPackages(); + assert !splitFound // see error log messages for details of split packages + } } class SplitPackageDetector { - private static final String HIDDEN_DIRECTORY_PREFIX = "." - - private static final String JAVA_FILE_SUFFIX = ".java" - - private static final String SRC_MAIN_JAVA = "src" + File.separator + "main" + File.separator + "java" - - private static final String PACKAGE_SEPARATOR = "." - - private final Map mergeMap - - private final Map> pkgMap = [:] - - private final logger - - SplitPackageDetector(projectsToScan, mergeMap, logger) { - this.mergeMap = mergeMap - this.logger = logger - projectsToScan.each { Project p -> - def dir = p.projectDir - def packages = getPackagesInDirectory(dir) - if (!packages.isEmpty()) { - pkgMap.put(p, packages) - } - } - } - - private File[] dirList(String dir) { - dirList(new File(dir)) - } - - private File[] dirList(File dir) { - dir.listFiles({ file -> file.isDirectory() && !file.getName().startsWith(HIDDEN_DIRECTORY_PREFIX) } as FileFilter) - } - - private Set getPackagesInDirectory(File dir) { - def pkgs = new HashSet() - addPackagesInDirectory(pkgs, new File(dir, SRC_MAIN_JAVA), "") - return pkgs; - } - - boolean diagnoseSplitPackages() { - def splitFound = false; - def projs = pkgMap.keySet().toArray() - def numProjects = projs.length - for (int i = 0; i < numProjects - 1; i++) { - for (int j = i + 1; j < numProjects - 1; j++) { - def pi = projs[i] - def pkgi = new HashSet(pkgMap.get(pi)) - def pj = projs[j] - def pkgj = pkgMap.get(pj) - pkgi.retainAll(pkgj) - if (!pkgi.isEmpty() && mergeMap.get(pi) != pj && mergeMap.get(pj) != pi) { - pkgi.each { pkg -> - def readablePkg = pkg.substring(1).replaceAll(File.separator, PACKAGE_SEPARATOR) - logger.error("Package '$readablePkg' is split between $pi and $pj") - } - splitFound = true - } - } - } - return splitFound - } - - private void addPackagesInDirectory(HashSet packages, File dir, String pkg) { - def scanDir = new File(dir, pkg) - def File[] javaFiles = scanDir.listFiles({ file -> !file.isDirectory() && file.getName().endsWith(JAVA_FILE_SUFFIX) } as FileFilter) - if (javaFiles != null && javaFiles.length != 0) { - packages.add(pkg) - } - dirList(scanDir).each { File subDir -> - addPackagesInDirectory(packages, dir, pkg + File.separator + subDir.getName()) - } - } -} \ No newline at end of file + private static final String HIDDEN_DIRECTORY_PREFIX = "." + + private static final String JAVA_FILE_SUFFIX = ".java" + + private static final String SRC_MAIN_JAVA = "src" + File.separator + "main" + File.separator + "java" + + private static final String PACKAGE_SEPARATOR = "." + + private final Map mergeMap + + private final Map> pkgMap = [:] + + private final logger + + SplitPackageDetector(projectsToScan, mergeMap, logger) { + this.mergeMap = mergeMap + this.logger = logger + projectsToScan.each { Project p -> + def dir = p.projectDir + def packages = getPackagesInDirectory(dir) + if (!packages.isEmpty()) { + pkgMap.put(p, packages) + } + } + } + + private File[] dirList(String dir) { + dirList(new File(dir)) + } + + private File[] dirList(File dir) { + dir.listFiles({ file -> file.isDirectory() && !file.getName().startsWith(HIDDEN_DIRECTORY_PREFIX) } as FileFilter) + } + + private Set getPackagesInDirectory(File dir) { + def pkgs = new HashSet() + addPackagesInDirectory(pkgs, new File(dir, SRC_MAIN_JAVA), "") + return pkgs; + } + + boolean diagnoseSplitPackages() { + def splitFound = false; + def projs = pkgMap.keySet().toArray() + def numProjects = projs.length + for (int i = 0; i < numProjects - 1; i++) { + for (int j = i + 1; j < numProjects - 1; j++) { + def pi = projs[i] + def pkgi = new HashSet(pkgMap.get(pi)) + def pj = projs[j] + def pkgj = pkgMap.get(pj) + pkgi.retainAll(pkgj) + if (!pkgi.isEmpty() && mergeMap.get(pi) != pj && mergeMap.get(pj) != pi) { + pkgi.each { pkg -> + def readablePkg = pkg.substring(1).replaceAll(File.separator, PACKAGE_SEPARATOR) + logger.error("Package '$readablePkg' is split between $pi and $pj") + } + splitFound = true + } + } + } + return splitFound + } + + private void addPackagesInDirectory(HashSet packages, File dir, String pkg) { + def scanDir = new File(dir, pkg) + def File[] javaFiles = scanDir.listFiles({ file -> !file.isDirectory() && file.getName().endsWith(JAVA_FILE_SUFFIX) } as FileFilter) + if (javaFiles != null && javaFiles.length != 0) { + packages.add(pkg) + } + dirList(scanDir).each { File subDir -> + addPackagesInDirectory(packages, dir, pkg + File.separator + subDir.getName()) + } + } +}