io.github.jcohy.gradle.conventions.ExtractResources Maven / Gradle / Ivy
package io.github.jcohy.gradle.conventions;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.gradle.api.DefaultTask;
import org.gradle.api.GradleException;
import org.gradle.api.Task;
import org.gradle.api.file.DirectoryProperty;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.TaskAction;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.PropertyPlaceholderHelper;
/**
* Copyright: Copyright (c) 2021
* jcohy.com
*
* Description: {@link Task} 从 classpath 中获取资源并写入磁盘中
*
* @author jiac
* @version 0.0.5.1 2021/6/11:16:25
* @since 0.0.5.1
*/
public class ExtractResources extends DefaultTask {
private final PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper("${", "}");
private final Map properties = new HashMap<>();
private final DirectoryProperty destinationDirectory;
private List resourceNames = new ArrayList<>();
public ExtractResources() {
this.destinationDirectory = getProject().getObjects().directoryProperty();
}
@Input
public List getResourceNames() {
return this.resourceNames;
}
public void setResourcesNames(List resourceNames) {
this.resourceNames = resourceNames;
}
@OutputDirectory
public DirectoryProperty getDestinationDirectory() {
return this.destinationDirectory;
}
public void property(String name, String value) {
this.properties.put(name, value);
}
@Input
public Map getProperties() {
return this.properties;
}
@TaskAction
void extractResources() throws IOException {
for (String resourceName : this.resourceNames) {
InputStream resourceStream = getClass().getClassLoader().getResourceAsStream(resourceName);
if (resourceStream == null) {
throw new GradleException("Resource '" + resourceName + "' does not exist");
}
String resource = FileCopyUtils.copyToString(new InputStreamReader(resourceStream, StandardCharsets.UTF_8));
resource = this.propertyPlaceholderHelper.replacePlaceholders(resource,
this.properties::get);
FileCopyUtils.copy(resource,
new FileWriter(this.destinationDirectory.file(resourceName).get().getAsFile()));
}
}
}