Skip to content

Commit

Permalink
#724 - new input to configure encoding
Browse files Browse the repository at this point in the history
  • Loading branch information
deadlocker8 committed Jan 8, 2023
1 parent f794725 commit 21cdbda
Show file tree
Hide file tree
Showing 6 changed files with 45 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public TransactionImportController(TransactionService transactionService, Helper
@GetMapping
public String transactionImport(HttpServletRequest request, Model model)
{
model.addAttribute(RequestAttributeNames.CSV_IMPORT, new CsvImport(null, ";"));
model.addAttribute(RequestAttributeNames.CSV_IMPORT, new CsvImport(null, ";", StandardCharsets.UTF_8.name()));
return ReturnValues.TRANSACTION_IMPORT;
}

Expand All @@ -78,6 +78,11 @@ public String upload(WebRequest request,
bindingResult.addError(new FieldError("CsvImport", "separator", "", false, new String[]{"warning.transaction.import.separator"}, null, null));
}

if(!csvImport.isEncodingSupported())
{
bindingResult.addError(new FieldError("CsvImport", "encoding", "", false, new String[]{"warning.transaction.import.encoding"}, null, null));
}

if(bindingResult.hasErrors())
{
model.addAttribute(ModelAttributes.ERROR, bindingResult);
Expand All @@ -87,7 +92,7 @@ public String upload(WebRequest request,

try
{
final String csvString = new String(csvImport.file().getBytes(), StandardCharsets.UTF_8);
final String csvString = new String(csvImport.file().getBytes(), csvImport.encoding());
final List<CsvRow> csvRows = CsvParser.parseCsv(csvString, csvImport.separator().charAt(0));

request.setAttribute(RequestAttributeNames.CSV_IMPORT, csvImport, RequestAttributes.SCOPE_SESSION);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,15 @@
package de.deadlocker8.budgetmaster.transactions.csvImport;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

public record CsvImport(MultipartFile file, String separator)
import java.nio.charset.Charset;
import java.text.MessageFormat;

public record CsvImport(MultipartFile file, String separator, String encoding)
{
@Override
public String toString()
{
return "CsvImport{" +
"file=" + file +
", separator='" + separator + '\'' +
'}';
}
private static final Logger LOGGER = LoggerFactory.getLogger(CsvImport.class);

public boolean isValidSeparator()
{
Expand All @@ -23,6 +21,21 @@ public boolean isValidSeparator()
return separator.strip().length() == 1;
}

public boolean isEncodingSupported()
{
try
{
Charset.forName(encoding);
return true;
}
catch(IllegalArgumentException e)
{
LOGGER.error(MessageFormat.format("Could not create charset from encoding name: {0}", encoding), e);
}

return false;
}

public String getFileName()
{
if(file == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,17 @@

public class CsvParser
{
private CsvParser()
{
}

public static List<CsvRow> parseCsv(String csvString, char separator) throws IOException, CsvValidationException
{
final ArrayList<CsvRow> csvRows = new ArrayList<>();

final CSVParser csvParser = new CSVParserBuilder().withSeparator(separator).build();
final CSVParser csvParser = new CSVParserBuilder()
.withSeparator(separator)
.build();

try(CSVReader reader = new CSVReaderBuilder(
new StringReader(csvString))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@ warning.empty.git.branch.name=Bitte gib den Namen des git-Branches ein.
warning.empty.git.user.name=Bitte gib deinen git-Nutzernamen ein.
warning.empty.git.token=Bitte gib dein git-Zugriffstoken ein.
warning.transaction.import.separator=Ungültiges Trennzeichen. Bitte genau ein Zeichen eingeben.
warning.transaction.import.encoding=Ungültige oder nicht unterstützte Kodierung.


# UI
Expand Down Expand Up @@ -372,6 +373,7 @@ transactions.recurring.placeholder=Keine aktiven wiederholenden Buchungen
transactions.import.overview=Übersicht
transactions.import.column=Spalte
transactions.import.separator=Trennzeichen
transactions.import.encoding=Kodierung

repeating.button.add=Wiederholung hinzufügen
repeating.button.remove=Wiederholung entfernen
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,7 @@ warning.empty.git.branch.name=Please insert the git branch name.
warning.empty.git.user.name=Please insert your git username.
warning.empty.git.token=Please insert your git access token.
warning.transaction.import.separator=Invalid separator. Please enter exactly one character.
warning.transaction.import.encoding=Invalid or unsupported encoding.


# UI
Expand Down Expand Up @@ -371,6 +372,7 @@ transactions.recurring.placeholder=No active recurring transactions
transactions.import.overview=Overview
transactions.import.column=Column
transactions.import.separator=Separator
transactions.import.encoding=Encoding

repeating.button.add=Add repetition
repeating.button.remove=Remove repetition
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,14 @@
</div>

<div class="row">
<div class="input-field col s2 offset-s5">
<div class="input-field col s2 offset-s4">
<input id="separator" type="text" name="separator" <@validation.validation "separator" "center-align"/> value="<#if csvImport??>${csvImport.separator()}</#if>">
<label class="input-label" for="separator">${locale.getString("transactions.import.separator")}</label>
</div>
<div class="input-field col s2">
<input id="encoding" type="text" name="encoding"" <@validation.validation "encoding" "center-align"/> value="<#if csvImport??>${csvImport.encoding()?upper_case}</#if>">
<label class="input-label" for="encoding">${locale.getString("transactions.import.encoding")}</label>
</div>
</div>

<div class="row">
Expand Down

0 comments on commit 21cdbda

Please sign in to comment.