package org.netbeans.gradle.project.tasks;
import java.io.File;
import org.gradle.tooling.GradleConnector;
import org.gradle.tooling.ModelBuilder;
import org.gradle.tooling.ProjectConnection;
import org.gradle.tooling.model.idea.IdeaProject;
import org.jtrim.cancel.CancellationToken;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.api.progress.ProgressHandle;
import org.netbeans.api.project.Project;
import org.netbeans.gradle.model.OperationInitializer;
import org.netbeans.gradle.project.NbStrings;
import org.netbeans.gradle.project.model.DefaultGradleModelLoader;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
public final class DownloadSourcesTask implements DaemonTask {
private final Project project;
public DownloadSourcesTask(Project project) {
ExceptionHelper.checkNotNullArgument(project, "project");
this.project = project;
}
public static DaemonTaskDef createTaskDef(Project project) {
return new DaemonTaskDef(
NbStrings.getDownloadSourcesProgressCaption(),
true,
new DownloadSourcesTask(project));
}
@Override
public void run(CancellationToken cancelToken, ProgressHandle progress) {
GradleConnector connector = DefaultGradleModelLoader.createGradleConnector(cancelToken, project);
FileObject projectDirObj = project.getProjectDirectory();
File projectDir = FileUtil.toFile(projectDirObj);
if (projectDir == null) {
throw new RuntimeException("Missing project directory: " + projectDirObj);
}
connector.forProjectDirectory(projectDir);
OperationInitializer setup = DefaultGradleModelLoader.modelBuilderSetup(project, progress);
// FIXME: Currently we just fetch IdeaProject and rely on that to fetch
// the sources. Then the source locator query will find the sources
// in the Gradle cache.
ProjectConnection connection = connector.connect();
try {
ModelBuilder<IdeaProject> builder = connection.model(IdeaProject.class);
DefaultGradleModelLoader.setupLongRunningOP(setup, builder);
builder.get();
} finally {
connection.close();
}
}
}