FALCON-2341 Entity SLA Alert publishing wrong results into DB

Author: Amit Khanna <amit.khanna@inmobi.com>

Reviewers: @pallavi-rao

Closes #415 from amitkhanna1806/apache-falcon and squashes the following commits:

f61fd66cf [Amit Khanna] SLA High should be true if TAG_CRITICAL
10a989c57 [Amit Khanna] FALCON-2341 Entity SLA Alert publishing wrong results into DB
diff --git a/common/src/main/java/org/apache/falcon/persistence/EntitySLAAlertBean.java b/common/src/main/java/org/apache/falcon/persistence/EntitySLAAlertBean.java
index 6482e8c..b0ce279 100644
--- a/common/src/main/java/org/apache/falcon/persistence/EntitySLAAlertBean.java
+++ b/common/src/main/java/org/apache/falcon/persistence/EntitySLAAlertBean.java
@@ -101,11 +101,11 @@
     private Boolean slaHighAlertSent;
 
     public Date getNominalTime() {
-        return new Date(nominalTime.getTime());
+        return nominalTime;
     }
 
     public void setNominalTime(Date nominalTime) {
-        this.nominalTime = new Date(nominalTime.getTime());
+        this.nominalTime = nominalTime;
     }
 
     public String getId() {
diff --git a/prism/src/main/java/org/apache/falcon/jdbc/MonitoringJdbcStateStore.java b/prism/src/main/java/org/apache/falcon/jdbc/MonitoringJdbcStateStore.java
index 51eac94..8d50862 100644
--- a/prism/src/main/java/org/apache/falcon/jdbc/MonitoringJdbcStateStore.java
+++ b/prism/src/main/java/org/apache/falcon/jdbc/MonitoringJdbcStateStore.java
@@ -263,6 +263,9 @@
 
     public void putSLAAlertInstance(String entityName, String cluster, String entityType, Date nominalTime,
                                     Boolean isSLALowMissed, Boolean isSLAHighMissed) throws FalconException{
+        if(isSLAAlertInstancePresent(entityName, cluster, entityType, nominalTime)){
+            return;
+        }
         EntityManager entityManager = getEntityManager();
         EntitySLAAlertBean entitySLAAlertBean = new EntitySLAAlertBean();
         entitySLAAlertBean.setEntityName(entityName);
@@ -313,4 +316,13 @@
         entityManager.getTransaction().begin();
     }
 
+    public boolean isSLAAlertInstancePresent(String entityName, String cluster, String entityType, Date nominalTime){
+        try{
+            getEntityAlertInstance(entityName, cluster, nominalTime, entityType);
+            return true;
+        } catch (Exception NoResultException){
+            return false;
+        }
+    }
+
 }
diff --git a/prism/src/main/java/org/apache/falcon/service/EntitySLAAlertService.java b/prism/src/main/java/org/apache/falcon/service/EntitySLAAlertService.java
index 2f19e6b..edf626b 100644
--- a/prism/src/main/java/org/apache/falcon/service/EntitySLAAlertService.java
+++ b/prism/src/main/java/org/apache/falcon/service/EntitySLAAlertService.java
@@ -144,9 +144,10 @@
                 } else if (schedulableEntityInstance.getTags().contains(EntitySLAMonitoringService.get().TAG_CRITICAL)){
                     if (entityType.equalsIgnoreCase(EntityType.PROCESS.name())){
                         store.putSLAAlertInstance(entityName, clusterName, entityType,
-                                nominalTime, true, false);
+                                nominalTime, true, true);
+                    } else {
+                        store.updateSLAAlertInstance(entityName, clusterName, nominalTime, entityType);
                     }
-                    store.updateSLAAlertInstance(entityName, clusterName, nominalTime, entityType);
                     LOG.info("Entity :{} EntityType : {} Cluster: {} Nominal Time: {} missed SLAHigh", entityName,
                             entityType, clusterName , nominalTime);
                     highSLAMissed(entityName, clusterName, EntityType.getEnum(entityType), nominalTime);
diff --git a/prism/src/main/java/org/apache/falcon/service/EntitySLAMonitoringService.java b/prism/src/main/java/org/apache/falcon/service/EntitySLAMonitoringService.java
index 8b3dbe4..279cab8 100644
--- a/prism/src/main/java/org/apache/falcon/service/EntitySLAMonitoringService.java
+++ b/prism/src/main/java/org/apache/falcon/service/EntitySLAMonitoringService.java
@@ -452,7 +452,7 @@
         Entity entity = EntityUtil.getEntity(entityType, entityName);
         authenticateUser(entity);
         try {
-            if (entityType.equalsIgnoreCase(EntityType.PROCESS.toString())){
+            if (entity.getEntityType() == EntityType.PROCESS){
                 LOG.trace("Checking instance availability status for entity:{}, cluster:{}, "
                         + "instanceTime:{}", entity.getName(), clusterName, nominalTime, entityType);
                 AbstractWorkflowEngine wfEngine = WorkflowEngineFactory.getWorkflowEngine();
@@ -470,7 +470,7 @@
                 }
                 return false;
             }
-            if (entityType.equalsIgnoreCase(EntityType.FEED.toString())){
+            if (entity.getEntityType() == EntityType.FEED){
                 LOG.trace("Checking instance availability status for feed:{}, cluster:{}, instanceTime:{}",
                         entity.getName(), clusterName, nominalTime);
 
@@ -567,7 +567,7 @@
         }
         Entity entity = EntityUtil.getEntity(entityType, entityName);
 
-        if (entityType.equals(EntityType.FEED.toString())) {
+        if (entity.getEntityType() == EntityType.FEED) {
             Sla sla = FeedHelper.getSLA(clusterName, (Feed) entity);
 
             if (sla != null) {
@@ -640,7 +640,7 @@
 
     @VisibleForTesting
     Date getInitialStartTime(Entity entity, String clusterName, String entityType) throws FalconException {
-        if (entityType.equals(EntityType.FEED.toString())){
+        if (entity.getEntityType() == EntityType.FEED){
             Sla sla = FeedHelper.getSLA(clusterName, (Feed) entity);
             if (sla == null) {
                 throw new IllegalStateException("InitialStartTime can not be determined as the feed: "