package org.netbeans.gradle.project.tasks; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import org.netbeans.api.project.Project; import org.netbeans.gradle.project.NbGradleProject; import org.netbeans.gradle.project.NbGradleProjectFactory; import org.netbeans.gradle.project.api.config.GradleArgumentQuery; import org.netbeans.gradle.project.api.task.DaemonTaskContext; import org.netbeans.gradle.project.extensions.NbGradleExtensionRef; import org.netbeans.gradle.project.model.SettingsGradleDef; import org.netbeans.gradle.project.properties.global.CommonGlobalSettings; import org.netbeans.gradle.project.properties.standard.UserInitScriptPath; public final class GradleArguments { private static final Logger LOGGER = Logger.getLogger(GradleArguments.class.getName()); private static <V> List<V> emptyIfNull(List<V> list) { return list != null ? list : Collections.<V>emptyList(); } private static List<String> filterNulls(List<String> args) { List<String> result = new ArrayList<>(args.size()); for (String arg: args) { if (arg != null) { result.add(arg); } } return result; } private static List<String> fixArguments(String extensionName, List<String> args) { if (args == null) { LOGGER.log(Level.WARNING, "Extension {0} returned null argument list.", extensionName); return Collections.emptyList(); } for (String arg: args) { if (arg == null) { LOGGER.log(Level.WARNING, "Extension {0} returned a null argument.", extensionName); return filterNulls(args); } } return args; } private static void addExtensionArgs( DaemonTaskContext context, List<String> result, ArgGetter argGetter) { NbGradleProject gradleProject = NbGradleProjectFactory.tryGetGradleProject(context.getProject()); if (gradleProject == null) { return; } for (NbGradleExtensionRef extensionRef: gradleProject.getExtensions().getExtensionRefs()) { for (GradleArgumentQuery query: extensionRef.getExtensionLookup().lookupAll(GradleArgumentQuery.class)) { List<String> extArgs = fixArguments(extensionRef.getName(), argGetter.getArgs(query, context)); result.addAll(extArgs); } } } private static void addExtensionArgs(DaemonTaskContext context, List<String> result) { addExtensionArgs(context, result, new ArgGetter() { @Override public List<String> getArgs(GradleArgumentQuery query, DaemonTaskContext context) { return query.getExtraArgs(context); } }); } private static void addExtensionJvmArgs(DaemonTaskContext context, List<String> result) { addExtensionArgs(context, result, new ArgGetter() { @Override public List<String> getArgs(GradleArgumentQuery query, DaemonTaskContext context) { return query.getExtraJvmArgs(context); } }); } private static Path tryGetUserInitScript(Project project) { NbGradleProject gradleProject = NbGradleProjectFactory.tryGetGradleProject(project); if (gradleProject == null) { return null; } UserInitScriptPath path = gradleProject.getCommonProperties().userInitScriptPath().getActiveValue(); return path != null ? path.getPath(gradleProject) : null; } public static List<String> getExtraArgs( SettingsGradleDef preferredSettings, DaemonTaskContext context) { List<String> result = new ArrayList<>(); result.addAll(emptyIfNull(CommonGlobalSettings.getDefault().gradleArgs().getActiveValue())); addExtensionArgs(context, result); Path settingsGradle = preferredSettings.getSettingsGradle(); if (settingsGradle != null) { result.add("-c"); result.add(settingsGradle.toString()); } else if (!preferredSettings.isMaySearchUpwards()) { result.add("-u"); } Path userInitScript = tryGetUserInitScript(context.getProject()); if (userInitScript != null) { result.add("--init-script"); result.add(userInitScript.toString()); } if (context.isModelLoading()) { result.add("-PevaluatingIDE=NetBeans"); } return result; } public static List<String> getExtraJvmArgs(DaemonTaskContext context) { List<String> result = new ArrayList<>(); result.addAll(emptyIfNull(CommonGlobalSettings.getDefault().gradleJvmArgs().getActiveValue())); addExtensionJvmArgs(context, result); return result; } private static interface ArgGetter { public List<String> getArgs(GradleArgumentQuery query, DaemonTaskContext context); } private GradleArguments() { throw new AssertionError(); } }