Skip to content

Commit f715cef

Browse files
pvillard31exceptionfactory
authored andcommitted
NIFI-14496 Support converting Object array of bytes to String for Records
This closes apache#9901 Signed-off-by: David Handermann <exceptionfactory@apache.org>
1 parent 8fcfa84 commit f715cef

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/field/ObjectStringFieldConverter.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,18 @@ public String convertField(final Object field, final Optional<String> pattern, f
9696
throw new FieldConversionException(String.class, field, name, e);
9797
}
9898
}
99+
case Object[] objectArray -> {
100+
if (objectArray.length > 0) {
101+
final byte[] converted = new byte[objectArray.length];
102+
for (int i = 0; i < objectArray.length; i++) {
103+
converted[i] = (byte) objectArray[i];
104+
}
105+
return new String(converted, StandardCharsets.UTF_8);
106+
} else {
107+
// Handle an empty array as an empty string
108+
return "";
109+
}
110+
}
99111
default -> {
100112
}
101113
}

nifi-commons/nifi-record/src/test/java/org/apache/nifi/serialization/record/field/ObjectStringFieldConverterTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.apache.nifi.serialization.record.RecordFieldType;
2020
import org.junit.jupiter.api.Test;
2121

22+
import java.nio.charset.StandardCharsets;
2223
import java.sql.Timestamp;
2324
import java.time.LocalDateTime;
2425
import java.time.ZoneId;
@@ -45,6 +46,8 @@ class ObjectStringFieldConverterTest {
4546

4647
private static final String DATE_TIME_ZONE_OFFSET_PATTERN = "yyyy-MM-dd HH:mm:ssZZZZZ";
4748

49+
private static final String EMPTY_STRING = "";
50+
4851
@Test
4952
void testConvertFieldNull() {
5053
final String string = CONVERTER.convertField(null, Optional.of(DEFAULT_PATTERN), FIELD_NAME);
@@ -120,6 +123,28 @@ void testConvertFieldDateZoneOffsetPattern() {
120123
assertEquals(dateTimeZoneOffsetExpected, string);
121124
}
122125

126+
@Test
127+
void testConvertFieldObjectArray() {
128+
final String expected = String.class.getSimpleName();
129+
final byte[] bytes = expected.getBytes(StandardCharsets.UTF_8);
130+
131+
final Object[] objectArray = new Object[bytes.length];
132+
for (int i = 0; i < bytes.length; i++) {
133+
objectArray[i] = bytes[i];
134+
}
135+
136+
final String string = CONVERTER.convertField(objectArray, Optional.empty(), FIELD_NAME);
137+
assertEquals(expected, string);
138+
}
139+
140+
@Test
141+
void testConvertFieldObjectArrayEmpty() {
142+
final Object[] objectArray = new Object[0];
143+
144+
final String string = CONVERTER.convertField(objectArray, Optional.empty(), FIELD_NAME);
145+
assertEquals(EMPTY_STRING, string);
146+
}
147+
123148
private String getDateTimeZoneOffset() {
124149
final Timestamp inputTimestamp = Timestamp.valueOf(DATE_TIME_DEFAULT);
125150
final LocalDateTime inputLocalDateTime = inputTimestamp.toLocalDateTime();

0 commit comments

Comments
 (0)