package org.netbeans.gradle.project.api.entry;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.gradle.util.GradleVersion;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.api.project.Project;
import org.netbeans.gradle.model.util.Exceptions;
import org.netbeans.gradle.model.util.ZipUtils;
import org.netbeans.gradle.project.NbGradleProject;
import org.netbeans.gradle.project.NbGradleProjectFactory;
import org.netbeans.gradle.project.properties.GradleLocationDef;
import org.netbeans.gradle.project.properties.global.CommonGlobalSettings;
public final class SampleGradleProject implements Closeable {
public static final String DEFAULT_GRADLE_VERSION = GradleVersion.current().getVersion();
public static final GradleLocationDef DEFAULT_GRADLE_TARGET = GradleLocationDef.fromVersion(DEFAULT_GRADLE_VERSION, false);
private static final int DAEMON_TIMEOUT_SEC = 60;
private final File tempFolder;
public SampleGradleProject(File tempFolder) {
ExceptionHelper.checkNotNullArgument(tempFolder, "tempFolder");
this.tempFolder = tempFolder;
}
public static SampleGradleProject createProject(String resourceRelPath) throws IOException {
return createProject(SampleGradleProject.class, resourceRelPath);
}
public static SampleGradleProject createProject(
Class<?> resourceBase,
String resourceRelPath) throws IOException {
CommonGlobalSettings.getDefault().gradleDaemonTimeoutSec().setValue(DAEMON_TIMEOUT_SEC);
return new SampleGradleProject(ZipUtils.unzipResourceToTemp(resourceBase, resourceRelPath));
}
private static File subDir(File base, String... subDirs) throws IOException {
File result = base;
for (String subDir: subDirs) {
result = new File(result, subDir);
}
return result.getCanonicalFile();
}
private Project getUnloadedProject(File projectDir) throws IOException {
return NbGradleProjectFactory.loadSafeProject(projectDir);
}
public Project getUnloadedProject(String... projectPath) throws IOException {
File projectDir = subDir(tempFolder, projectPath);
return getUnloadedProject(projectDir);
}
private NbGradleProject toLoadedProject(Project project) throws IOException {
try {
NbGradleProject gradleProject = NbGradleProjectFactory.getGradleProject(project);
gradleProject.ensureLoadRequested();
return gradleProject;
} catch (Throwable ex) {
throw Exceptions.throwUnchecked(ex);
}
}
public Project getSingleUnloadedProject() throws IOException {
File[] dirs = tempFolder.listFiles();
int dirsLength = dirs != null ? dirs.length : 0;
if (dirsLength != 1) {
throw new IllegalStateException(tempFolder + " does not contain a single folder but " + dirsLength);
}
return getUnloadedProject(dirs[0]);
}
public NbGradleProject loadSingleProject() throws IOException {
Project project = getSingleUnloadedProject();
return toLoadedProject(project);
}
public NbGradleProject loadProject(String... projectPath) throws IOException {
Project project = getUnloadedProject(projectPath);
return toLoadedProject(project);
}
@Override
public void close() throws IOException {
tryDelete(tempFolder);
}
private static void tryDelete(File folder) throws IOException {
long startTime = System.nanoTime();
long maxWaitNanos = TimeUnit.SECONDS.toNanos(60);
while (true) {
try {
ZipUtils.recursiveDelete(folder);
return;
} catch (IOException ex) {
long elapsed = System.nanoTime() - startTime;
if (elapsed >= maxWaitNanos) {
throw ex;
}
}
}
}
}