diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/ConcatFilesTask.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/ConcatFilesTask.groovy deleted file mode 100644 index 7e561b18dcb8a..0000000000000 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/ConcatFilesTask.groovy +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.gradle - -import org.gradle.api.DefaultTask -import org.gradle.api.file.FileTree -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.TaskAction - -/** - * Concatenates a list of files into one and removes duplicate lines. - */ -public class ConcatFilesTask extends DefaultTask { - - /** List of files to concatenate */ - @InputFiles - FileTree files - - /** line to add at the top of the target file */ - @Input - @Optional - String headerLine - - @OutputFile - File target - - public ConcatFilesTask() { - description = 'Concat a list of files into one.' - } - - @TaskAction - public void concatFiles() { - final StringBuilder output = new StringBuilder() - - if (headerLine) { - output.append(headerLine).append('\n') - } - - final StringBuilder sb = new StringBuilder() - files.each { file -> - sb.append(file.getText('UTF-8')) - } - // Remove duplicate lines - sb.readLines().toSet().each { value -> - output.append(value).append('\n') - } - - target.setText(output.toString(), 'UTF-8') - } -} diff --git a/buildSrc/src/main/java/org/elasticsearch/gradle/ConcatFilesTask.java b/buildSrc/src/main/java/org/elasticsearch/gradle/ConcatFilesTask.java new file mode 100644 index 0000000000000..7da6381cc2a24 --- /dev/null +++ b/buildSrc/src/main/java/org/elasticsearch/gradle/ConcatFilesTask.java @@ -0,0 +1,96 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.elasticsearch.gradle; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.util.LinkedHashSet; + +import org.gradle.api.DefaultTask; +import org.gradle.api.file.FileTree; +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.TaskAction; + +/** + * Concatenates a list of files into one and removes duplicate lines. + */ +public class ConcatFilesTask extends DefaultTask { + + public ConcatFilesTask() { + setDescription("Concat a list of files into one."); + } + + /** List of files to concatenate */ + private FileTree files; + + /** line to add at the top of the target file */ + private String headerLine; + + private File target; + + public void setFiles(FileTree files) { + this.files = files; + } + + @InputFiles + public FileTree getFiles() { return files; } + + public void setHeaderLine(String headerLine) { + this.headerLine = headerLine; + } + + @Input + @Optional + public String getHeaderLine() { return headerLine; } + + public void setTarget(File target) { + this.target = target; + } + + @OutputFile + public File getTarget() { + return target; + } + + @TaskAction + public void concatFiles() throws IOException { + if (getHeaderLine() != null) { + Files.write( + getTarget().toPath(), + (getHeaderLine() + '\n').getBytes(StandardCharsets.UTF_8) + ); + } + + // To remove duplicate lines + LinkedHashSet uniqueLines = new LinkedHashSet<>(); + for (File f : getFiles()) { + uniqueLines.addAll(Files.readAllLines(f.toPath(), StandardCharsets.UTF_8)); + } + Files.write( + getTarget().toPath(), uniqueLines, StandardCharsets.UTF_8, StandardOpenOption.APPEND + ); + } + +} diff --git a/buildSrc/src/test/java/org/elasticsearch/gradle/ConcatFilesTaskTests.java b/buildSrc/src/test/java/org/elasticsearch/gradle/ConcatFilesTaskTests.java new file mode 100644 index 0000000000000..5e8dde0b148b4 --- /dev/null +++ b/buildSrc/src/test/java/org/elasticsearch/gradle/ConcatFilesTaskTests.java @@ -0,0 +1,92 @@ +/* + * Licensed to Elasticsearch under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.elasticsearch.gradle; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Arrays; + +import org.elasticsearch.gradle.test.GradleUnitTestCase; +import org.gradle.api.Project; +import org.gradle.testfixtures.ProjectBuilder; + +public class ConcatFilesTaskTests extends GradleUnitTestCase { + + public void testHeaderAdded() throws IOException { + + Project project = createProject(); + ConcatFilesTask concatFilesTask = createTask(project); + + concatFilesTask.setHeaderLine("Header"); + + File file = new File(project.getProjectDir(), "src/main/java/Code.java"); + file.getParentFile().mkdirs(); + file.createNewFile(); + concatFilesTask.setTarget(file); + concatFilesTask.setFiles(project.fileTree("tmp/")); + + concatFilesTask.concatFiles(); + + assertEquals(Arrays.asList("Header"), Files.readAllLines(concatFilesTask.getTarget().toPath(), StandardCharsets.UTF_8)); + + file.delete(); + } + + public void testConcatenationWithUnique() throws IOException { + + Project project = createProject(); + ConcatFilesTask concatFilesTask = createTask(project); + + File file = new File(project.getProjectDir(), "src/main/java/Code.java"); + file.getParentFile().mkdirs(); + file.createNewFile(); + concatFilesTask.setTarget(file); + + File file1 = new File(project.getProjectDir(), "src/main/input/java/file1.java"); + File file2 = new File(project.getProjectDir(), "src/main/input/text/file2.txt"); + file1.getParentFile().mkdirs(); + file2.getParentFile().mkdirs(); + file1.createNewFile(); + file2.createNewFile(); + Files.write(file1.toPath(), "Hello\nHello".getBytes()); + Files.write(file2.toPath(), "Hello\nनमस्ते".getBytes()); + + concatFilesTask.setFiles(project.fileTree(file1.getParentFile().getParentFile())); + + concatFilesTask.concatFiles(); + + assertEquals( + Arrays.asList("Hello", "नमस्ते"), + Files.readAllLines(concatFilesTask.getTarget().toPath(), StandardCharsets.UTF_8) + ); + + } + + private Project createProject() { + Project project = ProjectBuilder.builder().build(); + return project; + } + + private ConcatFilesTask createTask(Project project) { + return project.getTasks().create("concatFilesTask", ConcatFilesTask.class); + } + +}