From 36db40c3cfab2d0c9b2abb0ec4243758e2873909 Mon Sep 17 00:00:00 2001 From: aliaksandr_fedasiuk Date: Wed, 30 Sep 2026 01:42:21 +0500 Subject: [PATCH] DIUTILS-9: Fix IndexOutOfBoundsException on MARC 005 field replace in addOrReplaceControlField --- NEWS.md | 2 +- .../dataimport/util/marc/MarcFieldEditor.java | 14 ++++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/NEWS.md b/NEWS.md index 7f52f2d..f25c289 100644 --- a/NEWS.md +++ b/NEWS.md @@ -14,7 +14,7 @@ * Implement common logic for marc record manipulation ([DIUTILS-8](https://folio-org.atlassian.net/browse/DIUTILS-8)) ### Bug fixes -* Description ([ISSUE](https://folio-org.atlassian.net/browse/ISSUE)) +* Fix IndexOutOfBoundsException on MARC 005 field replace in addOrReplaceControlField[DIUTILS-9](https://folio-org.atlassian.net/browse/DIUTILS-9) ### Tech Dept * Restructured the repository into a multi-module Maven project: the root is now an aggregator/parent POM (`data-import-utils-parent`) and the production code moved to the new `data-import-support` module diff --git a/data-import-support/src/main/java/org/folio/dataimport/util/marc/MarcFieldEditor.java b/data-import-support/src/main/java/org/folio/dataimport/util/marc/MarcFieldEditor.java index c636cbf..881dbd3 100644 --- a/data-import-support/src/main/java/org/folio/dataimport/util/marc/MarcFieldEditor.java +++ b/data-import-support/src/main/java/org/folio/dataimport/util/marc/MarcFieldEditor.java @@ -31,17 +31,15 @@ private MarcFieldEditor() { * @param replace if true, replaces an existing field with the same tag; if false, appends a new field */ public static void addOrReplaceControlField(Record marcRecord, String tag, String value, boolean replace) { + var newControlField = MarcFactory.newInstance().newControlField(tag, value); if (replace) { - var currentField = (ControlField) marcRecord.getVariableField(tag); - var newControlField = MarcFactory.newInstance().newControlField(tag, value); - if (currentField != null) { - marcRecord.getControlFields().set(marcRecord.getControlFields().indexOf(currentField), newControlField); - } else { - marcRecord.addVariableField(newControlField); + ControlField existing = (ControlField) marcRecord.getVariableField(tag); + if (existing != null) { + marcRecord.removeVariableField(existing); } + marcRecord.addVariableField(newControlField); } else { - ControlField controlField = MarcFactory.newInstance().newControlField(tag, value); - marcRecord.addVariableField(controlField); + marcRecord.addVariableField(newControlField); } }