Skip to content

Commit 45a79c6

Browse files
committed
Improve Error handling, split up classes into multiple packages
1 parent c018999 commit 45a79c6

32 files changed

+556
-456
lines changed

.gitignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Custom
2-
teilnehmer.xls
3-
db.mdb
2+
extern/data/*
43
gradlew
54
gradlew.bat
65

.idea/.name

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/libraries-with-intellij-classes.xml

Lines changed: 65 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules/DataImporter.iml

Lines changed: 0 additions & 2 deletions
This file was deleted.

build.gradle

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@ dependencies {
2121

2222
//implementation group: 'net.sf.ucanaccess', name: 'ucanaccess', version: '5.0.1'
2323
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.7'
24+
implementation 'org.jetbrains:annotations:20.1.0'
2425
}
2526

2627
application {
27-
mainClassName('com.damgem.dataImporter.Main')
28-
mainModule.set('com.damgem.dataImporter')
28+
mainClassName('com.damgem.DataImporter.Main')
29+
mainModule.set('com.damgem.DataImporter')
2930
}
3031

3132
javafx {
@@ -46,7 +47,8 @@ jlink {
4647
jpackage {
4748
appVersion = '0.1.1'
4849
icon = 'src/main/resources/table2.ico'
49-
//jvmArgs = ['-Djavafx.autoproxy.disable=true']
50-
installerOptions = ['--win-upgrade-uuid', 'comdamgemDataImporter']
50+
jvmArgs = ['-Djavafx.autoproxy.disable=true']
51+
installerOptions = ['--win-upgrade-uuid', '855563f2-b2c5-4ac1-8af6-80a0baff651b']
52+
// resourceDir = new File("src/main/resources")
5153
}
5254
}

autohotkey/importer_ctrl_alt_c.ahk renamed to extern/DataImporter-Hotkey.ahk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
22
; #Warn ; Enable warnings to assist with detecting common errors.
33
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
4-
SetWorkingDir C:\Program Files\DataImporter ; %A_ScriptDir% ; Ensures a consistent starting directory.
4+
SetWorkingDir %A_ScriptDir% ; C:\Program Files\DataImporter ; Ensures a consistent starting directory.
55

66
GetSelectedText() {
77
tmp = %ClipboardAll% ; save clipboard

config.json renamed to extern/config.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{
22
"legacyMode": false,
3-
"legacyProfile": "FB",
3+
"legacyProfile": "WS",
44
"profiles": {
5-
"FB": {
6-
"target": "teilnehmer.xls",
5+
"WS": {
6+
"target": "data/teilnehmer.xls",
77
"targetType": "excel",
88
"mapping": {
99
"Kundennummer": null,
@@ -35,8 +35,8 @@
3535
"Nachname Erziehungsb.": 14
3636
}
3737
},
38-
"Feedback": {
39-
"target": "feedback.mdb",
38+
"FB": {
39+
"target": "data/feedback.mdb",
4040
"subTarget": "tbl_Feedback_FP",
4141
"targetType": "access",
4242
"mapping": {
@@ -69,7 +69,7 @@
6969
},
7070
"GEB": {
7171
"targetType": "excel",
72-
"target": "geburtstage.xls",
72+
"target": "data/geburtstage.xls",
7373
"mapping": {
7474
"Vorname": 0,
7575
"Nachname": 1,
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.damgem.DataImporter.Connector;
2+
3+
import com.damgem.DataImporter.DataImporterError;
4+
import com.damgem.DataImporter.Field.Field;
5+
import com.healthmarketscience.jackcess.*;
6+
7+
import java.io.File;
8+
import java.util.HashMap;
9+
import java.util.List;
10+
import java.util.Map;
11+
import java.util.stream.Collectors;
12+
13+
public class AccessConnector implements DataConnector {
14+
15+
private String target, subTarget;
16+
17+
public AccessConnector(String target, String subTarget) throws DataImporterError {
18+
if(target == null) {
19+
throw new DataImporterError("Unvollständige Konfiguration", "target ist null.");
20+
}
21+
if(subTarget == null) {
22+
throw new DataImporterError("Unvollständige Konfiguration", "subTarget ist null.");
23+
}
24+
this.target = target;
25+
this.subTarget = subTarget;
26+
}
27+
28+
private Database openDatabase() throws DataImporterError {
29+
File file = new File(target);
30+
if(!file.exists()) {
31+
throw new DataImporterError("Fehler beim Öffnen der Datenbank", "Datei "
32+
+ file.getAbsolutePath() + " existiert nicht.");
33+
}
34+
try {
35+
return DatabaseBuilder.open(file);
36+
} catch (Exception error) {
37+
throw new DataImporterError("Fehler beim Öffnen der Datenbank", "Datei "
38+
+ file.getAbsolutePath() + " konnte nicht korrekt gelesen werden. ");
39+
}
40+
}
41+
42+
private Table openTable() throws DataImporterError {
43+
Database database = this.openDatabase();
44+
try {
45+
return database.getTable(subTarget);
46+
} catch (Exception error) {
47+
throw new DataImporterError("Fehler beim Öffnen der Tabelle ", "Tabelle mit dem Namen " +
48+
subTarget + " konnte nicht gefunden oder nicht korrekt gelesen werden:\n" + error.getMessage());
49+
}
50+
}
51+
52+
@Override
53+
public void write(String target, String subTarget, List<Field> data) throws DataImporterError {
54+
55+
Table table = this.openTable();
56+
57+
List<String> accessColumnNames = table.getColumns().stream().map(Column::getName).collect(Collectors.toList());
58+
List<String> dataColumnNames = data.stream().map(f -> f.name).collect(Collectors.toList());
59+
60+
if(!accessColumnNames.equals(dataColumnNames)) {
61+
throw new DataImporterError("Namensfehler", "Spaltennamen der Datenbank-Tabelle " +
62+
"stimmen nicht mit den in der Konfiguration spezifierten Feldnamen überein.");
63+
}
64+
65+
Map<String, Object> map = new HashMap<>();
66+
67+
// make sure there are no empty numerical values
68+
data.forEach(f -> {
69+
if(table.getColumn(f.name).getType() == DataType.LONG && f.value.isEmpty().get()) {
70+
map.put(f.name, 0);
71+
} else {
72+
map.put(f.name, f.value.getValue());
73+
}
74+
});
75+
76+
try { table.addRowFromMap(map); }
77+
catch (Exception error) {
78+
throw new DataImporterError("Schreibfehler", error.getMessage());
79+
}
80+
}
81+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.damgem.DataImporter.Connector;
2+
3+
import com.damgem.DataImporter.DataImporterError;
4+
import com.damgem.DataImporter.Field.Field;
5+
6+
import java.util.List;
7+
8+
public interface DataConnector {
9+
void write(String target, String subTarget, List<Field> data) throws DataImporterError;
10+
}
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package com.damgem.DataImporter.Connector;
2+
3+
import com.damgem.DataImporter.DataImporterError;
4+
import com.damgem.DataImporter.Field.Field;
5+
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
6+
import org.apache.poi.ss.usermodel.*;
7+
8+
import java.io.*;
9+
import java.nio.file.Paths;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
import java.util.stream.Collectors;
13+
14+
public class ExcelConnector implements DataConnector {
15+
16+
private String target, subTarget;
17+
18+
private String cellToString(Cell cell) {
19+
return switch (cell.getCellType()) {
20+
case _NONE, BLANK -> "";
21+
case NUMERIC -> String.valueOf(cell.getNumericCellValue());
22+
case STRING -> cell.getStringCellValue();
23+
case FORMULA -> "<formula>";
24+
case BOOLEAN -> cell.getBooleanCellValue() ? "<ja>" : "<nein>";
25+
case ERROR -> "<error>";
26+
};
27+
}
28+
29+
private List<String> rowToList(Row row) {
30+
if(row == null) return new ArrayList<>();
31+
List<String> cellStrings = new ArrayList<>(row.getLastCellNum());
32+
for (Cell cell : row) {
33+
cellStrings.add(this.cellToString(cell));
34+
}
35+
return cellStrings;
36+
}
37+
38+
private void addRowToSheet(Sheet sheet, List<String> data) {
39+
Row row = sheet.createRow(sheet.getLastRowNum() + 1);
40+
for (int ci = 0; ci < data.size(); ci++) {
41+
row.createCell(ci, CellType.STRING).setCellValue(data.get(ci));
42+
}
43+
}
44+
45+
private Workbook openWorkbook() throws DataImporterError {
46+
try {
47+
// new XSSFWorkbook(new FileInputStream(this.target));
48+
return new HSSFWorkbook(new FileInputStream(this.target));
49+
} catch(FileNotFoundException ignored) {
50+
// new XSSFWorkbook();
51+
return new HSSFWorkbook();
52+
} catch (Exception error) {
53+
throw new DataImporterError("Target Fehler", "Kann die Datei \"" + target +
54+
"\" weder korrekt lesen noch erstellen.\n\n" + error.getMessage());
55+
}
56+
}
57+
58+
private Sheet openSheet(Workbook workbook) throws DataImporterError {
59+
if(this.subTarget != null && !this.subTarget.isEmpty()) {
60+
Sheet sheet = workbook.getSheet(subTarget);
61+
return (sheet == null) ? workbook.createSheet(subTarget) : sheet;
62+
}
63+
else {
64+
if(workbook.getNumberOfSheets() == 0) workbook.createSheet();
65+
return workbook.getSheetAt(0);
66+
}
67+
}
68+
69+
public ExcelConnector(String target, String subTarget) throws DataImporterError {
70+
if(target == null) {
71+
throw new DataImporterError("Unvollständige Konfiguration", "target ist null.");
72+
}
73+
this.target = target;
74+
this.subTarget = subTarget;
75+
}
76+
77+
@Override
78+
public void write(String target, String subTarget, List<Field> data) throws DataImporterError {
79+
80+
Workbook workbook = this.openWorkbook();
81+
Sheet sheet = this.openSheet(workbook);
82+
83+
// compile field name list
84+
List<String> dataKeys = data.stream().map(kv -> kv.name).collect(Collectors.toList());
85+
86+
// read field names
87+
int rows = sheet.getLastRowNum();
88+
if(rows == -1) {
89+
this.addRowToSheet(sheet, dataKeys);
90+
} else if(!dataKeys.equals(rowToList(sheet.getRow(0)))) {
91+
throw new DataImporterError("Namensfehler", "Spaltennamen der Excel-Tabelle " +
92+
"stimmen nicht mit den in der Konfiguration spezifizierten Feldnamen überein.");
93+
}
94+
95+
// insert data
96+
List<String> dataFieldValues = data.stream().map(kv -> kv.value.getValue()).collect(Collectors.toList());
97+
this.addRowToSheet(sheet, dataFieldValues);
98+
99+
// write to file
100+
try (OutputStream fileOut = new FileOutputStream(target)) {
101+
workbook.write(fileOut);
102+
} catch (IOException ioe) {
103+
throw new DataImporterError("Schreibfehler", "Die Datei \"" +
104+
Paths.get(target).toAbsolutePath() + "\" konnte nicht zum Schreiben geöffnet werden.");
105+
}
106+
}
107+
}

src/main/java/com/damgem/dataImporter/ErrorController.java renamed to src/main/java/com/damgem/DataImporter/Controller/ErrorController.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.damgem.dataImporter;
1+
package com.damgem.DataImporter.Controller;
22

33
import javafx.event.ActionEvent;
44
import javafx.fxml.FXML;
@@ -7,8 +7,6 @@
77
import javafx.scene.text.Text;
88
import javafx.stage.Stage;
99

10-
import java.util.Objects;
11-
1210
public class ErrorController {
1311
@FXML
1412
public Label errorTitle;

0 commit comments

Comments
 (0)