pgyori commented on a change in pull request #5249:
URL: https://github.com/apache/nifi/pull/5249#discussion_r689668781



##########
File path: 
nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-standard-record-utils/src/main/java/org/apache/nifi/csv/CSVValidators.java
##########
@@ -25,15 +25,18 @@
 import java.util.Set;
 
 public class CSVValidators {
+    private static final Set<String> illegalChars = new HashSet<>();
 
-    public static class SingleCharacterValidator implements Validator {
-        private static final Set<String> illegalChars = new HashSet<>();
+    static {
+        illegalChars.add("\r");
+        illegalChars.add("\n");
+    }
 
-        static {
-            illegalChars.add("\r");
-            illegalChars.add("\n");
-        }
+    public static final Validator SINGLE_CHAR_VALIDATOR = 
createSingleCharValidator(false);
+
+    public static final Validator EMPTY_AND_SINGLE_CHAR_VALIDATOR = 
createSingleCharValidator(true);

Review comment:
       I recommend naming it EMPTY_OR_SINGLE_CHAR_VALIDATOR as it contains a 
logical OR in the implementation. When reading the code of CSVUtils, at 
`.addValidator(CSVValidators.EMPTY_AND_SINGLE_CHAR_VALIDATOR)` I got a little 
confused. My first impression was that the property is required to be empty and 
contain a single character at the same time.

##########
File path: 
nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/csv/TestCSVValidators.java
##########
@@ -33,48 +33,109 @@
     /*** SingleCharValidator **/
     @Test
     public void testSingleCharNullValue() {
-        CSVValidators.SingleCharacterValidator validator = new 
CSVValidators.SingleCharacterValidator();
+        Validator validator = CSVValidators.SINGLE_CHAR_VALIDATOR;
         ValidationContext mockContext = Mockito.mock(ValidationContext.class);
         ValidationResult result = validator.validate("EscapeChar", null, 
mockContext);
         assertEquals("Input is null for this property", 
result.getExplanation());
         assertFalse(result.isValid());
     }
 
+    @Test
+    public void testSingleCharEmptyValue() {
+        Validator validator = CSVValidators.SINGLE_CHAR_VALIDATOR;
+        ValidationContext mockContext = Mockito.mock(ValidationContext.class);
+        ValidationResult result = validator.validate("EscapeChar", "", 
mockContext);
+        assertEquals("Value must be exactly 1 character but was 0 in length", 
result.getExplanation());
+        assertFalse(result.isValid());
+    }
+
     @Test
     public void testSingleCharTab() {
-        CSVValidators.SingleCharacterValidator validator = new 
CSVValidators.SingleCharacterValidator();
+        Validator validator = CSVValidators.SINGLE_CHAR_VALIDATOR;
         ValidationContext mockContext = Mockito.mock(ValidationContext.class);
         ValidationResult result = validator.validate("EscapeChar", "\\t", 
mockContext);
         assertTrue(result.isValid());
     }
 
     @Test
     public void testSingleCharIllegalChar() {
-        CSVValidators.SingleCharacterValidator validator = new 
CSVValidators.SingleCharacterValidator();
+        Validator validator = CSVValidators.SINGLE_CHAR_VALIDATOR;
         ValidationContext mockContext = Mockito.mock(ValidationContext.class);
         ValidationResult result = validator.validate("EscapeChar", "\\r", 
mockContext);
         assertEquals("\\r is not a valid character for this property", 
result.getExplanation());
         assertFalse(result.isValid());
     }
 
+    @Test
+    public void testSingleCharExpressionLanguage() {
+        Validator validator = CSVValidators.SINGLE_CHAR_VALIDATOR;
+        ValidationContext mockContext = Mockito.mock(ValidationContext.class);
+        
Mockito.when(mockContext.isExpressionLanguageSupported(Mockito.any())).thenReturn(true);
+        
Mockito.when(mockContext.isExpressionLanguagePresent(Mockito.any())).thenReturn(true);
+        ValidationResult result = validator.validate("EscapeChar", 
"${csv.escape}", mockContext);
+        assertTrue(result.isValid());
+    }
+
     @Test
     public void testSingleCharGoodChar() {
-        CSVValidators.SingleCharacterValidator validator = new 
CSVValidators.SingleCharacterValidator();
+        Validator validator = CSVValidators.SINGLE_CHAR_VALIDATOR;
         ValidationContext mockContext = Mockito.mock(ValidationContext.class);
         ValidationResult result = validator.validate("EscapeChar", "'", 
mockContext);
         assertTrue(result.isValid());
     }
 
+    /*** Empty And SingleCharValidator **/

Review comment:
       Being consistent with my other comment, I would replace "And" with "Or".




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


Reply via email to