Repository: nifi
Updated Branches:
  refs/heads/develop b31c76bf3 -> 0a279ff53


NIFI-795:
- Ensuring consistency with response codes when creating new components between 
standalone and cluster mode.
- Fixing checkstyle issues.

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

Branch: refs/heads/develop
Commit: 0a279ff538a69709e97285ad4c9b8de01bd68627
Parents: b31c76b
Author: Matt Gilman <[email protected]>
Authored: Wed Aug 12 12:59:58 2015 -0400
Committer: Matt Gilman <[email protected]>
Committed: Wed Aug 12 12:59:58 2015 -0400

----------------------------------------------------------------------
 .../nifi/web/StandardNiFiServiceFacade.java     | 595 ++++++++++++++++---
 .../apache/nifi/web/api/ConnectionResource.java |  12 +-
 .../nifi/web/api/ControllerServiceResource.java |   6 +-
 .../org/apache/nifi/web/api/FunnelResource.java |   6 +-
 .../apache/nifi/web/api/InputPortResource.java  |   6 +-
 .../org/apache/nifi/web/api/LabelResource.java  |   6 +-
 .../apache/nifi/web/api/OutputPortResource.java |   6 +-
 .../nifi/web/api/ProcessGroupResource.java      |  31 +-
 .../apache/nifi/web/api/ProcessorResource.java  |   6 +-
 .../web/api/RemoteProcessGroupResource.java     |   6 +-
 .../nifi/web/api/ReportingTaskResource.java     |   6 +-
 .../apache/nifi/web/api/SnippetResource.java    |   6 +-
 .../apache/nifi/web/ConfigurationRequest.java   |   2 +-
 .../apache/nifi/web/ConfigurationResult.java    |  41 ++
 .../apache/nifi/web/ConfigurationSnapshot.java  |  37 +-
 .../web/StandardOptimisticLockingManager.java   |   4 +-
 16 files changed, 655 insertions(+), 121 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
index 4e50ff3..2286213 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/StandardNiFiServiceFacade.java
@@ -376,12 +376,22 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ConnectionDTO>() {
             @Override
-            public ConnectionDTO execute() {
+            public ConfigurationResult<ConnectionDTO> execute() {
                 final Connection connection = 
connectionDAO.updateConnection(groupId, connectionDTO);
 
                 controllerFacade.save();
 
-                return dtoFactory.createConnectionDto(connection);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ConnectionDTO getConfiguration() {
+                        return dtoFactory.createConnectionDto(connection);
+                    }
+                };
             }
         });
     }
@@ -395,14 +405,24 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ProcessorDTO>() {
             @Override
-            public ProcessorDTO execute() {
+            public ConfigurationResult<ProcessorDTO> execute() {
                 // update the processor
-                ProcessorNode processor = 
processorDAO.updateProcessor(groupId, processorDTO);
+                final ProcessorNode processor = 
processorDAO.updateProcessor(groupId, processorDTO);
 
                 // save the flow
                 controllerFacade.save();
 
-                return dtoFactory.createProcessorDto(processor);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ProcessorDTO getConfiguration() {
+                        return dtoFactory.createProcessorDto(processor);
+                    }
+                };
             }
         });
     }
@@ -416,14 +436,24 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<LabelDTO>() {
             @Override
-            public LabelDTO execute() {
+            public ConfigurationResult<LabelDTO> execute() {
                 // update the existing label
                 final Label label = labelDAO.updateLabel(groupId, labelDTO);
 
                 // save updated controller
                 controllerFacade.save();
 
-                return dtoFactory.createLabelDto(label);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public LabelDTO getConfiguration() {
+                        return dtoFactory.createLabelDto(label);
+                    }
+                };
             }
         });
     }
@@ -437,14 +467,24 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<FunnelDTO>() {
             @Override
-            public FunnelDTO execute() {
+            public ConfigurationResult<FunnelDTO> execute() {
                 // update the existing label
                 final Funnel funnel = funnelDAO.updateFunnel(groupId, 
funnelDTO);
 
                 // save updated controller
                 controllerFacade.save();
 
-                return dtoFactory.createFunnelDto(funnel);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public FunnelDTO getConfiguration() {
+                        return dtoFactory.createFunnelDto(funnel);
+                    }
+                };
             }
         });
     }
@@ -467,7 +507,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<SnippetDTO>() {
             @Override
-            public SnippetDTO execute() {
+            public ConfigurationResult<SnippetDTO> execute() {
                 // update the snippet
                 final Snippet snippet = snippetDAO.updateSnippet(snippetDto);
 
@@ -480,7 +520,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                     controllerFacade.save();
                 }
 
-                return responseSnippetDto;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public SnippetDTO getConfiguration() {
+                        return responseSnippetDto;
+                    }
+                };
             }
         });
     }
@@ -494,13 +544,23 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<PortDTO>() {
             @Override
-            public PortDTO execute() {
+            public ConfigurationResult<PortDTO> execute() {
                 final Port inputPort = inputPortDAO.updatePort(groupId, 
inputPortDTO);
 
                 // save updated controller
                 controllerFacade.save();
 
-                return dtoFactory.createPortDto(inputPort);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public PortDTO getConfiguration() {
+                        return dtoFactory.createPortDto(inputPort);
+                    }
+                };
             }
         });
     }
@@ -514,13 +574,23 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<PortDTO>() {
             @Override
-            public PortDTO execute() {
+            public ConfigurationResult<PortDTO> execute() {
                 final Port outputPort = outputPortDAO.updatePort(groupId, 
outputPortDTO);
 
                 // save updated controller
                 controllerFacade.save();
 
-                return dtoFactory.createPortDto(outputPort);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public PortDTO getConfiguration() {
+                        return dtoFactory.createPortDto(outputPort);
+                    }
+                };
             }
         });
     }
@@ -534,13 +604,23 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<RemoteProcessGroupDTO>() {
             @Override
-            public RemoteProcessGroupDTO execute() {
-                RemoteProcessGroup remoteProcessGroup = 
remoteProcessGroupDAO.updateRemoteProcessGroup(groupId, remoteProcessGroupDTO);
+            public ConfigurationResult<RemoteProcessGroupDTO> execute() {
+                final RemoteProcessGroup remoteProcessGroup = 
remoteProcessGroupDAO.updateRemoteProcessGroup(groupId, remoteProcessGroupDTO);
 
                 // save updated controller
                 controllerFacade.save();
 
-                return 
dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public RemoteProcessGroupDTO getConfiguration() {
+                        return 
dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup);
+                    }
+                };
             }
         });
     }
@@ -550,14 +630,24 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
             final Revision revision, final String groupId, final String 
remoteProcessGroupId, final RemoteProcessGroupPortDTO 
remoteProcessGroupPortDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<RemoteProcessGroupPortDTO>() {
             @Override
-            public RemoteProcessGroupPortDTO execute() {
+            public ConfigurationResult<RemoteProcessGroupPortDTO> execute() {
                 // update the remote port
-                RemoteGroupPort remoteGroupPort = 
remoteProcessGroupDAO.updateRemoteProcessGroupInputPort(groupId, 
remoteProcessGroupId, remoteProcessGroupPortDTO);
+                final RemoteGroupPort remoteGroupPort = 
remoteProcessGroupDAO.updateRemoteProcessGroupInputPort(groupId, 
remoteProcessGroupId, remoteProcessGroupPortDTO);
 
                 // save updated controller
                 controllerFacade.save();
 
-                return 
dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public RemoteProcessGroupPortDTO getConfiguration() {
+                        return 
dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort);
+                    }
+                };
             }
         });
     }
@@ -567,14 +657,24 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
             final Revision revision, final String groupId, final String 
remoteProcessGroupId, final RemoteProcessGroupPortDTO 
remoteProcessGroupPortDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<RemoteProcessGroupPortDTO>() {
             @Override
-            public RemoteProcessGroupPortDTO execute() {
+            public ConfigurationResult<RemoteProcessGroupPortDTO> execute() {
                 // update the remote port
-                RemoteGroupPort remoteGroupPort = 
remoteProcessGroupDAO.updateRemoteProcessGroupOutputPort(groupId, 
remoteProcessGroupId, remoteProcessGroupPortDTO);
+                final RemoteGroupPort remoteGroupPort = 
remoteProcessGroupDAO.updateRemoteProcessGroupOutputPort(groupId, 
remoteProcessGroupId, remoteProcessGroupPortDTO);
 
                 // save updated controller
                 controllerFacade.save();
 
-                return 
dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public RemoteProcessGroupPortDTO getConfiguration() {
+                        return 
dtoFactory.createRemoteProcessGroupPortDto(remoteGroupPort);
+                    }
+                };
             }
         });
     }
@@ -592,14 +692,24 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ProcessGroupDTO>() {
             @Override
-            public ProcessGroupDTO execute() {
+            public ConfigurationResult<ProcessGroupDTO> execute() {
                 // update the process group
-                ProcessGroup processGroup = 
processGroupDAO.updateProcessGroup(processGroupDTO);
+                final ProcessGroup processGroup = 
processGroupDAO.updateProcessGroup(processGroupDTO);
 
                 // save updated controller
                 controllerFacade.save();
 
-                return dtoFactory.createProcessGroupDto(processGroup);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ProcessGroupDTO getConfiguration() {
+                        return dtoFactory.createProcessGroupDto(processGroup);
+                    }
+                };
             }
         });
     }
@@ -608,7 +718,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<ControllerConfigurationDTO> 
updateControllerConfiguration(final Revision revision, final 
ControllerConfigurationDTO controllerConfigurationDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ControllerConfigurationDTO>() {
             @Override
-            public ControllerConfigurationDTO execute() {
+            public ConfigurationResult<ControllerConfigurationDTO> execute() {
                 // update the controller configuration through the proxy
                 if (controllerConfigurationDTO.getName() != null) {
                     
controllerFacade.setName(controllerConfigurationDTO.getName());
@@ -624,12 +734,22 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 }
 
                 // create the controller configuration dto
-                ControllerConfigurationDTO controllerConfig = 
getControllerConfiguration();
+                final ControllerConfigurationDTO controllerConfig = 
getControllerConfiguration();
 
                 // save the flow
                 controllerFacade.save();
 
-                return controllerConfig;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return controllerConfig;
+                    }
+                };
             }
         });
     }
@@ -667,13 +787,23 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> deleteConnection(final Revision 
revision, final String groupId, final String connectionId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 connectionDAO.deleteConnection(groupId, connectionId);
 
                 // save the flow
                 controllerFacade.save();
 
-                return null;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }
@@ -682,14 +812,24 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> deleteProcessor(final Revision 
revision, final String groupId, final String processorId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 // delete the processor and synchronize the connection state
                 processorDAO.deleteProcessor(groupId, processorId);
 
                 // save the flow
                 controllerFacade.save();
 
-                return null;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }
@@ -698,14 +838,24 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> deleteLabel(final Revision revision, 
final String groupId, final String labelId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 // delete the label
                 labelDAO.deleteLabel(groupId, labelId);
 
                 // save the flow
                 controllerFacade.save();
 
-                return null;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }
@@ -714,14 +864,24 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> deleteFunnel(final Revision revision, 
final String groupId, final String funnelId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 // delete the label
                 funnelDAO.deleteFunnel(groupId, funnelId);
 
                 // save the flow
                 controllerFacade.save();
 
-                return null;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }
@@ -735,7 +895,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> deleteSnippet(final Revision revision, 
final String snippetId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 // determine if this snippet was linked to the data flow
                 Snippet snippet = snippetDAO.getSnippet(snippetId);
                 boolean linked = snippet.isLinked();
@@ -748,7 +908,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                     controllerFacade.save();
                 }
 
