You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by tu...@apache.org on 2022/05/09 20:38:55 UTC

[nifi] branch main updated: NIFI-9991 Fix: The asn1 StandardRecordModelIteratorProvider's interator returns only the first object read from the input stream.

This is an automated email from the ASF dual-hosted git repository.

turcsanyi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 8aaa3d2f10 NIFI-9991 Fix: The asn1 StandardRecordModelIteratorProvider's interator returns only the first object read from the input stream.
8aaa3d2f10 is described below

commit 8aaa3d2f10205425be94fc9f97c499eab9224b30
Author: Tamas Palfy <ta...@gmail.com>
AuthorDate: Thu May 5 17:45:26 2022 +0200

    NIFI-9991 Fix: The asn1 StandardRecordModelIteratorProvider's interator returns only the first object read from the input stream.
    
    This closes #6019.
    
    Signed-off-by: Peter Turcsanyi <tu...@apache.org>
---
 .../org/apache/nifi/jasn1/JASN1RecordReader.java   |  1 -
 .../jasn1/StandardRecordModelIteratorProvider.java | 59 ++++++++++++++++------
 2 files changed, 43 insertions(+), 17 deletions(-)

diff --git a/nifi-nar-bundles/nifi-asn1-bundle/nifi-asn1-services/src/main/java/org/apache/nifi/jasn1/JASN1RecordReader.java b/nifi-nar-bundles/nifi-asn1-bundle/nifi-asn1-services/src/main/java/org/apache/nifi/jasn1/JASN1RecordReader.java
index 0111b70abc..d189efcb64 100644
--- a/nifi-nar-bundles/nifi-asn1-bundle/nifi-asn1-services/src/main/java/org/apache/nifi/jasn1/JASN1RecordReader.java
+++ b/nifi-nar-bundles/nifi-asn1-bundle/nifi-asn1-services/src/main/java/org/apache/nifi/jasn1/JASN1RecordReader.java
@@ -144,7 +144,6 @@ public class JASN1RecordReader implements RecordReader {
             } else {
                 return null;
             }
-
         });
     }
 
diff --git a/nifi-nar-bundles/nifi-asn1-bundle/nifi-asn1-services/src/main/java/org/apache/nifi/jasn1/StandardRecordModelIteratorProvider.java b/nifi-nar-bundles/nifi-asn1-bundle/nifi-asn1-services/src/main/java/org/apache/nifi/jasn1/StandardRecordModelIteratorProvider.java
index ea73c89389..8e4c106f62 100644
--- a/nifi-nar-bundles/nifi-asn1-bundle/nifi-asn1-services/src/main/java/org/apache/nifi/jasn1/StandardRecordModelIteratorProvider.java
+++ b/nifi-nar-bundles/nifi-asn1-bundle/nifi-asn1-services/src/main/java/org/apache/nifi/jasn1/StandardRecordModelIteratorProvider.java
@@ -35,24 +35,32 @@ public class StandardRecordModelIteratorProvider implements RecordModelIteratorP
     @Override
     @SuppressWarnings("unchecked")
     public Iterator<BerType> iterator(InputStream inputStream, ComponentLog logger, Class<? extends BerType> rootClass, String recordField, Field seqOfField) {
-        final BerType model;
-        try {
-            model = rootClass.getDeclaredConstructor().newInstance();
-        } catch (ReflectiveOperationException e) {
-            throw new RuntimeException("Failed to instantiate " + rootClass.getCanonicalName(), e);
-        }
+        if (StringUtils.isEmpty(recordField)) {
+            return new Iterator<BerType>() {
+                @Override
+                public boolean hasNext() {
+                    boolean hasNext;
 
-        try {
-            final int decode = model.decode(inputStream);
-            logger.debug("Decoded {} bytes into {}", new Object[]{decode, model.getClass()});
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to decode " + rootClass.getCanonicalName(), e);
-        }
+                    try {
+                        hasNext = inputStream.available() > 0;
+                    } catch (IOException e) {
+                        hasNext = false;
+                    }
 
-        final List<BerType> recordModels;
-        if (StringUtils.isEmpty(recordField)) {
-            recordModels = Collections.singletonList(model);
+                    return hasNext;
+                }
+
+                @Override
+                public BerType next() {
+                    final BerType model = decode(inputStream, logger, rootClass);
+
+                    return model;
+                }
+            };
         } else {
+            final BerType model = decode(inputStream, logger, rootClass);
+
+            final List<BerType> recordModels;
             try {
                 final Method recordModelGetter = rootClass.getMethod(JASN1Utils.toGetterMethod(recordField));
                 final BerType readPointModel = (BerType) recordModelGetter.invoke(model);
@@ -65,8 +73,27 @@ public class StandardRecordModelIteratorProvider implements RecordModelIteratorP
             } catch (ReflectiveOperationException e) {
                 throw new RuntimeException("Failed to get record models due to " + e, e);
             }
+
+            return recordModels.iterator();
+        }
+    }
+
+    private BerType decode(InputStream inputStream, ComponentLog logger, Class<? extends BerType> rootClass) {
+        final BerType model;
+
+        try {
+            model = rootClass.getDeclaredConstructor().newInstance();
+        } catch (ReflectiveOperationException e) {
+            throw new RuntimeException("Failed to instantiate " + rootClass.getCanonicalName(), e);
+        }
+
+        try {
+            final int decode = model.decode(inputStream);
+            logger.debug("Decoded {} bytes into {}", new Object[]{decode, model.getClass()});
+        } catch (IOException e) {
+            throw new RuntimeException("Failed to decode " + rootClass.getCanonicalName(), e);
         }
 
-        return recordModels.iterator();
+        return model;
     }
 }