Fix #59: Legacy-Format-Schutz für Instant-Parsing in ProcessingAttempt-Repository
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
+34
-2
@@ -7,8 +7,11 @@ import java.sql.ResultSet;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.sql.Statement;
|
import java.sql.Statement;
|
||||||
import java.sql.Types;
|
import java.sql.Types;
|
||||||
|
import java.time.DateTimeFormatter;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.ZoneId;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -308,8 +311,8 @@ public class SqliteProcessingAttemptRepositoryAdapter implements ProcessingAttem
|
|||||||
new DocumentFingerprint(rs.getString("fingerprint")),
|
new DocumentFingerprint(rs.getString("fingerprint")),
|
||||||
new RunId(rs.getString("run_id")),
|
new RunId(rs.getString("run_id")),
|
||||||
rs.getInt("attempt_number"),
|
rs.getInt("attempt_number"),
|
||||||
Instant.parse(rs.getString("started_at")),
|
stringToInstant(rs.getString("started_at")),
|
||||||
Instant.parse(rs.getString("ended_at")),
|
stringToInstant(rs.getString("ended_at")),
|
||||||
ProcessingStatus.valueOf(rs.getString("status")),
|
ProcessingStatus.valueOf(rs.getString("status")),
|
||||||
rs.getString("failure_class"),
|
rs.getString("failure_class"),
|
||||||
rs.getString("failure_message"),
|
rs.getString("failure_message"),
|
||||||
@@ -328,6 +331,35 @@ public class SqliteProcessingAttemptRepositoryAdapter implements ProcessingAttem
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Versucht, einen Instant aus einer String-Darstellung zu parsen.
|
||||||
|
* Unterstützt sowohl modernes ISO-8601-Format als auch Legacy-Format.
|
||||||
|
*
|
||||||
|
* @param stringValue die String-Darstellung des Datums, kann null sein
|
||||||
|
* @return das geparste Instant, oder null wenn stringValue null oder leer ist
|
||||||
|
*/
|
||||||
|
private Instant stringToInstant(String stringValue) {
|
||||||
|
if (stringValue == null || stringValue.isBlank()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Versuch mit ISO-8601 Format (moderner Standard)
|
||||||
|
try {
|
||||||
|
return Instant.parse(stringValue);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Fallback auf älteres Format "yyyy-MM-dd HH:mm:ss" (als UTC)
|
||||||
|
try {
|
||||||
|
LocalDateTime dateTime = LocalDateTime.parse(stringValue,
|
||||||
|
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||||
|
return dateTime.atZone(ZoneId.of("UTC")).toInstant();
|
||||||
|
} catch (Exception fallbackException) {
|
||||||
|
logger.warn("Fehler beim Parsen der Instant-String '{}' in beiden Formaten (ISO-8601 und Legacy-Format)",
|
||||||
|
stringValue, fallbackException);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
// JDBC nullable helpers
|
// JDBC nullable helpers
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user