implementing BAEL-6833 (#14912)
Co-authored-by: technoddy <mail.technoddy@gmail.com>
This commit is contained in:
parent
77d51bcb95
commit
5dcd7e88d0
@ -5,6 +5,18 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<artifactId>libraries-io</artifactId>
|
<artifactId>libraries-io</artifactId>
|
||||||
<name>libraries-io</name>
|
<name>libraries-io</name>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<source>17</source>
|
||||||
|
<target>17</target>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
<parent>
|
<parent>
|
||||||
<groupId>com.baeldung</groupId>
|
<groupId>com.baeldung</groupId>
|
||||||
@ -34,6 +46,11 @@
|
|||||||
<artifactId>zip4j</artifactId>
|
<artifactId>zip4j</artifactId>
|
||||||
<version>${zip4j.version}</version>
|
<version>${zip4j.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.opencsv</groupId>
|
||||||
|
<artifactId>opencsv</artifactId>
|
||||||
|
<version>${opencsv.version}</version>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
@ -42,6 +59,10 @@
|
|||||||
<sshj.version>0.27.0</sshj.version>
|
<sshj.version>0.27.0</sshj.version>
|
||||||
<vfs.version>2.4</vfs.version>
|
<vfs.version>2.4</vfs.version>
|
||||||
<zip4j.version>2.9.0</zip4j.version>
|
<zip4j.version>2.9.0</zip4j.version>
|
||||||
|
<opencsv.version>5.7.1</opencsv.version>
|
||||||
|
<maven.compiler.source>17</maven.compiler.source>
|
||||||
|
<maven.compiler.target>17</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
</project>
|
</project>
|
@ -0,0 +1,4 @@
|
|||||||
|
package com.baeldung.java.io.pojotocsv;
|
||||||
|
|
||||||
|
public record Application(String id, String name, Integer age, String created_at) {
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
package com.baeldung.java.io.pojotocsv;
|
||||||
|
|
||||||
|
import com.opencsv.bean.CsvBindByName;
|
||||||
|
import com.opencsv.bean.CsvBindByPosition;
|
||||||
|
|
||||||
|
public record ApplicationWithAnnotation(@CsvBindByName(column = "id", required = true) @CsvBindByPosition(position = 1) String id, @CsvBindByName(column = "name", required = true) @CsvBindByPosition(position = 0) String name,
|
||||||
|
@CsvBindByName(column = "age", required = true) @CsvBindByPosition(position = 2) Integer age, @CsvBindByName(column = "position", required = true) @CsvBindByPosition(position = 3) String created_at) {
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
package com.baeldung.java.io.pojotocsv;
|
||||||
|
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.opencsv.CSVWriter;
|
||||||
|
import com.opencsv.bean.StatefulBeanToCsvBuilder;
|
||||||
|
import com.opencsv.exceptions.CsvDataTypeMismatchException;
|
||||||
|
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
|
||||||
|
|
||||||
|
public class BeanToCsv {
|
||||||
|
|
||||||
|
public void beanToCSVWithDefault(List<Application> applications) throws Exception {
|
||||||
|
try (FileWriter writer = new FileWriter("src/main/resources/application.csv")) {
|
||||||
|
var builder = new StatefulBeanToCsvBuilder<Application>(writer).withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
|
||||||
|
.withSeparator(',')
|
||||||
|
.build();
|
||||||
|
builder.write(applications);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void beanToCSVWithCustomHeaderStrategy(List<Application> applications) throws IOException, CsvRequiredFieldEmptyException, CsvDataTypeMismatchException {
|
||||||
|
try (FileWriter writer = new FileWriter("src/main/resources/application2.csv")) {
|
||||||
|
var mappingStrategy = new CustomHeaderStrategy<Application>();
|
||||||
|
mappingStrategy.setType(Application.class);
|
||||||
|
|
||||||
|
var builder = new StatefulBeanToCsvBuilder<Application>(writer).withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
|
||||||
|
.withMappingStrategy(mappingStrategy)
|
||||||
|
.build();
|
||||||
|
builder.write(applications);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void beanToCSVWithCustomPositionStrategy(List<ApplicationWithAnnotation> applications) throws Exception {
|
||||||
|
try (FileWriter writer = new FileWriter("src/main/resources/application3.csv")) {
|
||||||
|
var builder = new StatefulBeanToCsvBuilder<ApplicationWithAnnotation>(writer).withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
|
||||||
|
.build();
|
||||||
|
builder.write(applications);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void beanToCSVWithCustomHeaderAndPositionStrategy(List<ApplicationWithAnnotation> applications) throws IOException, CsvRequiredFieldEmptyException, CsvDataTypeMismatchException {
|
||||||
|
try (FileWriter writer = new FileWriter("src/main/resources/application4.csv")) {
|
||||||
|
var mappingStrategy = new CustomColumnPositionStrategy<ApplicationWithAnnotation>();
|
||||||
|
mappingStrategy.setType(ApplicationWithAnnotation.class);
|
||||||
|
|
||||||
|
var builder = new StatefulBeanToCsvBuilder<ApplicationWithAnnotation>(writer).withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
|
||||||
|
.withMappingStrategy(mappingStrategy)
|
||||||
|
.build();
|
||||||
|
builder.write(applications);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package com.baeldung.java.io.pojotocsv;
|
||||||
|
|
||||||
|
import com.opencsv.bean.ColumnPositionMappingStrategy;
|
||||||
|
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
|
||||||
|
|
||||||
|
public class CustomColumnPositionStrategy<T> extends ColumnPositionMappingStrategy<T> {
|
||||||
|
@Override
|
||||||
|
public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException {
|
||||||
|
super.generateHeader(bean);
|
||||||
|
return super.getColumnMapping();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.baeldung.java.io.pojotocsv;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import com.opencsv.bean.HeaderColumnNameMappingStrategy;
|
||||||
|
import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
|
||||||
|
|
||||||
|
public class CustomHeaderStrategy<T> extends HeaderColumnNameMappingStrategy<T> {
|
||||||
|
@Override
|
||||||
|
public String[] generateHeader(T bean) throws CsvRequiredFieldEmptyException {
|
||||||
|
String[] header = super.generateHeader(bean);
|
||||||
|
return Arrays.stream(header)
|
||||||
|
.map(String::toLowerCase)
|
||||||
|
.toArray(String[]::new);
|
||||||
|
}
|
||||||
|
}
|
4
libraries-io/src/main/resources/application.csv
Normal file
4
libraries-io/src/main/resources/application.csv
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
AGE,CREATED_AT,ID,NAME
|
||||||
|
34,2023-08-11,123,Sam
|
||||||
|
44,2023-02-11,456,Tam
|
||||||
|
54,2023-03-11,890,Jam
|
|
4
libraries-io/src/main/resources/application2.csv
Normal file
4
libraries-io/src/main/resources/application2.csv
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
age,created_at,id,name
|
||||||
|
34,2023-08-11,123,Sam
|
||||||
|
44,2023-02-11,456,Tam
|
||||||
|
54,2023-03-11,890,Jam
|
|
3
libraries-io/src/main/resources/application3.csv
Normal file
3
libraries-io/src/main/resources/application3.csv
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Sam,123,34,2023-08-11
|
||||||
|
Tam,456,44,2023-02-11
|
||||||
|
Jam,789,54,2023-03-11
|
|
4
libraries-io/src/main/resources/application4.csv
Normal file
4
libraries-io/src/main/resources/application4.csv
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
name,id,age,created_at
|
||||||
|
Sam,123,34,2023-08-11
|
||||||
|
Tam,456,44,2023-02-11
|
||||||
|
Jam,789,54,2023-03-11
|
|
@ -0,0 +1,80 @@
|
|||||||
|
package com.baeldung.java.io.pojotocsv;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
public class BeanToCsvUnitTest {
|
||||||
|
|
||||||
|
List<Application> applications = new ArrayList<>();
|
||||||
|
List<ApplicationWithAnnotation> applicationsWithAnnotation = new ArrayList<>();
|
||||||
|
|
||||||
|
@BeforeEach
|
||||||
|
public void beforeEach() {
|
||||||
|
applications = List.of(new Application("123", "Sam", 34, "2023-08-11"), new Application("456", "Tam", 44, "2023-02-11"), new Application("890", "Jam", 54, "2023-03-11"));
|
||||||
|
|
||||||
|
applicationsWithAnnotation = List.of(new ApplicationWithAnnotation("123", "Sam", 34, "2023-08-11"), new ApplicationWithAnnotation("456", "Tam", 44, "2023-02-11"), new ApplicationWithAnnotation("789", "Jam", 54, "2023-03-11"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenApplicationPOJO_whenUsingDefaultStrategy_thenReceiveCSVFormatWithAscendingOrderOfField() throws Exception {
|
||||||
|
BeanToCsv beanToCsv = new BeanToCsv();
|
||||||
|
beanToCsv.beanToCSVWithDefault(applications);
|
||||||
|
try (BufferedReader bufferedReader = Files.newBufferedReader(Path.of("src/main/resources/application.csv"))) {
|
||||||
|
List<String> content = bufferedReader.lines()
|
||||||
|
.toList();
|
||||||
|
assertThat(content.get(0)).isEqualTo("AGE,CREATED_AT,ID,NAME");
|
||||||
|
assertThat(content.get(1)).isEqualTo("34,2023-08-11,123,Sam");
|
||||||
|
assertThat(content.get(2)).isEqualTo("44,2023-02-11,456,Tam");
|
||||||
|
assertThat(content.get(3)).isEqualTo("54,2023-03-11,890,Jam");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenApplicationPOJO_whenUsingCustomHeaderStrategy_thenReceiveCSVFormatWithCustomHeaders() throws Exception {
|
||||||
|
BeanToCsv beanToCsv = new BeanToCsv();
|
||||||
|
beanToCsv.beanToCSVWithCustomHeaderStrategy(applications);
|
||||||
|
try (BufferedReader bufferedReader = Files.newBufferedReader(Path.of("src/main/resources/application2.csv"))) {
|
||||||
|
List<String> content = bufferedReader.lines()
|
||||||
|
.toList();
|
||||||
|
assertThat(content.get(0)).isEqualTo("age,created_at,id,name");
|
||||||
|
assertThat(content.get(1)).isEqualTo("34,2023-08-11,123,Sam");
|
||||||
|
assertThat(content.get(2)).isEqualTo("44,2023-02-11,456,Tam");
|
||||||
|
assertThat(content.get(3)).isEqualTo("54,2023-03-11,890,Jam");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenApplicationPOJOWithAnnotation_whenUsingCustomPositionStrategy_thenReceiveCSVFormatWithCustomPosition() throws Exception {
|
||||||
|
BeanToCsv beanToCsv = new BeanToCsv();
|
||||||
|
beanToCsv.beanToCSVWithCustomPositionStrategy(applicationsWithAnnotation);
|
||||||
|
try (BufferedReader bufferedReader = Files.newBufferedReader(Path.of("src/main/resources/application3.csv"))) {
|
||||||
|
List<String> content = bufferedReader.lines()
|
||||||
|
.toList();
|
||||||
|
assertThat(content.get(0)).isEqualTo("Sam,123,34,2023-08-11");
|
||||||
|
assertThat(content.get(1)).isEqualTo("Tam,456,44,2023-02-11");
|
||||||
|
assertThat(content.get(2)).isEqualTo("Jam,789,54,2023-03-11");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenApplicationPOJOWithAnnotation_whenUsingCustomHeaderPositionStrategy_thenReceiveCSVFormatWithCustomHeaderPosition() throws Exception {
|
||||||
|
BeanToCsv beanToCsv = new BeanToCsv();
|
||||||
|
beanToCsv.beanToCSVWithCustomHeaderAndPositionStrategy(applicationsWithAnnotation);
|
||||||
|
try (BufferedReader bufferedReader = Files.newBufferedReader(Path.of("src/main/resources/application4.csv"))) {
|
||||||
|
List<String> content = bufferedReader.lines()
|
||||||
|
.toList();
|
||||||
|
assertThat(content.get(0)).isEqualTo("name,id,age,created_at");
|
||||||
|
assertThat(content.get(1)).isEqualTo("Sam,123,34,2023-08-11");
|
||||||
|
assertThat(content.get(2)).isEqualTo("Tam,456,44,2023-02-11");
|
||||||
|
assertThat(content.get(3)).isEqualTo("Jam,789,54,2023-03-11");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user