-                return null;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }
@@ -757,13 +927,23 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> deleteInputPort(final Revision 
revision, final String groupId, final String inputPortId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 inputPortDAO.deletePort(groupId, inputPortId);
 
                 // save the flow
                 controllerFacade.save();
 
-                return null;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }
@@ -772,13 +952,23 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> deleteOutputPort(final Revision 
revision, final String groupId, final String outputPortId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 outputPortDAO.deletePort(groupId, outputPortId);
 
                 // save the flow
                 controllerFacade.save();
 
-                return null;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }
@@ -787,13 +977,23 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> deleteProcessGroup(final Revision 
revision, final String groupId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 processGroupDAO.deleteProcessGroup(groupId);
 
                 // save the flow
                 controllerFacade.save();
 
-                return null;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }
@@ -802,13 +1002,23 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> deleteRemoteProcessGroup(final Revision 
revision, final String groupId, final String remoteProcessGroupId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 remoteProcessGroupDAO.deleteRemoteProcessGroup(groupId, 
remoteProcessGroupId);
 
                 // save the flow
                 controllerFacade.save();
 
-                return null;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }
@@ -823,7 +1033,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<ConnectionDTO> createConnection(final 
Revision revision, final String groupId, final ConnectionDTO connectionDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ConnectionDTO>() {
             @Override
-            public ConnectionDTO execute() {
+            public ConfigurationResult<ConnectionDTO> execute() {
                 // ensure id is set
                 if (StringUtils.isBlank(connectionDTO.getId())) {
                     connectionDTO.setId(UUID.randomUUID().toString());
@@ -834,7 +1044,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 // save the flow
                 controllerFacade.save();
 
-                return dtoFactory.createConnectionDto(connection);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return true;
+                    }
+
+                    @Override
+                    public ConnectionDTO getConfiguration() {
+                        return dtoFactory.createConnectionDto(connection);
+                    }
+                };
             }
         });
     }
@@ -843,7 +1063,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<ProcessorDTO> createProcessor(final Revision 
revision, final String groupId, final ProcessorDTO processorDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ProcessorDTO>() {
             @Override
-            public ProcessorDTO execute() {
+            public ConfigurationResult<ProcessorDTO> execute() {
                 // ensure id is set
                 if (StringUtils.isBlank(processorDTO.getId())) {
                     processorDTO.setId(UUID.randomUUID().toString());
@@ -855,7 +1075,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 // save the flow
                 controllerFacade.save();
 
-                return dtoFactory.createProcessorDto(processor);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return true;
+                    }
+
+                    @Override
+                    public ProcessorDTO getConfiguration() {
+                        return dtoFactory.createProcessorDto(processor);
+                    }
+                };
             }
         });
     }
@@ -864,7 +1094,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<LabelDTO> createLabel(final Revision 
revision, final String groupId, final LabelDTO labelDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<LabelDTO>() {
             @Override
-            public LabelDTO execute() {
+            public ConfigurationResult<LabelDTO> execute() {
                 // ensure id is set
                 if (StringUtils.isBlank(labelDTO.getId())) {
                     labelDTO.setId(UUID.randomUUID().toString());
@@ -876,7 +1106,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 // save the flow
                 controllerFacade.save();
 
-                return dtoFactory.createLabelDto(label);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return true;
+                    }
+
+                    @Override
+                    public LabelDTO getConfiguration() {
+                        return dtoFactory.createLabelDto(label);
+                    }
+                };
             }
         });
     }
@@ -885,7 +1125,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<FunnelDTO> createFunnel(final Revision 
revision, final String groupId, final FunnelDTO funnelDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<FunnelDTO>() {
             @Override
-            public FunnelDTO execute() {
+            public ConfigurationResult<FunnelDTO> execute() {
                 // ensure id is set
                 if (StringUtils.isBlank(funnelDTO.getId())) {
                     funnelDTO.setId(UUID.randomUUID().toString());
@@ -897,7 +1137,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 // save the flow
                 controllerFacade.save();
 
-                return dtoFactory.createFunnelDto(funnel);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return true;
+                    }
+
+                    @Override
+                    public FunnelDTO getConfiguration() {
+                        return dtoFactory.createFunnelDto(funnel);
+                    }
+                };
             }
         });
     }
@@ -961,7 +1211,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<FlowSnippetDTO> copySnippet(final Revision 
revision, final String groupId, final String snippetId, final Double originX, 
final Double originY) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<FlowSnippetDTO>() {
             @Override
-            public FlowSnippetDTO execute() {
+            public ConfigurationResult<FlowSnippetDTO> execute() {
                 String id = snippetId;
 
                 // ensure id is set
@@ -970,7 +1220,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 }
 
                 // create the new snippet
-                FlowSnippetDTO flowSnippet = snippetDAO.copySnippet(groupId, 
id, originX, originY);
+                final FlowSnippetDTO flowSnippet = 
snippetDAO.copySnippet(groupId, id, originX, originY);
 
                 // validate the new snippet
                 validateSnippetContents(flowSnippet, groupId);
@@ -978,7 +1228,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 // save the flow
                 controllerFacade.save();
 
-                return flowSnippet;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public FlowSnippetDTO getConfiguration() {
+                        return flowSnippet;
+                    }
+                };
             }
         });
     }
@@ -987,7 +1247,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<SnippetDTO> createSnippet(final Revision 
revision, final SnippetDTO snippetDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<SnippetDTO>() {
             @Override
-            public SnippetDTO execute() {
+            public ConfigurationResult<SnippetDTO> execute() {
                 // ensure id is set
                 if (StringUtils.isBlank(snippetDTO.getId())) {
                     snippetDTO.setId(UUID.randomUUID().toString());
@@ -998,7 +1258,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 final SnippetDTO responseSnippetDTO = 
dtoFactory.createSnippetDto(snippet);
                 
responseSnippetDTO.setContents(snippetUtils.populateFlowSnippet(snippet, false, 
false));
 
-                return responseSnippetDTO;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return true;
+                    }
+
+                    @Override
+                    public SnippetDTO getConfiguration() {
+                        return responseSnippetDTO;
+                    }
+                };
             }
         });
     }
@@ -1007,7 +1277,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<PortDTO> createInputPort(final Revision 
revision, final String groupId, final PortDTO inputPortDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<PortDTO>() {
             @Override
-            public PortDTO execute() {
+            public ConfigurationResult<PortDTO> execute() {
                 // ensure id is set
                 if (StringUtils.isBlank(inputPortDTO.getId())) {
                     inputPortDTO.setId(UUID.randomUUID().toString());
@@ -1018,7 +1288,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 // save the flow
                 controllerFacade.save();
 
-                return dtoFactory.createPortDto(inputPort);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return true;
+                    }
+
+                    @Override
+                    public PortDTO getConfiguration() {
+                        return dtoFactory.createPortDto(inputPort);
+                    }
+                };
             }
         });
     }
@@ -1027,7 +1307,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<PortDTO> createOutputPort(final Revision 
revision, final String groupId, final PortDTO outputPortDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<PortDTO>() {
             @Override
-            public PortDTO execute() {
+            public ConfigurationResult<PortDTO> execute() {
                 // ensure id is set
                 if (StringUtils.isBlank(outputPortDTO.getId())) {
                     outputPortDTO.setId(UUID.randomUUID().toString());
@@ -1038,7 +1318,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 // save the flow
                 controllerFacade.save();
 
-                return dtoFactory.createPortDto(outputPort);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return true;
+                    }
+
+                    @Override
+                    public PortDTO getConfiguration() {
+                        return dtoFactory.createPortDto(outputPort);
+                    }
+                };
             }
         });
     }
@@ -1047,7 +1337,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<ProcessGroupDTO> createProcessGroup(final 
String parentGroupId, final Revision revision, final ProcessGroupDTO 
processGroupDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ProcessGroupDTO>() {
             @Override
-            public ProcessGroupDTO execute() {
+            public ConfigurationResult<ProcessGroupDTO> execute() {
                 // ensure id is set
                 if (StringUtils.isBlank(processGroupDTO.getId())) {
                     processGroupDTO.setId(UUID.randomUUID().toString());
@@ -1058,7 +1348,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 // save the flow
                 controllerFacade.save();
 
-                return dtoFactory.createProcessGroupDto(processGroup);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return true;
+                    }
+
+                    @Override
+                    public ProcessGroupDTO getConfiguration() {
+                        return dtoFactory.createProcessGroupDto(processGroup);
+                    }
+                };
             }
         });
     }
@@ -1067,7 +1367,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<RemoteProcessGroupDTO> 
createRemoteProcessGroup(final Revision revision, final String groupId, final 
RemoteProcessGroupDTO remoteProcessGroupDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<RemoteProcessGroupDTO>() {
             @Override
-            public RemoteProcessGroupDTO execute() {
+            public ConfigurationResult<RemoteProcessGroupDTO> execute() {
                 // ensure id is set
                 if (StringUtils.isBlank(remoteProcessGroupDTO.getId())) {
                     remoteProcessGroupDTO.setId(UUID.randomUUID().toString());
@@ -1078,7 +1378,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 // save the flow
                 controllerFacade.save();
 
-                return 
dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return true;
+                    }
+
+                    @Override
+                    public RemoteProcessGroupDTO getConfiguration() {
+                        return 
dtoFactory.createRemoteProcessGroupDto(remoteProcessGroup);
+                    }
+                };
             }
         });
     }
@@ -1129,10 +1439,10 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<FlowSnippetDTO> createTemplateInstance(final 
Revision revision, final String groupId, final Double originX, final Double 
originY, final String templateId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<FlowSnippetDTO>() {
             @Override
-            public FlowSnippetDTO execute() {
+            public ConfigurationResult<FlowSnippetDTO> execute() {
                 // instantiate the template - there is no need to make another 
copy of the flow snippet since the actual template
                 // was copied and this dto is only used to instantiate it's 
components (which as already completed)
-                FlowSnippetDTO flowSnippet = 
templateDAO.instantiateTemplate(groupId, originX, originY, templateId);
+                final FlowSnippetDTO flowSnippet = 
templateDAO.instantiateTemplate(groupId, originX, originY, templateId);
 
                 // validate the new snippet
                 validateSnippetContents(flowSnippet, groupId);
@@ -1140,7 +1450,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 // save the flow
                 controllerFacade.save();
 
-                return flowSnippet;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public FlowSnippetDTO getConfiguration() {
+                        return flowSnippet;
+                    }
+                };
             }
         });
     }
@@ -1149,10 +1469,21 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> createArchive(final Revision revision) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 // create the archive
                 controllerFacade.createArchive();
-                return null;
+
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }
@@ -1161,7 +1492,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<ProcessorDTO> 
setProcessorAnnotationData(final Revision revision, final String processorId, 
final String annotationData) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ProcessorDTO>() {
             @Override
-            public ProcessorDTO execute() {
+            public ConfigurationResult<ProcessorDTO> execute() {
                 // create the processor config
                 final ProcessorConfigDTO config = new ProcessorConfigDTO();
                 config.setAnnotationData(annotationData);
@@ -1180,12 +1511,22 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                 }
 
                 // update the processor configuration
-                ProcessorNode processor = 
processorDAO.updateProcessor(groupId, processorDTO);
+                final ProcessorNode processor = 
processorDAO.updateProcessor(groupId, processorDTO);
 
                 // save the flow
                 controllerFacade.save();
 
-                return dtoFactory.createProcessorDto(processor);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ProcessorDTO getConfiguration() {
+                        return dtoFactory.createProcessorDto(processor);
+                    }
+                };
             }
         });
     }
@@ -1194,7 +1535,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<ControllerServiceDTO> 
createControllerService(final Revision revision, final ControllerServiceDTO 
controllerServiceDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ControllerServiceDTO>() {
             @Override
-            public ControllerServiceDTO execute() {
+            public ConfigurationResult<ControllerServiceDTO> execute() {
                 // ensure id is set
                 if (StringUtils.isBlank(controllerServiceDTO.getId())) {
                     controllerServiceDTO.setId(UUID.randomUUID().toString());
@@ -1210,7 +1551,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                     controllerFacade.save();
                 }
 
-                return 
dtoFactory.createControllerServiceDto(controllerService);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return true;
+                    }
+
+                    @Override
+                    public ControllerServiceDTO getConfiguration() {
+                        return 
dtoFactory.createControllerServiceDto(controllerService);
+                    }
+                };
             }
         });
     }
@@ -1224,7 +1575,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ControllerServiceDTO>() {
             @Override
-            public ControllerServiceDTO execute() {
+            public ConfigurationResult<ControllerServiceDTO> execute() {
                 final ControllerServiceNode controllerService = 
controllerServiceDAO.updateControllerService(controllerServiceDTO);
 
                 // save the update
@@ -1234,7 +1585,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                     controllerFacade.save();
                 }
 
-                return 
dtoFactory.createControllerServiceDto(controllerService);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerServiceDTO getConfiguration() {
+                        return 
dtoFactory.createControllerServiceDto(controllerService);
+                    }
+                };
             }
         });
     }
@@ -1245,11 +1606,23 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
             final String controllerServiceId,
             final org.apache.nifi.controller.ScheduledState scheduledState,
             final org.apache.nifi.controller.service.ControllerServiceState 
controllerServiceState) {
+
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Set<ControllerServiceReferencingComponentDTO>>() {
             @Override
-            public Set<ControllerServiceReferencingComponentDTO> execute() {
+            public 
ConfigurationResult<Set<ControllerServiceReferencingComponentDTO>> execute() {
                 final ControllerServiceReference reference = 
controllerServiceDAO.updateControllerServiceReferencingComponents(controllerServiceId,
 scheduledState, controllerServiceState);
-                return 
dtoFactory.createControllerServiceReferencingComponentsDto(reference);
+
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public Set<ControllerServiceReferencingComponentDTO> 
getConfiguration() {
+                        return 
dtoFactory.createControllerServiceReferencingComponentsDto(reference);
+                    }
+                };
             }
         });
     }
@@ -1258,7 +1631,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> deleteControllerService(final Revision 
revision, final String controllerServiceId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 // delete the label
                 
controllerServiceDAO.deleteControllerService(controllerServiceId);
 
@@ -1269,7 +1642,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                     controllerFacade.save();
                 }
 
-                return null;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }
@@ -1278,7 +1661,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<ReportingTaskDTO> createReportingTask(final 
Revision revision, final ReportingTaskDTO reportingTaskDTO) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ReportingTaskDTO>() {
             @Override
-            public ReportingTaskDTO execute() {
+            public ConfigurationResult<ReportingTaskDTO> execute() {
                 // ensure id is set
                 if (StringUtils.isBlank(reportingTaskDTO.getId())) {
                     reportingTaskDTO.setId(UUID.randomUUID().toString());
@@ -1294,7 +1677,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                     controllerFacade.save();
                 }
 
-                return dtoFactory.createReportingTaskDto(reportingTask);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return true;
+                    }
+
+                    @Override
+                    public ReportingTaskDTO getConfiguration() {
+                        return 
dtoFactory.createReportingTaskDto(reportingTask);
+                    }
+                };
             }
         });
     }
@@ -1308,7 +1701,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
 
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<ReportingTaskDTO>() {
             @Override
-            public ReportingTaskDTO execute() {
+            public ConfigurationResult<ReportingTaskDTO> execute() {
                 final ReportingTaskNode reportingTask = 
reportingTaskDAO.updateReportingTask(reportingTaskDTO);
 
                 // save the update
@@ -1318,7 +1711,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                     controllerFacade.save();
                 }
 
-                return dtoFactory.createReportingTaskDto(reportingTask);
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ReportingTaskDTO getConfiguration() {
+                        return 
dtoFactory.createReportingTaskDto(reportingTask);
+                    }
+                };
             }
         });
     }
