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

io.sealights.agents.plugin.ProjectDataCollector Maven / Gradle / Ivy

package io.sealights.agents.plugin;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ModuleVersionIdentifier;
import org.gradle.api.artifacts.ResolvedArtifact;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.tasks.SourceSet;

import io.sealights.onpremise.agents.java.agent.infra.utils.StringUtils;
import io.sealights.onpremise.agents.java.agent.plugins.engine.api.DependencyInfo;
import io.sealights.onpremise.agents.java.agent.plugins.engine.api.ProjectDescriptor;

public class ProjectDataCollector {

    private final static String SEALIGHTS_GRADLE_PLUGIN = "sealights-gradle-plugin";
    private Project rootProject;

    public static ProjectDescriptor execute(Project rootProject) {
    		ProjectDataCollector instance = new ProjectDataCollector(rootProject);
    		return instance.collectProjectData();
    }

    private ProjectDataCollector(Project rootProject) {
        this.rootProject = rootProject;
    }

    private ProjectDescriptor collectProjectData() {
    	try {
	        return new ProjectDescriptor(
	                SEALIGHTS_GRADLE_PLUGIN,
	                resolvePluginVersion(),
	                rootProject.getName(),
	                rootProject.getVersion().toString(),
	                collectProperties(),
	                resolveBaseSourceDir(),
	                rootProject.getProjectDir().getAbsolutePath(),
	                rootProject.getBuildDir().getAbsolutePath(),
	                collectDependenciesData(),
	                collectPluginsData());
    	}
    	catch(Exception e) {
    		// Catch any null pointer exception instead of checking each getMethod 
    		return new ProjectDescriptor();
    	}
    }
    
    private String resolvePluginVersion() {
    	return "[-]";
    }

    private Properties collectProperties() {
        Properties destProps = new Properties();
        // This is too much ...
//        Map projectProps = project.getProperties();
//        for (String key : projectProps.keySet()) {
//            Object value = projectProps.get(key);
//            if (value != null) {
//                destProps.setProperty(key, value.toString());
//            }
//        }
        return destProps;
    }

    private List collectDependenciesData(){
        Set dependencies = new HashSet<>();
        dependencies = collectProjectDependencies(rootProject);
        for (Project subproject : rootProject.getAllprojects()){
            dependencies.addAll(collectProjectDependencies(subproject));
        }
        List dependenciesAsList = new ArrayList<>();
        dependenciesAsList.addAll(dependencies);
        return dependenciesAsList;
    }

    private Set collectProjectDependencies(Project project) {
        Set dependenciesData = new HashSet<>();
        Configuration runtimeCfg = project.getConfigurations().getByName("runtime");
        if ( runtimeCfg != null && runtimeCfg.getResolvedConfiguration() != null) {
            Set artifacts = runtimeCfg.getResolvedConfiguration().getResolvedArtifacts();
            for (ResolvedArtifact a : artifacts) {
            	DependencyInfo dependencyInfo = artifactAsDependecyInfo(a);
            	if (dependencyInfo != null) {
                    dependenciesData.add(dependencyInfo);
                }
            }
        }
        return dependenciesData;
    }
    
    private DependencyInfo artifactAsDependecyInfo(ResolvedArtifact artifact) {
        if (artifact.getModuleVersion() != null && artifact.getModuleVersion().getId() != null ) {
            // Artifact may have either module version or module version id 'null'
            // Put dependencies of "good" artifacts only
            ModuleVersionIdentifier moduleVersion =  artifact.getModuleVersion().getId();

            return new DependencyInfo(
                            notNullValue(moduleVersion.getGroup()),
                            notNullValue(moduleVersion.getName()),
                            notNullValue(moduleVersion.getVersion()));
        }
        else {
        	return null;
        }
    }

    private String notNullValue(String value) {
        return value != null ? value : StringUtils.EMPTY_STRING;
    }

    private List collectPluginsData() {
        List pluginsData = new ArrayList<>();
        for (Plugin p: rootProject.getPlugins()) {
            pluginsData.add(new DependencyInfo("[-]", p.getClass().getSimpleName(), "[-]"));
        }
        return pluginsData;
    }

    private String resolveBaseSourceDir() {
    	String defaultSrcDir = rootProject.getPath();
    	try {
    		boolean javaPlugin = rootProject.getPlugins().hasPlugin(JavaPlugin.class); 
    		if (javaPlugin ) {
    			   JavaPluginConvention javaPluginConvention = rootProject.getConvention().getPlugin(JavaPluginConvention.class); 
    			   SourceSet main = javaPluginConvention.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME); 
    			   return main.getOutput().getAsPath();
    		} 
    	}
    	catch(Exception e) {
    		// Catch any null pointer exception instead of checking each getMethod
    	}
    	return defaultSrcDir;
    }	

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy