parent
							
								
									2df08bdfbd
								
							
						
					
					
						commit
						b8f408ed5f
					
				
							
								
								
									
										14
									
								
								build.gradle
								
								
								
								
							
							
						
						
									
										14
									
								
								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"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,101 +31,101 @@ import org.gradle.plugins.ide.eclipse.model.EclipseClasspath
 | 
			
		|||
import org.gradle.plugins.ide.idea.IdeaPlugin
 | 
			
		||||
 | 
			
		||||
class SplitPackageDetectorPlugin implements Plugin<Project> {
 | 
			
		||||
    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<Project> projectsToScan
 | 
			
		||||
	@Input
 | 
			
		||||
	Set<Project> projectsToScan
 | 
			
		||||
 | 
			
		||||
    @TaskAction
 | 
			
		||||
    public final void diagnoseSplitPackages() {
 | 
			
		||||
        def Map<Project, Project> 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
 | 
			
		||||
    }
 | 
			
		||||
	@TaskAction
 | 
			
		||||
	public final void diagnoseSplitPackages() {
 | 
			
		||||
		def Map<Project, Project> 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 HIDDEN_DIRECTORY_PREFIX = "."
 | 
			
		||||
 | 
			
		||||
    private static final String JAVA_FILE_SUFFIX = ".java"
 | 
			
		||||
	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 SRC_MAIN_JAVA = "src" + File.separator + "main" + File.separator + "java"
 | 
			
		||||
 | 
			
		||||
    private static final String PACKAGE_SEPARATOR = "."
 | 
			
		||||
	private static final String PACKAGE_SEPARATOR = "."
 | 
			
		||||
 | 
			
		||||
    private final Map<Project, Project> mergeMap
 | 
			
		||||
	private final Map<Project, Project> mergeMap
 | 
			
		||||
 | 
			
		||||
    private final Map<Project, Set<String>> pkgMap = [:]
 | 
			
		||||
	private final Map<Project, Set<String>> pkgMap = [:]
 | 
			
		||||
 | 
			
		||||
    private final logger
 | 
			
		||||
	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)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
	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(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 File[] dirList(File dir) {
 | 
			
		||||
		dir.listFiles({ file -> file.isDirectory() && !file.getName().startsWith(HIDDEN_DIRECTORY_PREFIX) } as FileFilter)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    private Set<String> getPackagesInDirectory(File dir) {
 | 
			
		||||
        def pkgs = new HashSet<String>()
 | 
			
		||||
        addPackagesInDirectory(pkgs, new File(dir, SRC_MAIN_JAVA), "")
 | 
			
		||||
        return pkgs;
 | 
			
		||||
    }
 | 
			
		||||
	private Set<String> getPackagesInDirectory(File dir) {
 | 
			
		||||
		def pkgs = new HashSet<String>()
 | 
			
		||||
		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
 | 
			
		||||
    }
 | 
			
		||||
	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<String> 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())
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
	private void addPackagesInDirectory(HashSet<String> 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())
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue