Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial introduction of delayed config concepts (Property, Provider, etc) for QuarkusPluginExtension, QuarkusBuild and QuarkusDev #25615

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all 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 @@ -101,12 +101,15 @@ public QuarkusPlugin(ToolingModelBuilderRegistry registry) {
@Override
public void apply(Project project) {
verifyGradleVersion();

// Apply the `java` plugin
project.getPluginManager().apply(JavaPlugin.class);

registerModel();

// register extension
final QuarkusPluginExtension quarkusExt = project.getExtensions().create(EXTENSION_NAME, QuarkusPluginExtension.class,
project);
// register plugin
project.getPluginManager().apply(JavaPlugin.class);

registerTasks(project, quarkusExt);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@

import org.gradle.api.Action;
import org.gradle.api.Project;
import org.gradle.api.file.Directory;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.FileSystemLocation;
import org.gradle.api.file.RegularFile;
import org.gradle.api.plugins.JavaPlugin;
import org.gradle.api.plugins.JavaPluginConvention;
import org.gradle.api.provider.Property;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetContainer;
Expand All @@ -34,20 +37,40 @@ public class QuarkusPluginExtension {

private final Project project;

private File outputDirectory;
private final DirectoryProperty outputDirectory;

private String finalName;
private final Property<String> finalName;

private File sourceDir;
private final DirectoryProperty sourceDirectory;

private File workingDir;
private final DirectoryProperty workingDirectory;

private File outputConfigDirectory;
private final DirectoryProperty outputConfigDirectory;

private final SourceSetExtension sourceSetExtension;

public QuarkusPluginExtension(Project project) {
this.project = project;

finalName = project.getObjects().property(String.class);
finalName.convention(project.provider(
() -> String.format("%s-%s", project.getName(), project.getVersion())));

final SourceSet mainSourceSet = getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME);

outputDirectory = project.getObjects().directoryProperty();
outputDirectory.convention(mainSourceSet.getJava().getDestinationDirectory());

sourceDirectory = project.getObjects().directoryProperty();
sourceDirectory.convention(
mainSourceSet.getJava().getSourceDirectories().getElements().map(QuarkusPluginExtension::lastDirectory));

workingDirectory = project.getObjects().directoryProperty();
workingDirectory.convention(outputDirectory);

outputConfigDirectory = project.getObjects().directoryProperty();
outputConfigDirectory.convention(mainSourceSet.getResources().getDestinationDirectory());

this.sourceSetExtension = new SourceSetExtension();
}

Expand Down Expand Up @@ -116,62 +139,74 @@ public Path appJarOrClasses() {
return classesDir;
}

public File outputDirectory() {
if (outputDirectory == null) {
outputDirectory = getLastFile(getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME).getOutput()
.getClassesDirs());
}
public DirectoryProperty getOutputDirectory() {
return outputDirectory;
}

public File outputDirectory() {
return getOutputDirectory().get().getAsFile();
}

public void setOutputDirectory(String outputDirectory) {
this.outputDirectory = new File(outputDirectory);
this.outputDirectory.set(new File(outputDirectory));
}

public File outputConfigDirectory() {
if (outputConfigDirectory == null) {
outputConfigDirectory = getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME).getOutput()
.getResourcesDir();
}
public DirectoryProperty getOutputConfigDirectory() {
return outputConfigDirectory;
}

public File outputConfigDirectory() {
return getOutputConfigDirectory().get().getAsFile();
}

public void setOutputConfigDirectory(String outputConfigDirectory) {
this.outputConfigDirectory = new File(outputConfigDirectory);
this.outputConfigDirectory.set(new File(outputConfigDirectory));
}

public DirectoryProperty getSourceDirectory() {
return sourceDirectory;
}

public File sourceDir() {
if (sourceDir == null) {
sourceDir = getLastFile(getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME).getAllJava()
.getSourceDirectories());
}
return sourceDir;
return getSourceDirectory().get().getAsFile();
}

public void setSourceDir(String sourceDir) {
this.sourceDir = new File(sourceDir);
this.sourceDirectory.set(new File(sourceDir));
}

public DirectoryProperty getWorkingDirectory() {
return workingDirectory;
}

public File workingDir() {
if (workingDir == null) {
workingDir = outputDirectory();
}
return workingDir;
return getWorkingDirectory().get().getAsFile();
}

public void setWorkingDir(String workingDir) {
this.workingDir = new File(workingDir);
this.workingDirectory.set(new File(workingDir));
}

public String finalName() {
if (finalName == null || finalName.length() == 0) {
this.finalName = String.format("%s-%s", project.getName(), project.getVersion());
}
/**
* The name of the application - `${project.name}-${project.version}` by default
*/
public Property<String> getFinalName() {
return finalName;
}

public void setFinalName(String finalName) {
this.finalName = finalName;
/**
* @see #getFinalName()
*/
public String finalName() {
return finalName.get();
}

/**
* Setter for {@link #getFinalName()}
*/
@Deprecated
public void setFinalName(String value) {
finalName.set(value);
}

public void sourceSets(Action<? super SourceSetExtension> action) {
Expand Down Expand Up @@ -213,7 +248,7 @@ public ApplicationModel getApplicationModel(LaunchMode mode) {
* Returns the last file from the specified {@link FileCollection}.
* Needed for the Scala plugin.
*/
private File getLastFile(FileCollection fileCollection) {
public static File getLastFile(FileCollection fileCollection) {
File result = null;
for (File f : fileCollection) {
if (result == null || f.exists()) {
Expand All @@ -223,12 +258,32 @@ private File getLastFile(FileCollection fileCollection) {
return result;
}

/**
* Returns the last file from the specified {@link FileCollection}.
* Needed for the Scala plugin.
*/
public static Provider<Directory> lastDirectoryProvider(FileCollection fileCollection) {
return fileCollection.getElements().map(QuarkusPluginExtension::lastDirectory);
}

public static Directory lastDirectory(Set<FileSystemLocation> locations) {
Directory result = null;

for (FileSystemLocation fileSystemLocation : locations) {
if (fileSystemLocation instanceof Directory) {
result = (Directory) fileSystemLocation;
}
}

return result;
}

/**
* Convenience method to get the source sets associated with the current project.
*
* @return the source sets associated with the current project.
*/
private SourceSetContainer getSourceSets() {
return project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets();
return project.getExtensions().getByType(SourceSetContainer.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.io.File;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
Expand All @@ -12,7 +11,10 @@
import org.gradle.api.Action;
import org.gradle.api.GradleException;
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.RegularFile;
import org.gradle.api.java.archives.Attributes;
import org.gradle.api.provider.ListProperty;
import org.gradle.api.provider.Provider;
import org.gradle.api.tasks.Classpath;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.Internal;
Expand All @@ -38,11 +40,28 @@ public class QuarkusBuild extends QuarkusTask {
private static final String MANIFEST_SECTIONS_PROPERTY_PREFIX = "quarkus.package.manifest.manifest-sections";
private static final String MANIFEST_ATTRIBUTES_PROPERTY_PREFIX = "quarkus.package.manifest.attributes";

private List<String> ignoredEntries = new ArrayList<>();
private Manifest manifest = new Manifest();
private final Manifest manifest = new Manifest();
private final ListProperty<String> ignoredEntries;
private final Provider<RegularFile> runnerJar;
private final Provider<RegularFile> nativeRunner;
private final Provider<RegularFile> fastJar;

public QuarkusBuild() {
super("Quarkus builds a runner jar based on the build jar");

ignoredEntries = getProject().getObjects().listProperty(String.class);

runnerJar = getProject().getLayout().getBuildDirectory().file(runnerJarName());
nativeRunner = getProject().getLayout().getBuildDirectory().file(nativeRunnerName());
fastJar = getProject().getLayout().getBuildDirectory().file("quarkus-app");
}

private Provider<String> runnerJarName() {
return extension().getFinalName().map((finalName) -> finalName + "-runner.jar");
}

private Provider<String> nativeRunnerName() {
return extension().getFinalName().map((finalName) -> finalName + "-runner");
}

public QuarkusBuild nativeArgs(Action<Map<String, ?>> action) {
Expand All @@ -54,16 +73,21 @@ public QuarkusBuild nativeArgs(Action<Map<String, ?>> action) {
return this;
}

@Optional
@Input
public List<String> getIgnoredEntries() {
@Optional
Copy link
Member

Choose a reason for hiding this comment

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

This optional can be removed too right ?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

+1

As far as I know, @Optional only really has an effect in relation to file / directory properties

@Option(description = "When using the uber-jar option, this option can be used to "
+ "specify one or more entries that should be excluded from the final jar", option = "ignored-entry")
public ListProperty<String> getIgnoredEntriesList() {
return ignoredEntries;
}

@Option(description = "When using the uber-jar option, this option can be used to "
+ "specify one or more entries that should be excluded from the final jar", option = "ignored-entry")
public void setIgnoredEntries(List<String> ignoredEntries) {
this.ignoredEntries.addAll(ignoredEntries);
@Internal
public List<String> getIgnoredEntries() {
return ignoredEntries.get();
}

public void setIgnoredEntries(List<String> values) {
ignoredEntries.addAll(values);
}

@Classpath
Expand Down Expand Up @@ -108,18 +132,48 @@ public QuarkusBuild manifest(Action<Manifest> action) {
}

@OutputFile
public Provider<RegularFile> getRunnerJarFile() {
return runnerJar;
}

/**
* Same as {@link #getRunnerJarFile()}, except this method resolves the value.
* <p>
* Prefer {@link #getRunnerJarFile()} for delayed configuration
*/
@Internal
public File getRunnerJar() {
return new File(getProject().getBuildDir(), extension().finalName() + "-runner.jar");
return getRunnerJarFile().get().getAsFile();
}

@OutputFile
public Provider<RegularFile> getNativeRunnerFile() {
return nativeRunner;
}

/**
* Same as {@link #getNativeRunnerFile()}, except this method resolves the value.
* <p>
* Prefer {@link #getNativeRunnerFile()} for delayed configuration
*/
@Internal
public File getNativeRunner() {
return new File(getProject().getBuildDir(), extension().finalName() + "-runner");
return getNativeRunnerFile().get().getAsFile();
}

@OutputDirectory
public Provider<RegularFile> getFastJarFile() {
return fastJar;
}

/**
* Same as {@link #getFastJarFile()}, except this method resolves the value.
* <p>
* Prefer {@link #getFastJarFile()} for delayed configuration
*/
@Internal
public File getFastJar() {
return new File(getProject().getBuildDir(), "quarkus-app");
return getFastJarFile().get().getAsFile();
}

@TaskAction
Expand All @@ -133,8 +187,8 @@ public void buildQuarkus() {
}

final Properties effectiveProperties = getBuildSystemProperties(appModel.getAppArtifact());
if (ignoredEntries != null && ignoredEntries.size() > 0) {
String joinedEntries = String.join(",", ignoredEntries);
if (!ignoredEntries.get().isEmpty()) {
String joinedEntries = String.join(",", ignoredEntries.get());
effectiveProperties.setProperty("quarkus.package.user-configured-ignored-entries", joinedEntries);
}

Expand Down
Loading