Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -182,60 +182,6 @@ class BuildPlugin implements Plugin<Project> {
}
}

/** Add a check before gradle execution phase which ensures java home for the given java version is set. */
static void requireJavaHome(Task task, int version) {
// use root project for global accounting
Project rootProject = task.project.rootProject
ExtraPropertiesExtension extraProperties = rootProject.extensions.extraProperties

// hacky way (but the only way) to find if the task graph has already been populated
boolean taskGraphReady
try {
rootProject.gradle.taskGraph.getAllTasks()
taskGraphReady = true
} catch (IllegalStateException) {
taskGraphReady = false
}

if (taskGraphReady) {
// check directly if the version is present since we are already executing
if (BuildParams.javaVersions.find { it.version == version } == null) {
throw new GradleException("JAVA${version}_HOME required to run task:\n${task}")
}
} else {
// setup list of java versions we will check at the end of configuration time
if (extraProperties.has('requiredJavaVersions') == false) {
extraProperties.set('requiredJavaVersions', [:])
rootProject.gradle.taskGraph.whenReady { TaskExecutionGraph taskGraph ->
List<String> messages = []
Map<Integer, List<Task>> requiredJavaVersions = (Map<Integer, List<Task>>) extraProperties.get('requiredJavaVersions')
for (Map.Entry<Integer, List<Task>> entry : requiredJavaVersions) {
if (BuildParams.javaVersions.any { it.version == entry.key }) {
continue
}
List<String> tasks = entry.value.findAll { taskGraph.hasTask(it) }.collect { " ${it.path}".toString() }
if (tasks.isEmpty() == false) {
messages.add("JAVA${entry.key}_HOME required to run tasks:\n${tasks.join('\n')}".toString())
}
}
if (messages.isEmpty() == false) {
throw new GradleException(messages.join('\n'))
}
}
}
Map<Integer, List<Task>> requiredJavaVersions = (Map<Integer, List<Task>>) extraProperties.get('requiredJavaVersions')
requiredJavaVersions.putIfAbsent(version, [])
requiredJavaVersions.get(version).add(task)
}
}

/** A convenience method for getting java home for a version of java and requiring that version for the given task to execute */
static String getJavaHome(final Task task, final int version) {
requireJavaHome(task, version)
JavaHome java = BuildParams.javaVersions.find { it.version == version }
return java == null ? null : java.javaHome.get().absolutePath
}

/**
* Makes dependencies non-transitive.
*
Expand Down
42 changes: 42 additions & 0 deletions buildSrc/src/main/java/org/elasticsearch/gradle/util/JavaUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* Licensed to Elasticsearch under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/

package org.elasticsearch.gradle.util;

import org.elasticsearch.gradle.info.BuildParams;
import org.elasticsearch.gradle.info.JavaHome;
import org.gradle.api.GradleException;
import org.gradle.api.Task;

import java.util.List;
import java.util.Optional;

public class JavaUtil {

/** A convenience method for getting java home for a version of java and requiring that version for the given task to execute */
static String getJavaHome(final Task task, final int version) {
Copy link
Contributor

@mark-vieira mark-vieira Apr 23, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Give we are ditching all the task graph stuff I think we can even just avoid the Task parameter here. If this blows up at runtime in a task action the exception cause chain will include the failing task so no need to have it here just for the purpose of including it in the exception message.

List<JavaHome> javaHomes = BuildParams.getJavaVersions();
Optional<JavaHome> java = javaHomes.stream().filter(j -> j.getVersion() == version).findFirst();
// check directly if the version is present since we are already executing
if (java.isEmpty()) {
throw new GradleException("JAVA" + version + "_HOME required to run task " + task.getPath());
}
return java.get().getJavaHome().get().getAbsolutePath();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could be simplified to java.orElseThrow(() -> new GradleException("message"))

}
}
2 changes: 1 addition & 1 deletion distribution/bwc/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import org.gradle.util.GradleVersion

import java.nio.charset.StandardCharsets

import static org.elasticsearch.gradle.BuildPlugin.getJavaHome
import static org.elasticsearch.gradle.util.JavaUtil.getJavaHome

/**
* We want to be able to do BWC tests for unreleased versions without relying on and waiting for snapshots.
Expand Down
2 changes: 0 additions & 2 deletions modules/reindex/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@ import org.elasticsearch.gradle.Architecture
import org.elasticsearch.gradle.OS
import org.elasticsearch.gradle.info.BuildParams

import static org.elasticsearch.gradle.BuildPlugin.getJavaHome

apply plugin: 'elasticsearch.test-with-dependencies'
apply plugin: 'elasticsearch.jdk-download'

Expand Down