You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by pv...@apache.org on 2018/11/02 08:46:57 UTC

nifi git commit: NIFI-5728 - XML Writer to populate record tag name properly

Repository: nifi
Updated Branches:
  refs/heads/master d8d220ccb -> 2812fe60a


NIFI-5728 - XML Writer to populate record tag name properly

Signed-off-by: Pierre Villard <pi...@gmail.com>

This closes #3098.


Project: http://git-wip-us.apache.org/repos/asf/nifi/repo
Commit: http://git-wip-us.apache.org/repos/asf/nifi/commit/2812fe60
Tree: http://git-wip-us.apache.org/repos/asf/nifi/tree/2812fe60
Diff: http://git-wip-us.apache.org/repos/asf/nifi/diff/2812fe60

Branch: refs/heads/master
Commit: 2812fe60a2ed486b1a6cb80916e764aa9af10f9b
Parents: d8d220c
Author: Ed B <eb...@HW14163.local>
Authored: Sat Oct 20 21:42:21 2018 -0400
Committer: Pierre Villard <pi...@gmail.com>
Committed: Fri Nov 2 09:46:45 2018 +0100

----------------------------------------------------------------------
 .../nifi/serialization/SimpleRecordSchema.java  | 28 +++++++++++
 .../nifi/serialization/record/RecordSchema.java | 11 +++++
 .../java/org/apache/nifi/avro/AvroTypeUtil.java |  2 +
 .../org/apache/nifi/xml/WriteXMLResult.java     |  2 +-
 .../apache/nifi/xml/TestXMLRecordSetWriter.java | 49 ++++++++++++++++++++
 5 files changed, 91 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/2812fe60/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/SimpleRecordSchema.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/SimpleRecordSchema.java b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/SimpleRecordSchema.java
