|
1
|
|
package com.edtech.service; |
|
2
|
|
|
|
3
|
|
import com.edtech.model.AuditLog; |
|
4
|
|
import java.io.ByteArrayOutputStream; |
|
5
|
|
import java.io.OutputStreamWriter; |
|
6
|
|
import java.nio.charset.StandardCharsets; |
|
7
|
|
import java.util.List; |
|
8
|
|
import org.springframework.stereotype.Component; |
|
9
|
|
|
|
10
|
|
/** Transforma logs de auditoria em arquivos CSV. */ |
|
11
|
|
@Component |
|
12
|
|
public class AuditTrailCsvExporter { |
|
13
|
|
|
|
14
|
|
/** |
|
15
|
|
* Gera um CSV em memoria com os principais dados da trilha de auditoria. |
|
16
|
|
* |
|
17
|
|
* @param logs logs que devem ser exportados. |
|
18
|
|
* @return conteudo do arquivo CSV em bytes. |
|
19
|
|
*/ |
|
20
|
|
public byte[] export(List<AuditLog> logs) { |
|
21
|
|
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); |
|
22
|
|
|
|
23
|
|
try (OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)) { |
|
24
|
|
|
|
25
|
1
1. export : removed call to com/edtech/service/AuditTrailCsvExporter::writeRow → KILLED
|
writeRow( |
|
26
|
|
writer, |
|
27
|
|
"data_hora", |
|
28
|
|
"usuario_id", |
|
29
|
|
"acao", |
|
30
|
|
"tipo_recurso", |
|
31
|
|
"id_recurso", |
|
32
|
|
"ip", |
|
33
|
|
"detalhes"); |
|
34
|
|
|
|
35
|
|
for (AuditLog log : logs) { |
|
36
|
1
1. export : removed call to com/edtech/service/AuditTrailCsvExporter::writeRow → KILLED
|
writeRow( |
|
37
|
|
writer, |
|
38
|
1
1. export : negated conditional → SURVIVED
|
log.getCreatedAt() != null ? log.getCreatedAt().toString() : "", |
|
39
|
1
1. export : negated conditional → KILLED
|
log.getUserId() != null ? log.getUserId().toString() : "", |
|
40
|
1
1. export : negated conditional → KILLED
|
log.getAction() != null ? log.getAction().name() : "", |
|
41
|
1
1. export : negated conditional → SURVIVED
|
log.getResourceType() != null ? log.getResourceType() : "", |
|
42
|
1
1. export : negated conditional → KILLED
|
log.getResourceId() != null ? log.getResourceId().toString() : "", |
|
43
|
1
1. export : negated conditional → SURVIVED
|
log.getIpAddress() != null ? log.getIpAddress() : "", |
|
44
|
1
1. export : negated conditional → KILLED
|
log.getDetails() != null ? log.getDetails() : ""); |
|
45
|
|
} |
|
46
|
|
|
|
47
|
1
1. export : removed call to java/io/OutputStreamWriter::flush → KILLED
|
writer.flush(); |
|
48
|
|
return outputStream.toByteArray(); |
|
49
|
|
} catch (Exception e) { |
|
50
|
|
throw new RuntimeException("Falha ao gerar CSV da trilha de auditoria", e); |
|
51
|
|
} |
|
52
|
|
} |
|
53
|
|
|
|
54
|
|
private void writeRow(OutputStreamWriter writer, String... values) throws java.io.IOException { |
|
55
|
2
1. writeRow : negated conditional → KILLED
2. writeRow : changed conditional boundary → KILLED
|
for (int index = 0; index < values.length; index++) { |
|
56
|
2
1. writeRow : negated conditional → KILLED
2. writeRow : changed conditional boundary → KILLED
|
if (index > 0) { |
|
57
|
1
1. writeRow : removed call to java/io/OutputStreamWriter::write → KILLED
|
writer.write(","); |
|
58
|
|
} |
|
59
|
1
1. writeRow : removed call to java/io/OutputStreamWriter::write → KILLED
|
writer.write(escape(values[index])); |
|
60
|
|
} |
|
61
|
1
1. writeRow : removed call to java/io/OutputStreamWriter::write → KILLED
|
writer.write("\r\n"); |
|
62
|
|
} |
|
63
|
|
|
|
64
|
|
private String escape(String value) { |
|
65
|
1
1. escape : negated conditional → KILLED
|
String safeValue = value != null ? value : ""; |
|
66
|
1
1. escape : negated conditional → KILLED
|
if (safeValue.contains("\"") |
|
67
|
1
1. escape : negated conditional → KILLED
|
|| safeValue.contains(",") |
|
68
|
1
1. escape : negated conditional → KILLED
|
|| safeValue.contains("\n") |
|
69
|
1
1. escape : negated conditional → KILLED
|
|| safeValue.contains("\r")) { |
|
70
|
1
1. escape : replaced return value with "" for com/edtech/service/AuditTrailCsvExporter::escape → KILLED
|
return "\"" + safeValue.replace("\"", "\"\"") + "\""; |
|
71
|
|
} |
|
72
|
|
return safeValue; |
|
73
|
|
} |
|
74
|
|
} |
| | Mutations |
| 25 |
|
1.1 Location : export Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:exportEscapesCsvSpecialCharacters()] removed call to com/edtech/service/AuditTrailCsvExporter::writeRow → KILLED
|
| 36 |
|
1.1 Location : export Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] removed call to com/edtech/service/AuditTrailCsvExporter::writeRow → KILLED
|
| 38 |
|
1.1 Location : export Killed by : none negated conditional → SURVIVED
|
| 39 |
|
1.1 Location : export Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] negated conditional → KILLED
|
| 40 |
|
1.1 Location : export Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] negated conditional → KILLED
|
| 41 |
|
1.1 Location : export Killed by : none negated conditional → SURVIVED
|
| 42 |
|
1.1 Location : export Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] negated conditional → KILLED
|
| 43 |
|
1.1 Location : export Killed by : none negated conditional → SURVIVED
|
| 44 |
|
1.1 Location : export Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithCarriageReturn_ShouldEscape()] negated conditional → KILLED
|
| 47 |
|
1.1 Location : export Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] removed call to java/io/OutputStreamWriter::flush → KILLED
|
| 55 |
|
1.1 Location : writeRow Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] negated conditional → KILLED 2.2 Location : writeRow Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] changed conditional boundary → KILLED
|
| 56 |
|
1.1 Location : writeRow Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] negated conditional → KILLED 2.2 Location : writeRow Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:exportEscapesCsvSpecialCharacters()] changed conditional boundary → KILLED
|
| 57 |
|
1.1 Location : writeRow Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] removed call to java/io/OutputStreamWriter::write → KILLED
|
| 59 |
|
1.1 Location : writeRow Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithCarriageReturn_ShouldEscape()] removed call to java/io/OutputStreamWriter::write → KILLED
|
| 61 |
|
1.1 Location : writeRow Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:exportEscapesCsvSpecialCharacters()] removed call to java/io/OutputStreamWriter::write → KILLED
|
| 65 |
|
1.1 Location : escape Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithCarriageReturn_ShouldEscape()] negated conditional → KILLED
|
| 66 |
|
1.1 Location : escape Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] negated conditional → KILLED
|
| 67 |
|
1.1 Location : escape Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] negated conditional → KILLED
|
| 68 |
|
1.1 Location : escape Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] negated conditional → KILLED
|
| 69 |
|
1.1 Location : escape Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithNullFields_ShouldHandleGracefully()] negated conditional → KILLED
|
| 70 |
|
1.1 Location : escape Killed by : com.edtech.service.AuditTrailCsvExporterTest.[engine:junit-jupiter]/[class:com.edtech.service.AuditTrailCsvExporterTest]/[method:export_WithCarriageReturn_ShouldEscape()] replaced return value with "" for com/edtech/service/AuditTrailCsvExporter::escape → KILLED
|