use of org.marc4j.MarcReader in project mod-source-record-storage by folio-org.
the class AdditionalFieldsUtil method getValueFromControlledField.
/**
* Read value from controlled field in marc record
*
* @param record marc record
* @param tag tag to read
* @return value from field
*/
public static String getValueFromControlledField(Record record, String tag) {
try {
MarcReader reader = buildMarcReader(record);
if (reader.hasNext()) {
org.marc4j.marc.Record marcRecord = reader.next();
Optional<ControlField> controlField = marcRecord.getControlFields().stream().filter(field -> field.getTag().equals(tag)).findFirst();
if (controlField.isPresent()) {
return controlField.get().getData();
}
}
} catch (Exception e) {
LOGGER.error("Failed to read controlled field {) from record {}", tag, record.getId(), e);
return null;
}
return null;
}
use of org.marc4j.MarcReader in project mod-source-record-storage by folio-org.
the class AdditionalFieldsUtil method addControlledFieldToMarcRecord.
public static boolean addControlledFieldToMarcRecord(Record record, String field, String value, boolean replace) {
boolean result = false;
try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
if (record != null && record.getParsedRecord() != null && record.getParsedRecord().getContent() != null) {
if (replace) {
removeField(record, field);
}
MarcReader reader = buildMarcReader(record);
MarcWriter streamWriter = new MarcStreamWriter(new ByteArrayOutputStream());
MarcJsonWriter jsonWriter = new MarcJsonWriter(os);
MarcFactory factory = MarcFactory.newInstance();
if (reader.hasNext()) {
org.marc4j.marc.Record marcRecord = reader.next();
ControlField dataField = factory.newControlField(field, value);
marcRecord.addVariableField(dataField);
// use stream writer to recalculate leader
streamWriter.write(marcRecord);
jsonWriter.write(marcRecord);
record.setParsedRecord(record.getParsedRecord().withContent(new JsonObject(os.toString()).encode()));
result = true;
}
}
} catch (Exception e) {
LOGGER.error("Failed to add additional controlled field {) to record {}", field, record.getId(), e);
}
return result;
}
use of org.marc4j.MarcReader in project mod-source-record-storage by folio-org.
the class AdditionalFieldsUtil method addFieldToMarcRecord.
/**
* Adds field if it does not exist and a subfield with a value to that field
*
* @param record record that needs to be updated
* @param field field that should contain new subfield
* @param subfield new subfield to add
* @param value value of the subfield to add
* @return true if succeeded, false otherwise
*/
public static boolean addFieldToMarcRecord(Record record, String field, char subfield, String value) {
boolean result = false;
try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
if (record != null && record.getParsedRecord() != null && record.getParsedRecord().getContent() != null) {
MarcReader reader = buildMarcReader(record);
MarcWriter streamWriter = new MarcStreamWriter(new ByteArrayOutputStream());
MarcJsonWriter jsonWriter = new MarcJsonWriter(os);
MarcFactory factory = MarcFactory.newInstance();
if (reader.hasNext()) {
org.marc4j.marc.Record marcRecord = reader.next();
VariableField variableField = getSingleFieldByIndicators(marcRecord.getVariableFields(field), INDICATOR, INDICATOR);
DataField dataField;
if (variableField != null && ((DataField) variableField).getIndicator1() == INDICATOR && ((DataField) variableField).getIndicator2() == INDICATOR) {
dataField = (DataField) variableField;
marcRecord.removeVariableField(variableField);
dataField.removeSubfield(dataField.getSubfield(subfield));
} else {
dataField = factory.newDataField(field, INDICATOR, INDICATOR);
}
dataField.addSubfield(factory.newSubfield(subfield, value));
marcRecord.addVariableField(dataField);
// use stream writer to recalculate leader
streamWriter.write(marcRecord);
jsonWriter.write(marcRecord);
record.setParsedRecord(record.getParsedRecord().withContent(new JsonObject(os.toString()).encode()));
result = true;
}
}
} catch (Exception e) {
LOGGER.error("Failed to add additional subfield {} for field {} to record {}", subfield, field, record.getId(), e);
}
return result;
}
use of org.marc4j.MarcReader in project mod-source-record-storage by folio-org.
the class AdditionalFieldsUtil method removeField.
/**
* remove field from marc record
*
* @param record record that needs to be updated
* @param field tag of the field
* @return true if succeeded, false otherwise
*/
public static boolean removeField(Record record, String field) {
boolean result = false;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
if (record != null && record.getParsedRecord() != null && record.getParsedRecord().getContent() != null) {
MarcReader reader = buildMarcReader(record);
MarcWriter marcStreamWriter = new MarcStreamWriter(new ByteArrayOutputStream());
MarcJsonWriter marcJsonWriter = new MarcJsonWriter(baos);
if (reader.hasNext()) {
org.marc4j.marc.Record marcRecord = reader.next();
VariableField variableField = marcRecord.getVariableField(field);
if (variableField != null) {
marcRecord.removeVariableField(variableField);
}
// use stream writer to recalculate leader
marcStreamWriter.write(marcRecord);
marcJsonWriter.write(marcRecord);
record.setParsedRecord(record.getParsedRecord().withContent(new JsonObject(baos.toString()).encode()));
result = true;
}
}
} catch (Exception e) {
LOGGER.error("Failed to remove controlled field {) from record {}", field, record.getId(), e);
}
return result;
}
use of org.marc4j.MarcReader in project mod-source-record-storage by folio-org.
the class AdditionalFieldsUtil method addDataFieldToMarcRecord.
/**
* Adds new data field to marc record
*
* @param record record that needs to be updated
* @param tag tag of data field
* @param value value of the field to add
* @return true if succeeded, false otherwise
*/
public static boolean addDataFieldToMarcRecord(Record record, String tag, char ind1, char ind2, char subfield, String value) {
boolean result = false;
try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
if (record != null && record.getParsedRecord() != null && record.getParsedRecord().getContent() != null) {
MarcReader reader = buildMarcReader(record);
MarcWriter streamWriter = new MarcStreamWriter(new ByteArrayOutputStream());
MarcJsonWriter jsonWriter = new MarcJsonWriter(os);
MarcFactory factory = MarcFactory.newInstance();
if (reader.hasNext()) {
org.marc4j.marc.Record marcRecord = reader.next();
DataField dataField = factory.newDataField(tag, ind1, ind2);
dataField.addSubfield(factory.newSubfield(subfield, value));
addDataFieldInNumericalOrder(dataField, marcRecord);
// use stream writer to recalculate leader
streamWriter.write(marcRecord);
jsonWriter.write(marcRecord);
record.setParsedRecord(record.getParsedRecord().withContent(new JsonObject(os.toString()).encode()));
result = true;
}
}
} catch (Exception e) {
LOGGER.error("Failed to add additional data field {) to record {}", e, tag, record.getId());
}
return result;
}
Aggregations