package org.netbeans.gradle.project.model;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import org.gradle.tooling.ProgressEvent;
import org.gradle.tooling.ProgressListener;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.api.java.platform.JavaPlatform;
import org.netbeans.api.java.platform.Specification;
import org.netbeans.api.progress.ProgressHandle;
import org.netbeans.api.project.Project;
import org.netbeans.gradle.model.BuildOperationArgs;
import org.netbeans.gradle.model.OperationInitializer;
import org.netbeans.gradle.project.NbGradleProject;
import org.netbeans.gradle.project.NbGradleProjectFactory;
import org.netbeans.gradle.project.properties.ScriptPlatform;
import org.netbeans.gradle.project.properties.standard.JavaPlatformUtils;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.modules.SpecificationVersion;
public final class DefaultModelBuilderSetup implements OperationInitializer {
private static final SpecificationVersion DEFAULT_JDK_VERSION = new SpecificationVersion("1.5");
private final ProgressHandle progress;
private final JavaPlatform jdkPlatform;
private final File jdkHome;
private final List<String> arguments;
private final List<String> jvmArgs;
public DefaultModelBuilderSetup(Project project, List<String> arguments, List<String> jvmArgs, ProgressHandle progress) {
this.progress = progress;
JavaPlatform selectedPlatform = tryGetScriptJavaPlatform(project);
this.jdkHome = getScriptJavaHome(selectedPlatform);
this.jdkPlatform = selectedPlatform != null ? selectedPlatform : JavaPlatform.getDefault();
this.arguments = arguments != null ? new ArrayList<>(arguments) : Collections.<String>emptyList();
this.jvmArgs = jvmArgs != null ? new ArrayList<>(jvmArgs) : Collections.<String>emptyList();
}
public JavaPlatform getJdkPlatform() {
return jdkPlatform;
}
public SpecificationVersion getJDKVersion() {
Specification spec = jdkPlatform.getSpecification();
if (spec == null) {
return DEFAULT_JDK_VERSION;
}
SpecificationVersion result = spec.getVersion();
return result != null ? result : DEFAULT_JDK_VERSION;
}
@Override
public void initOperation(BuildOperationArgs args) {
if (jdkHome != null && !jdkHome.getPath().isEmpty()) {
args.setJavaHome(jdkHome);
}
if (!arguments.isEmpty()) {
args.setArguments(arguments.toArray(new String[arguments.size()]));
}
if (!jvmArgs.isEmpty()) {
args.setJvmArguments(jvmArgs.toArray(new String[jvmArgs.size()]));
}
if (progress != null) {
args.setProgressListeners(new ProgressListener[]{new ProgressListener() {
@Override
public void statusChanged(ProgressEvent pe) {
progress.progress(pe.getDescription());
}
}});
}
}
private static File getScriptJavaHome(JavaPlatform platform) {
FileObject jdkHomeObj = platform != null ? JavaPlatformUtils.getHomeFolder(platform) : null;
if (jdkHomeObj != null) {
// This is necessary for unit test code because JavaPlatform returns
// the jre inside the JDK.
if ("jre".equals(jdkHomeObj.getNameExt().toLowerCase(Locale.ROOT))) {
FileObject parent = jdkHomeObj.getParent();
if (parent != null) {
jdkHomeObj = parent;
}
}
}
return jdkHomeObj != null ? FileUtil.toFile(jdkHomeObj) : null;
}
private static JavaPlatform tryGetScriptJavaPlatform(Project project) {
ExceptionHelper.checkNotNullArgument(project, "project");
NbGradleProject gradleProject = NbGradleProjectFactory.tryGetGradleProject(project);
ScriptPlatform result = gradleProject != null ? gradleProject.getCommonProperties().scriptPlatform().getActiveValue() : null;
return result != null ? result.getJavaPlatform() : null;
}
}