BuildPlugin.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
  3. * or more contributor license agreements. Licensed under the Elastic License
  4. * 2.0 and the Server Side Public License, v 1; you may not use this file except
  5. * in compliance with, at your election, the Elastic License 2.0 or the Server
  6. * Side Public License, v 1.
  7. */
  8. package org.elasticsearch.gradle.internal;
  9. import org.elasticsearch.gradle.internal.info.GlobalBuildInfoPlugin;
  10. import org.elasticsearch.gradle.internal.precommit.InternalPrecommitTasks;
  11. import org.elasticsearch.gradle.internal.snyk.SnykDependencyMonitoringGradlePlugin;
  12. import org.gradle.api.InvalidUserDataException;
  13. import org.gradle.api.Plugin;
  14. import org.gradle.api.Project;
  15. import org.gradle.api.file.ProjectLayout;
  16. import org.gradle.api.file.RegularFileProperty;
  17. import org.gradle.api.model.ObjectFactory;
  18. import org.gradle.api.plugins.ExtraPropertiesExtension;
  19. import org.gradle.api.provider.ProviderFactory;
  20. import org.gradle.api.tasks.bundling.Jar;
  21. import org.gradle.initialization.layout.BuildLayout;
  22. import java.io.File;
  23. import javax.inject.Inject;
  24. /**
  25. * Encapsulates build configuration for elasticsearch projects.
  26. */
  27. public class BuildPlugin implements Plugin<Project> {
  28. public static final String SSPL_LICENSE_PATH = "licenses/SSPL-1.0+ELASTIC-LICENSE-2.0.txt";
  29. private final BuildLayout buildLayout;
  30. private final ObjectFactory objectFactory;
  31. private final ProviderFactory providerFactory;
  32. private final ProjectLayout projectLayout;
  33. @Inject
  34. BuildPlugin(BuildLayout buildLayout, ObjectFactory objectFactory, ProviderFactory providerFactory, ProjectLayout projectLayout) {
  35. this.buildLayout = buildLayout;
  36. this.objectFactory = objectFactory;
  37. this.providerFactory = providerFactory;
  38. this.projectLayout = projectLayout;
  39. }
  40. @Override
  41. public void apply(final Project project) {
  42. // make sure the global build info plugin is applied to the root project
  43. project.getRootProject().getPluginManager().apply(GlobalBuildInfoPlugin.class);
  44. if (project.getPluginManager().hasPlugin("elasticsearch.standalone-rest-test")) {
  45. throw new InvalidUserDataException(
  46. "elasticsearch.standalone-test, " + "elasticsearch.standalone-rest-test, and elasticsearch.build are mutually exclusive"
  47. );
  48. }
  49. project.getPluginManager().apply("elasticsearch.java");
  50. project.getPluginManager().apply("elasticsearch.publish");
  51. project.getPluginManager().apply(ElasticsearchJavadocPlugin.class);
  52. project.getPluginManager().apply(DependenciesInfoPlugin.class);
  53. project.getPluginManager().apply(SnykDependencyMonitoringGradlePlugin.class);
  54. InternalPrecommitTasks.create(project, true);
  55. configureLicenseAndNotice(project);
  56. }
  57. public void configureLicenseAndNotice(final Project project) {
  58. final ExtraPropertiesExtension ext = project.getExtensions().getByType(ExtraPropertiesExtension.class);
  59. RegularFileProperty licenseFileProperty = objectFactory.fileProperty();
  60. RegularFileProperty noticeFileProperty = objectFactory.fileProperty();
  61. ext.set("licenseFile", licenseFileProperty);
  62. ext.set("noticeFile", noticeFileProperty);
  63. configureLicenseDefaultConvention(licenseFileProperty);
  64. configureNoticeDefaultConvention(noticeFileProperty);
  65. updateJarTasksMetaInf(project);
  66. }
  67. private void updateJarTasksMetaInf(Project project) {
  68. final ExtraPropertiesExtension ext = project.getExtensions().getByType(ExtraPropertiesExtension.class);
  69. project.getTasks().withType(Jar.class).configureEach(jar -> {
  70. final RegularFileProperty licenseFileExtProperty = (RegularFileProperty) ext.get("licenseFile");
  71. final RegularFileProperty noticeFileExtProperty = (RegularFileProperty) ext.get("noticeFile");
  72. File licenseFile = licenseFileExtProperty.getAsFile().get();
  73. File noticeFile = noticeFileExtProperty.getAsFile().get();
  74. jar.metaInf(spec -> {
  75. spec.from(licenseFile.getParent(), from -> {
  76. from.include(licenseFile.getName());
  77. from.rename(s -> "LICENSE.txt");
  78. });
  79. spec.from(noticeFile.getParent(), from -> {
  80. from.include(noticeFile.getName());
  81. from.rename(s -> "NOTICE.txt");
  82. });
  83. });
  84. });
  85. }
  86. private void configureLicenseDefaultConvention(RegularFileProperty licenseFileProperty) {
  87. File licenseFileDefault = new File(buildLayout.getRootDirectory(), SSPL_LICENSE_PATH);
  88. licenseFileProperty.convention(projectLayout.file(providerFactory.provider(() -> licenseFileDefault)));
  89. }
  90. private void configureNoticeDefaultConvention(RegularFileProperty noticeFileProperty) {
  91. File noticeFileDefault = new File(buildLayout.getRootDirectory(), "NOTICE.txt");
  92. noticeFileProperty.convention(projectLayout.file(providerFactory.provider(() -> noticeFileDefault)));
  93. }
  94. }