Repository: incubator-nifi
Updated Branches:
  refs/heads/NIFI-250 ca7b65262 -> c9604a3fc


NIFI-250:
- Adding support for configuring the scheduling strategy and scheduling period 
for reporting tasks.

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

Branch: refs/heads/NIFI-250
Commit: c9604a3fcacf4c33606ca0be767c9d89ef4424a0
Parents: ca7b652
Author: Matt Gilman <[email protected]>
Authored: Thu Mar 12 11:10:39 2015 -0400
Committer: Matt Gilman <[email protected]>
Committed: Thu Mar 12 11:10:39 2015 -0400

----------------------------------------------------------------------
 .../nifi/web/api/dto/ReportingTaskDTO.java      | 16 ++++
 .../nifi/web/api/ReportingTaskResource.java     |  7 +-
 .../org/apache/nifi/web/api/dto/DtoFactory.java |  7 ++
 .../web/dao/impl/StandardReportingTaskDAO.java  | 86 +++++++++++++++----
 .../canvas/controller-service-configuration.jsp |  2 +-
 .../canvas/reporting-task-configuration.jsp     | 78 +++++++++++------
 .../src/main/webapp/css/reporting-task.css      | 30 +++++++
 .../js/nf/canvas/nf-controller-service.js       |  2 +-
 .../webapp/js/nf/canvas/nf-reporting-task.js    | 89 +++++++++++++++++++-
 9 files changed, 270 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c9604a3f/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 6a9c7fc..3ec048b 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
@@ -34,6 +34,8 @@ public class ReportingTaskDTO extends NiFiComponentDTO {
        private String schedulingStrategy;
        private String availability;
        
+    private Map<String, String> defaultSchedulingPeriod;
+    
        private Map<String, String> properties;
     private Map<String, PropertyDescriptorDTO> descriptors;
  
@@ -180,4 +182,18 @@ public class ReportingTaskDTO extends NiFiComponentDTO {
     public void setValidationErrors(Collection<String> validationErrors) {
         this.validationErrors = validationErrors;
     }
+
+    /**
+     * The default scheduling period for the different scheduling strategies.
+     * 
+     * @return 
+     */
+    public Map<String, String> getDefaultSchedulingPeriod() {
+        return defaultSchedulingPeriod;
+    }
+
+    public void setDefaultSchedulingPeriod(Map<String, String> 
defaultSchedulingPeriod) {
+        this.defaultSchedulingPeriod = defaultSchedulingPeriod;
+    }
+    
 }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c9604a3f/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 aae1afc..9f6b135 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
@@ -345,6 +345,8 @@ public class ReportingTaskResource extends 
ApplicationResource {
      * @param annotationData The annotation data for the reporting task
      * @param markedForDeletion Array of property names whose value should be 
removed.
      * @param state The updated scheduled state
+     * @param schedulingStrategy The scheduling strategy for this reporting 
task
+     * @param schedulingPeriod The scheduling period for this reporting task
      * @param formParams Additionally, the processor properties and styles are
      * specified in the form parameters. Because the property names and styles
      * differ from processor to processor they are specified in a map-like
@@ -373,7 +375,8 @@ public class ReportingTaskResource extends 
ApplicationResource {
             @FormParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) 
ClientIdParameter clientId,
             @PathParam("availability") String availability, @PathParam("id") 
String id, @FormParam("name") String name,
             @FormParam("annotationData") String annotationData, 
@FormParam("markedForDeletion[]") List<String> markedForDeletion,
-            @FormParam("state") String state, MultivaluedMap<String, String> 
formParams) {
+            @FormParam("state") String state, @FormParam("schedulingStrategy") 
String schedulingStrategy,
+            @FormParam("schedulingPeriod") String schedulingPeriod, 
MultivaluedMap<String, String> formParams) {
 
         // create collections for holding the reporting task properties
         final Map<String, String> updatedProperties = new LinkedHashMap<>();
@@ -404,6 +407,8 @@ public class ReportingTaskResource extends 
ApplicationResource {
         reportingTaskDTO.setId(id);
         reportingTaskDTO.setName(name);
         reportingTaskDTO.setState(state);
+        reportingTaskDTO.setSchedulingStrategy(schedulingStrategy);
+        reportingTaskDTO.setSchedulingPeriod(schedulingPeriod);
         reportingTaskDTO.setAnnotationData(annotationData);
 
         // only set the properties when appropriate

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c9604a3f/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 ae404de..1dcf856 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
@@ -844,8 +844,15 @@ public final class DtoFactory {
         dto.setName(reportingTaskNode.getName());
         dto.setType(reportingTaskNode.getReportingTask().getClass().getName());
         dto.setState(reportingTaskNode.getScheduledState().name());
+        
dto.setSchedulingStrategy(reportingTaskNode.getSchedulingStrategy().name());
+        dto.setSchedulingPeriod(reportingTaskNode.getSchedulingPeriod());
 //        dto.setComments(reportingTaskNode.getComments());
         
+        final Map<String, String> defaultSchedulingPeriod = new HashMap<>();
+        defaultSchedulingPeriod.put(SchedulingStrategy.TIMER_DRIVEN.name(), 
SchedulingStrategy.TIMER_DRIVEN.getDefaultSchedulingPeriod());
+        defaultSchedulingPeriod.put(SchedulingStrategy.CRON_DRIVEN.name(), 
SchedulingStrategy.CRON_DRIVEN.getDefaultSchedulingPeriod());
+        dto.setDefaultSchedulingPeriod(defaultSchedulingPeriod);
+        
         // sort a copy of the properties
         final Map<PropertyDescriptor, String> sortedProperties = new 
TreeMap<>(new Comparator<PropertyDescriptor>() {
             @Override

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c9604a3f/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardReportingTaskDAO.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/dao/impl/StandardReportingTaskDAO.java
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardReportingTaskDAO.java
index 8a9a897..41434d3 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardReportingTaskDAO.java
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-api/src/main/java/org/apache/nifi/web/dao/impl/StandardReportingTaskDAO.java
@@ -16,11 +16,14 @@
  */
 package org.apache.nifi.web.dao.impl;
 
+import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.RejectedExecutionException;
+import java.util.regex.Matcher;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.nifi.controller.ReportingTaskNode;
 import org.apache.nifi.controller.ScheduledState;
 import org.apache.nifi.controller.exception.ProcessorLifeCycleException;
@@ -28,10 +31,13 @@ import 
org.apache.nifi.controller.exception.ProcessorLifeCycleException;
 import org.apache.nifi.controller.exception.ValidationException;
 import 
org.apache.nifi.controller.reporting.ReportingTaskInstantiationException;
 import org.apache.nifi.controller.reporting.ReportingTaskProvider;
+import org.apache.nifi.scheduling.SchedulingStrategy;
+import org.apache.nifi.util.FormatUtils;
 import org.apache.nifi.web.NiFiCoreException;
 import org.apache.nifi.web.ResourceNotFoundException;
 import org.apache.nifi.web.api.dto.ReportingTaskDTO;
 import org.apache.nifi.web.dao.ReportingTaskDAO;
+import org.quartz.CronExpression;
 
 public class StandardReportingTaskDAO extends ComponentDAO implements 
ReportingTaskDAO {
 
@@ -121,10 +127,10 @@ public class StandardReportingTaskDAO extends 
ComponentDAO implements ReportingT
     public ReportingTaskNode updateReportingTask(final ReportingTaskDTO 
reportingTaskDTO) {
         // get the reporting task
         final ReportingTaskNode reportingTask = 
locateReportingTask(reportingTaskDTO.getId());
-        
+
         // ensure we can perform the update 
         verifyUpdate(reportingTask, reportingTaskDTO);
-        
+
         // perform the update
         configureReportingTask(reportingTask, reportingTaskDTO);
 
@@ -166,22 +172,57 @@ public class StandardReportingTaskDAO extends 
ComponentDAO implements ReportingT
                 }
             }
         }
-        
+
         return reportingTask;
     }
 
     /**
      * Validates the specified configuration for the specified reporting task.
-     * 
+     *
      * @param reportingTask
      * @param reportingTaskDTO
-     * @return 
+     * @return
      */
     private List<String> validateProposedConfiguration(final ReportingTaskNode 
reportingTask, final ReportingTaskDTO reportingTaskDTO) {
         final List<String> validationErrors = new ArrayList<>();
+
+        // get the current scheduling strategy
+        SchedulingStrategy schedulingStrategy = 
reportingTask.getSchedulingStrategy();
+
+        // validate the new scheduling strategy if appropriate
+        if (isNotNull(reportingTaskDTO.getSchedulingStrategy())) {
+            try {
+                // this will be the new scheduling strategy so use it
+                schedulingStrategy = 
SchedulingStrategy.valueOf(reportingTaskDTO.getSchedulingStrategy());
+            } catch (IllegalArgumentException iae) {
+                validationErrors.add(String.format("Scheduling strategy: Value 
must be one of [%s]", StringUtils.join(SchedulingStrategy.values(), ", ")));
+            }
+        }
+
+        // validate the scheduling period based on the scheduling strategy
+        if (isNotNull(reportingTaskDTO.getSchedulingPeriod())) {
+            switch (schedulingStrategy) {
+                case TIMER_DRIVEN:
+                    final Matcher schedulingMatcher = 
FormatUtils.TIME_DURATION_PATTERN.matcher(reportingTaskDTO.getSchedulingPeriod());
+                    if (!schedulingMatcher.matches()) {
+                        validationErrors.add("Scheduling period is not a valid 
time duration (ie 30 sec, 5 min)");
+                    }
+                    break;
+                case CRON_DRIVEN:
+                    try {
+                        new 
CronExpression(reportingTaskDTO.getSchedulingPeriod());
+                    } catch (final ParseException pe) {
+                        throw new 
IllegalArgumentException(String.format("Scheduling Period '%s' is not a valid 
cron expression: %s", reportingTaskDTO.getSchedulingPeriod(), pe.getMessage()));
+                    } catch (final Exception e) {
+                        throw new IllegalArgumentException("Scheduling Period 
is not a valid cron expression: " + reportingTaskDTO.getSchedulingPeriod());
+                    }
+                    break;
+            }
+        }
+
         return validationErrors;
     }
-    
+
     @Override
     public void verifyDelete(final String reportingTaskId) {
         final ReportingTaskNode reportingTask = 
locateReportingTask(reportingTaskId);
@@ -193,12 +234,12 @@ public class StandardReportingTaskDAO extends 
ComponentDAO implements ReportingT
         final ReportingTaskNode reportingTask = 
locateReportingTask(reportingTaskDTO.getId());
         verifyUpdate(reportingTask, reportingTaskDTO);
     }
-    
+
     /**
      * Verifies the reporting task can be updated.
-     * 
+     *
      * @param reportingTask
-     * @param reportingTaskDTO 
+     * @param reportingTaskDTO
      */
     private void verifyUpdate(final ReportingTaskNode reportingTask, final 
ReportingTaskDTO reportingTaskDTO) {
         // ensure the state, if specified, is valid
@@ -234,13 +275,15 @@ public class StandardReportingTaskDAO extends 
ComponentDAO implements ReportingT
                         reportingTaskDTO.getState()));
             }
         }
-        
+
         boolean modificationRequest = false;
         if (isAnyNotNull(reportingTaskDTO.getName(),
+                reportingTaskDTO.getSchedulingStrategy(),
+                reportingTaskDTO.getSchedulingPeriod(),
                 reportingTaskDTO.getAnnotationData(),
                 reportingTaskDTO.getProperties())) {
             modificationRequest = true;
-            
+
             // validate the request
             final List<String> requestValidation = 
validateProposedConfiguration(reportingTask, reportingTaskDTO);
 
@@ -249,26 +292,36 @@ public class StandardReportingTaskDAO extends 
ComponentDAO implements ReportingT
                 throw new ValidationException(requestValidation);
             }
         }
-        
+
         if (modificationRequest) {
             reportingTask.verifyCanUpdate();
         }
     }
-    
+
     /**
      * Configures the specified reporting task.
-     * 
+     *
      * @param reportingTask
-     * @param reportingTaskDTO 
+     * @param reportingTaskDTO
      */
     private void configureReportingTask(final ReportingTaskNode reportingTask, 
final ReportingTaskDTO reportingTaskDTO) {
         final String name = reportingTaskDTO.getName();
+        final String schedulingStrategy = 
reportingTaskDTO.getSchedulingStrategy();
+        final String schedulingPeriod = reportingTaskDTO.getSchedulingPeriod();
         final String annotationData = reportingTaskDTO.getAnnotationData();
         final Map<String, String> properties = 
reportingTaskDTO.getProperties();
+
+        // ensure scheduling strategy is set first
+        if (isNotNull(schedulingStrategy)) {
+            
reportingTask.setSchedulingStrategy(SchedulingStrategy.valueOf(schedulingStrategy));
+        }
         
         if (isNotNull(name)) {
             reportingTask.setName(name);
         }
+        if (isNotNull(schedulingPeriod)) {
+            reportingTask.setScheduldingPeriod(schedulingPeriod);
+        }
         if (isNotNull(annotationData)) {
             reportingTask.setAnnotationData(annotationData);
         }
@@ -284,7 +337,7 @@ public class StandardReportingTaskDAO extends ComponentDAO 
implements ReportingT
             }
         }
     }
-    
+
     /**
      * Deletes the specified reporting task.
      *
@@ -297,7 +350,6 @@ public class StandardReportingTaskDAO extends ComponentDAO 
implements ReportingT
     }
 
     /* setters */
-    
     public void setReportingTaskProvider(ReportingTaskProvider 
reportingTaskProvider) {
         this.reportingTaskProvider = reportingTaskProvider;
     }

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c9604a3f/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 338a906..604dd40 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
@@ -43,7 +43,7 @@
                             <span id="controller-service-type"></span>
                         </div>
                     </div>
-                    <div id="availability-setting-container" class="setting 
hidden">
+                    <div 
id="controller-service-availability-setting-container" class="setting hidden">
                         <div class="availability-setting">
                             <div class="setting-name">
                                 Availability

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c9604a3f/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
index c1d816f..3b4906c 100644
--- 
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
@@ -20,40 +20,68 @@
         <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 class="settings-left">
+                    <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>
-                <div class="setting">
-                    <div class="setting-name">Id</div>
-                    <div class="setting-field">
-                        <span id="reporting-task-id"></span>
+                    <div class="setting">
+                        <div class="setting-name">Id</div>
+                        <div class="setting-field">
+                            <span id="reporting-task-id"></span>
+                        </div>
                     </div>
-                </div>
-                <div class="setting">
-                    <div class="setting-name">Type</div>
-                    <div class="setting-field">
-                        <span id="reporting-task-type"></span>
+                    <div class="setting">
+                        <div class="setting-name">Type</div>
+                        <div class="setting-field">
+                            <span id="reporting-task-type"></span>
+                        </div>
+                    </div>
+                    <div id="reporting-task-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="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 class="spacer">&nbsp;</div>
+                <div class="settings-right">
+                    <div class="setting">
+                        <div 
class="reporting-task-scheduling-strategy-container">
+                            <div class="setting-name">
+                                Scheduling strategy
+                                <img class="setting-icon icon-info" 
src="images/iconInfo.png" alt="Info" title="The strategy used to schedule this 
reporting task."/>
+                            </div>
+                            <div class="setting-field">
+                                <div type="text" 
id="reporting-task-scheduling-strategy-combo"></div>
+                            </div>
                         </div>
-                        <div class="setting-field">
-                            <div id="availability"></div>
+                        <div 
class="reporting-task-scheduling-period-container">
+                            <div class="setting-name">
+                                Run schedule
+                                <img class="setting-icon icon-info" 
src="images/iconInfo.png" alt="Info" title="The amount of time that should 
elapse between task executions."/>
+                            </div>
+                            <div class="setting-field">
+                                <input type="text" 
id="reporting-task-timer-driven-scheduling-period" 
class="reporting-task-scheduling-period small-setting-input"/>
+                                <input type="text" 
id="reporting-task-cron-driven-scheduling-period" 
class="reporting-task-scheduling-period small-setting-input"/>
+                            </div>
                         </div>
+                        <div class="clear"></div>
                     </div>
-                    <div class="clear"></div>
                 </div>
+                <div class="clear"></div>
             </div>
             <div id="reporting-task-properties-tab-content" 
class="configuration-tab">
                 <div id="reporting-task-properties"></div>

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c9604a3f/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
index 952aebd..50ecd41 100644
--- 
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
@@ -55,6 +55,21 @@ div.reporting-task-configuration-tab-container {
 
 /* reporting-task settings */
 
+#reporting-task-configuration div.settings-left {
+    float: left;
+    width: 356px;
+}
+
+#reporting-task-configuration div.settings-right {
+    float: left;
+    width: 356px;
+}
+
+#reporting-task-configuration div.spacer {
+    float: left;
+    margin-right: 40px;
+}
+
 #reporting-task-name {
     font-size: 11px !important;
     width: 250px;
@@ -77,4 +92,19 @@ div.reporting-task-enabled-container {
 div.availability-setting {
     float: left;
     width: 140px;
+}
+
+div.reporting-task-scheduling-strategy-container, 
div.reporting-task-scheduling-period-container {
+    float: left;
+    width: 175px;
+}
+
+#reporting-task-scheduling-strategy-combo {
+    width: 145px;
+    height: 18px;
+    line-height: 18px;
+}
+
+input.reporting-task-scheduling-period {
+    font-size: 11px !important;
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c9604a3f/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-controller-service.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-controller-service.js
 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-controller-service.js
index e585133..b570075 100644
--- 
a/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-controller-service.js
+++ 
b/nifi/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-web/nifi-web-ui/src/main/webapp/js/nf/canvas/nf-controller-service.js
@@ -1039,7 +1039,7 @@ nf.ControllerService = (function () {
             
             // we clustered we need to show the controls for editing the 
availability
             if (nf.Canvas.isClustered()) {
-                $('#availability-setting-container').show();
+                $('#controller-service-availability-setting-container').show();
             }
 
             // initialize the conroller service configuration dialog

http://git-wip-us.apache.org/repos/asf/incubator-nifi/blob/c9604a3f/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
index 4234bd2..fec1d10 100644
--- 
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
@@ -65,6 +65,25 @@ nf.ReportingTask = (function () {
             return true;
         }
         
+        // consider the scheduling strategy
+        var schedulingStrategy = 
$('#reporting-task-scheduling-strategy-combo').combo('getSelectedOption').value;
+        if (schedulingStrategy !== (details['schedulingStrategy'] + '')) {
+            return true;
+        }
+        
+        // get the appropriate scheduling period field
+        var schedulingPeriod;
+        if (schedulingStrategy === 'CRON_DRIVEN') {
+            schedulingPeriod = 
$('#reporting-task-cron-driven-scheduling-period');
+        } else {
+            schedulingPeriod = 
$('#reporting-task-timer-driven-scheduling-period');
+        }
+        
+        // check the scheduling period
+        if (nf.Common.isDefinedAndNotNull(schedulingPeriod) && 
schedulingPeriod.val() !== (details['schedulingPeriod'] + '')) {
+            return true;
+        }
+        
         // defer to the properties
         return $('#reporting-task-properties').propertytable('isSaveRequired');
     };
@@ -76,10 +95,23 @@ nf.ReportingTask = (function () {
         // properties
         var properties = 
$('#reporting-task-properties').propertytable('marshalProperties');
 
+        // get the scheduling strategy
+        var schedulingStrategy = 
$('#reporting-task-scheduling-strategy-combo').combo('getSelectedOption').value;
+
+        // get the appropriate scheduling period field
+        var schedulingPeriod;
+        if (schedulingStrategy === 'CRON_DRIVEN') {
+            schedulingPeriod = 
$('#reporting-task-cron-driven-scheduling-period');
+        } else {
+            schedulingPeriod = 
$('#reporting-task-timer-driven-scheduling-period');
+        }
+
         // create the reporting task dto
         var reportingTaskDto = {};
         reportingTaskDto['id'] = $('#reporting-task-id').text();
         reportingTaskDto['name'] = $('#reporting-task-name').val();
+        reportingTaskDto['schedulingStrategy'] = schedulingStrategy;
+        reportingTaskDto['schedulingPeriod'] = schedulingPeriod.val();
         
         // mark the processor disabled if appropriate
         if ($('#reporting-task-enabled').hasClass('checkbox-unchecked')) {
@@ -108,7 +140,23 @@ nf.ReportingTask = (function () {
      * @argument {object} details       The details to validate
      */
     var validateDetails = function (details) {
-        return true;
+        var errors = [];
+        var reportingTask = details['reportingTask'];
+        
+        if (nf.Common.isBlank(reportingTask['schedulingPeriod'])) {
+            errors.push('Run schedule must be specified');
+        }
+        
+        if (errors.length > 0) {
+            nf.Dialog.showOkDialog({
+                dialogContent: nf.Common.formatUnorderedList(errors),
+                overlayBackground: false,
+                headerText: 'Configuration Error'
+            });
+            return false;
+        } else {
+            return true;
+        }
     };
     
     /**
@@ -192,7 +240,7 @@ nf.ReportingTask = (function () {
             
             // we clustered we need to show the controls for editing the 
availability
             if (nf.Canvas.isClustered()) {
-                $('#availability-setting-container').show();
+                $('#reporting-task-availability-setting-container').show();
             }
 
             // initialize the reporting task configuration dialog
@@ -275,6 +323,43 @@ nf.ReportingTask = (function () {
                     }
                 }
                 
+                // get the default schedule period
+                var defaultSchedulingPeriod = 
reportingTask['defaultSchedulingPeriod'];
+                var cronSchedulingPeriod = 
$('#reporting-task-cron-driven-scheduling-period').val(defaultSchedulingPeriod['CRON_DRIVEN']);
+                var timerSchedulingPeriod = 
$('#reporting-task-timer-driven-scheduling-period').val(defaultSchedulingPeriod['TIMER_DRIVEN']);
+                
+                // set the scheduling period as appropriate
+                if (reportingTask['schedulingStrategy'] === 'CRON_DRIVEN') {
+                    
cronSchedulingPeriod.val(reportingTask['schedulingPeriod']);
+                } else {
+                    
timerSchedulingPeriod.val(reportingTask['schedulingPeriod']);
+                }
+                
+                // initialize the scheduling strategy
+                $('#reporting-task-scheduling-strategy-combo').combo({
+                        options: [{
+                        text: 'Timer driven',
+                        value: 'TIMER_DRIVEN',
+                        description: 'Reporting task will be scheduled to run 
on an interval defined by the run schedule.'
+                    }, {
+                        text: 'CRON driven',
+                        value: 'CRON_DRIVEN',
+                        description: 'Reporting task will be scheduled to run 
on at specific times based on the specified CRON string.'
+                    }],
+                    selectedOption: {
+                        value: reportingTask['schedulingStrategy']
+                    },
+                    select: function (selectedOption) {
+                        if (selectedOption.value === 'CRON_DRIVEN') {
+                            timerSchedulingPeriod.hide();
+                            cronSchedulingPeriod.show();
+                        } else {
+                            timerSchedulingPeriod.show();
+                            cronSchedulingPeriod.hide();
+                        }
+                    }
+                });
+                
                 var buttons = [{
                         buttonText: 'Apply',
                         handler: {

Reply via email to