index 6926c93..ba507e9 100644
--- a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/SimpleRecordSchema.java
+++ b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/SimpleRecordSchema.java
@@ -38,6 +38,8 @@ public class SimpleRecordSchema implements RecordSchema {
     private final AtomicReference<String> text = new AtomicReference<>();
     private final String schemaFormat;
     private final SchemaIdentifier schemaIdentifier;
+    private String schemaName;
+    private String schemaNamespace;
 
     public SimpleRecordSchema(final List<RecordField> fields) {
         this(fields, createText(fields), null, false, SchemaIdentifier.EMPTY);
@@ -213,4 +215,30 @@ public class SimpleRecordSchema implements RecordSchema {
     public SchemaIdentifier getIdentifier() {
         return schemaIdentifier;
     }
+
+    /**
+     * Set schema name.
+     * @param schemaName schema name as defined in a root record.
+     */
+    public void setSchemaName(String schemaName) {
+        this.schemaName = schemaName;
+    }
+
+    @Override
+    public Optional<String> getSchemaName() {
+        return Optional.ofNullable(schemaName);
+    }
+
+    /**
+     * Set schema namespace.
+     * @param schemaNamespace schema namespace as defined in a root record.
+     */
+    public void setSchemaNamespace(String schemaNamespace) {
+        this.schemaNamespace = schemaNamespace;
+    }
+
+    @Override
+    public Optional<String> getSchemaNamespace() {
+        return Optional.ofNullable(schemaNamespace);
+    }
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/2812fe60/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/RecordSchema.java
----------------------------------------------------------------------
diff --git a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/RecordSchema.java b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/RecordSchema.java
index 367f2b0..cdc9a32 100644
--- a/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/RecordSchema.java
+++ b/nifi-commons/nifi-record/src/main/java/org/apache/nifi/serialization/record/RecordSchema.java
@@ -76,4 +76,15 @@ public interface RecordSchema {
      * @return the SchemaIdentifier, which provides various attributes for identifying a schema
      */
     SchemaIdentifier getIdentifier();
+
+    /**
+     * @return the name of the schema's root record.
+     */
+    Optional<String> getSchemaName();
+
+    /**
+     * @return the namespace of the schema.
+     */
+    Optional<String> getSchemaNamespace();
+
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/2812fe60/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
index 2e8898a..9e023cc 100755
--- a/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
+++ b/nifi-nar-bundles/nifi-extension-utils/nifi-record-utils/nifi-avro-record-utils/src/main/java/org/apache/nifi/avro/AvroTypeUtil.java
@@ -396,6 +396,8 @@ public class AvroTypeUtil {
 
         final String schemaFullName = avroSchema.getNamespace() + "." + avroSchema.getName();
         final SimpleRecordSchema recordSchema = schemaText == null ? new SimpleRecordSchema(schemaId) : new SimpleRecordSchema(schemaText, AVRO_SCHEMA_FORMAT, schemaId);
+        recordSchema.setSchemaName(avroSchema.getName());
+        recordSchema.setSchemaNamespace(avroSchema.getNamespace());
         final DataType recordSchemaType = RecordFieldType.RECORD.getRecordDataType(recordSchema);
         final Map<String, DataType> knownRecords = new HashMap<>();
         knownRecords.put(schemaFullName, recordSchemaType);

http://git-wip-us.apache.org/repos/asf/nifi/blob/2812fe60/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/WriteXMLResult.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/WriteXMLResult.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/WriteXMLResult.java
index baa3a13..382067c 100755
--- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/WriteXMLResult.java
+++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/main/java/org/apache/nifi/xml/WriteXMLResult.java
@@ -91,7 +91,7 @@ public class WriteXMLResult extends AbstractRecordSetWriter implements RecordSet
         if (recordTagName != null) {
             this.recordTagName = recordTagName;
         } else {
-            Optional<String> recordTagNameOptional = recordSchema.getIdentifier().getName();
+            Optional<String> recordTagNameOptional = recordSchema.getSchemaName().isPresent()? recordSchema.getSchemaName() : recordSchema.getIdentifier().getName();
             if (recordTagNameOptional.isPresent()) {
                 this.recordTagName = recordTagNameOptional.get();
             } else {

http://git-wip-us.apache.org/repos/asf/nifi/blob/2812fe60/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestXMLRecordSetWriter.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestXMLRecordSetWriter.java b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestXMLRecordSetWriter.java
index 8008f65..becb3c5 100755
--- a/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestXMLRecordSetWriter.java
+++ b/nifi-nar-bundles/nifi-standard-services/nifi-record-serialization-services-bundle/nifi-record-serialization-services/src/test/java/org/apache/nifi/xml/TestXMLRecordSetWriter.java
@@ -17,9 +17,16 @@
 
 package org.apache.nifi.xml;
 
+import org.apache.avro.Schema;
+import org.apache.nifi.avro.AvroTypeUtil;
 import org.apache.nifi.components.AllowableValue;
+import org.apache.nifi.logging.ComponentLog;
 import org.apache.nifi.reporting.InitializationException;
 import org.apache.nifi.schema.access.SchemaAccessUtils;
+import org.apache.nifi.schema.access.SchemaNotFoundException;
+import org.apache.nifi.serialization.RecordSetWriter;
+import org.apache.nifi.serialization.record.RecordSchema;
+import org.apache.nifi.serialization.record.SchemaIdentifier;
 import org.apache.nifi.util.TestRunner;
 import org.apache.nifi.util.TestRunners;
 import org.junit.Assert;
@@ -29,6 +36,7 @@ import org.xmlunit.diff.ElementSelectors;
 import org.xmlunit.matchers.CompareMatcher;
 
 import java.io.IOException;
+import java.io.OutputStream;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 
@@ -117,6 +125,33 @@ public class TestXMLRecordSetWriter {
     }
 
     @Test
+    public void testSchemaRootRecordNaming() throws IOException, InitializationException {
+        String avroSchemaText = new String(Files.readAllBytes(Paths.get("src/test/resources/xml/testschema3")));;
+        Schema avroSchema = new Schema.Parser().parse(avroSchemaText);
+
+        SchemaIdentifier schemaId = SchemaIdentifier.builder().name("schemaName").build();
+        RecordSchema recordSchema = AvroTypeUtil.createSchema(avroSchema, avroSchemaText, schemaId);
+
+        XMLRecordSetWriter writer = new _XMLRecordSetWriter(recordSchema);
+        TestRunner runner = setup(writer);
+
+        runner.setProperty(writer, XMLRecordSetWriter.ROOT_TAG_NAME, "ROOT_NODE");
+
+        runner.enableControllerService(writer);
+        runner.enqueue("");
+        runner.run();
+        runner.assertQueueEmpty();
+        runner.assertAllFlowFilesTransferred(TestXMLRecordSetWriterProcessor.SUCCESS, 1);
+
+        String expected = "<ROOT_NODE><array_record><array_field>1</array_field><array_field></array_field><array_field>3</array_field>" +
+                "<name1>val1</name1><name2></name2></array_record>" +
+                "<array_record><array_field>1</array_field><array_field></array_field><array_field>3</array_field>" +
+                "<name1>val1</name1><name2></name2></array_record></ROOT_NODE>";
+        String actual = new String(runner.getContentAsByteArray(runner.getFlowFilesForRelationship(TestXMLRecordSetWriterProcessor.SUCCESS).get(0)));
+        assertThat(expected, CompareMatcher.isSimilarTo(actual).ignoreWhitespace().withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText)));
+   }
+
+    @Test
     public void testNullSuppression() throws IOException, InitializationException {
         XMLRecordSetWriter writer = new XMLRecordSetWriter();
         TestRunner runner = setup(writer);
@@ -194,5 +229,19 @@ public class TestXMLRecordSetWriter {
         }
     }
 
+    static class _XMLRecordSetWriter extends XMLRecordSetWriter{
+
+        RecordSchema recordSchema;
+
+        _XMLRecordSetWriter(RecordSchema recordSchema){
+            this.recordSchema = recordSchema;
+        }
+
+        @Override
+        public RecordSetWriter createWriter(ComponentLog logger, RecordSchema schema, OutputStream out)
+                throws SchemaNotFoundException, IOException {
+            return super.createWriter(logger, this.recordSchema, out);
+        }
+    }
 
 }