You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by al...@apache.org on 2015/11/18 16:36:18 UTC

nifi git commit: NIFI-1181: Ensure that a FlowFile's uuid cannot be modified by processors

Repository: nifi
Updated Branches:
  refs/heads/master 2b9b5e008 -> 93be75330


NIFI-1181: Ensure that a FlowFile's uuid cannot be modified by processors

Signed-off-by: Aldrin Piri <al...@apache.org>


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

Branch: refs/heads/master
Commit: 93be753301559119205803182a49a550a5aa3486
Parents: 2b9b5e0
Author: Mark Payne <ma...@hotmail.com>
Authored: Wed Nov 18 09:04:22 2015 -0500
Committer: Aldrin Piri <al...@apache.org>
Committed: Wed Nov 18 10:35:37 2015 -0500

----------------------------------------------------------------------
 .../repository/StandardFlowFileRecord.java      | 13 +++++++
 .../repository/StandardProcessSession.java      | 26 ++++++-------
 .../repository/TestStandardProcessSession.java  | 40 ++++++++++++++++++++
 3 files changed, 66 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/93be7533/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardFlowFileRecord.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardFlowFileRecord.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardFlowFileRecord.java
index 5474c7a..d3d8d40 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardFlowFileRecord.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardFlowFileRecord.java
@@ -247,6 +247,10 @@ public final class StandardFlowFileRecord implements FlowFile, FlowFileRecord {
         public Builder removeAttributes(final String... keys) {
             if (keys != null) {
                 for (final String key : keys) {
+                    if (CoreAttributes.UUID.key().equals(key)) {
+                        continue;
+                    }
+
                     bAttributes.remove(key);
                 }
             }
@@ -256,6 +260,10 @@ public final class StandardFlowFileRecord implements FlowFile, FlowFileRecord {
         public Builder removeAttributes(final Set<String> keys) {
             if (keys != null) {
                 for (final String key : keys) {
+                    if (CoreAttributes.UUID.key().equals(key)) {
+                        continue;
+                    }
+
                     bAttributes.remove(key);
                 }
             }
@@ -267,6 +275,11 @@ public final class StandardFlowFileRecord implements FlowFile, FlowFileRecord {
                 final Iterator<String> iterator = bAttributes.keySet().iterator();
                 while (iterator.hasNext()) {
                     final String key = iterator.next();
+
+                    if (CoreAttributes.UUID.key().equals(key)) {
+                        continue;
+                    }
+
                     if (keyPattern.matcher(key).matches()) {
                         iterator.remove();
                     }

http://git-wip-us.apache.org/repos/asf/nifi/blob/93be7533/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardProcessSession.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardProcessSession.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardProcessSession.java
index 3709972..2ab90cd 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardProcessSession.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/repository/StandardProcessSession.java
@@ -1410,14 +1410,18 @@ public final class StandardProcessSession implements ProcessSession, ProvenanceE
         validateRecordState(flowFile);
         final StandardRepositoryRecord record = records.get(flowFile);
 
-        final String originalUuid = flowFile.getAttribute(CoreAttributes.UUID.key());
+        final Map<String, String> updatedAttributes;
+        if (attributes.containsKey(CoreAttributes.UUID.key())) {
+            updatedAttributes = new HashMap<>(attributes);
+            updatedAttributes.remove(CoreAttributes.UUID.key());
+        } else {
+            updatedAttributes = attributes;
+        }
 
-        final StandardFlowFileRecord.Builder ffBuilder = new StandardFlowFileRecord.Builder().fromFlowFile(record.getCurrent()).addAttributes(attributes);
-        // Ignore the uuid attribute, if passed in
-        ffBuilder.addAttribute(CoreAttributes.UUID.key(), originalUuid);
+        final StandardFlowFileRecord.Builder ffBuilder = new StandardFlowFileRecord.Builder().fromFlowFile(record.getCurrent()).addAttributes(updatedAttributes);
         final FlowFileRecord newFile = ffBuilder.build();
 
-        record.setWorking(newFile, attributes);
+        record.setWorking(newFile, updatedAttributes);
         return newFile;
     }
 
@@ -1443,19 +1447,15 @@ public final class StandardProcessSession implements ProcessSession, ProvenanceE
             return flowFile;
         }
 
-        final Set<String> keysToRemove;
-        if (keys.contains(CoreAttributes.UUID.key())) {
-            keysToRemove = new HashSet<>(keys);
-            keysToRemove.remove(CoreAttributes.UUID.key());
-        } else {
-            keysToRemove = keys;
-        }
-
         final StandardRepositoryRecord record = records.get(flowFile);
         final FlowFileRecord newFile = new StandardFlowFileRecord.Builder().fromFlowFile(record.getCurrent()).removeAttributes(keys).build();
 
         final Map<String, String> updatedAttrs = new HashMap<>();
         for (final String key : keys) {
+            if (CoreAttributes.UUID.key().equals(key)) {
+                continue;
+            }
+
             updatedAttrs.put(key, null);
         }
 

http://git-wip-us.apache.org/repos/asf/nifi/blob/93be7533/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestStandardProcessSession.java
----------------------------------------------------------------------
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestStandardProcessSession.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestStandardProcessSession.java
index 845257b..d549a00 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestStandardProcessSession.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/test/java/org/apache/nifi/controller/repository/TestStandardProcessSession.java
@@ -37,13 +37,16 @@ import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.regex.Pattern;
 
 import org.apache.nifi.connectable.Connectable;
 import org.apache.nifi.connectable.ConnectableType;
@@ -58,6 +61,7 @@ import org.apache.nifi.controller.repository.claim.StandardContentClaim;
 import org.apache.nifi.controller.repository.claim.StandardResourceClaim;
 import org.apache.nifi.controller.repository.claim.StandardResourceClaimManager;
 import org.apache.nifi.flowfile.FlowFile;
+import org.apache.nifi.flowfile.attributes.CoreAttributes;
 import org.apache.nifi.groups.ProcessGroup;
 import org.apache.nifi.processor.Relationship;
 import org.apache.nifi.processor.exception.FlowFileAccessException;
@@ -470,6 +474,42 @@ public class TestStandardProcessSession {
     }
 
     @Test
+    public void testUuidAttributeCannotBeUpdated() {
+        String originalUuid = "11111111-1111-1111-1111-111111111111";
+        final FlowFileRecord flowFileRecord1 = new StandardFlowFileRecord.Builder()
+            .id(1L)
+            .addAttribute("uuid", originalUuid)
+            .entryDate(System.currentTimeMillis())
+            .build();
+
+        flowFileQueue.put(flowFileRecord1);
+
+        FlowFile flowFile = session.get();
+        assertNotNull(flowFile);
+
+        final String uuid = CoreAttributes.UUID.key();
+        final String newUuid = "22222222-2222-2222-2222-222222222222";
+        flowFile = session.putAttribute(flowFile, uuid, newUuid);
+        assertEquals(originalUuid, flowFile.getAttribute(uuid));
+
+        final Map<String, String> uuidMap = new HashMap<>(1);
+        uuidMap.put(uuid, newUuid);
+
+        flowFile = session.putAllAttributes(flowFile, uuidMap);
+        assertEquals(originalUuid, flowFile.getAttribute(uuid));
+
+        flowFile = session.removeAllAttributes(flowFile, Pattern.compile("uuid"));
+        assertEquals(originalUuid, flowFile.getAttribute(uuid));
+
+        flowFile = session.removeAllAttributes(flowFile, Collections.singleton(uuid));
+        assertEquals(originalUuid, flowFile.getAttribute(uuid));
+
+        flowFile = session.removeAttribute(flowFile, uuid);
+        assertEquals(originalUuid, flowFile.getAttribute(uuid));
+
+    }
+
+    @Test
     public void testUpdateAttributesThenJoin() throws IOException {
         final FlowFileRecord flowFileRecord1 = new StandardFlowFileRecord.Builder()
             .id(1L)