All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.whitesource.gradle.tasks.CollectProjectInfoTask.groovy Maven / Gradle / Ivy

package org.whitesource.gradle.tasks

import org.apache.commons.lang.StringUtils
import org.gradle.api.DefaultTask
import org.gradle.api.artifacts.ResolvedDependency
import org.gradle.api.tasks.TaskAction
import org.whitesource.agent.hash.ChecksumUtils
import org.whitesource.agent.api.model.AgentProjectInfo
import org.whitesource.agent.api.model.Coordinates
import org.whitesource.agent.api.model.DependencyInfo
import org.whitesource.agent.api.model.DependencyType
import org.whitesource.gradle.WhitesourceConfiguration

import java.util.stream.Stream

/**
 * @author Itai Marko
 * @author raz.nitzan
 */
class CollectProjectInfoTask extends DefaultTask {

    WhitesourceConfiguration wssConfig = project.whitesource

    @TaskAction
    def CollectProjectInfos() {
        // set project names
        String projectName = null
        if (wssConfig.includedProjects.size() > 1) {
            if (!wssConfig.projectNames.isEmpty()) {
                projectName = wssConfig.projectNames.get(project.name)
            }
        } else {
            projectName = wssConfig.projectName
        }

        // validate project name
        if (StringUtils.isBlank(projectName)) {
            projectName = project.name
        }

        logger.lifecycle("Processing project ${project.name}")
        def projectInfo = new AgentProjectInfo()
        projectInfo.setCoordinates(new Coordinates(null, projectName, null))
        if (project.parent) {
            projectInfo.setParentCoordinates(new Coordinates(null, project.parent.name, null))
        }

        if (wssConfig.includedProjects.size() > 1) {
            projectInfo.setProjectToken(wssConfig.projectTokens.get(project.name))
        } else {
            projectInfo.setProjectToken(wssConfig.projectToken)
        }

        def configurationsToInclude = project.configurations.findAll { thisProjectConfiguration ->
            thisProjectConfiguration.name in wssConfig.includedConfigurationNames || thisProjectConfiguration.name in wssConfig.includedConfigurations*.name
        }

        def addedSha1s = new HashSet()

        if (wssConfig.useAndroidPlugin){
            // filtering out configurations without files' list
            def files = configurationsToInclude.stream().filter({ configuration -> try { return  configuration.getFiles() != null; }
            catch (IllegalStateException e){
                return  false;
            }})*.getFiles().flatten();
            /**
             * path\groupId\artifactId\version\sha1\filename
             * e.g
             * path\com.android.support.test\rules\1.0.1\afc664aefa2eb399dc8cce3e87d795fb0822a9a7\rules-1.0.1.aar
             */
            files.stream().distinct().each { file ->
                def sha1Path = file.getParentFile(); // removing the file name
                if (!addedSha1s.contains(sha1Path.getName())){
                    def dependencyInfo = new DependencyInfo();
                    dependencyInfo.setSha1(sha1Path.getName());
                    def versionPath = sha1Path.getParentFile(); // removing the sha1 value
                    dependencyInfo.setVersion(versionPath.getName());
                    def artifactIdPath = versionPath.getParentFile(); // removing the version
                    dependencyInfo.setArtifactId(artifactIdPath.getName());
                    def groupIdPath = artifactIdPath.getParentFile(); // removing the artifact id
                    dependencyInfo.setGroupId(groupIdPath.getName());
                    addedSha1s.add(sha1Path);
                    projectInfo.getDependencies().add(dependencyInfo);
                }
            }
        } else {
            configurationsToInclude*.resolvedConfiguration*.getFirstLevelModuleDependencies(wssConfig.dependencyFilter).flatten().each { dependency ->
                def resolvedDependency = (ResolvedDependency) dependency
                def info = getDependencyInfo(resolvedDependency, addedSha1s)
                if (info.getGroupId() != null || info.getArtifactId() != null || info.getVersion() != null) {
                    logger.info("CollectProjectInfoTask:CollectProjectInfos - info.groupId = " + info.getGroupId());
                    //logger.lifecycle("CollectProjectInfoTask:CollectProjectInfos - projectInfo.getDependencies() = " + projectInfo.getDependencies());
                    projectInfo.getDependencies().add(info)
                }
            }
            configurationsToInclude*.resolvedConfiguration*.getFiles(wssConfig.dependencyFilter).flatten().each { file ->
                def sha1 = ChecksumUtils.calculateSHA1(file)
                if (!addedSha1s.contains(sha1)) {
                    def dependencyInfo = new DependencyInfo()
                    dependencyInfo.setArtifactId(file.name)
                    dependencyInfo.setFilename(file.name)
                    dependencyInfo.setSystemPath(file.absolutePath)
                    dependencyInfo.setSha1(sha1)
                    dependencyInfo.setDependencyType(DependencyType.GRADLE)
                    projectInfo.getDependencies().add(dependencyInfo)
                    //logger.lifecycle("CollectProjectInfoTask:CollectProjectInfos - addedSha1s = " + addedSha1s);
                    //logger.lifecycle("CollectProjectInfoTask:CollectProjectInfos - sha1 = " + sha1);
                    addedSha1s.add(sha1)
                }
            }
        }

        //logger.lifecycle("CollectProjectInfoTask:CollectProjectInfos - project.projectInfos = " + project.projectInfos);
        project.projectInfos.add(projectInfo)
    }

    def getDependencyInfo(ResolvedDependency dependency, addedSha1s) {
        def dependencyInfo = new DependencyInfo()
        //logger.lifecycle("CollectProjectInfoTask:getDependencyInfo - dependency.getAllModuleArtifacts() = " + dependency.getAllModuleArtifacts());
        try {
            def artifact = dependency.getAllModuleArtifacts()[0]
            if (artifact != null) {
                def file = artifact.getFile()
                def sha1 = ChecksumUtils.calculateSHA1(file)
                if (!addedSha1s.contains(sha1)) {
                    dependencyInfo.setGroupId(dependency.getModuleGroup())
                    dependencyInfo.setArtifactId(dependency.getModuleName())
                    dependencyInfo.setVersion(dependency.getModuleVersion())
                    dependencyInfo.setSha1(sha1)
                    //logger.lifecycle("CollectProjectInfoTask:getDependencyInfo - addedSha1s = " + addedSha1s);
                    //logger.lifecycle("CollectProjectInfoTask:getDependencyInfo - sha1 = " + sha1);
                    addedSha1s.add(sha1)
                    dependency.getChildren().each {
                        def info = getDependencyInfo(it, addedSha1s)
                        if (info.getSha1() != null) {
                            //logger.lifecycle("CollectProjectInfoTask:getDependencyInfo - dependencyInfo.getChildren() = " + dependencyInfo.getChildren());
                            //logger.lifecycle("CollectProjectInfoTask:getDependencyInfo - info = " + info);
                            dependencyInfo.getChildren().add(info)
                        }
                    }
                }
            }
        } catch (Error e){
            logger.warn("Can't get dependency " + dependency.getName() + " module artifacts.  Error message: " + e.getMessage());
            logger.debug("stack trace: ", e.printStackTrace())
        }
        return dependencyInfo
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy