Skip to content
Snippets Groups Projects
Commit 21cdbdaa authored by Robert Goldmann's avatar Robert Goldmann
Browse files

#724 - new input to configure encoding

parent f794725c
No related branches found
No related tags found
No related merge requests found
...@@ -58,7 +58,7 @@ public class TransactionImportController extends BaseController ...@@ -58,7 +58,7 @@ public class TransactionImportController extends BaseController
@GetMapping @GetMapping
public String transactionImport(HttpServletRequest request, Model model) 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; return ReturnValues.TRANSACTION_IMPORT;
} }
...@@ -78,6 +78,11 @@ public class TransactionImportController extends BaseController ...@@ -78,6 +78,11 @@ public class TransactionImportController extends BaseController
bindingResult.addError(new FieldError("CsvImport", "separator", "", false, new String[]{"warning.transaction.import.separator"}, null, null)); 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()) if(bindingResult.hasErrors())
{ {
model.addAttribute(ModelAttributes.ERROR, bindingResult); model.addAttribute(ModelAttributes.ERROR, bindingResult);
...@@ -87,7 +92,7 @@ public class TransactionImportController extends BaseController ...@@ -87,7 +92,7 @@ public class TransactionImportController extends BaseController
try 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)); final List<CsvRow> csvRows = CsvParser.parseCsv(csvString, csvImport.separator().charAt(0));
request.setAttribute(RequestAttributeNames.CSV_IMPORT, csvImport, RequestAttributes.SCOPE_SESSION); request.setAttribute(RequestAttributeNames.CSV_IMPORT, csvImport, RequestAttributes.SCOPE_SESSION);
......
package de.deadlocker8.budgetmaster.transactions.csvImport; package de.deadlocker8.budgetmaster.transactions.csvImport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
public record CsvImport(MultipartFile file, String separator) import java.nio.charset.Charset;
{ import java.text.MessageFormat;
@Override
public String toString() public record CsvImport(MultipartFile file, String separator, String encoding)
{ {
return "CsvImport{" + private static final Logger LOGGER = LoggerFactory.getLogger(CsvImport.class);
"file=" + file +
", separator='" + separator + '\'' +
'}';
}
public boolean isValidSeparator() public boolean isValidSeparator()
{ {
...@@ -23,6 +21,21 @@ public record CsvImport(MultipartFile file, String separator) ...@@ -23,6 +21,21 @@ public record CsvImport(MultipartFile file, String separator)
return separator.strip().length() == 1; 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() public String getFileName()
{ {
if(file == null) if(file == null)
......
...@@ -13,11 +13,17 @@ import java.util.List; ...@@ -13,11 +13,17 @@ import java.util.List;
public class CsvParser public class CsvParser
{ {
private CsvParser()
{
}
public static List<CsvRow> parseCsv(String csvString, char separator) throws IOException, CsvValidationException public static List<CsvRow> parseCsv(String csvString, char separator) throws IOException, CsvValidationException
{ {
final ArrayList<CsvRow> csvRows = new ArrayList<>(); 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( try(CSVReader reader = new CSVReaderBuilder(
new StringReader(csvString)) new StringReader(csvString))
......
...@@ -233,6 +233,7 @@ warning.empty.git.branch.name=Bitte gib den Namen des git-Branches ein. ...@@ -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.user.name=Bitte gib deinen git-Nutzernamen ein.
warning.empty.git.token=Bitte gib dein git-Zugriffstoken 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.separator=Ungültiges Trennzeichen. Bitte genau ein Zeichen eingeben.
warning.transaction.import.encoding=Ungültige oder nicht unterstützte Kodierung.
# UI # UI
...@@ -372,6 +373,7 @@ transactions.recurring.placeholder=Keine aktiven wiederholenden Buchungen ...@@ -372,6 +373,7 @@ transactions.recurring.placeholder=Keine aktiven wiederholenden Buchungen
transactions.import.overview=Übersicht transactions.import.overview=Übersicht
transactions.import.column=Spalte transactions.import.column=Spalte
transactions.import.separator=Trennzeichen transactions.import.separator=Trennzeichen
transactions.import.encoding=Kodierung
repeating.button.add=Wiederholung hinzufügen repeating.button.add=Wiederholung hinzufügen
repeating.button.remove=Wiederholung entfernen repeating.button.remove=Wiederholung entfernen
......
...@@ -233,6 +233,7 @@ warning.empty.git.branch.name=Please insert the git branch name. ...@@ -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.user.name=Please insert your git username.
warning.empty.git.token=Please insert your git access token. warning.empty.git.token=Please insert your git access token.
warning.transaction.import.separator=Invalid separator. Please enter exactly one character. warning.transaction.import.separator=Invalid separator. Please enter exactly one character.
warning.transaction.import.encoding=Invalid or unsupported encoding.
# UI # UI
...@@ -371,6 +372,7 @@ transactions.recurring.placeholder=No active recurring transactions ...@@ -371,6 +372,7 @@ transactions.recurring.placeholder=No active recurring transactions
transactions.import.overview=Overview transactions.import.overview=Overview
transactions.import.column=Column transactions.import.column=Column
transactions.import.separator=Separator transactions.import.separator=Separator
transactions.import.encoding=Encoding
repeating.button.add=Add repetition repeating.button.add=Add repetition
repeating.button.remove=Remove repetition repeating.button.remove=Remove repetition
......
...@@ -69,10 +69,14 @@ ...@@ -69,10 +69,14 @@
</div> </div>
<div class="row"> <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>"> <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> <label class="input-label" for="separator">${locale.getString("transactions.import.separator")}</label>
</div> </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>
<div class="row"> <div class="row">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment