package org.netbeans.gradle.model.java;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.tasks.TaskCollection;
import org.gradle.api.tasks.testing.JUnitXmlReport;
import org.gradle.api.tasks.testing.Test;
import org.gradle.api.tasks.testing.TestTaskReports;
import org.netbeans.gradle.model.api.ProjectInfoBuilder2;
import org.netbeans.gradle.model.util.BuilderUtils;
enum JavaTestModelBuilder
implements
ProjectInfoBuilder2<JavaTestModel> {
INSTANCE;
private static final Logger LOGGER = Logger.getLogger(JavaTestModelBuilder.class.getName());
public JavaTestModel getProjectInfo(Object project) {
return getProjectInfo((Project)project);
}
private JavaTestModel getProjectInfo(Project project) {
if (!project.getPlugins().hasPlugin(JavaPlugin.class)) {
return null;
}
TaskCollection<? extends Task> allTests = project.getTasks().withType(Test.class);
List<JavaTestTask> result = new ArrayList<JavaTestTask>(allTests.size());
XmlOutputDirGetter outputDirGetter = new XmlOutputDirGetter(project);
for (Task task: allTests) {
File xmlOutputDir = outputDirGetter.getXmlOutputDir(task);
JavaTestTask taskInfo = new JavaTestTask(task.getName(), xmlOutputDir);
result.add(taskInfo);
}
return new JavaTestModel(result);
}
/** {@inheritDoc } */
public String getName() {
return BuilderUtils.getNameForEnumBuilder(this);
}
private static final class XmlOutputDirGetter {
private final Project project;
private XmlOutputDirGetter(Project project) {
this.project = project;
}
private File tryGetXmlOutputDir(Task task) {
Object reportsObj = task.property("reports");
if (!(reportsObj instanceof TestTaskReports)) {
return null;
}
TestTaskReports reports = (TestTaskReports)reportsObj;
try {
JUnitXmlReport junitXml = reports.getJunitXml();
return junitXml != null ? junitXml.getDestination() : null;
} catch (Exception ex) {
LOGGER.log(Level.WARNING, "Cannot get XML report file for test reports", ex);
return null;
}
}
public File getXmlOutputDir(Task task) {
File result = tryGetXmlOutputDir(task);
return result != null
? result
: getDefaultXmlOutput(project);
}
private static File getDefaultXmlOutput(Project project) {
return new File(project.getBuildDir(), "test-results");
}
}
}