/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.gradle.plugins.defaults.tasks;
import com.liferay.gradle.plugins.defaults.internal.util.GradleUtil;
import com.liferay.gradle.util.Validator;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
import org.gradle.api.DefaultTask;
import org.gradle.api.Project;
import org.gradle.api.file.FileCollection;
import org.gradle.api.specs.Spec;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.SkipWhenEmpty;
import org.gradle.api.tasks.TaskAction;
import org.gradle.util.GUtil;
/**
* @author Andrea Di Giorgi
*/
public class MergeFilesTask extends DefaultTask {
@Input
@Optional
public String getFooter() {
return GradleUtil.toString(_footer);
}
@Input
@Optional
public String getHeader() {
return GradleUtil.toString(_header);
}
@InputFiles
@SkipWhenEmpty
public FileCollection getInputFiles() {
Project project = getProject();
return project.files(_inputFiles);
}
@OutputFile
public File getOutputFile() {
return GradleUtil.toFile(getProject(), _outputFile);
}
@Input
public String getSeparator() {
return GradleUtil.toString(_separator);
}
public MergeFilesTask inputFiles(Iterable<?> inputFiles) {
GUtil.addToCollection(_inputFiles, inputFiles);
return this;
}
public MergeFilesTask inputFiles(Object... inputFiles) {
return inputFiles(Arrays.asList(inputFiles));
}
@TaskAction
public void mergeFiles() throws IOException {
FileCollection inputFiles = getInputFiles();
inputFiles = inputFiles.filter(
new Spec<File>() {
@Override
public boolean isSatisfiedBy(File file) {
return file.exists();
}
});
File outputFile = getOutputFile();
if (inputFiles.isEmpty()) {
outputFile.delete();
return;
}
String separator = getSeparator();
try (BufferedWriter bufferedWriter = Files.newBufferedWriter(
outputFile.toPath(), StandardCharsets.UTF_8)) {
String header = getHeader();
if (Validator.isNotNull(header)) {
bufferedWriter.write(header);
}
for (File inputFile : inputFiles) {
bufferedWriter.write(separator);
String content = new String(
Files.readAllBytes(inputFile.toPath()),
StandardCharsets.UTF_8);
bufferedWriter.write(content);
}
String footer = getFooter();
if (Validator.isNotNull(footer)) {
bufferedWriter.write(separator);
bufferedWriter.write(footer);
}
}
}
public void setFooter(Object footer) {
_footer = footer;
}
public void setHeader(Object header) {
_header = header;
}
public void setInputFiles(Iterable<?> inputFiles) {
_inputFiles.clear();
inputFiles(inputFiles);
}
public void setInputFiles(Object... inputFiles) {
setInputFiles(Arrays.asList(inputFiles));
}
public void setOutputFile(Object outputFile) {
_outputFile = outputFile;
}
public void setSeparator(Object separator) {
_separator = separator;
}
private Object _footer;
private Object _header;
private final Set<Object> _inputFiles = new LinkedHashSet<>();
private Object _outputFile;
private Object _separator = System.lineSeparator();
}