use of org.marc4j.MarcJsonWriter in project mod-source-record-manager by folio-org.
the class MarcRecordParser method parseRecord.
@Override
public ParsedResult parseRecord(String rawRecord) {
ParsedResult result = new ParsedResult();
try {
MarcReader reader = new MarcStreamReader(new ByteArrayInputStream(rawRecord.getBytes(DEFAULT_CHARSET)), DEFAULT_CHARSET.name());
if (reader.hasNext()) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
MarcJsonWriter writer = new MarcJsonWriter(os);
Record record = reader.next();
List<MarcError> errorList = record.getErrors();
if (errorList == null || errorList.isEmpty()) {
writer.write(record);
result.setParsedRecord(new JsonObject(new String(os.toByteArray())));
} else {
List<JsonObject> preparedErrors = new ArrayList<>();
errorList.forEach(e -> preparedErrors.add(buildErrorObject(e)));
prepareResultWithError(result, preparedErrors);
}
return result;
} else {
result.setParsedRecord(new JsonObject());
}
} catch (Exception e) {
LOGGER.error("Error during parse MARC record from raw record", e);
prepareResultWithError(result, Collections.singletonList(new JsonObject().put("name", e.getClass().getName()).put("message", e.getMessage())));
}
return result;
}
use of org.marc4j.MarcJsonWriter in project mod-source-record-manager by folio-org.
the class XmlRecordParser method parseRecord.
@Override
public ParsedResult parseRecord(String rawRecord) {
ParsedResult result = new ParsedResult();
try {
MarcXmlReader reader = new MarcXmlReader(new ByteArrayInputStream(rawRecord.getBytes(StandardCharsets.UTF_8)));
if (reader.hasNext()) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
MarcJsonWriter writer = new MarcJsonWriter(os);
Record record = reader.next();
writer.write(record);
result.setParsedRecord(new JsonObject(new String(os.toByteArray())));
} else {
result.setParsedRecord(new JsonObject());
}
} catch (Exception e) {
LOGGER.error("Error during parse MARC record from MARC XML data", e);
result.setHasError(true);
result.setErrors(new JsonObject().put("name", e.getClass().getName()).put("message", e.getMessage()));
}
return result;
}
use of org.marc4j.MarcJsonWriter in project mod-source-record-manager 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(new String(baos.toByteArray())).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.MarcJsonWriter in project mod-source-record-manager 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(new String(os.toByteArray())).encode()));
result = true;
}
}
} catch (Exception e) {
LOGGER.error("Failed to add additional data field {} to record {}", tag, record.getId(), e);
}
return result;
}
use of org.marc4j.MarcJsonWriter in project mod-source-record-storage by folio-org.
the class MarcUtil method recordToMarcJson.
private static String recordToMarcJson(Record record) throws IOException {
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
final MarcJsonWriter writer = new MarcJsonWriter(out);
writer.write(record);
writer.close();
return out.toString();
}
}
Aggregations