Skip to content

Commit

Permalink
Implement ConcatFilesTask from Groovy to Java issues#34459 (#37497)
Browse files Browse the repository at this point in the history
relates  #344597
  • Loading branch information
akki authored and alpar-t committed Mar 7, 2019
1 parent 6c19d87 commit 4df26a2
Show file tree
Hide file tree
Showing 3 changed files with 188 additions and 70 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<String> 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
);
}

}
Original file line number Diff line number Diff line change
@@ -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);
}

}

0 comments on commit 4df26a2

Please sign in to comment.