Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@
<version>1.18.34</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.datafaker</groupId>
<artifactId>datafaker</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
Expand Down
25 changes: 24 additions & 1 deletion src/main/java/org/writer/Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,30 @@
package org.writer;

import net.datafaker.Faker;
import org.writer.model.Months;
import org.writer.model.Person;
import org.writer.model.Student;

import java.util.ArrayList;
import java.util.List;

public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
Faker faker = new Faker();
WritableImpl writableImpl = new WritableImpl();

List<Student> students = new ArrayList<>();
for (int i = 0; i < 5; i++) {
students.add(new Student(faker.name().firstName(), List.of(faker.size().adjective(), faker.size().adjective())));
}
writableImpl.writeToFile(students, "output.csv");


List<Person> persons = new ArrayList<>();
for (int i = 0; i < 5; i++) {
persons.add(new Person(faker.name().firstName(), faker.name().lastName(), 22, Months.APRIL, 1094));
}
writableImpl.writeToFile(persons, "output.csv");

}
}
86 changes: 86 additions & 0 deletions src/main/java/org/writer/WritableImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package org.writer;

import org.writer.exception.AccessFileException;
import org.writer.exception.InvalidDataException;

import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
import java.util.logging.Logger;
import java.util.stream.Collectors;

/**
* Класс реализации записи данных в файл в формате CSV
*/

public class WritableImpl implements Writable {
private final Logger logger = Logger.getLogger(WritableImpl.class.getName());
private final StringBuilder stringBuilder = new StringBuilder();


/**
* Вадидация входных даннных
* @param data - список обьектов
* @param fileName - имя файла для записи
* @throws InvalidDataException - бросает исключение
*/
@Override
public void writeToFile(List<?> data, String fileName) {
if (validateMethod(data, fileName)) {
try (FileWriter fw = new FileWriter(fileName))
{
for (Object object : data) {
Class<?> aClass = object.getClass();
Field[] fields = aClass.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
Object valueField = field.get(object);
resolveFieldClass(valueField);
}
}
if (!stringBuilder.isEmpty()) {
stringBuilder.setLength(stringBuilder.length() - 1);
}
fw.write(stringBuilder.toString());
} catch (IllegalAccessException e) {
throw new InvalidDataException("Invalid data!");
} catch (IOException e) {
throw new AccessFileException("Access file error!");
}
} else {
throw new InvalidDataException("Invalid data!");
}
}

/**
* Вадидация входных даннных
* @param data - список обьектов
* @param fileName - имя файла для записи
*/
private boolean validateMethod(List<?> data, String fileName) {
if (data == null || fileName == null) {
logger.warning("Data or File Name is null!");
return false;
} else if (data.isEmpty() || fileName.isEmpty()) {
logger.warning("Data or File Name is empty!");
return false;
} else {
return true;
}
}

/**
* Проверка типа поля и заполнение stringbuilder
* @param valueField - поле обьекта
*/
private void resolveFieldClass (Object valueField) {
if (valueField instanceof Collection) {
String collect = ((Collection<?>) valueField).stream().map(value -> value.toString()).collect(Collectors.joining("|"));
stringBuilder.append(collect).append(',');
} else {
stringBuilder.append(valueField).append(',');
}
}
}
10 changes: 10 additions & 0 deletions src/main/java/org/writer/exception/AccessFileException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.writer.exception;

public class AccessFileException extends RuntimeException {
public AccessFileException(String message) {
super(message);
}
public AccessFileException(String message, Throwable cause) {
super(message, cause);
}
}
11 changes: 11 additions & 0 deletions src/main/java/org/writer/exception/InvalidDataException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.writer.exception;

public class InvalidDataException extends RuntimeException {

public InvalidDataException(String message) {
super(message);
}
public InvalidDataException(String message, Throwable cause) {
super(message, cause);
}
}
4 changes: 4 additions & 0 deletions src/main/java/org/writer/model/Months.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package org.writer.model;

/**
* Enum с именами месяцев в году.
*/

public enum Months {
JANUARY,
FEBRUARY,
Expand Down
11 changes: 9 additions & 2 deletions src/main/java/org/writer/model/Person.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,26 @@
import lombok.Builder;
import lombok.Data;

/**
* Класс сущности Person
*/

@Data
@Builder
@AllArgsConstructor
public class Person {

/** Поле имя */
private String firstName;

/** Поле фамилия */
private String lastName;

/** Поле дата рождения */
private int dayOfBirth;

/** Поле месяц рождения */
private Months monthOfBirth;

/** Поле год рождения */
private int yearOfBirth;

}
8 changes: 6 additions & 2 deletions src/main/java/org/writer/model/Student.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@

import java.util.List;

/**
* Класс сущности Student
*/

@Data
@Builder
@AllArgsConstructor
public class Student {

/** Поле имя */
private String name;

/** Поле счета, представляет из себя список String */
private List<String> score;
}
86 changes: 86 additions & 0 deletions src/test/java/UnitTests/CSVWriterTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package UnitTests;


import net.datafaker.Faker;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.writer.WritableImpl;
import org.writer.exception.InvalidDataException;
import org.writer.model.Months;
import org.writer.model.Person;
import org.writer.model.Student;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

class CSVWriterTest {
private final Faker faker = new Faker();
private final WritableImpl writable = new WritableImpl();
private final List<Person> persons = new ArrayList<>();
private final List<Student> students = new ArrayList<>();
private final String fileName = "output.csv";


@BeforeEach
void setUp() {
for (int i = 0; i < 5; i++) {
persons.add(new Person(faker.name().firstName(), faker.name().lastName(), 22, Months.APRIL, 1094));
}
persons.add(new Person("Egor", "Fillipov", 22, Months.APRIL, 1094));


for (int i = 0; i < 5; i++) {
students.add(new Student(faker.name().firstName(), List.of(faker.size().adjective(), faker.size().adjective())));
}
students.add(new Student("Egor", List.of("129", "200")));
}

@AfterEach
void tearDown() {
persons.clear();
students.clear();
}


@Test
void validPersonsWriteTest() throws IOException {
writable.writeToFile(persons, fileName);
Assertions.assertDoesNotThrow(() -> {});
FileReader fileReader = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String s = bufferedReader.readLine();
Assertions.assertNotNull(s);
Assertions.assertTrue(s.contains("Egor"));
}

@Test
void validStudentsWriteTest() throws IOException {
writable.writeToFile(students, fileName);
Assertions.assertDoesNotThrow(() -> {});
FileReader fileReader = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String s = bufferedReader.readLine();
Assertions.assertNotNull(s);
Assertions.assertTrue(s.contains("Egor"));
}

@Test
void invalidPersonsWriteTest() {
Assertions.assertThrows(InvalidDataException.class, () -> writable.writeToFile(null, fileName));
}

@Test
void invalidStudentsWriteTest() {
Assertions.assertThrows(InvalidDataException.class, () -> writable.writeToFile(null, fileName));
}

@Test
void invalidFileNameTest() {
Assertions.assertThrows(InvalidDataException.class, () -> writable.writeToFile(persons, null));
}
}