in nifi-extension-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/WriteXMLResult.java [253:437]
private boolean writeFieldForType(Deque<String> tagsToOpen, Object coercedValue, DataType dataType, String fieldName) throws XMLStreamException {
switch (dataType.getFieldType()) {
case BOOLEAN:
case BYTE:
case CHAR:
case DECIMAL:
case DOUBLE:
case FLOAT:
case INT:
case LONG:
case SHORT:
case UUID:
case STRING: {
writeAllTags(tagsToOpen, fieldName);
writer.writeCharacters(coercedValue.toString());
writer.writeEndElement();
return true;
}
case DATE: {
writeAllTags(tagsToOpen, fieldName);
final String stringValue = STRING_FIELD_CONVERTER.convertField(coercedValue, Optional.ofNullable(dateFormat), fieldName);
writer.writeCharacters(stringValue);
writer.writeEndElement();
return true;
}
case TIME: {
writeAllTags(tagsToOpen, fieldName);
final String stringValue = STRING_FIELD_CONVERTER.convertField(coercedValue, Optional.ofNullable(timeFormat), fieldName);
writer.writeCharacters(stringValue);
writer.writeEndElement();
return true;
}
case TIMESTAMP: {
writeAllTags(tagsToOpen, fieldName);
final String stringValue = STRING_FIELD_CONVERTER.convertField(coercedValue, Optional.ofNullable(timestampFormat), fieldName);
writer.writeCharacters(stringValue);
writer.writeEndElement();
return true;
}
case RECORD: {
final Record record = (Record) coercedValue;
final RecordDataType recordDataType = (RecordDataType) dataType;
final RecordSchema childSchema = recordDataType.getChildSchema();
tagsToOpen.addLast(fieldName);
boolean hasWritten = iterateThroughRecordUsingSchema(tagsToOpen, record, childSchema);
if (hasWritten) {
writer.writeEndElement();
return true;
} else {
if (nullSuppression.equals(NullSuppression.NEVER_SUPPRESS) || nullSuppression.equals(NullSuppression.SUPPRESS_MISSING)) {
writeAllTags(tagsToOpen);
writer.writeEndElement();
return true;
} else {
tagsToOpen.removeLast();
return false;
}
}
}
case ARRAY: {
final Object[] arrayValues;
if (coercedValue instanceof Object[]) {
arrayValues = (Object[]) coercedValue;
} else {
arrayValues = new Object[]{coercedValue.toString()};
}
final ArrayDataType arrayDataType = (ArrayDataType) dataType;
final DataType elementType = arrayDataType.getElementType();
final String elementName;
final String wrapperName;
if (arrayWrapping.equals(ArrayWrapping.USE_PROPERTY_FOR_ELEMENTS)) {
elementName = arrayTagName;
wrapperName = fieldName;
} else if (arrayWrapping.equals(ArrayWrapping.USE_PROPERTY_AS_WRAPPER)) {
elementName = fieldName;
wrapperName = arrayTagName;
} else {
elementName = fieldName;
wrapperName = null;
}
if (wrapperName != null) {
tagsToOpen.addLast(wrapperName);
}
boolean loopHasWritten = false;
for (Object element : arrayValues) {
final DataType chosenDataType = elementType.getFieldType() == RecordFieldType.CHOICE ? DataTypeUtils.chooseDataType(element, (ChoiceDataType) elementType) : elementType;
final Object coercedElement = DataTypeUtils.convertType(
element, chosenDataType, Optional.ofNullable(dateFormat), Optional.ofNullable(timeFormat), Optional.ofNullable(timestampFormat), fieldName
);
if (coercedElement != null) {
boolean hasWritten = writeFieldForType(tagsToOpen, coercedElement, elementType, elementName);
if (hasWritten) {
loopHasWritten = true;
}
} else {
if (nullSuppression.equals(NullSuppression.NEVER_SUPPRESS) || nullSuppression.equals(NullSuppression.SUPPRESS_MISSING)) {
writeAllTags(tagsToOpen, fieldName);
writer.writeEndElement();
loopHasWritten = true;
}
}
}
if (wrapperName != null) {
if (loopHasWritten) {
writer.writeEndElement();
return true;
} else {
if (nullSuppression.equals(NullSuppression.NEVER_SUPPRESS) || nullSuppression.equals(NullSuppression.SUPPRESS_MISSING)) {
writeAllTags(tagsToOpen);
writer.writeEndElement();
return true;
} else {
tagsToOpen.removeLast();
return false;
}
}
} else {
return loopHasWritten;
}
}
case MAP: {
final MapDataType mapDataType = (MapDataType) dataType;
final DataType valueDataType = mapDataType.getValueType();
final Map<String, ?> map = (Map<String, ?>) coercedValue;
tagsToOpen.addLast(fieldName);
boolean loopHasWritten = false;
for (Map.Entry<String, ?> entry : map.entrySet()) {
final String key = entry.getKey();
final DataType chosenDataType = valueDataType.getFieldType() == RecordFieldType.CHOICE ? DataTypeUtils.chooseDataType(entry.getValue(),
(ChoiceDataType) valueDataType) : valueDataType;
final Object coercedElement = DataTypeUtils.convertType(
entry.getValue(), chosenDataType, Optional.ofNullable(dateFormat), Optional.ofNullable(timeFormat), Optional.ofNullable(timestampFormat), fieldName
);
if (coercedElement != null) {
boolean hasWritten = writeFieldForType(tagsToOpen, entry.getValue(), valueDataType, key);
if (hasWritten) {
loopHasWritten = true;
}
} else {
if (nullSuppression.equals(NullSuppression.NEVER_SUPPRESS) || nullSuppression.equals(NullSuppression.SUPPRESS_MISSING)) {
writeAllTags(tagsToOpen, key);
writer.writeEndElement();
loopHasWritten = true;
}
}
}
if (loopHasWritten) {
writer.writeEndElement();
return true;
} else {
if (nullSuppression.equals(NullSuppression.NEVER_SUPPRESS) || nullSuppression.equals(NullSuppression.SUPPRESS_MISSING)) {
writeAllTags(tagsToOpen);
writer.writeEndElement();
return true;
} else {
tagsToOpen.removeLast();
return false;
}
}
}
case CHOICE:
default: {
return writeUnknownField(tagsToOpen, coercedValue, fieldName);
}
}
}