diff --git a/gradle-plugin/src/main/java/com/microsoft/gradle/GradleProjectModelBuilder.java b/gradle-plugin/src/main/java/com/microsoft/gradle/GradleProjectModelBuilder.java index 960f42e84..aa0038bed 100644 --- a/gradle-plugin/src/main/java/com/microsoft/gradle/GradleProjectModelBuilder.java +++ b/gradle-plugin/src/main/java/com/microsoft/gradle/GradleProjectModelBuilder.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Set; import java.util.TreeSet; +import java.util.stream.Collectors; import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.artifacts.Configuration; @@ -64,12 +65,19 @@ public boolean canBuild(String modelName) { public Object buildAll(String modelName, Project project) { cachedTasks.clear(); - DefaultGradleProject gradleProject = (DefaultGradleProject) this.registry - .getBuilder("org.gradle.tooling.model.GradleProject").buildAll(modelName, project); - if (gradleProject == null) { - return null; + + GradleProjectModel rootModel = null; + int cmpVersion = GradleVersion.current().compareTo(GradleVersion.version("5.0.0")); + + if (cmpVersion == -1) { + rootModel = buildModel(project, project); + } else { + DefaultGradleProject gradleProject = (DefaultGradleProject) this.registry + .getBuilder("org.gradle.tooling.model.GradleProject").buildAll(modelName, project); + + rootModel = buildModel(project, project.getName(), gradleProject); } - GradleProjectModel rootModel = buildModel(project, project.getName(), gradleProject); + // add task selectors for root project Set taskNames = new HashSet<>(); for (GradleTask existingTask : rootModel.getTasks()) { @@ -93,6 +101,59 @@ public Object buildAll(String modelName, Project project) { return rootModel; } + private GradleProjectModel buildModel(Project rootProject, Project project) { + if (rootProject == null || project == null) { + return null; + } + + ScriptHandler buildScript = project.getBuildscript(); + + ClassPath classpath = ((DefaultScriptHandler) buildScript).getScriptClassPath(); + + List scriptClasspaths = classpath.getAsFiles().stream().map(file -> file.getAbsolutePath()) + .collect(Collectors.toList()); + + GradleDependencyNode node = generateDefaultGradleDependencyNode(project); + + List plugins = getPlugins(project); + + List closures = getPluginClosures(project); + + Map childProjects = project.getChildProjects(); + + List subModels = childProjects.values().stream() + .map(childProject -> buildModel(rootProject, childProject)).filter(subModel -> subModel != null) + .collect(Collectors.toList()); + + List tasks = getGradleTasks(rootProject, project); + + return new DefaultGradleProjectModel(project.getParent() == null, project.getProjectDir().getAbsolutePath(), + subModels, tasks, node, plugins, closures, scriptClasspaths); + } + + private List getGradleTasks(Project rootProject, Project project) { + List tasks = new ArrayList<>(); + TaskContainer taskContainer = project.getTasks(); + + if (taskContainer instanceof TaskContainerInternal) { + TaskContainerInternal taskContainerInternal = (TaskContainerInternal) taskContainer; + taskContainerInternal.discoverTasks(); + taskContainerInternal.realize(); + taskContainerInternal.forEach(task -> { + String buildFile = task.getProject().getBuildscript().getSourceFile().getAbsolutePath(); + boolean debuggable = (task instanceof JavaExec) || (task instanceof Test); + GradleTask newTask = new DefaultGradleTask(task.getName(), task.getGroup(), task.getPath(), + task.getProject().getName(), buildFile, rootProject.getName(), task.getDescription(), + debuggable); + + tasks.add(newTask); + cachedTasks.add(newTask); + }); + } + + return tasks; + } + private GradleProjectModel buildModel(Project project, String rootProjectName, DefaultGradleProject gradleProject) { if (project == null) { return null; @@ -277,4 +338,4 @@ private boolean isDeprecated(AccessibleObject object) { } return false; } -} +} \ No newline at end of file