|  | @@ -0,0 +1,62 @@
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
 | 
	
		
			
				|  |  | + * or more contributor license agreements. Licensed under the Elastic License
 | 
	
		
			
				|  |  | + * 2.0 and the Server Side Public License, v 1; you may not use this file except
 | 
	
		
			
				|  |  | + * in compliance with, at your election, the Elastic License 2.0 or the Server
 | 
	
		
			
				|  |  | + * Side Public License, v 1.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +package org.elasticsearch.gradle.internal;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import org.gradle.api.Project;
 | 
	
		
			
				|  |  | +import org.gradle.api.artifacts.Configuration;
 | 
	
		
			
				|  |  | +import org.gradle.api.file.Directory;
 | 
	
		
			
				|  |  | +import org.gradle.api.provider.Provider;
 | 
	
		
			
				|  |  | +import org.gradle.api.tasks.SourceSet;
 | 
	
		
			
				|  |  | +import org.gradle.api.tasks.Sync;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import static org.elasticsearch.gradle.internal.conventions.GUtils.capitalize;
 | 
	
		
			
				|  |  | +import static org.elasticsearch.gradle.util.GradleUtils.getJavaSourceSets;
 | 
	
		
			
				|  |  | +import static org.gradle.api.artifacts.type.ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE;
 | 
	
		
			
				|  |  | +import static org.gradle.api.artifacts.type.ArtifactTypeDefinition.DIRECTORY_TYPE;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +public class EmbeddedProviderExtension {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private final Project project;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public EmbeddedProviderExtension(Project project) {
 | 
	
		
			
				|  |  | +        this.project = project;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    void impl(String implName, Project implProject) {
 | 
	
		
			
				|  |  | +        String projectName = implProject.getName();
 | 
	
		
			
				|  |  | +        String capitalName = capitalize(projectName);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Configuration implConfig = project.getConfigurations().detachedConfiguration(project.getDependencies().create(implProject));
 | 
	
		
			
				|  |  | +        implConfig.attributes(attrs -> {
 | 
	
		
			
				|  |  | +            attrs.attribute(ARTIFACT_TYPE_ATTRIBUTE, DIRECTORY_TYPE);
 | 
	
		
			
				|  |  | +            attrs.attribute(EmbeddedProviderPlugin.IMPL_ATTR, true);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        String manifestTaskName = "generate" + capitalName + "ProviderManifest";
 | 
	
		
			
				|  |  | +        Provider<Directory> generatedResourcesDir = project.getLayout().getBuildDirectory().dir("generated-resources");
 | 
	
		
			
				|  |  | +        var generateProviderManifest = project.getTasks().register(manifestTaskName, GenerateProviderManifest.class);
 | 
	
		
			
				|  |  | +        generateProviderManifest.configure(t -> {
 | 
	
		
			
				|  |  | +            t.getManifestFile().set(generatedResourcesDir.map(d -> d.file("LISTING.TXT")));
 | 
	
		
			
				|  |  | +            t.getProviderImplClasspath().from(implConfig);
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        String implTaskName = "generate" + capitalName + "ProviderImpl";
 | 
	
		
			
				|  |  | +        var generateProviderImpl = project.getTasks().register(implTaskName, Sync.class);
 | 
	
		
			
				|  |  | +        generateProviderImpl.configure(t -> {
 | 
	
		
			
				|  |  | +            t.into(generatedResourcesDir);
 | 
	
		
			
				|  |  | +            t.into("IMPL-JARS/" + implName, spec -> {
 | 
	
		
			
				|  |  | +                spec.from(implConfig);
 | 
	
		
			
				|  |  | +                spec.from(generateProviderManifest);
 | 
	
		
			
				|  |  | +            });
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        var mainSourceSet = getJavaSourceSets(project).findByName(SourceSet.MAIN_SOURCE_SET_NAME);
 | 
	
		
			
				|  |  | +        mainSourceSet.getOutput().dir(generateProviderImpl);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |