You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by mc...@apache.org on 2015/02/20 21:08:53 UTC

incubator-nifi git commit: NIFI-250: - Continuing to setup Reporting Task management in the UI.

Repository: incubator-nifi
Updated Branches:
  refs/heads/NIFI-250 c1077baf9 -> 2d4aebf33


NIFI-250:
- Continuing to setup Reporting Task management in the UI.

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

Branch: refs/heads/NIFI-250
Commit: 2d4aebf33b50b7603f2c19ba63d368bf125ce498
Parents: c1077ba
Author: Matt Gilman <ma...@gmail.com>
Authored: Fri Feb 20 15:08:39 2015 -0500
Committer: Matt Gilman <ma...@gmail.com>
Committed: Fri Feb 20 15:08:39 2015 -0500

----------------------------------------------------------------------
 .../nifi/web/api/dto/ReportingTaskDTO.java      |  27 +-
 .../nifi/controller/FlowFromDOMFactory.java     |   2 +-
 .../controller/StandardFlowSynchronizer.java    |  14 +-
 .../apache/nifi/web/api/HistoryResource.java    |  31 ++
 .../org/apache/nifi/web/api/dto/DtoFactory.java |  60 ++-
 .../nifi-framework/nifi-web/nifi-web-ui/pom.xml |   2 +
 .../main/resources/filters/canvas.properties    |   1 +
 .../src/main/webapp/WEB-INF/pages/canvas.jsp    |   1 +
 .../canvas/controller-service-configuration.jsp |   2 +-
 .../canvas/reporting-task-configuration.jsp     |  63 +++
 .../nifi-web-ui/src/main/webapp/css/canvas.css  |   1 +
 .../src/main/webapp/css/controller-service.css  |   7 -
 .../src/main/webapp/css/reporting-task.css      |  80 ++++
 .../src/main/webapp/js/nf/canvas/nf-canvas.js   |   1 +
 .../webapp/js/nf/canvas/nf-reporting-task.js    | 426 +++++++++++++++++++
 .../src/main/webapp/js/nf/canvas/nf-settings.js |   4 +-
 16 files changed, 695 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ReportingTaskDTO.java
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ReportingTaskDTO.java b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ReportingTaskDTO.java
index a04e9bb..6a9c7fc 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ReportingTaskDTO.java
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-client-dto/src/main/java/org/apache/nifi/web/api/dto/ReportingTaskDTO.java
@@ -16,6 +16,7 @@
  */
 package org.apache.nifi.web.api.dto;
 
+import java.util.Collection;
 import java.util.Map;
 
 import javax.xml.bind.annotation.XmlType;
@@ -29,7 +30,7 @@ public class ReportingTaskDTO extends NiFiComponentDTO {
 	private String comment;
 	private String type;
 	private String schedulingPeriod;
-	private String scheduledState;
+	private String state;
 	private String schedulingStrategy;
 	private String availability;
 	
@@ -37,6 +38,8 @@ public class ReportingTaskDTO extends NiFiComponentDTO {
     private Map<String, PropertyDescriptorDTO> descriptors;
  
     private String annotationData;
+    
+    private Collection<String> validationErrors;
 
     /**
      * The user-defined name of the reporting task
@@ -92,12 +95,12 @@ public class ReportingTaskDTO extends NiFiComponentDTO {
 	 * The current scheduling state of the reporting task
 	 * @return
 	 */
-	public String getScheduledState() {
-		return scheduledState;
+	public String getState() {
+		return state;
 	}
 
-	public void setScheduledState(String scheduledState) {
-		this.scheduledState = scheduledState;
+	public void setState(String state) {
+		this.state = state;
 	}
 
 	/**
@@ -163,4 +166,18 @@ public class ReportingTaskDTO extends NiFiComponentDTO {
 		this.annotationData = annotationData;
 	}
 	
+    /**
+     * Gets the validation errors from this reporting task. These validation errors
+     * represent the problems with the reporting task that must be resolved before it
+     * can be scheduled to run.
+     *
+     * @return The validation errors
+     */
+    public Collection<String> getValidationErrors() {
+        return validationErrors;
+    }
+
+    public void setValidationErrors(Collection<String> validationErrors) {
+        this.validationErrors = validationErrors;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowFromDOMFactory.java
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowFromDOMFactory.java b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowFromDOMFactory.java
index 6e17208..dc10bf0 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowFromDOMFactory.java
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowFromDOMFactory.java
@@ -105,7 +105,7 @@ public class FlowFromDOMFactory {
     	dto.setComment(getString(element, "comment"));
     	dto.setType(getString(element, "class"));
     	dto.setSchedulingPeriod(getString(element, "schedulingPeriod"));
-    	dto.setScheduledState(getString(element, "scheduledState"));
+    	dto.setState(getString(element, "scheduledState"));
     	dto.setSchedulingStrategy(getString(element, "schedulingStrategy"));
     	
     	dto.setProperties(getProperties(element, encryptor));

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSynchronizer.java
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSynchronizer.java b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSynchronizer.java
index 633d58b..f1d169f 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSynchronizer.java
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/StandardFlowSynchronizer.java
@@ -417,7 +417,7 @@ public class StandardFlowSynchronizer implements FlowSynchronizer {
         }
         
         if ( autoResumeState ) {
-	        if ( ScheduledState.RUNNING.name().equals(dto.getScheduledState()) ) {
+	        if ( ScheduledState.RUNNING.name().equals(dto.getState()) ) {
 	        	try {
 	        		controller.startReportingTask(reportingTask);
 	        	} catch (final Exception e) {
@@ -428,7 +428,7 @@ public class StandardFlowSynchronizer implements FlowSynchronizer {
 	        		controller.getBulletinRepository().addBulletin(BulletinFactory.createBulletin(
 	        				"Reporting Tasks", Severity.ERROR.name(), "Failed to start " + reportingTask + " due to " + e));
 	        	}
-	        } else if ( ScheduledState.DISABLED.name().equals(dto.getScheduledState()) ) {
+	        } else if ( ScheduledState.DISABLED.name().equals(dto.getState()) ) {
 	        	try {
 	        		controller.disableReportingTask(reportingTask);
 	        	} catch (final Exception e) {
@@ -447,9 +447,9 @@ public class StandardFlowSynchronizer implements FlowSynchronizer {
     	final ReportingTaskDTO dto = FlowFromDOMFactory.getReportingTask(reportingTaskElement, encryptor);
     	final ReportingTaskNode taskNode = controller.getReportingTaskNode(dto.getId());
     	
-        if (!taskNode.getScheduledState().name().equals(dto.getScheduledState())) {
+        if (!taskNode.getScheduledState().name().equals(dto.getState())) {
             try {
-                switch (ScheduledState.valueOf(dto.getScheduledState())) {
+                switch (ScheduledState.valueOf(dto.getState())) {
                     case DISABLED:
                     	if ( taskNode.isRunning() ) {
                     		controller.stopReportingTask(taskNode);
@@ -471,16 +471,16 @@ public class StandardFlowSynchronizer implements FlowSynchronizer {
                         break;
                 }
             } catch (final IllegalStateException ise) {
-                logger.error("Failed to change Scheduled State of {} from {} to {} due to {}", taskNode, taskNode.getScheduledState().name(), dto.getScheduledState(), ise.toString());
+                logger.error("Failed to change Scheduled State of {} from {} to {} due to {}", taskNode, taskNode.getScheduledState().name(), dto.getState(), ise.toString());
                 logger.error("", ise);
 
                 // create bulletin for the Processor Node
                 controller.getBulletinRepository().addBulletin(BulletinFactory.createBulletin("Node Reconnection", Severity.ERROR.name(),
-                        "Failed to change Scheduled State of " + taskNode + " from " + taskNode.getScheduledState().name() + " to " + dto.getScheduledState() + " due to " + ise.toString()));
+                        "Failed to change Scheduled State of " + taskNode + " from " + taskNode.getScheduledState().name() + " to " + dto.getState() + " due to " + ise.toString()));
 
                 // create bulletin at Controller level.
                 controller.getBulletinRepository().addBulletin(BulletinFactory.createBulletin("Node Reconnection", Severity.ERROR.name(),
-                        "Failed to change Scheduled State of " + taskNode + " from " + taskNode.getScheduledState().name() + " to " + dto.getScheduledState() + " due to " + ise.toString()));
+                        "Failed to change Scheduled State of " + taskNode + " from " + taskNode.getScheduledState().name() + " to " + dto.getState() + " due to " + ise.toString()));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/HistoryResource.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/HistoryResource.java b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/HistoryResource.java
index 934f3a9..0f60f52 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/HistoryResource.java
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/HistoryResource.java
@@ -294,6 +294,37 @@ public class HistoryResource extends ApplicationResource {
         return generateOkResponse(entity).build();
     }
     
+    /**
+     * Gets the actions for the specified reporting task.
+     *
+     * @param clientId Optional client id. If the client id is not specified, a
+     * new one will be generated. This value (whether specified or generated) is
+     * included in the response.
+     * @param reportingTaskId The id of the reporting task.
+     * @return An componentHistoryEntity.
+     */
+    @GET
+    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+    @PreAuthorize("hasAnyRole('ROLE_MONITOR', 'ROLE_DFM', 'ROLE_ADMIN')")
+    @Path("/reporting-tasks/{reportingTaskId}")
+    @TypeHint(ComponentHistoryEntity.class)
+    public Response getReportingTaskHistory(
+            @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) ClientIdParameter clientId,
+            @PathParam("reportingTaskId") final String reportingTaskId) {
+
+        // create the revision
+        final RevisionDTO revision = new RevisionDTO();
+        revision.setClientId(clientId.getClientId());
+
+        // create the response entity
+        final ComponentHistoryEntity entity = new ComponentHistoryEntity();
+        entity.setRevision(revision);
+        entity.setComponentHistory(serviceFacade.getComponentHistory(reportingTaskId));
+
+        // generate the response
+        return generateOkResponse(entity).build();
+    }
+    
     /* setters */
     public void setServiceFacade(NiFiServiceFacade serviceFacade) {
         this.serviceFacade = serviceFacade;

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.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/dto/DtoFactory.java b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
index cb13247..d425a6c 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/api/dto/DtoFactory.java
@@ -840,14 +840,66 @@ public final class DtoFactory {
 
     public ReportingTaskDTO createReportingTaskDto(final ReportingTaskNode reportingTaskNode) {
         final ReportingTaskDTO dto = new ReportingTaskDTO();
+        dto.setId(reportingTaskNode.getIdentifier());
+        dto.setName(reportingTaskNode.getName());
+        dto.setType(reportingTaskNode.getReportingTask().getClass().getName());
+        dto.setState(reportingTaskNode.getScheduledState().name());
+//        dto.setComments(reportingTaskNode.getComments());
+        
+        // sort a copy of the properties
+        final Map<PropertyDescriptor, String> sortedProperties = new TreeMap<>(new Comparator<PropertyDescriptor>() {
+            @Override
+            public int compare(PropertyDescriptor o1, PropertyDescriptor o2) {
+                return Collator.getInstance(Locale.US).compare(o1.getName(), o2.getName());
+            }
+        });
+        sortedProperties.putAll(reportingTaskNode.getProperties());
+
+        // get the property order from the reporting task
+        final ReportingTask reportingTask = reportingTaskNode.getReportingTask();
+        final Map<PropertyDescriptor, String> orderedProperties = new LinkedHashMap<>();
+        final List<PropertyDescriptor> descriptors = reportingTask.getPropertyDescriptors();
+        if (descriptors != null && !descriptors.isEmpty()) {
+            for (PropertyDescriptor descriptor : descriptors) {
+                orderedProperties.put(descriptor, null);
+            }
+        }
+        orderedProperties.putAll(sortedProperties);
+        
+        // build the descriptor and property dtos
+        dto.setDescriptors(new LinkedHashMap<String, PropertyDescriptorDTO>());
+        dto.setProperties(new LinkedHashMap<String, String>());
+        for (final Map.Entry<PropertyDescriptor, String> entry : orderedProperties.entrySet()) {
+            final PropertyDescriptor descriptor = entry.getKey();
+
+            // store the property descriptor
+            dto.getDescriptors().put(descriptor.getName(), createPropertyDescriptorDto(descriptor));
+
+            // determine the property value - don't include sensitive properties
+            String propertyValue = entry.getValue();
+            if (propertyValue != null && descriptor.isSensitive()) {
+                propertyValue = "********";
+            }
+
+            // set the property value
+            dto.getProperties().put(descriptor.getName(), propertyValue);
+        }
+        
+        // add the validation errors
+        final Collection<ValidationResult> validationErrors = reportingTaskNode.getValidationErrors();
+        if (validationErrors != null && !validationErrors.isEmpty()) {
+            final List<String> errors = new ArrayList<>();
+            for (final ValidationResult validationResult : validationErrors) {
+                errors.add(validationResult.toString());
+            }
+
+            dto.setValidationErrors(errors);
+        }
+        
         return dto;
     }
     
     public ControllerServiceDTO createControllerServiceDto(final ControllerServiceNode controllerServiceNode) {
-        if (controllerServiceNode == null) {
-            return null;
-        }
-        
         final ControllerServiceDTO dto = new ControllerServiceDTO();
         dto.setId(controllerServiceNode.getIdentifier());
         dto.setName(controllerServiceNode.getName());

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/pom.xml
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/pom.xml b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/pom.xml
index 68f67a0..a1eb8a0 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/pom.xml
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/pom.xml
@@ -268,6 +268,7 @@
                                                 <include>${staging.dir}/js/nf/canvas/nf-custom-processor-ui.js</include>
                                                 <include>${staging.dir}/js/nf/canvas/nf-registration.js</include>
                                                 <include>${staging.dir}/js/nf/canvas/nf-controller-service.js</include>
+                                                <include>${staging.dir}/js/nf/canvas/nf-reporting-task.js</include>
                                                 <include>${staging.dir}/js/nf/canvas/nf-processor-configuration.js</include>
                                                 <include>${staging.dir}/js/nf/nf-processor-details.js</include>
                                                 <include>${staging.dir}/js/nf/canvas/nf-process-group-configuration.js</include>
@@ -403,6 +404,7 @@
                                             <insertNewLine>true</insertNewLine>
                                             <output>${project.build.directory}/${project.build.finalName}/css/nf-canvas-all.css</output>
                                             <includes>
+                                                <include>${staging.dir}/css/reporting-task.css</include>
                                                 <include>${staging.dir}/css/controller-service.css</include>
                                                 <include>${staging.dir}/css/processor-configuration.css</include>
                                                 <include>${staging.dir}/css/processor-details.css</include>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/resources/filters/canvas.properties
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/resources/filters/canvas.properties b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/resources/filters/canvas.properties
index 6d0d0ef..eae97e0 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/resources/filters/canvas.properties
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/resources/filters/canvas.properties
@@ -25,6 +25,7 @@ nf.canvas.script.tags=<script type="text/javascript" src="js/nf/nf-namespace.js?
 <script type="text/javascript" src="js/nf/canvas/nf-custom-processor-ui.js?${project.version}"></script>\n\
 <script type="text/javascript" src="js/nf/canvas/nf-registration.js?${project.version}"></script>\n\
 <script type="text/javascript" src="js/nf/canvas/nf-controller-service.js?${project.version}"></script>\n\
+<script type="text/javascript" src="js/nf/canvas/nf-reporting-task.js?${project.version}"></script>\n\
 <script type="text/javascript" src="js/nf/canvas/nf-processor-configuration.js?${project.version}"></script>\n\
 <script type="text/javascript" src="js/nf/nf-processor-details.js?${project.version}"></script>\n\
 <script type="text/javascript" src="js/nf/canvas/nf-process-group-configuration.js?${project.version}"></script>\n\

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
index 77f41bd..c81bb9d 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/pages/canvas.jsp
@@ -104,6 +104,7 @@
         <jsp:include page="/WEB-INF/partials/canvas/settings-content.jsp"/>
         <jsp:include page="/WEB-INF/partials/canvas/shell.jsp"/>
         <jsp:include page="/WEB-INF/partials/canvas/controller-service-configuration.jsp"/>
+        <jsp:include page="/WEB-INF/partials/canvas/reporting-task-configuration.jsp"/>
         <jsp:include page="/WEB-INF/partials/canvas/processor-configuration.jsp"/>
         <jsp:include page="/WEB-INF/partials/processor-details.jsp"/>
         <jsp:include page="/WEB-INF/partials/canvas/process-group-configuration.jsp"/>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/controller-service-configuration.jsp
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/controller-service-configuration.jsp b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/controller-service-configuration.jsp
index 4b4a75c..338a906 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/controller-service-configuration.jsp
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/controller-service-configuration.jsp
@@ -24,7 +24,7 @@
                     <div class="setting">
                         <div class="setting-name">Name</div>
                         <div class="setting-field">
-                            <input type="text" id="controller-service-name" name="controller-service-name"/>
+                            <input type="text" id="controller-service-name" name="controller-service-name" class="setting-input"/>
                             <div class="controller-service-enabled-container">
                                 <div id="controller-service-enabled" class="nf-checkbox checkbox-unchecked"></div>
                                 <span> Enabled</span>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/reporting-task-configuration.jsp
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/reporting-task-configuration.jsp b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/reporting-task-configuration.jsp
new file mode 100644
index 0000000..c1d816f
--- /dev/null
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/WEB-INF/partials/canvas/reporting-task-configuration.jsp
@@ -0,0 +1,63 @@
+<%--
+ 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.
+--%>
+<%@ page contentType="text/html" pageEncoding="UTF-8" session="false" %>
+<div id="reporting-task-configuration">
+    <div class="reporting-task-configuration-tab-container">
+        <div id="reporting-task-configuration-tabs"></div>
+        <div id="reporting-task-configuration-tabs-content">
+            <div id="reporting-task-standard-settings-tab-content" class="configuration-tab">
+                <div class="setting">
+                    <div class="setting-name">Name</div>
+                    <div class="setting-field">
+                        <input type="text" id="reporting-task-name" name="reporting-task-name"/>
+                        <div class="reporting-task-enabled-container">
+                            <div id="reporting-task-enabled" class="nf-checkbox checkbox-unchecked"></div>
+                            <span> Enabled</span>
+                        </div>
+                    </div>
+                </div>
+                <div class="setting">
+                    <div class="setting-name">Id</div>
+                    <div class="setting-field">
+                        <span id="reporting-task-id"></span>
+                    </div>
+                </div>
+                <div class="setting">
+                    <div class="setting-name">Type</div>
+                    <div class="setting-field">
+                        <span id="reporting-task-type"></span>
+                    </div>
+                </div>
+                <div id="availability-setting-container" class="setting hidden">
+                    <div class="availability-setting">
+                        <div class="setting-name">
+                            Availability
+                            <img class="setting-icon icon-info" src="images/iconInfo.png" alt="Info" title="Where this controller service is available."/>
+                        </div>
+                        <div class="setting-field">
+                            <div id="availability"></div>
+                        </div>
+                    </div>
+                    <div class="clear"></div>
+                </div>
+            </div>
+            <div id="reporting-task-properties-tab-content" class="configuration-tab">
+                <div id="reporting-task-properties"></div>
+            </div>
+        </div>
+    </div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/canvas.css
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/canvas.css b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/canvas.css
index 7d1852b..a8866ad 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/canvas.css
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/canvas.css
@@ -21,6 +21,7 @@
 @import url(process-group-details.css);
 @import url(remote-process-group-configuration.css);
 @import url(controller-service.css);
+@import url(reporting-task.css);
 @import url(port-configuration.css);
 @import url(port-details.css);
 @import url(label-configuration.css);

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/controller-service.css
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/controller-service.css b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/controller-service.css
index 54168f1..9ebfbfc 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/controller-service.css
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/controller-service.css
@@ -72,16 +72,9 @@ div.controller-service-configuration-tab-container {
 
 #controller-service-configuration .setting-input {
     font-size: 11px !important;
-    width: 320px;
-}
-
-#controller-service-configuration .small-setting-input {
-    font-size: 11px !important;
-    width: 130px;
 }
 
 #controller-service-name {
-    font-size: 11px !important;
     width: 250px;
     float: left;
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/reporting-task.css
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/reporting-task.css b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/reporting-task.css
new file mode 100644
index 0000000..952aebd
--- /dev/null
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/css/reporting-task.css
@@ -0,0 +1,80 @@
+/*
+ * 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.
+ */
+
+/*
+    Reporting task configuration styles.
+*/
+
+#reporting-task-configuration {
+    position: absolute;
+    overflow: hidden;
+    width: 800px;
+    height: 450px;
+    font-size: 10px;
+    z-index: 1301;
+    display: none;
+}
+
+div.reporting-task-configuration-tab-container {
+    margin-top: -10px;
+    padding: 5px 11px;
+}
+
+#reporting-task-configuration-advanced {
+    display: none;
+}
+
+#reporting-task-configuration-tabs {
+    background-color: transparent;
+    width: 778px;
+    height: 21px;
+    border-bottom: 3px solid #666;
+}
+
+#reporting-task-configuration div.configuration-tab {
+    height: 320px;
+    overflow: auto;
+    padding: 10px;
+    background: #eee url(../images/bgTabContainer.png) repeat-x;
+    display: none;
+}
+
+/* reporting-task settings */
+
+#reporting-task-name {
+    font-size: 11px !important;
+    width: 250px;
+    float: left;
+}
+
+#reporting-task-enabled {
+    width: 12px;
+    height: 12px;
+    float: left;
+    margin-right: 4px;
+}
+
+div.reporting-task-enabled-container {
+    float: left;
+    margin-top: 5px;
+    margin-left: 10px;
+}
+
+div.availability-setting {
+    float: left;
+    width: 140px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas.js
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas.js b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas.js
index 31fdf8b..febe6e4 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas.js
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-canvas.js
@@ -1033,6 +1033,7 @@ nf.Canvas = (function () {
                         // initialize components
                         nf.ConnectionConfiguration.init();
                         nf.ControllerService.init();
+                        nf.ReportingTask.init();
                         nf.ProcessorConfiguration.init();
                         nf.ProcessGroupConfiguration.init();
                         nf.RemoteProcessGroupConfiguration.init();

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-reporting-task.js
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-reporting-task.js b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-reporting-task.js
new file mode 100644
index 0000000..b50f7f8
--- /dev/null
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-reporting-task.js
@@ -0,0 +1,426 @@
+/*
+ * 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.
+ */
+nf.ReportingTask = (function () {
+
+    /**
+     * Handle any expected reporting task configuration errors.
+     * 
+     * @argument {object} xhr       The XmlHttpRequest
+     * @argument {string} status    The status of the request
+     * @argument {string} error     The error
+     */
+    var handleReportingTaskConfigurationError = function (xhr, status, error) {
+        if (xhr.status === 400) {
+            var errors = xhr.responseText.split('\n');
+
+            var content;
+            if (errors.length === 1) {
+                content = $('<span></span>').text(errors[0]);
+            } else {
+                content = nf.Common.formatUnorderedList(errors);
+            }
+
+            nf.Dialog.showOkDialog({
+                dialogContent: content,
+                overlayBackground: false,
+                headerText: 'Configuration Error'
+            });
+        } else {
+            nf.Common.handleAjaxError(xhr, status, error);
+        }
+    };
+
+    /**
+     * Determines whether the user has made any changes to the reporting task configuration
+     * that needs to be saved.
+     */
+    var isSaveRequired = function () {
+        var details = $('#reporting-task-configuration').data('reportingTaskDetails');
+
+        // determine if any reporting task settings have changed
+
+        if ($('#reporting-task-name').val() !== details.name) {
+            return true;
+        }
+        
+        if ($('#reporting-task-enabled').hasClass('checkbox-checked')) {
+            return true;
+        }
+        
+        // defer to the properties
+        return $('#reporting-task-properties').propertytable('isSaveRequired');
+    };
+
+    /**
+     * Marshals the data that will be used to update the reporting task's configuration.
+     */
+    var marshalDetails = function () {
+        // properties
+        var properties = $('#reporting-task-properties').propertytable('marshalProperties');
+
+        // create the reporting task dto
+        var reportingTaskDto = {};
+        reportingTaskDto['id'] = $('#reporting-task-id').text();
+        reportingTaskDto['name'] = $('#reporting-task-name').val();
+        
+        // set the properties
+        if ($.isEmptyObject(properties) === false) {
+            reportingTaskDto['properties'] = properties;
+        }
+        
+        // create the reporting task entity
+        var reportingTaskEntity = {};
+        reportingTaskEntity['revision'] = nf.Client.getRevision();
+        reportingTaskEntity['reportingTask'] = reportingTaskDto;
+
+        // return the marshaled details
+        return reportingTaskEntity;
+    };
+
+    /**
+     * Validates the specified details.
+     * 
+     * @argument {object} details       The details to validate
+     */
+    var validateDetails = function (details) {
+        return true;
+    };
+    
+    /**
+     * Reloads the specified reporting task.
+     * 
+     * @param {object} reportingTask
+     */
+    var reloadReportingTask = function (reportingTask) {
+        return $.ajax({
+            type: 'GET',
+            url: reportingTask.uri,
+            dataType: 'json'
+        }).done(function (response) {
+            renderReportingTask(response.reportingTask);
+        }).fail(nf.Common.handleAjaxError);
+    };
+    
+    /**
+     * Renders the specified reporting task.
+     * 
+     * @param {object} reportingTask
+     */
+    var renderReportingTask = function (reportingTask) {
+        // get the table and update the row accordingly
+        var reportingTaskGrid = $('#reporting-tasks-table').data('gridInstance');
+        var reportingTaskData = reportingTaskGrid.getData();
+        reportingTaskData.updateItem(reportingTask.id, reportingTask);
+    };
+    
+    /**
+     * 
+     * @param {object} reportingTask
+     * @param {boolean} running
+     */
+    var setRunning = function (reportingTask, running) {
+        var revision = nf.Client.getRevision();
+        return $.ajax({
+            type: 'PUT',
+            url: reportingTask.uri,
+            data: {
+                clientId: revision.clientId,
+                version: revision.version,
+                state: running === true ? 'RUNNING' : 'STOPPED'
+            },
+            dataType: 'json'
+        }).done(function (response) {
+            // update the revision
+            nf.Client.setRevision(response.revision);
+            
+            // update the task
+            renderReportingTask(response.reportingTask);
+        }).fail(nf.Common.handleAjaxError);
+    };
+    
+    return {
+        /**
+         * Initializes the reporting task configuration dialog.
+         */
+        init: function () {
+            // initialize the configuration dialog tabs
+            $('#reporting-task-configuration-tabs').tabbs({
+                tabStyle: 'tab',
+                selectedTabStyle: 'selected-tab',
+                tabs: [{
+                        name: 'Settings',
+                        tabContentId: 'reporting-task-standard-settings-tab-content'
+                    }, {
+                        name: 'Properties',
+                        tabContentId: 'reporting-task-properties-tab-content'
+                    }],
+                select: function () {
+                    // update the property table size in case this is the first time its rendered
+                    if ($(this).text() === 'Properties') {
+                        $('#reporting-task-properties').propertytable('resetTableSize');
+                    }
+
+                    // close all fields currently being edited
+                    $('#reporting-task-properties').propertytable('saveRow');
+                }
+            });
+            
+            // we clustered we need to show the controls for editing the availability
+            if (nf.Canvas.isClustered()) {
+                $('#availability-setting-container').show();
+            }
+
+            // initialize the reporting task configuration dialog
+            $('#reporting-task-configuration').modal({
+                headerText: 'Configure Reporting Task',
+                overlayBackground: false,
+                handler: {
+                    close: function () {
+                        // cancel any active edits
+                        $('#reporting-task-properties').propertytable('cancelEdit');
+
+                        // clear the tables
+                        $('#reporting-task-properties').propertytable('clear');
+                        
+                        // removed the cached reporting task details
+                        $('#reporting-task-configuration').removeData('reportingTaskDetails');
+                    }
+                }
+            }).draggable({
+                containment: 'parent',
+                handle: '.dialog-header'
+            });
+
+            // initialize the property table
+            $('#reporting-task-properties').propertytable({
+                readOnly: false,
+                newPropertyDialogContainer: 'body'
+            });
+        },
+        
+        /**
+         * Shows the configuration dialog for the specified reporting task.
+         * 
+         * @argument {reportingTask} reportingTask      The reporting task
+         */
+        showConfiguration: function (reportingTask) {
+            // reload the task in case the property descriptors have changed
+            var reloadTask = $.ajax({
+                type: 'GET',
+                url: reportingTask.uri,
+                dataType: 'json'
+            });
+            
+            // get the reporting task history
+            var loadHistory = $.ajax({
+                type: 'GET',
+                url: '../nifi-api/controller/history/reporting-tasks/' + encodeURIComponent(reportingTask.id),
+                dataType: 'json'
+            });
+            
+            // once everything is loaded, show the dialog
+            $.when(reloadTask, loadHistory).done(function (taskResponse, historyResponse) {
+                // get the updated reporting task
+                reportingTask = taskResponse[0].reportingTask;
+                
+                // get the reporting task history
+                var reportingTaskHistory = historyResponse[0].componentHistory;
+                
+                // record the reporting task details
+                $('#reporting-task-configuration').data('reportingTaskDetails', reportingTask);
+
+                // populate the reporting task settings
+                $('#reporting-task-id').text(reportingTask['id']);
+                $('#reporting-task-type').text(nf.Common.substringAfterLast(reportingTask['type'], '.'));
+                $('#reporting-task-name').val(reportingTask['name']);
+
+                // select the availability when appropriate
+                if (nf.Canvas.isClustered()) {
+                    if (reportingTask['availability'] === 'node') {
+                        $('#availability').text('Node');
+                    } else {
+                        $('#availability').text('Cluster Manager');
+                    }
+                }
+                
+                var buttons = [{
+                        buttonText: 'Apply',
+                        handler: {
+                            click: function () {
+                                // close all fields currently being edited
+                                $('#reporting-task-properties').propertytable('saveRow');
+
+                                // marshal the settings and properties and update the reporting task
+                                var updatedReportingTask = marshalDetails();
+
+                                // ensure details are valid as far as we can tell
+                                if (validateDetails(updatedReportingTask)) {
+                                    // update the selected component
+                                    $.ajax({
+                                        type: 'PUT',
+                                        data: JSON.stringify(updatedReportingTask),
+                                        url: reportingTask.uri,
+                                        dataType: 'json',
+                                        processData: false,
+                                        contentType: 'application/json'
+                                    }).done(function (response) {
+                                        if (nf.Common.isDefinedAndNotNull(response.reportingTask)) {
+                                            // update the revision
+                                            nf.Client.setRevision(response.revision);
+
+                                            // reload the reporting task
+                                            renderReportingTask(response.reportingTask);
+
+                                            // close the details panel
+                                            $('#reporting-task-configuration').modal('hide');
+                                        }
+                                    }).fail(handleReportingTaskConfigurationError);
+                                }
+                            }
+                        }
+                    }, {
+                        buttonText: 'Cancel',
+                        handler: {
+                            click: function () {
+                                $('#reporting-task-configuration').modal('hide');
+                            }
+                        }
+                    }];
+
+                // determine if we should show the advanced button
+                if (nf.Common.isDefinedAndNotNull(reportingTask.customUiUrl) && reportingTask.customUiUrl !== '') {
+                    buttons.push({
+                        buttonText: 'Advanced',
+                        handler: {
+                            click: function () {
+                                var openCustomUi = function () {
+                                    // reset state and close the dialog manually to avoid hiding the faded background
+                                    $('#reporting-task-configuration').modal('hide');
+
+                                    // show the custom ui
+                                    nf.CustomProcessorUi.showCustomUi($('#reporting-task-id').text(), reportingTask.customUiUrl, true).done(function () {
+                                        // once the custom ui is closed, reload the reporting task
+                                        reloadReportingTask(reportingTask);
+                                    });
+                                };
+
+                                // close all fields currently being edited
+                                $('#reporting-task-properties').propertytable('saveRow');
+
+                                // determine if changes have been made
+                                if (isSaveRequired()) {
+                                    // see if those changes should be saved
+                                    nf.Dialog.showYesNoDialog({
+                                        dialogContent: 'Save changes before opening the advanced configuration?',
+                                        overlayBackground: false,
+                                        noHandler: openCustomUi,
+                                        yesHandler: function () {
+                                            // marshal the settings and properties and update the reporting task
+                                            var updatedReportingTask = marshalDetails();
+
+                                            // ensure details are valid as far as we can tell
+                                            if (validateDetails(updatedReportingTask)) {
+                                                // update the selected component
+                                                $.ajax({
+                                                    type: 'PUT',
+                                                    data: JSON.stringify(updatedReportingTask),
+                                                    url: reportingTask.uri,
+                                                    dataType: 'json',
+                                                    processData: false,
+                                                    contentType: 'application/json'
+                                                }).done(function (response) {
+                                                    if (nf.Common.isDefinedAndNotNull(response.reportingTask)) {
+                                                        // update the revision
+                                                        nf.Client.setRevision(response.revision);
+
+                                                        // open the custom ui
+                                                        openCustomUi();
+                                                    }
+                                                }).fail(handleReportingTaskConfigurationError);
+                                            }
+                                        }
+                                    });
+                                } else {
+                                    // if there were no changes, simply open the custom ui
+                                    openCustomUi();
+                                }
+                            }
+                        }
+                    });
+                }
+
+                // set the button model
+                $('#reporting-task-configuration').modal('setButtonModel', buttons);
+                
+                // load the property table
+                $('#reporting-task-properties').propertytable('loadProperties', reportingTask.properties, reportingTask.descriptors, reportingTaskHistory.propertyHistory);
+
+                // show the details
+                $('#reporting-task-configuration').modal('show');
+            }).fail(nf.Common.handleAjaxError);
+        }, 
+        
+        showDetails: function(reportingTask) {
+            
+        },
+        
+        /**
+         * Starts the specified reporting task.
+         * 
+         * @param {object} reportingTask
+         */
+        start: function(reportingTask) {
+            setRunning(reportingTask, true);
+        },
+        
+        /**
+         * Stops the specified reporting task.
+         * 
+         * @param {object} reportingTask
+         */
+        stop: function(reportingTask) {
+            setRunning(reportingTask, false);
+        },
+        
+        /**
+         * Deletes the specified reporting task.
+         * 
+         * @param {object} reportingTask
+         */
+        remove: function(reportingTask) {
+            // prompt for removal?
+                    
+            var revision = nf.Client.getRevision();
+            $.ajax({
+                type: 'DELETE',
+                url: reportingTask.uri + '?' + $.param({
+                    version: revision.version,
+                    clientId: revision.clientId
+                }),
+                dataType: 'json'
+            }).done(function (response) {
+                // update the revision
+                nf.Client.setRevision(response.revision);
+
+                // remove the task
+                var reportingTaskGrid = $('#reporting-tasks-table').data('gridInstance');
+                var reportingTaskData = reportingTaskGrid.getData();
+                reportingTaskData.deleteItem(reportingTask.id);
+            }).fail(nf.Common.handleAjaxError);
+        }
+    };
+}());

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/2d4aebf3/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-settings.js
----------------------------------------------------------------------
diff --git a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-settings.js b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-settings.js
index f4191f7..1fc5498 100644
--- a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-settings.js
+++ b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-settings.js
@@ -416,7 +416,7 @@ nf.Settings = (function () {
             // select the new controller service
             var row = controllerServicesData.getRowById(controllerService.id);
             controllerServicesGrid.setSelectedRows([row]);
-        });
+        }).fail(nf.Common.handleAjaxError);
         
         // hide the dialog
         $('#new-controller-service-dialog').modal('hide');
@@ -1072,7 +1072,7 @@ nf.Settings = (function () {
             // select the new reporting task
             var row = reportingTaskData.getRowById(reportingTask.id);
             reportingTaskGrid.setSelectedRows([row]);
-        });
+        }).fail(nf.Common.handleAjaxError);
         
         // hide the dialog
         $('#new-reporting-task-dialog').modal('hide');