Skip to content

Commit dc5e71e

Browse files
committed
add ability to download tx meter values as csv
1 parent ebf8696 commit dc5e71e

5 files changed

Lines changed: 44 additions & 0 deletions

File tree

pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,10 @@
532532
<groupId>com.fasterxml.jackson.core</groupId>
533533
<artifactId>jackson-annotations</artifactId>
534534
</dependency>
535+
<dependency>
536+
<groupId>tools.jackson.dataformat</groupId>
537+
<artifactId>jackson-dataformat-csv</artifactId>
538+
</dependency>
535539
<!-- Needed for Joda fields in de.rwth.idsg.steve.web.api -->
536540
<dependency>
537541
<groupId>tools.jackson.datatype</groupId>

src/main/java/de/rwth/idsg/steve/repository/dto/TransactionDetails.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package de.rwth.idsg.steve.repository.dto;
2020

2121
import com.fasterxml.jackson.annotation.JsonIgnore;
22+
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
2223
import jooq.steve.db.tables.records.TransactionStartRecord;
2324
import lombok.Builder;
2425
import lombok.Getter;
@@ -46,6 +47,16 @@ public class TransactionDetails {
4647
@JsonIgnore
4748
private final TransactionStartRecord nextTransactionStart;
4849

50+
@JsonPropertyOrder(value = {
51+
"valueTimestamp",
52+
"value",
53+
"readingContext",
54+
"format",
55+
"measurand",
56+
"location",
57+
"unit",
58+
"phase"
59+
})
4960
@Getter
5061
@Builder
5162
public static class MeterValues {

src/main/java/de/rwth/idsg/steve/service/TransactionService.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
import org.joda.time.DateTime;
3737
import org.springframework.stereotype.Service;
3838
import org.springframework.util.CollectionUtils;
39+
import tools.jackson.dataformat.csv.CsvMapper;
40+
import tools.jackson.dataformat.csv.CsvSchema;
3941

4042
import java.io.Writer;
4143
import java.util.Comparator;
@@ -56,6 +58,11 @@ public class TransactionService {
5658
private final TransactionRepository transactionRepository;
5759
private final OcppServerRepository ocppServerRepository;
5860

61+
private final CsvMapper csvMapper = CsvMapper.builder().findAndAddModules().build();
62+
private final CsvSchema schema = csvMapper.schemaFor(TransactionDetails.MeterValues.class)
63+
.withHeader()
64+
.withNullValue("\"\""); // to be consistent with JOOQ's CSV behavior
65+
5966
public List<Transaction> getTransactions(TransactionQueryForm form) {
6067
return transactionRepository.getTransactions(form);
6168
}
@@ -64,6 +71,12 @@ public void writeTransactionsCSV(TransactionQueryForm form, Writer writer) {
6471
transactionRepository.writeTransactionsCSV(form, writer);
6572
}
6673

74+
public void writeTransactionMeterValuesCSV(int transactionPk, Writer writer) {
75+
try (var seqWriter = csvMapper.writer(schema).writeValues(writer)) {
76+
seqWriter.writeAll(getDetails(transactionPk).getValues());
77+
}
78+
}
79+
6780
public List<Integer> getActiveTransactionIds(String chargeBoxId) {
6881
return transactionRepository.getActiveTransactionIds(chargeBoxId);
6982
}

src/main/java/de/rwth/idsg/steve/web/controller/TransactionsReservationsController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ public class TransactionsReservationsController {
6464
private static final String TRANSACTIONS_PATH = "/transactions";
6565
private static final String TRANSACTION_STOP_PATH = "/transactions/stop/{transactionPk}";
6666
private static final String TRANSACTIONS_DETAILS_PATH = "/transactions/details/{transactionPk}";
67+
private static final String TRANSACTIONS_DETAILS_METER_VALUES_CSV_PATH = TRANSACTIONS_DETAILS_PATH + "/meterValues.csv";
6768
private static final String TRANSACTIONS_QUERY_PATH = "/transactions/query";
6869
private static final String RESERVATIONS_PATH = "/reservations";
6970
private static final String RESERVATIONS_QUERY_PATH = "/reservations/query";
@@ -94,6 +95,17 @@ public String getTransactionDetails(@PathVariable("transactionPk") int transacti
9495
return "data-man/transactionDetails";
9596
}
9697

98+
@RequestMapping(value = TRANSACTIONS_DETAILS_METER_VALUES_CSV_PATH)
99+
public void getTransactionDetailsMeterValuesCsv(@PathVariable("transactionPk") int transactionPk,
100+
HttpServletResponse response) throws IOException {
101+
String fileName = "transaction_%s_meter_values.csv".formatted(transactionPk);
102+
String headerKey = "Content-Disposition";
103+
String headerValue = "attachment; filename=\"%s\"".formatted(fileName);
104+
response.setContentType("text/csv");
105+
response.setHeader(headerKey, headerValue);
106+
transactionService.writeTransactionMeterValuesCSV(transactionPk, response.getWriter());
107+
}
108+
97109
@RequestMapping(value = TRANSACTIONS_QUERY_PATH)
98110
public String getTransactionsQuery(@Valid @ModelAttribute(PARAMS) TransactionQueryForm params,
99111
BindingResult result, Model model,

src/main/webapp/WEB-INF/views/data-man/transactionDetails.jsp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
</center>
4444
<br>
4545
<section><span>Intermediate Meter Values</span></section>
46+
<form action="${ctxPath}/manager/transactions/details/${details.transaction.id}/meterValues.csv" method="get">
47+
<input type="submit" value="Download CSV">
48+
</form>
49+
<br>
4650
<table class="res">
4751
<thead>
4852
<tr>

0 commit comments

Comments
 (0)