@@ -1327,7 +1730,7 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
     public ConfigurationSnapshot<Void> deleteReportingTask(final Revision 
revision, final String reportingTaskId) {
         return optimisticLockingManager.configureFlow(revision, new 
ConfigurationRequest<Void>() {
             @Override
-            public Void execute() {
+            public ConfigurationResult<Void> execute() {
                 // delete the label
                 reportingTaskDAO.deleteReportingTask(reportingTaskId);
 
@@ -1338,7 +1741,17 @@ public class StandardNiFiServiceFacade implements 
NiFiServiceFacade {
                     controllerFacade.save();
                 }
 
-                return null;
+                return new ConfigurationResult() {
+                    @Override
+                    public boolean isNew() {
+                        return false;
+                    }
+
+                    @Override
+                    public ControllerConfigurationDTO getConfiguration() {
+                        return null;
+                    }
+                };
             }
         });
     }

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectionResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectionResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectionResource.java
index 93fde8f..64c14fa 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectionResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ConnectionResource.java
@@ -787,13 +787,21 @@ public class ConnectionResource extends 
ApplicationResource {
         updatedRevision.setClientId(revision.getClientId());
         updatedRevision.setVersion(controllerResponse.getVersion());
 
+        // marshall the target and add the source processor
+        final ConnectionDTO connectionDTO = 
controllerResponse.getConfiguration();
+        populateRemainingConnectionContent(connectionDTO);
+
         // create the response entity
         ConnectionEntity entity = new ConnectionEntity();
         entity.setRevision(updatedRevision);
-        
entity.setConnection(populateRemainingConnectionContent(controllerResponse.getConfiguration()));
+        entity.setConnection(connectionDTO);
 
         // generate the response
-        return clusterContext(generateOkResponse(entity)).build();
+        if (controllerResponse.isNew()) {
+            return 
clusterContext(generateCreatedResponse(URI.create(connectionDTO.getUri()), 
entity)).build();
+        } else {
+            return clusterContext(generateOkResponse(entity)).build();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java
index 2a68015..0f2cdce 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ControllerServiceResource.java
@@ -955,7 +955,11 @@ public class ControllerServiceResource extends 
ApplicationResource {
         entity.setRevision(updatedRevision);
         
entity.setControllerService(populateRemainingControllerServiceContent(availability,
 responseControllerServiceDTO));
 
-        return clusterContext(generateOkResponse(entity)).build();
+        if (controllerResponse.isNew()) {
+            return 
clusterContext(generateCreatedResponse(URI.create(responseControllerServiceDTO.getUri()),
 entity)).build();
+        } else {
+            return clusterContext(generateOkResponse(entity)).build();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FunnelResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FunnelResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FunnelResource.java
index d0ad806..0ab6c32 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FunnelResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/FunnelResource.java
@@ -514,7 +514,11 @@ public class FunnelResource extends ApplicationResource {
         entity.setRevision(updatedRevision);
         entity.setFunnel(responseFunnelDTO);
 
-        return clusterContext(generateOkResponse(entity)).build();
+        if (controllerResponse.isNew()) {
+            return 
clusterContext(generateCreatedResponse(URI.create(responseFunnelDTO.getUri()), 
entity)).build();
+        } else {
+            return clusterContext(generateOkResponse(entity)).build();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/InputPortResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/InputPortResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/InputPortResource.java
index b4c4607..d2be69d 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/InputPortResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/InputPortResource.java
@@ -541,7 +541,11 @@ public class InputPortResource extends ApplicationResource 
{
         entity.setRevision(updatedRevision);
         entity.setInputPort(responsePortDTO);
 
-        return clusterContext(generateOkResponse(entity)).build();
+        if (controllerResponse.isNew()) {
+            return 
clusterContext(generateCreatedResponse(URI.create(responsePortDTO.getUri()), 
entity)).build();
+        } else {
+            return clusterContext(generateOkResponse(entity)).build();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/LabelResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/LabelResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/LabelResource.java
index b6edb71..400c92a 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/LabelResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/LabelResource.java
@@ -558,7 +558,11 @@ public class LabelResource extends ApplicationResource {
         entity.setRevision(updatedRevision);
         entity.setLabel(responseLabelDTO);
 
-        return clusterContext(generateOkResponse(entity)).build();
+        if (controllerResponse.isNew()) {
+            return 
clusterContext(generateCreatedResponse(URI.create(responseLabelDTO.getUri()), 
entity)).build();
+        } else {
+            return clusterContext(generateOkResponse(entity)).build();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/OutputPortResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/OutputPortResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/OutputPortResource.java
index 127ac43..ccd08db 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/OutputPortResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/OutputPortResource.java
@@ -542,7 +542,11 @@ public class OutputPortResource extends 
ApplicationResource {
         entity.setRevision(updatedRevision);
         entity.setOutputPort(responsePortDTO);
 
-        return clusterContext(generateOkResponse(entity)).build();
+        if (controllerResponse.isNew()) {
+            return 
clusterContext(generateCreatedResponse(URI.create(responsePortDTO.getUri()), 
entity)).build();
+        } else {
+            return clusterContext(generateOkResponse(entity)).build();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
index 3e82bad..a67e74b 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessGroupResource.java
@@ -283,8 +283,8 @@ public class ProcessGroupResource extends 
ApplicationResource {
     @ApiOperation(
             value = "Gets a process group",
             notes = "Gets a process group and includes all components 
contained in this group. The verbose and recursive flags can be used to adjust "
-                    + "the default behavior. This endpoint is starting point 
for obtaining the current flow and consequently includes the current "
-                    + "flow revision.",
+            + "the default behavior. This endpoint is starting point for 
obtaining the current flow and consequently includes the current "
+            + "flow revision.",
             response = ProcessGroupEntity.class,
             authorizations = {
                 @Authorization(value = "Read Only", type = "ROLE_MONITOR"),
@@ -350,7 +350,10 @@ public class ProcessGroupResource extends 
ApplicationResource {
     }
 
     /**
-     * Copies the specified snippet within this ProcessGroup.
+     * Copies the specified snippet within this ProcessGroup. The snippet 
instance that is instantiated cannot be referenced at a later time, therefore 
there is no
+     * corresponding URI. Instead the request URI is returned.
+     *
+     * Alternatively, we could have performed a PUT request. However, PUT 
requests are supposed to be idempotent and this endpoint is certainly not.
      *
      * @param httpServletRequest request
      * @param version The revision is used to verify the client is working 
with the latest version of the flow.
@@ -457,11 +460,14 @@ public class ProcessGroupResource extends 
ApplicationResource {
         entity.setContents(populateRemainingSnippetContent(flowSnippet));
 
         // generate the response
-        return clusterContext(generateOkResponse(entity)).build();
+        return clusterContext(generateCreatedResponse(getAbsolutePath(), 
entity)).build();
     }
 
     /**
-     * Instantiates the specified template within this ProcessGroup.
+     * Instantiates the specified template within this ProcessGroup. The 
template instance that is instantiated cannot be referenced at a later time, 
therefore there is no
+     * corresponding URI. Instead the request URI is returned.
+     *
+     * Alternatively, we could have performed a PUT request. However, PUT 
requests are supposed to be idempotent and this endpoint is certainly not.
      *
      * @param httpServletRequest request
      * @param version The revision is used to verify the client is working 
with the latest version of the flow.
@@ -565,7 +571,7 @@ public class ProcessGroupResource extends 
ApplicationResource {
         entity.setContents(populateRemainingSnippetContent(flowSnippet));
 
         // generate the response
-        return clusterContext(generateOkResponse(entity)).build();
+        return clusterContext(generateCreatedResponse(getAbsolutePath(), 
entity)).build();
     }
 
     /**
@@ -644,7 +650,7 @@ public class ProcessGroupResource extends 
ApplicationResource {
             @Context HttpServletRequest httpServletRequest,
             @ApiParam(
                     value = "The process group to update. The only action that 
is supported at this endpoint is to set the running flag in order "
-                            + "to start or stop all descendent schedulable 
components. This defines the schema of the expected input.",
+                    + "to start or stop all descendent schedulable components. 
This defines the schema of the expected input.",
                     required = true
             )
             ProcessGroupEntity processGroupEntity) {
@@ -1152,8 +1158,11 @@ public class ProcessGroupResource extends 
ApplicationResource {
         entity.setRevision(updatedRevision);
         
entity.setProcessGroup(populateRemainingProcessGroupContent(processGroup, 
getProcessGroupReferenceUri(processGroup)));
 
-        // generate the response
-        return clusterContext(generateOkResponse(entity)).build();
+        if (response.isNew()) {
+            return 
clusterContext(generateCreatedResponse(URI.create(processGroup.getUri()), 
entity)).build();
+        } else {
+            return clusterContext(generateOkResponse(entity)).build();
+        }
     }
 
     /**
@@ -1253,13 +1262,13 @@ public class ProcessGroupResource extends 
ApplicationResource {
     @ApiOperation(
             value = "Gets the status for a process group",
             notes = "The status for a process group includes status for all 
descendent components. When invoked on the root group with "
-                    + "recursive set to true, it will return the current 
status of every component in the flow.",
+            + "recursive set to true, it will return the current status of 
every component in the flow.",
             response = ProcessGroupStatusEntity.class,
             authorizations = {
                 @Authorization(value = "Read Only", type = "ROLE_MONITOR"),
                 @Authorization(value = "Data Flow Manager", type = "ROLE_DFM"),
                 @Authorization(value = "Administrator", type = "ROLE_ADMIN"),
-                @Authorization(value = "NiFi", type="ROLE_NIFI")
+                @Authorization(value = "NiFi", type = "ROLE_NIFI")
             }
     )
     @ApiResponses(

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
index f972c07..84ad8d1 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ProcessorResource.java
@@ -812,7 +812,11 @@ public class ProcessorResource extends ApplicationResource 
{
         entity.setRevision(updatedRevision);
         entity.setProcessor(responseProcessorDTO);
 
-        return clusterContext(generateOkResponse(entity)).build();
+        if (controllerResponse.isNew()) {
+            return 
clusterContext(generateCreatedResponse(URI.create(responseProcessorDTO.getUri()),
 entity)).build();
+        } else {
+            return clusterContext(generateOkResponse(entity)).build();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/RemoteProcessGroupResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/RemoteProcessGroupResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/RemoteProcessGroupResource.java
index 2a12ceb..e466666 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/RemoteProcessGroupResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/RemoteProcessGroupResource.java
@@ -1049,7 +1049,11 @@ public class RemoteProcessGroupResource extends 
ApplicationResource {
         entity.setRevision(updatedRevision);
         entity.setRemoteProcessGroup(responseRemoteProcessGroup);
 
-        return clusterContext(generateOkResponse(entity)).build();
+        if (controllerResponse.isNew()) {
+            return 
clusterContext(generateCreatedResponse(URI.create(responseRemoteProcessGroup.getUri()),
 entity)).build();
+        } else {
+            return clusterContext(generateOkResponse(entity)).build();
+        }
     }
 
     // setters

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
index 4af8783..c783da6 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/ReportingTaskResource.java
@@ -739,7 +739,11 @@ public class ReportingTaskResource extends 
ApplicationResource {
         entity.setRevision(updatedRevision);
         
entity.setReportingTask(populateRemainingReportingTaskContent(availability, 
responseReportingTaskDTO));
 
-        return clusterContext(generateOkResponse(entity)).build();
+        if (controllerResponse.isNew()) {
+            return 
clusterContext(generateCreatedResponse(URI.create(responseReportingTaskDTO.getUri()),
 entity)).build();
+        } else {
+            return clusterContext(generateOkResponse(entity)).build();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/SnippetResource.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/SnippetResource.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/SnippetResource.java
index 4dfa9fe..a27c7a4 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/SnippetResource.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/SnippetResource.java
@@ -607,7 +607,11 @@ public class SnippetResource extends ApplicationResource {
         entity.setRevision(updatedRevision);
         entity.setSnippet(populateRemainingSnippetContent(snippet));
 
-        return clusterContext(generateOkResponse(entity)).build();
+        if (controllerResponse.isNew()) {
+            return 
clusterContext(generateCreatedResponse(URI.create(snippet.getUri()), 
entity)).build();
+        } else {
+            return clusterContext(generateOkResponse(entity)).build();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationRequest.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationRequest.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationRequest.java
index c2e940a..af50d49 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationRequest.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationRequest.java
@@ -31,5 +31,5 @@ public interface ConfigurationRequest<T> {
      *
      * @return The resulting configuration
      */
-    T execute();
+    ConfigurationResult<T> execute();
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationResult.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationResult.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationResult.java
new file mode 100644
index 0000000..46b0db0
--- /dev/null
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationResult.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.web;
+
+/**
+ * Represents a request to configure. The implementations execute method will
+ * perform the configuration action. It will return type T which will be
+ * encapsulated in a ConfigurationSnapshot.
+ *
+ * @param <T> type of request
+ */
+public interface ConfigurationResult<T> {
+
+    /**
+     * Returns whether the configuration represents a newly created resource.
+     *
+     * @return If the configuration represents a newly created resource
+     */
+    boolean isNew();
+
+    /**
+     * Returns the resulting configuration.
+     *
+     * @return The resulting configuration
+     */
+    T getConfiguration();
+}

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationSnapshot.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationSnapshot.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationSnapshot.java
index c706fd2..8e9194f 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationSnapshot.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/ConfigurationSnapshot.java
@@ -17,17 +17,18 @@
 package org.apache.nifi.web;
 
 /**
- * Response object that captures some configuration for a given revision.
+ * Response object that captures the context of a given configuration.
  *
  * @param <T> type of snapshot
  */
 public class ConfigurationSnapshot<T> {
 
-    private Long version;
-    private T configuration;
+    private final Long version;
+    private final T configuration;
+    private final boolean isNew;
 
     /**
-     * Creates a new ConfigurationSnapshot.
+     * Creates a new ConfigurationSnapshot with no configuration object.
      *
      * @param version The revision version
      */
@@ -36,14 +37,30 @@ public class ConfigurationSnapshot<T> {
     }
 
     /**
-     * Creates a new ConfigurationSnapshot.
+     * Creates a new ConfigurationSnapshot with the specified configuration
+     * object. The object is consider to have been existing prior to this
+     * request.
      *
      * @param version The revision version
      * @param configuration The configuration
      */
     public ConfigurationSnapshot(Long version, T configuration) {
+        this(version, configuration, false);
+    }
+
+    /**
+     * Creates a new ConfigurationSnapshot with the specified configuration
+     * object. The isNew parameter specifies whether the object was created as 
a
+     * result of this request.
+     *
+     * @param version       The revision version
+     * @param configuration The configuration
+     * @param isNew         Whether the resource was newly created
+     */
+    public ConfigurationSnapshot(Long version, T configuration, boolean isNew) 
{
         this.version = version;
         this.configuration = configuration;
+        this.isNew = isNew;
     }
 
     /**
@@ -64,4 +81,14 @@ public class ConfigurationSnapshot<T> {
         return configuration;
     }
 
+    /**
+     * Returns whether the configuration object was created as a result of this
+     * request.
+     *
+     * @return Whether the object was created as a result of this request
+     */
+    public boolean isNew() {
+        return isNew;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/nifi/blob/0a279ff5/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/StandardOptimisticLockingManager.java
----------------------------------------------------------------------
diff --git 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/StandardOptimisticLockingManager.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/StandardOptimisticLockingManager.java
index 7792f0e..16b55ee 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/StandardOptimisticLockingManager.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-optimistic-locking/src/main/java/org/apache/nifi/web/StandardOptimisticLockingManager.java
@@ -80,13 +80,13 @@ public class StandardOptimisticLockingManager implements 
OptimisticLockingManage
             checkRevision(revision);
 
             // execute the configuration request
-            final T result = configurationRequest.execute();
+            final ConfigurationResult<T> result = 
configurationRequest.execute();
 
             // update the revision
             final Revision newRevision = 
updateRevision(incrementRevision(revision.getClientId()));
 
             // build the result
-            return new ConfigurationSnapshot(newRevision.getVersion(), result);
+            return new ConfigurationSnapshot(newRevision.getVersion(), 
result.getConfiguration(), result.isNew());
         } finally {
             unlock();
         }

Reply via email to