Repository: incubator-griffin
Updated Branches:
  refs/heads/master 06f969fea -> 44eea866d


http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/job/JobController.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/job/JobController.java 
b/service/src/main/java/org/apache/griffin/core/job/JobController.java
index 50f6614..3731d9f 100644
--- a/service/src/main/java/org/apache/griffin/core/job/JobController.java
+++ b/service/src/main/java/org/apache/griffin/core/job/JobController.java
@@ -42,7 +42,7 @@ public class JobController {
     }
 
     @RequestMapping(value = "/jobs", method = RequestMethod.POST)
-    public GriffinOperationMessage addJob(@RequestBody JobSchedule 
jobSchedule) {
+    public GriffinOperationMessage addJob(@RequestBody JobSchedule 
jobSchedule) throws Exception {
         return jobService.addJob(jobSchedule);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/job/JobInstance.java
----------------------------------------------------------------------
diff --git a/service/src/main/java/org/apache/griffin/core/job/JobInstance.java 
b/service/src/main/java/org/apache/griffin/core/job/JobInstance.java
index a785fbf..0c8b554 100644
--- a/service/src/main/java/org/apache/griffin/core/job/JobInstance.java
+++ b/service/src/main/java/org/apache/griffin/core/job/JobInstance.java
@@ -150,7 +150,8 @@ public class JobInstance implements Job {
     private Long[] genSampleTs(SegmentRange segRange, DataConnector dc) throws 
IOException {
         Long offset = TimeUtil.str2Long(segRange.getBegin());
         Long range = TimeUtil.str2Long(segRange.getLength());
-        Long dataUnit = TimeUtil.str2Long(dc.getDataUnit());
+        String unit = dc.getDataUnit();
+        Long dataUnit = TimeUtil.str2Long(unit != null ? unit : 
dc.getDefaultDataUnit());
         //offset usually is negative
         Long dataStartTime = jobStartTime + offset;
         if (range < 0) {

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/job/JobService.java
----------------------------------------------------------------------
diff --git a/service/src/main/java/org/apache/griffin/core/job/JobService.java 
b/service/src/main/java/org/apache/griffin/core/job/JobService.java
index a210105..33dce25 100644
--- a/service/src/main/java/org/apache/griffin/core/job/JobService.java
+++ b/service/src/main/java/org/apache/griffin/core/job/JobService.java
@@ -32,7 +32,7 @@ public interface JobService {
 
     List<JobDataBean> getAliveJobs();
 
-    GriffinOperationMessage addJob(JobSchedule jobSchedule);
+    GriffinOperationMessage addJob(JobSchedule jobSchedule) throws Exception;
 
     boolean pauseJob(String group, String name) throws SchedulerException;
 

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/job/JobServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/job/JobServiceImpl.java 
b/service/src/main/java/org/apache/griffin/core/job/JobServiceImpl.java
index 90c18ec..92188b4 100644
--- a/service/src/main/java/org/apache/griffin/core/job/JobServiceImpl.java
+++ b/service/src/main/java/org/apache/griffin/core/job/JobServiceImpl.java
@@ -44,7 +44,7 @@ import org.springframework.data.domain.Sort;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.interceptor.TransactionAspectSupport;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.client.RestClientException;
 import org.springframework.web.client.RestTemplate;
@@ -53,8 +53,7 @@ import java.io.IOException;
 import java.text.ParseException;
 import java.util.*;
 
-import static 
org.apache.griffin.core.util.GriffinOperationMessage.CREATE_JOB_FAIL;
-import static 
org.apache.griffin.core.util.GriffinOperationMessage.CREATE_JOB_SUCCESS;
+import static org.apache.griffin.core.util.GriffinOperationMessage.*;
 import static org.quartz.JobBuilder.newJob;
 import static org.quartz.JobKey.jobKey;
 import static org.quartz.TriggerBuilder.newTrigger;
@@ -140,40 +139,38 @@ public class JobServiceImpl implements JobService {
     }
 
     @Override
-    public GriffinOperationMessage addJob(JobSchedule js) {
+    @Transactional(rollbackFor = Exception.class)
+    public GriffinOperationMessage addJob(JobSchedule js) throws Exception {
         Long measureId = js.getMeasureId();
         GriffinMeasure measure = getMeasureIfValid(measureId);
-        if (measure != null) {
-            return addJob(js, measure);
+        if (measure != null && addJob(js, measure)) {
+            return CREATE_JOB_SUCCESS;
         }
         return CREATE_JOB_FAIL;
     }
 
-    private GriffinOperationMessage addJob(JobSchedule js, GriffinMeasure 
measure) {
-        String qName = js.getJobName() + "_" + System.currentTimeMillis();
+    private boolean addJob(JobSchedule js, GriffinMeasure measure) throws 
Exception {
+        String qName = getQuartzName(js);
         String qGroup = getQuartzGroupName();
-        try {
-            if (addJob(js, measure, qName, qGroup)) {
-                return CREATE_JOB_SUCCESS;
-            }
-        } catch (Exception e) {
-            LOGGER.error("Add job exception happens.", e);
-            
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+        TriggerKey triggerKey = triggerKey(qName, qGroup);
+        if (!isJobScheduleParamValid(js, measure) || 
factory.getObject().checkExists(triggerKey)) {
+            return false;
         }
-        return CREATE_JOB_FAIL;
+        GriffinJob job = new GriffinJob(measure.getId(), js.getJobName(), 
qName, qGroup, false);
+        jobRepo.save(job);
+        js = jobScheduleRepo.save(js);
+        addJob(triggerKey, js, job);
+        return true;
     }
 
-    private boolean addJob(JobSchedule js, GriffinMeasure measure, String 
qName, String qGroup) throws SchedulerException, ParseException {
+    private void addJob(TriggerKey triggerKey, JobSchedule js, GriffinJob job) 
throws Exception {
         Scheduler scheduler = factory.getObject();
-        TriggerKey triggerKey = triggerKey(qName, qGroup);
-        if (!isJobScheduleParamValid(js, measure)) {
-            return false;
-        }
-        if (scheduler.checkExists(triggerKey)) {
-            return false;
-        }
-        GriffinJob job = saveGriffinJob(measure.getId(), js.getJobName(), 
qName, qGroup);
-        return job != null && saveAndAddQuartzJob(scheduler, triggerKey, js, 
job);
+        JobDetail jobDetail = addJobDetail(scheduler, triggerKey, js, job);
+        scheduler.scheduleJob(genTriggerInstance(triggerKey, jobDetail, js));
+    }
+
+    private String getQuartzName(JobSchedule js) {
+        return js.getJobName() + "_" + System.currentTimeMillis();
     }
 
     private String getQuartzGroupName() {
@@ -253,24 +250,12 @@ public class JobServiceImpl implements JobService {
     private GriffinMeasure getMeasureIfValid(Long measureId) {
         Measure measure = measureRepo.findByIdAndDeleted(measureId, false);
         if (measure == null) {
-            LOGGER.warn("The measure id {} isn't valid. Maybe it doesn't exist 
or is deleted.", measureId);
+            LOGGER.warn("The measure id {} isn't valid. Maybe it doesn't exist 
or is external measure type.", measureId);
             return null;
         }
         return (GriffinMeasure) measure;
     }
 
-    private GriffinJob saveGriffinJob(Long measureId, String jobName, String 
qName, String qGroup) {
-        GriffinJob job = new GriffinJob(measureId, jobName, qName, qGroup, 
false);
-        return jobRepo.save(job);
-    }
-
-    private boolean saveAndAddQuartzJob(Scheduler scheduler, TriggerKey 
triggerKey, JobSchedule js, GriffinJob job) throws SchedulerException, 
ParseException {
-        js = jobScheduleRepo.save(js);
-        JobDetail jobDetail = addJobDetail(scheduler, triggerKey, js, job);
-        scheduler.scheduleJob(genTriggerInstance(triggerKey, jobDetail, js));
-        return true;
-    }
-
 
     private Trigger genTriggerInstance(TriggerKey triggerKey, JobDetail jd, 
JobSchedule js) throws ParseException {
         return newTrigger()
@@ -298,8 +283,9 @@ public class JobServiceImpl implements JobService {
 
 
     private void setJobDataMap(JobDetail jd, JobSchedule js, GriffinJob job) {
-        jd.getJobDataMap().put(JOB_SCHEDULE_ID, js.getId().toString());
-        jd.getJobDataMap().put(GRIFFIN_JOB_ID, job.getId().toString());
+        JobDataMap jobDataMap = jd.getJobDataMap();
+        jobDataMap.put(JOB_SCHEDULE_ID, js.getId().toString());
+        jobDataMap.put(GRIFFIN_JOB_ID, job.getId().toString());
     }
 
     private boolean pauseJob(List<JobInstanceBean> instances) {
@@ -337,7 +323,7 @@ public class JobServiceImpl implements JobService {
         JobKey jobKey = new JobKey(name, group);
         if (!scheduler.checkExists(jobKey)) {
             LOGGER.warn("Job({},{}) does not exist.", jobKey.getGroup(), 
jobKey.getName());
-            return false;
+            return true;
         }
         scheduler.pauseJob(jobKey);
         return true;
@@ -375,7 +361,7 @@ public class JobServiceImpl implements JobService {
     @Override
     public GriffinOperationMessage deleteJob(Long jobId) {
         GriffinJob job = jobRepo.findByIdAndDeleted(jobId, false);
-        return deleteJob(job) ? GriffinOperationMessage.DELETE_JOB_SUCCESS : 
GriffinOperationMessage.DELETE_JOB_FAIL;
+        return deleteJob(job) ? DELETE_JOB_SUCCESS : DELETE_JOB_FAIL;
     }
 
     /**
@@ -389,14 +375,14 @@ public class JobServiceImpl implements JobService {
         List<GriffinJob> jobs = jobRepo.findByJobNameAndDeleted(name, false);
         if (CollectionUtils.isEmpty(jobs)) {
             LOGGER.warn("There is no job with '{}' name.", name);
-            return GriffinOperationMessage.DELETE_JOB_FAIL;
+            return DELETE_JOB_FAIL;
         }
         for (GriffinJob job : jobs) {
             if (!deleteJob(job)) {
-                return GriffinOperationMessage.DELETE_JOB_FAIL;
+                return DELETE_JOB_FAIL;
             }
         }
-        return GriffinOperationMessage.DELETE_JOB_SUCCESS;
+        return DELETE_JOB_SUCCESS;
     }
 
     private boolean deleteJob(GriffinJob job) {
@@ -419,7 +405,7 @@ public class JobServiceImpl implements JobService {
         JobKey jobKey = new JobKey(name, group);
         if (scheduler.checkExists(jobKey)) {
             LOGGER.warn("Job({},{}) does not exist.", jobKey.getGroup(), 
jobKey.getName());
-            return false;
+            return true;
         }
         scheduler.deleteJob(jobKey);
         return true;
@@ -435,8 +421,8 @@ public class JobServiceImpl implements JobService {
     public boolean deleteJobsRelateToMeasure(Long measureId) {
         List<GriffinJob> jobs = jobRepo.findByMeasureIdAndDeleted(measureId, 
false);
         if (CollectionUtils.isEmpty(jobs)) {
-            LOGGER.warn("Measure id {} has no related jobs.", measureId);
-            return false;
+            LOGGER.info("Measure id {} has no related jobs.", measureId);
+            return true;
         }
         for (GriffinJob job : jobs) {
             deleteJob(job);
@@ -563,7 +549,7 @@ public class JobServiceImpl implements JobService {
 
     private Boolean isJobHealthy(Long jobId) {
         Pageable pageable = new PageRequest(0, 1, Sort.Direction.DESC, "tms");
-        List<JobInstanceBean> instances = 
jobInstanceRepo.findByJobId(jobId,pageable);
+        List<JobInstanceBean> instances = jobInstanceRepo.findByJobId(jobId, 
pageable);
         return !CollectionUtils.isEmpty(instances) && 
LivySessionStates.isHealthy(instances.get(0).getState());
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/job/entity/JobDataSegment.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/job/entity/JobDataSegment.java 
b/service/src/main/java/org/apache/griffin/core/job/entity/JobDataSegment.java
index 7009b5d..b0f81cb 100644
--- 
a/service/src/main/java/org/apache/griffin/core/job/entity/JobDataSegment.java
+++ 
b/service/src/main/java/org/apache/griffin/core/job/entity/JobDataSegment.java
@@ -78,4 +78,9 @@ public class JobDataSegment extends AbstractAuditableEntity {
 
     public JobDataSegment() {
     }
+
+    public JobDataSegment(String dataConnectorName, boolean baseline) {
+        this.dataConnectorName =dataConnectorName;
+        this.baseline = baseline;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/job/entity/JobSchedule.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/job/entity/JobSchedule.java 
b/service/src/main/java/org/apache/griffin/core/job/entity/JobSchedule.java
index 131fe03..1406b5e 100644
--- a/service/src/main/java/org/apache/griffin/core/job/entity/JobSchedule.java
+++ b/service/src/main/java/org/apache/griffin/core/job/entity/JobSchedule.java
@@ -41,8 +41,6 @@ import javax.validation.constraints.NotNull;
 import java.io.IOException;
 import java.util.*;
 
-@Configurable(preConstruction = true)
-@Component
 @Entity
 public class JobSchedule extends AbstractAuditableEntity {
 
@@ -178,11 +176,11 @@ public class JobSchedule extends AbstractAuditableEntity {
     public JobSchedule() throws JsonProcessingException {
     }
 
-    public JobSchedule(Long measureId, String jobName, String cronExpression, 
Map configMap, List<JobDataSegment> segments) throws JsonProcessingException {
+    public JobSchedule(Long measureId, String jobName, String 
cronExpression,String timeZone, List<JobDataSegment> segments) throws 
JsonProcessingException {
         this.measureId = measureId;
         this.jobName = jobName;
         this.cronExpression = cronExpression;
-        setConfigMap(configMap);
+        this.timeZone = timeZone;
         this.segments = segments;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/login/LoginController.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/login/LoginController.java 
b/service/src/main/java/org/apache/griffin/core/login/LoginController.java
index a4e997d..47b0ed3 100644
--- a/service/src/main/java/org/apache/griffin/core/login/LoginController.java
+++ b/service/src/main/java/org/apache/griffin/core/login/LoginController.java
@@ -36,8 +36,7 @@ public class LoginController {
     private LoginService loginService;
 
     @RequestMapping(value = "/authenticate", method = RequestMethod.POST)
-    public ResponseEntity<Map<String, Object>> login(
-            @RequestBody Map<String, String> map) {
+    public ResponseEntity<Map<String, Object>> login(@RequestBody Map<String, 
String> map) {
         return loginService.login(map);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/measure/ExternalMeasureOperationImpl.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/measure/ExternalMeasureOperationImpl.java
 
b/service/src/main/java/org/apache/griffin/core/measure/ExternalMeasureOperationImpl.java
index f38982a..ca9aae1 100644
--- 
a/service/src/main/java/org/apache/griffin/core/measure/ExternalMeasureOperationImpl.java
+++ 
b/service/src/main/java/org/apache/griffin/core/measure/ExternalMeasureOperationImpl.java
@@ -31,6 +31,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import static org.apache.griffin.core.util.GriffinOperationMessage.*;
+
 @Component("externalOperation")
 public class ExternalMeasureOperationImpl implements MeasureOperation {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(ExternalMeasureOperationImpl.class);
@@ -45,18 +47,18 @@ public class ExternalMeasureOperationImpl implements 
MeasureOperation {
         ExternalMeasure em = (ExternalMeasure) measure;
         if (StringUtils.isBlank(em.getMetricName())) {
             LOGGER.error("Failed to create external measure {}. Its metric 
name is blank.", measure.getName());
-            return GriffinOperationMessage.CREATE_MEASURE_FAIL;
+            return CREATE_MEASURE_FAIL;
         }
         try {
             em.setVirtualJob(new VirtualJob());
             em = measureRepo.save(em);
             VirtualJob vj = genVirtualJob(em, em.getVirtualJob());
             jobRepo.save(vj);
-            return GriffinOperationMessage.CREATE_MEASURE_SUCCESS;
+            return CREATE_MEASURE_SUCCESS;
         } catch (Exception e) {
             LOGGER.error("Failed to create new measure {}.{}", em.getName(), 
e.getMessage());
         }
-        return GriffinOperationMessage.CREATE_MEASURE_FAIL;
+        return CREATE_MEASURE_FAIL;
     }
 
     @Override
@@ -64,18 +66,18 @@ public class ExternalMeasureOperationImpl implements 
MeasureOperation {
         ExternalMeasure latestMeasure = (ExternalMeasure) measure;
         if (StringUtils.isBlank(latestMeasure.getMetricName())) {
             LOGGER.error("Failed to create external measure {}. Its metric 
name is blank.", measure.getName());
-            return GriffinOperationMessage.UPDATE_MEASURE_FAIL;
+            return UPDATE_MEASURE_FAIL;
         }
         try {
             ExternalMeasure originMeasure = 
measureRepo.findOne(latestMeasure.getId());
             VirtualJob vj = genVirtualJob(latestMeasure, 
originMeasure.getVirtualJob());
             latestMeasure.setVirtualJob(vj);
             measureRepo.save(latestMeasure);
-            return GriffinOperationMessage.UPDATE_MEASURE_SUCCESS;
+            return UPDATE_MEASURE_SUCCESS;
         } catch (Exception e) {
             LOGGER.error("Failed to update measure. {}", e.getMessage());
         }
-        return GriffinOperationMessage.UPDATE_MEASURE_FAIL;
+        return UPDATE_MEASURE_FAIL;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/measure/GriffinMeasureOperationImpl.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/measure/GriffinMeasureOperationImpl.java
 
b/service/src/main/java/org/apache/griffin/core/measure/GriffinMeasureOperationImpl.java
index 88c5409..f21b60d 100644
--- 
a/service/src/main/java/org/apache/griffin/core/measure/GriffinMeasureOperationImpl.java
+++ 
b/service/src/main/java/org/apache/griffin/core/measure/GriffinMeasureOperationImpl.java
@@ -37,6 +37,8 @@ import org.springframework.util.CollectionUtils;
 import java.util.ArrayList;
 import java.util.List;
 
+import static org.apache.griffin.core.util.GriffinOperationMessage.*;
+
 @Component("griffinOperation")
 public class GriffinMeasureOperationImpl implements MeasureOperation {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(GriffinMeasureOperationImpl.class);
@@ -52,26 +54,26 @@ public class GriffinMeasureOperationImpl implements 
MeasureOperation {
     @Override
     public GriffinOperationMessage create(Measure measure) {
         if (!isConnectorNamesValid((GriffinMeasure) measure)) {
-            return GriffinOperationMessage.CREATE_MEASURE_FAIL;
+            return CREATE_MEASURE_FAIL;
         }
         try {
             measureRepo.save(measure);
-            return GriffinOperationMessage.CREATE_MEASURE_SUCCESS;
+            return CREATE_MEASURE_SUCCESS;
         } catch (Exception e) {
             LOGGER.error("Failed to create new measure {}.", 
measure.getName(), e);
         }
-        return GriffinOperationMessage.CREATE_MEASURE_FAIL;
+        return CREATE_MEASURE_FAIL;
     }
 
     @Override
     public GriffinOperationMessage update(Measure measure) {
         try {
             measureRepo.save(measure);
-            return GriffinOperationMessage.UPDATE_MEASURE_SUCCESS;
+            return UPDATE_MEASURE_SUCCESS;
         } catch (Exception e) {
             LOGGER.error("Failed to update measure. {}", e.getMessage());
         }
-        return GriffinOperationMessage.UPDATE_MEASURE_FAIL;
+        return UPDATE_MEASURE_FAIL;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/measure/MeasureServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/measure/MeasureServiceImpl.java 
b/service/src/main/java/org/apache/griffin/core/measure/MeasureServiceImpl.java
index ecb9fdd..34a780d 100644
--- 
a/service/src/main/java/org/apache/griffin/core/measure/MeasureServiceImpl.java
+++ 
b/service/src/main/java/org/apache/griffin/core/measure/MeasureServiceImpl.java
@@ -33,6 +33,8 @@ import org.springframework.util.CollectionUtils;
 
 import java.util.List;
 
+import static org.apache.griffin.core.util.GriffinOperationMessage.*;
+
 @Service
 public class MeasureServiceImpl implements MeasureService {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(MeasureServiceImpl.class);
@@ -66,7 +68,7 @@ public class MeasureServiceImpl implements MeasureService {
         List<Measure> aliveMeasureList = 
measureRepo.findByNameAndDeleted(measure.getName(), false);
         if (!CollectionUtils.isEmpty(aliveMeasureList)) {
             LOGGER.warn("Failed to create new measure {}, it already exists.", 
measure.getName());
-            return GriffinOperationMessage.CREATE_MEASURE_FAIL_DUPLICATE;
+            return CREATE_MEASURE_FAIL_DUPLICATE;
         }
         MeasureOperation op = getOperation(measure);
         return op.create(measure);
@@ -76,11 +78,11 @@ public class MeasureServiceImpl implements MeasureService {
     public GriffinOperationMessage updateMeasure(Measure measure) {
         Measure m = measureRepo.findByIdAndDeleted(measure.getId(), false);
         if (m == null) {
-            return GriffinOperationMessage.RESOURCE_NOT_FOUND;
+            return RESOURCE_NOT_FOUND;
         }
         if (!m.getType().equals(measure.getType())) {
             LOGGER.error("Can't update measure to different type.");
-            return GriffinOperationMessage.UPDATE_MEASURE_FAIL;
+            return UPDATE_MEASURE_FAIL;
         }
         MeasureOperation op = getOperation(measure);
         return op.update(measure);
@@ -90,17 +92,17 @@ public class MeasureServiceImpl implements MeasureService {
     public GriffinOperationMessage deleteMeasureById(Long measureId) {
         Measure measure = measureRepo.findByIdAndDeleted(measureId, false);
         if (measure == null) {
-            return GriffinOperationMessage.RESOURCE_NOT_FOUND;
+            return RESOURCE_NOT_FOUND;
         }
         try {
             MeasureOperation op = getOperation(measure);
             if (op.delete(measure)) {
-                return GriffinOperationMessage.DELETE_MEASURE_BY_ID_SUCCESS;
+                return DELETE_MEASURE_BY_ID_SUCCESS;
             }
         } catch (Exception e) {
             LOGGER.error("Delete measure id: {} name: {} failure. {}", 
measure.getId(), measure.getName(), e.getMessage());
         }
-        return GriffinOperationMessage.DELETE_MEASURE_BY_ID_FAIL;
+        return DELETE_MEASURE_BY_ID_FAIL;
     }
 
     private MeasureOperation getOperation(Measure measure) {

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/measure/entity/DataConnector.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/measure/entity/DataConnector.java
 
b/service/src/main/java/org/apache/griffin/core/measure/entity/DataConnector.java
index 3c4abf5..8a87ea5 100644
--- 
a/service/src/main/java/org/apache/griffin/core/measure/entity/DataConnector.java
+++ 
b/service/src/main/java/org/apache/griffin/core/measure/entity/DataConnector.java
@@ -97,13 +97,9 @@ public class DataConnector extends AbstractAuditableEntity {
         return config;
     }
 
-
     @JsonProperty("data.unit")
     public String getDataUnit() {
-        if (dataUnit != null) {
-            return dataUnit;
-        }
-        return defaultDataUnit;
+        return dataUnit;
     }
 
     @JsonProperty("data.unit")
@@ -111,6 +107,14 @@ public class DataConnector extends AbstractAuditableEntity 
{
         this.dataUnit = dataUnit;
     }
 
+    public String getDefaultDataUnit() {
+        return defaultDataUnit;
+    }
+
+    public void setDefaultDataUnit(String defaultDataUnit) {
+        this.defaultDataUnit = defaultDataUnit;
+    }
+
     public String getName() {
         return name;
     }
@@ -152,6 +156,13 @@ public class DataConnector extends AbstractAuditableEntity 
{
         });
     }
 
+    public DataConnector(String name, String dataUnit, Map 
configMap,List<SegmentPredicate> predicates) throws IOException {
+        this.name = name;
+        this.dataUnit = dataUnit;
+        this.configMap = configMap;
+        this.predicates = predicates;
+    }
+
     @Override
     public String toString() {
         return "DataConnector{" +

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/measure/entity/GriffinMeasure.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/measure/entity/GriffinMeasure.java
 
b/service/src/main/java/org/apache/griffin/core/measure/entity/GriffinMeasure.java
index 3c5c602..c448c0b 100644
--- 
a/service/src/main/java/org/apache/griffin/core/measure/entity/GriffinMeasure.java
+++ 
b/service/src/main/java/org/apache/griffin/core/measure/entity/GriffinMeasure.java
@@ -112,4 +112,12 @@ public class GriffinMeasure extends Measure {
         this.evaluateRule = evaluateRule;
     }
 
+    public GriffinMeasure(Long measureId,String name, String owner, 
List<DataSource> dataSources, EvaluateRule evaluateRule) {
+        this.setId(measureId);
+        this.name = name;
+        this.owner = owner;
+        this.dataSources = dataSources;
+        this.evaluateRule = evaluateRule;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/metric/MetricController.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/metric/MetricController.java 
b/service/src/main/java/org/apache/griffin/core/metric/MetricController.java
index fcaa51d..359858b 100644
--- a/service/src/main/java/org/apache/griffin/core/metric/MetricController.java
+++ b/service/src/main/java/org/apache/griffin/core/metric/MetricController.java
@@ -21,6 +21,7 @@ package org.apache.griffin.core.metric;
 
 import org.apache.griffin.core.metric.model.Metric;
 import org.apache.griffin.core.metric.model.MetricValue;
+import org.apache.griffin.core.util.GriffinOperationMessage;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
@@ -48,12 +49,12 @@ public class MetricController {
     }
 
     @RequestMapping(value = "/metrics/values", method = RequestMethod.POST)
-    public ResponseEntity addMetricValues(@RequestBody List<MetricValue> 
values) {
+    public ResponseEntity<GriffinOperationMessage> 
addMetricValues(@RequestBody List<MetricValue> values) {
         return metricService.addMetricValues(values);
     }
 
     @RequestMapping(value = "/metrics/values", method = RequestMethod.DELETE)
-    public ResponseEntity deleteMetricValues(@RequestParam("metricName") 
String metricName) {
+    public ResponseEntity<GriffinOperationMessage> 
deleteMetricValues(@RequestParam("metricName") String metricName) {
         return metricService.deleteMetricValues(metricName);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/metric/MetricService.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/metric/MetricService.java 
b/service/src/main/java/org/apache/griffin/core/metric/MetricService.java
index f68d83c..502f254 100644
--- a/service/src/main/java/org/apache/griffin/core/metric/MetricService.java
+++ b/service/src/main/java/org/apache/griffin/core/metric/MetricService.java
@@ -22,6 +22,7 @@ package org.apache.griffin.core.metric;
 
 import org.apache.griffin.core.metric.model.Metric;
 import org.apache.griffin.core.metric.model.MetricValue;
+import org.apache.griffin.core.util.GriffinOperationMessage;
 import org.springframework.http.ResponseEntity;
 
 import java.util.List;
@@ -33,7 +34,7 @@ public interface MetricService {
 
     List<MetricValue> getMetricValues(String metricName, int offset, int size);
 
-    ResponseEntity addMetricValues(List<MetricValue> values);
+    ResponseEntity<GriffinOperationMessage> addMetricValues(List<MetricValue> 
values);
 
-    ResponseEntity deleteMetricValues(String metricName);
+    ResponseEntity<GriffinOperationMessage> deleteMetricValues(String 
metricName);
 }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/metric/MetricServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/metric/MetricServiceImpl.java 
b/service/src/main/java/org/apache/griffin/core/metric/MetricServiceImpl.java
index 68b26eb..4d992e2 100644
--- 
a/service/src/main/java/org/apache/griffin/core/metric/MetricServiceImpl.java
+++ 
b/service/src/main/java/org/apache/griffin/core/metric/MetricServiceImpl.java
@@ -41,6 +41,8 @@ import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import static org.apache.griffin.core.util.GriffinOperationMessage.*;
+
 @Service
 public class MetricServiceImpl implements MetricService {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(MetricServiceImpl.class);
@@ -88,22 +90,22 @@ public class MetricServiceImpl implements MetricService {
     public ResponseEntity addMetricValues(List<MetricValue> values) {
         for (MetricValue value : values) {
             if (!isMetricValueValid(value)) {
-                LOGGER.error("Invalid metric value.");
-                return new 
ResponseEntity<>(GriffinOperationMessage.ADD_METRIC_VALUES_FAIL, 
HttpStatus.BAD_REQUEST);
+                LOGGER.warn("Invalid metric value.");
+                return new ResponseEntity<>(ADD_METRIC_VALUES_FAIL, 
HttpStatus.BAD_REQUEST);
             }
         }
         try {
             for (MetricValue value : values) {
                 metricStore.addMetricValue(value);
             }
-            return new 
ResponseEntity<>(GriffinOperationMessage.ADD_METRIC_VALUES_SUCCESS, 
HttpStatus.CREATED);
+            return new ResponseEntity<>(ADD_METRIC_VALUES_SUCCESS, 
HttpStatus.CREATED);
         } catch (ResponseException e) {
             LOGGER.error("Failed to add metric values. {}", e.getMessage());
             HttpStatus status = 
HttpStatus.valueOf(e.getResponse().getStatusLine().getStatusCode());
-            return new 
ResponseEntity<>(GriffinOperationMessage.ADD_METRIC_VALUES_FAIL, status);
+            return new ResponseEntity<>(ADD_METRIC_VALUES_FAIL, status);
         } catch (Exception e) {
             LOGGER.error("Failed to add metric values. {}", e.getMessage());
-            return new 
ResponseEntity<>(GriffinOperationMessage.ADD_METRIC_VALUES_FAIL, 
HttpStatus.INTERNAL_SERVER_ERROR);
+            return new ResponseEntity<>(ADD_METRIC_VALUES_FAIL, 
HttpStatus.INTERNAL_SERVER_ERROR);
         }
     }
 
@@ -112,17 +114,17 @@ public class MetricServiceImpl implements MetricService {
     }
 
     @Override
-    public ResponseEntity deleteMetricValues(String metricName) {
+    public ResponseEntity<GriffinOperationMessage> deleteMetricValues(String 
metricName) {
         try {
             metricStore.deleteMetricValues(metricName);
-            return 
ResponseEntity.ok(GriffinOperationMessage.DELETE_METRIC_VALUES_SUCCESS);
+            return ResponseEntity.ok(DELETE_METRIC_VALUES_SUCCESS);
         } catch (ResponseException e) {
             LOGGER.error("Failed to delete metric values named {}. {}", 
metricName, e.getMessage());
             HttpStatus status = 
HttpStatus.valueOf(e.getResponse().getStatusLine().getStatusCode());
-            return new 
ResponseEntity<>(GriffinOperationMessage.DELETE_METRIC_VALUES_FAIL, status);
+            return new ResponseEntity<>(DELETE_METRIC_VALUES_FAIL, status);
         } catch (Exception e) {
             LOGGER.error("Failed to delete metric values named {}. {}", 
metricName, e.getMessage());
-            return new 
ResponseEntity<>(GriffinOperationMessage.DELETE_METRIC_VALUES_FAIL, 
HttpStatus.INTERNAL_SERVER_ERROR);
+            return new ResponseEntity<>(DELETE_METRIC_VALUES_FAIL, 
HttpStatus.INTERNAL_SERVER_ERROR);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/java/org/apache/griffin/core/metric/MetricStoreImpl.java
----------------------------------------------------------------------
diff --git 
a/service/src/main/java/org/apache/griffin/core/metric/MetricStoreImpl.java 
b/service/src/main/java/org/apache/griffin/core/metric/MetricStoreImpl.java
index 30b60f9..d055b37 100644
--- a/service/src/main/java/org/apache/griffin/core/metric/MetricStoreImpl.java
+++ b/service/src/main/java/org/apache/griffin/core/metric/MetricStoreImpl.java
@@ -46,7 +46,7 @@ public class MetricStoreImpl implements MetricStore {
 
     private ObjectMapper mapper = new ObjectMapper();
 
-    public MetricStoreImpl(@Value("${elasticsearch.host}") String host, 
@Value("${elasticsearch.port}") int port) {
+    public MetricStoreImpl(@Value("${elasticsearch.host}") String host, 
@Value("${elasticsearch.port}") int port) throws IOException {
         client = RestClient.builder(new HttpHost(host, port, "http")).build();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/main/resources/application.properties
----------------------------------------------------------------------
diff --git a/service/src/main/resources/application.properties 
b/service/src/main/resources/application.properties
index f2d83f4..b3f5e94 100644
--- a/service/src/main/resources/application.properties
+++ b/service/src/main/resources/application.properties
@@ -29,24 +29,24 @@ spring.jpa.properties.hibernate.dialect = 
org.hibernate.dialect.MySQL5Dialect
 # Naming strategy
 spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
 
-# hive metastore
+# Hive metastore
 hive.metastore.uris = thrift://localhost:9083
 hive.metastore.dbname = default
 hive.hmshandler.retry.attempts = 15
 hive.hmshandler.retry.interval = 2000ms
+# Hive cache time
+cache.evict.hive.fixedRate.in.milliseconds = 900000
 
-# kafka schema registry
+# Kafka schema registry
 kafka.schema.registry.url = http://localhost:8081
 
-# jobInstance
+# Update job instance state at regular intervals
 jobInstance.fixedDelay.in.milliseconds = 60000
-# default job instance expired time is 7 days that is 604800000 milliseconds
+# Expired time of job instance which is 7 days that is 604800000 milliseconds
 jobInstance.expired.milliseconds = 604800000
 
-# spring cache
-cache.evict.hive.fixedRate.in.milliseconds = 900000
-
-# predicate job
+# schedule predicate job every 5 minutes and repeat 12 times at most
+#interval unit m:minute h:hour d:day,only support these three units
 predicate.job.interval = 5m
 predicate.job.repeat.count = 12
 

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/test/java/org/apache/griffin/core/job/JobControllerTest.java
----------------------------------------------------------------------
diff --git 
a/service/src/test/java/org/apache/griffin/core/job/JobControllerTest.java 
b/service/src/test/java/org/apache/griffin/core/job/JobControllerTest.java
index d3fdd97..51edad8 100644
--- a/service/src/test/java/org/apache/griffin/core/job/JobControllerTest.java
+++ b/service/src/test/java/org/apache/griffin/core/job/JobControllerTest.java
@@ -1,148 +1,160 @@
-///*
-//Licensed to the Apache Software Foundation (ASF) under one
-//or more contributor license agreements.  See the NOTICE file
-//distributed with this work for additional information
-//regarding copyright ownership.  The ASF licenses this file
-//to you under the Apache License, Version 2.0 (the
-//"License"); you may not use this file except in compliance
-//with the License.  You may obtain a copy of the License at
-//
-//  http://www.apache.org/licenses/LICENSE-2.0
-//
-//Unless required by applicable law or agreed to in writing,
-//software distributed under the License is distributed on an
-//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-//KIND, either express or implied.  See the License for the
-//specific language governing permissions and limitations
-//under the License.
-//*/
-//
-//package org.apache.griffin.core.job;
-//
-//import org.apache.griffin.core.job.entity.*;
-//import org.apache.griffin.core.util.GriffinOperationMessage;
-//import org.apache.griffin.core.util.JsonUtil;
-//import org.apache.griffin.core.util.URLHelper;
-//import org.junit.Before;
-//import org.junit.Test;
-//import org.junit.runner.RunWith;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
-//import org.springframework.boot.test.mock.mockito.MockBean;
-//import org.springframework.http.MediaType;
-//import org.springframework.test.context.junit4.SpringRunner;
-//import org.springframework.test.web.servlet.MockMvc;
-//
-//import java.io.Serializable;
-//import java.util.Arrays;
-//import java.util.HashMap;
-//import java.util.Map;
-//
-//import static org.hamcrest.CoreMatchers.is;
-//import static org.mockito.BDDMockito.given;
-//import static 
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-//import static 
org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
-//import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
-//import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-//
-//@RunWith(SpringRunner.class)
-//@WebMvcTest(value = JobController.class, secure = false)
-//public class JobControllerTest {
-//    @Autowired
-//    private MockMvc mvc;
-//
-//    @MockBean
-//    private JobService service;
-//
-//    @Before
-//    public void setup() {
-//    }
-//
-//
-//    @Test
-//    public void testGetJobs() throws Exception {
-//        JobDataBean jobBean = new JobDataBean();
-//        jobBean.setJobName("job1");
-//        given(service.getAliveJobs()).willReturn(Arrays.asList(jobBean));
-//
-//        mvc.perform(get(URLHelper.API_VERSION_PATH + 
"/jobs/").contentType(MediaType.APPLICATION_JSON))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.[0].jobName", is("job1")));
-//    }
-//
-//    @Test
-//    public void testAddJobForSuccess() throws Exception {
-//        JobSchedule jobSchedule = new JobSchedule(1L, "jobName","0 0/4 * * * 
?", null,null);
-//        
given(service.addJob(jobSchedule)).willReturn(GriffinOperationMessage.CREATE_JOB_SUCCESS);
-//
-//        mvc.perform(post(URLHelper.API_VERSION_PATH + "/job")
-//                .contentType(MediaType.APPLICATION_JSON)
-//                .content("{\"measure.id\": 1,\"cron.expression\": \"0 0/4 * 
* * ?\"}"))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.code", is(205)))
-//                .andExpect(jsonPath("$.description", is("Create Job 
Succeed")))
-//                .andDo(print());
-//    }
-//
-//    @Test
-//    public void testAddJobForFail() throws Exception {
-//        Map configMap = new HashMap();
-//        configMap.put("interval", "1m");
-//        configMap.put("repeat", "2");
-//        JobSchedule jobSchedule = new JobSchedule(1L, "jobName","0 0/4 * * * 
?", configMap,null);
-//        
given(service.addJob(jobSchedule)).willReturn(GriffinOperationMessage.CREATE_JOB_FAIL);
-//
-//        mvc.perform(post(URLHelper.API_VERSION_PATH + "/job")
-//                .contentType(MediaType.APPLICATION_JSON)
-//                .content(JsonUtil.toJson(jobSchedule)))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.code", is(405)))
-//                .andExpect(jsonPath("$.description", is("Create Job 
Failed")))
-//                .andDo(print());
-//    }
-//
-//    @Test
-//    public void testDeleteJobForSuccess() throws Exception {
-//        String jobName = "job1";
-//        
given(service.deleteJob(jobName)).willReturn(GriffinOperationMessage.DELETE_JOB_SUCCESS);
-//
-//        mvc.perform(delete(URLHelper.API_VERSION_PATH + 
"/job").param("jobName", jobName))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.code", is(206)))
-//                .andExpect(jsonPath("$.description", is("Delete Job 
Succeed")));
-//    }
-//
-//    @Test
-//    public void testDeleteJobForFail() throws Exception {
-//        String jobName = "job1";
-//        
given(service.deleteJob(jobName)).willReturn(GriffinOperationMessage.DELETE_JOB_FAIL);
-//
-//        mvc.perform(delete(URLHelper.API_VERSION_PATH + 
"/job").param("jobName", jobName))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.code", is(406)))
-//                .andExpect(jsonPath("$.description", is("Delete Job 
Failed")));
-//    }
-//
-//    @Test
-//    public void testFindInstancesOfJob() throws Exception {
-//        int page = 0;
-//        int size = 2;
-//        JobInstanceBean jobInstance = new JobInstanceBean(1L,  
LivySessionStates.State.running, "", "", 
System.currentTimeMillis(),System.currentTimeMillis());
-//        given(service.findInstancesOfJob(1L, page, 
size)).willReturn(Arrays.asList(jobInstance));
-//
-//        mvc.perform(get(URLHelper.API_VERSION_PATH + 
"/jobs/instances").param("jobId",String.valueOf(1L))
-//                .param("page", String.valueOf(page)).param("size", 
String.valueOf(size)))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.[0].jobId", is(1)));
-//    }
-//
-//    @Test
-//    public void testGetHealthInfo() throws Exception {
-////        JobHealth jobHealth = new JobHealth(1, 3);
-////        given(service.getHealthInfo()).willReturn(jobHealth);
-////
-////        mvc.perform(get(URLHelper.API_VERSION_PATH + "/jobs/health"))
-////                .andExpect(status().isOk())
-////                .andExpect(jsonPath("$.healthyJobCount", is(1)));
-//    }
-//}
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.apache.griffin.core.job;
+
+import org.apache.griffin.core.job.entity.*;
+import org.apache.griffin.core.util.GriffinOperationMessage;
+import org.apache.griffin.core.util.JsonUtil;
+import org.apache.griffin.core.util.URLHelper;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.griffin.core.util.GriffinOperationMessage.*;
+import static org.hamcrest.CoreMatchers.is;
+import static org.mockito.BDDMockito.given;
+import static 
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static 
org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
+import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@RunWith(SpringRunner.class)
+@WebMvcTest(value = JobController.class, secure = false)
+public class JobControllerTest {
+    @Autowired
+    private MockMvc mvc;
+
+    @MockBean
+    private JobService service;
+
+    @Before
+    public void setup() {
+    }
+
+
+    @Test
+    public void testGetJobs() throws Exception {
+        JobDataBean jobBean = new JobDataBean();
+        jobBean.setJobName("job_name");
+        given(service.getAliveJobs()).willReturn(Arrays.asList(jobBean));
+
+        mvc.perform(get(URLHelper.API_VERSION_PATH + 
"/jobs").contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.[0].jobName", is("job_name")));
+    }
+
+    @Test
+    public void testAddJobForSuccess() throws Exception {
+        JobSchedule jobSchedule = new JobSchedule(1L, "jobName","0 0/4 * * * 
?","GMT+8:00", null);
+        given(service.addJob(jobSchedule)).willReturn(CREATE_JOB_SUCCESS);
+
+        mvc.perform(post(URLHelper.API_VERSION_PATH + "/jobs")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(JsonUtil.toJson(jobSchedule)))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(205)))
+                .andDo(print());
+    }
+
+    @Test
+    public void testAddJobForFailure() throws Exception {
+        JobSchedule jobSchedule = new JobSchedule(1L, "jobName","0 0/4 * * * 
?","GMT+8:00", null);
+        given(service.addJob(jobSchedule)).willReturn(CREATE_JOB_FAIL);
+
+        mvc.perform(post(URLHelper.API_VERSION_PATH + "/jobs")
+                .contentType(MediaType.APPLICATION_JSON)
+                .content(JsonUtil.toJson(jobSchedule)))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(405)))
+                .andDo(print());
+    }
+
+    @Test
+    public void testDeleteJobByIdForSuccess() throws Exception {
+        given(service.deleteJob(1L)).willReturn(DELETE_JOB_SUCCESS);
+
+        mvc.perform(delete(URLHelper.API_VERSION_PATH + "/jobs/1"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(206)));
+    }
+
+    @Test
+    public void testDeleteJobByIdForFailure() throws Exception {
+        given(service.deleteJob(1L)).willReturn(DELETE_JOB_FAIL);
+
+        mvc.perform(delete(URLHelper.API_VERSION_PATH + "/jobs/1"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(406)));
+    }
+
+    @Test
+    public void testDeleteJobByNameForSuccess() throws Exception {
+        String jobName = "jobName";
+        given(service.deleteJob(jobName)).willReturn(DELETE_JOB_SUCCESS);
+
+        mvc.perform(delete(URLHelper.API_VERSION_PATH + 
"/jobs").param("jobName",jobName))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(206)));
+    }
+
+    @Test
+    public void testDeleteJobByNameForFailure() throws Exception {
+        String jobName = "jobName";
+        given(service.deleteJob(jobName)).willReturn(DELETE_JOB_FAIL);
+
+        mvc.perform(delete(URLHelper.API_VERSION_PATH + 
"/jobs").param("jobName",jobName))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(406)));
+    }
+
+    @Test
+    public void testFindInstancesOfJob() throws Exception {
+        int page = 0;
+        int size = 2;
+        JobInstanceBean jobInstance = new JobInstanceBean(1L,  
LivySessionStates.State.running, "", "", null,null);
+        given(service.findInstancesOfJob(1L, page, 
size)).willReturn(Arrays.asList(jobInstance));
+
+        mvc.perform(get(URLHelper.API_VERSION_PATH + 
"/jobs/instances").param("jobId",String.valueOf(1L))
+                .param("page", String.valueOf(page)).param("size", 
String.valueOf(size)))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.[0].state", is("running")));
+    }
+
+    @Test
+    public void testGetHealthInfo() throws Exception {
+        JobHealth jobHealth = new JobHealth(1, 3);
+        given(service.getHealthInfo()).willReturn(jobHealth);
+
+        mvc.perform(get(URLHelper.API_VERSION_PATH + "/jobs/health"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.healthyJobCount", is(1)));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/test/java/org/apache/griffin/core/job/repo/JobInstanceRepoTest.java
----------------------------------------------------------------------
diff --git 
a/service/src/test/java/org/apache/griffin/core/job/repo/JobInstanceRepoTest.java
 
b/service/src/test/java/org/apache/griffin/core/job/repo/JobInstanceRepoTest.java
new file mode 100644
index 0000000..72dbc8c
--- /dev/null
+++ 
b/service/src/test/java/org/apache/griffin/core/job/repo/JobInstanceRepoTest.java
@@ -0,0 +1,87 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.apache.griffin.core.job.repo;
+
+import org.apache.griffin.core.job.entity.JobInstanceBean;
+import org.apache.griffin.core.job.entity.LivySessionStates;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
+import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@DataJpaTest
+public class JobInstanceRepoTest {
+
+    @Autowired
+    private TestEntityManager entityManager;
+
+    @Autowired
+    private JobInstanceRepo jobInstanceRepo;
+
+    @Before
+    public void setup() {
+        entityManager.clear();
+        entityManager.flush();
+        setEntityManager();
+    }
+
+    @Test
+    public void testFindByActiveState() {
+        List<JobInstanceBean> beans = jobInstanceRepo.findByActiveState();
+        assertThat(beans.size()).isEqualTo(1);
+    }
+
+    @Test
+    public void testFindByPredicateName() {
+        JobInstanceBean bean = jobInstanceRepo.findByPredicateName("pName1");
+        assertThat(bean).isNotNull();
+    }
+
+    @Test
+    public void testFindByExpireTmsLessThanEqual() {
+        List<JobInstanceBean> beans = 
jobInstanceRepo.findByExpireTmsLessThanEqual(1516004640092L);
+        assertThat(beans.size()).isEqualTo(2);
+    }
+
+    @Test
+    public void testDeleteByExpireTimestamp() {
+        int count = jobInstanceRepo.deleteByExpireTimestamp(1516004640092L);
+        assertThat(count).isEqualTo(2);
+    }
+
+    private void setEntityManager() {
+        JobInstanceBean bean1 = new JobInstanceBean( 
LivySessionStates.State.finding, "pName1", "pGroup1", null, 1516004640092L);
+        JobInstanceBean bean2 = new JobInstanceBean( 
LivySessionStates.State.not_found, "pName2", "pGroup2", null, 1516004640093L);
+        JobInstanceBean bean3 = new JobInstanceBean( 
LivySessionStates.State.running, "pName3", "pGroup3", null, 1516004640082L);
+        JobInstanceBean bean4 = new JobInstanceBean( 
LivySessionStates.State.success, "pName4", "pGroup4", null, 1516004640094L);
+        entityManager.persistAndFlush(bean1);
+        entityManager.persistAndFlush(bean2);
+        entityManager.persistAndFlush(bean3);
+        entityManager.persistAndFlush(bean4);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/test/java/org/apache/griffin/core/measure/MeasureControllerTest.java
----------------------------------------------------------------------
diff --git 
a/service/src/test/java/org/apache/griffin/core/measure/MeasureControllerTest.java
 
b/service/src/test/java/org/apache/griffin/core/measure/MeasureControllerTest.java
index 2abd4b5..82a9ff9 100644
--- 
a/service/src/test/java/org/apache/griffin/core/measure/MeasureControllerTest.java
+++ 
b/service/src/test/java/org/apache/griffin/core/measure/MeasureControllerTest.java
@@ -1,200 +1,198 @@
-///*
-//Licensed to the Apache Software Foundation (ASF) under one
-//or more contributor license agreements.  See the NOTICE file
-//distributed with this work for additional information
-//regarding copyright ownership.  The ASF licenses this file
-//to you under the Apache License, Version 2.0 (the
-//"License"); you may not use this file except in compliance
-//with the License.  You may obtain a copy of the License at
-//
-//  http://www.apache.org/licenses/LICENSE-2.0
-//
-//Unless required by applicable law or agreed to in writing,
-//software distributed under the License is distributed on an
-//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-//KIND, either express or implied.  See the License for the
-//specific language governing permissions and limitations
-//under the License.
-//*/
-//
-//package org.apache.griffin.core.measure;
-//
-//import org.apache.griffin.core.measure.entity.Measure;
-//import org.apache.griffin.core.util.GriffinOperationMessage;
-//import org.apache.griffin.core.util.JsonUtil;
-//import org.apache.griffin.core.util.URLHelper;
-//import org.junit.Before;
-//import org.junit.Test;
-//import org.junit.runner.RunWith;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
-//import org.springframework.boot.test.mock.mockito.MockBean;
-//import org.springframework.http.MediaType;
-//import org.springframework.test.context.junit4.SpringRunner;
-//import org.springframework.test.web.servlet.MockMvc;
-//
-//import java.util.*;
-//
-//import static 
org.apache.griffin.core.measure.MeasureTestHelper.createATestGriffinMeasure;
-//import static org.hamcrest.CoreMatchers.is;
-//import static org.mockito.BDDMockito.given;
-//import static 
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
-//import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
-//import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
-//
-//@RunWith(SpringRunner.class)
-//@WebMvcTest(value = MeasureController.class, secure = false)
-//public class MeasureControllerTest {
-//    @Autowired
-//    private MockMvc mvc;
-//
-//    @MockBean
-//    private MeasureService service;
-//
-//
-//    @Before
-//    public void setup() {
-//
-//    }
-//
-//    @Test
-//    public void testGetAllMeasures() throws Exception {
-//        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
-//        
given(service.getAllAliveMeasures()).willReturn(Arrays.asList(measure));
-//
-//        mvc.perform(get(URLHelper.API_VERSION_PATH + 
"/measures").contentType(MediaType.APPLICATION_JSON))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.[0].name", is("view_item_hourly")));
-//    }
-//
-//
-//    @Test
-//    public void testGetMeasuresById() throws Exception {
-//        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
-//        given(service.getMeasureById(1L)).willReturn(measure);
-//
-//        mvc.perform(get(URLHelper.API_VERSION_PATH + 
"/measure/1").contentType(MediaType.APPLICATION_JSON))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.name", is("view_item_hourly")))
-//        ;
-//    }
-//
-//    @Test
-//    public void testDeleteMeasuresByIdForSuccess() throws Exception {
-//        
given(service.deleteMeasureById(1L)).willReturn(GriffinOperationMessage.DELETE_MEASURE_BY_ID_SUCCESS);
-//
-//        mvc.perform(delete(URLHelper.API_VERSION_PATH + 
"/measure/1").contentType(MediaType.APPLICATION_JSON))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.description", is("Delete Measures By 
Id Succeed")))
-//                .andExpect(jsonPath("$.code", is(202)));
-//    }
-//
-//    @Test
-//    public void testDeleteMeasuresByIdForNotFound() throws Exception {
-//        
given(service.deleteMeasureById(1L)).willReturn(GriffinOperationMessage.RESOURCE_NOT_FOUND);
-//
-//        mvc.perform(delete(URLHelper.API_VERSION_PATH + 
"/measure/1").contentType(MediaType.APPLICATION_JSON))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.description", is("Resource Not 
Found")))
-//                .andExpect(jsonPath("$.code", is(400)));
-//    }
-//
-//    @Test
-//    public void testDeleteMeasuresByIdForFail() throws Exception {
-//        
given(service.deleteMeasureById(1L)).willReturn(GriffinOperationMessage.DELETE_MEASURE_BY_ID_FAIL);
-//
-//        mvc.perform(delete(URLHelper.API_VERSION_PATH + 
"/measure/1").contentType(MediaType.APPLICATION_JSON))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.description", is("Delete Measures By 
Id Failed")))
-//                .andExpect(jsonPath("$.code", is(402)));
-//    }
-//
-//    @Test
-//    public void testUpdateMeasureForSuccess() throws Exception {
-//        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
-//        String measureJson = JsonUtil.toJson(measure);
-//        
given(service.updateMeasure(measure)).willReturn(GriffinOperationMessage.UPDATE_MEASURE_SUCCESS);
-//
-//        mvc.perform(put(URLHelper.API_VERSION_PATH + 
"/measure").contentType(MediaType.APPLICATION_JSON).content(measureJson))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.description", is("Update Measure 
Succeed")))
-//                .andExpect(jsonPath("$.code", is(204)));
-//    }
-//
-//    @Test
-//    public void testUpdateMeasureForNotFound() throws Exception {
-//        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
-//        String measureJson = JsonUtil.toJson(measure);
-//        
given(service.updateMeasure(measure)).willReturn(GriffinOperationMessage.RESOURCE_NOT_FOUND);
-//
-//        mvc.perform(put(URLHelper.API_VERSION_PATH + 
"/measure").contentType(MediaType.APPLICATION_JSON).content(measureJson))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.description", is("Resource Not 
Found")))
-//                .andExpect(jsonPath("$.code", is(400)));
-//
-//    }
-//
-//    @Test
-//    public void testUpdateMeasureForFail() throws Exception {
-//        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
-//        String measureJson = JsonUtil.toJson(measure);
-//        
given(service.updateMeasure(measure)).willReturn(GriffinOperationMessage.UPDATE_MEASURE_FAIL);
-//
-//        mvc.perform(put(URLHelper.API_VERSION_PATH + 
"/measure").contentType(MediaType.APPLICATION_JSON).content(measureJson))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.description", is("Update Measure 
Failed")))
-//                .andExpect(jsonPath("$.code", is(404)));
-//    }
-//
-//    @Test
-//    public void testGetAllMeasuresByOwner() throws Exception {
-//        String owner = "test";
-//        List<Measure> measureList = new LinkedList<>();
-//        Measure measure = createATestGriffinMeasure("view_item_hourly", 
owner);
-//        measureList.add(measure);
-//        
given(service.getAliveMeasuresByOwner(owner)).willReturn(measureList);
-//
-//        mvc.perform(get(URLHelper.API_VERSION_PATH + "/measures/owner/" + 
owner).contentType(MediaType.APPLICATION_JSON))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.[0].name", is("view_item_hourly")))
-//        ;
-//    }
-//
-//    @Test
-//    public void testCreateNewMeasureForSuccess() throws Exception {
-//        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
-//        String measureJson = JsonUtil.toJson(measure);
-//        
given(service.createMeasure(measure)).willReturn(GriffinOperationMessage.CREATE_MEASURE_SUCCESS);
-//
-//        mvc.perform(post(URLHelper.API_VERSION_PATH + 
"/measure").contentType(MediaType.APPLICATION_JSON).content(measureJson))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.description", is("Create Measure 
Succeed")))
-//                .andExpect(jsonPath("$.code", is(201)));
-//    }
-//
-//    @Test
-//    public void testCreateNewMeasureForFailWithDuplicate() throws Exception {
-//        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
-//        String measureJson = JsonUtil.toJson(measure);
-//        
given(service.createMeasure(measure)).willReturn(GriffinOperationMessage.CREATE_MEASURE_FAIL_DUPLICATE);
-//
-//        mvc.perform(post(URLHelper.API_VERSION_PATH + 
"/measure").contentType(MediaType.APPLICATION_JSON).content(measureJson))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.description", is("Create Measure 
Failed, duplicate records")))
-//                .andExpect(jsonPath("$.code", is(410)));
-//    }
-//
-//    @Test
-//    public void testCreateNewMeasureForFailWithSaveException() throws 
Exception {
-//        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
-//        String measureJson = JsonUtil.toJson(measure);
-//        
given(service.createMeasure(measure)).willReturn(GriffinOperationMessage.CREATE_MEASURE_FAIL);
-//
-//        mvc.perform(post(URLHelper.API_VERSION_PATH + 
"/measure").contentType(MediaType.APPLICATION_JSON).content(measureJson))
-//                .andExpect(status().isOk())
-//                .andExpect(jsonPath("$.description", is("Create Measure 
Failed")))
-//                .andExpect(jsonPath("$.code", is(401)));
-//    }
-//
-//
-//}
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.apache.griffin.core.measure;
+
+import org.apache.griffin.core.measure.entity.Measure;
+import org.apache.griffin.core.util.GriffinOperationMessage;
+import org.apache.griffin.core.util.JsonUtil;
+import org.apache.griffin.core.util.URLHelper;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+import java.util.*;
+
+import static 
org.apache.griffin.core.util.EntityHelper.createATestGriffinMeasure;
+import static org.apache.griffin.core.util.GriffinOperationMessage.*;
+import static org.hamcrest.CoreMatchers.is;
+import static org.mockito.BDDMockito.given;
+import static 
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
+import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static 
org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@RunWith(SpringRunner.class)
+@WebMvcTest(value = MeasureController.class, secure = false)
+public class MeasureControllerTest {
+    @Autowired
+    private MockMvc mvc;
+
+    @MockBean
+    private MeasureService service;
+
+
+    @Before
+    public void setup() {
+
+    }
+
+    @Test
+    public void testGetAllMeasures() throws Exception {
+        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
+        
given(service.getAllAliveMeasures()).willReturn(Arrays.asList(measure));
+
+        mvc.perform(get(URLHelper.API_VERSION_PATH + "/measures"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.[0].name", is("view_item_hourly")));
+    }
+
+
+    @Test
+    public void testGetMeasuresById() throws Exception {
+        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
+        given(service.getMeasureById(1L)).willReturn(measure);
+
+        mvc.perform(get(URLHelper.API_VERSION_PATH + "/measures/1"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.name", is("view_item_hourly")))
+        ;
+    }
+
+    @Test
+    public void testDeleteMeasuresByIdForSuccess() throws Exception {
+        
given(service.deleteMeasureById(1L)).willReturn(DELETE_MEASURE_BY_ID_SUCCESS);
+
+        mvc.perform(delete(URLHelper.API_VERSION_PATH + "/measures/1"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(202)));
+    }
+
+    @Test
+    public void testDeleteMeasuresByIdForNotFound() throws Exception {
+        given(service.deleteMeasureById(1L)).willReturn(RESOURCE_NOT_FOUND);
+
+        mvc.perform(delete(URLHelper.API_VERSION_PATH + "/measures/1"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(400)));
+    }
+
+    @Test
+    public void testDeleteMeasuresByIdForFail() throws Exception {
+        
given(service.deleteMeasureById(1L)).willReturn(DELETE_MEASURE_BY_ID_FAIL);
+
+        mvc.perform(delete(URLHelper.API_VERSION_PATH + "/measures/1"))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(402)));
+    }
+
+    @Test
+    public void testUpdateMeasureForSuccess() throws Exception {
+        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
+        String measureJson = JsonUtil.toJson(measure);
+        
given(service.updateMeasure(measure)).willReturn(UPDATE_MEASURE_SUCCESS);
+
+        mvc.perform(put(URLHelper.API_VERSION_PATH + "/measures")
+                .contentType(MediaType.APPLICATION_JSON).content(measureJson))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(204)));
+    }
+
+    @Test
+    public void testUpdateMeasureForNotFound() throws Exception {
+        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
+        String measureJson = JsonUtil.toJson(measure);
+        given(service.updateMeasure(measure)).willReturn(RESOURCE_NOT_FOUND);
+
+        mvc.perform(put(URLHelper.API_VERSION_PATH + "/measures")
+                .contentType(MediaType.APPLICATION_JSON).content(measureJson))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(400)));
+
+    }
+
+    @Test
+    public void testUpdateMeasureForFail() throws Exception {
+        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
+        String measureJson = JsonUtil.toJson(measure);
+        given(service.updateMeasure(measure)).willReturn(UPDATE_MEASURE_FAIL);
+
+        mvc.perform(put(URLHelper.API_VERSION_PATH + "/measures")
+                .contentType(MediaType.APPLICATION_JSON).content(measureJson))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(404)));
+    }
+
+    @Test
+    public void testGetAllMeasuresByOwner() throws Exception {
+        String owner = "test";
+        List<Measure> measureList = new LinkedList<>();
+        Measure measure = createATestGriffinMeasure("view_item_hourly", owner);
+        measureList.add(measure);
+        given(service.getAliveMeasuresByOwner(owner)).willReturn(measureList);
+
+        mvc.perform(get(URLHelper.API_VERSION_PATH + "/measures/owner/" + 
owner)
+                .contentType(MediaType.APPLICATION_JSON))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.[0].name", is("view_item_hourly")))
+        ;
+    }
+
+    @Test
+    public void testCreateNewMeasureForSuccess() throws Exception {
+        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
+        String measureJson = JsonUtil.toJson(measure);
+        
given(service.createMeasure(measure)).willReturn(CREATE_MEASURE_SUCCESS);
+
+        mvc.perform(post(URLHelper.API_VERSION_PATH + "/measures")
+                .contentType(MediaType.APPLICATION_JSON).content(measureJson))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(201)));
+    }
+
+    @Test
+    public void testCreateNewMeasureForFailWithDuplicate() throws Exception {
+        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
+        String measureJson = JsonUtil.toJson(measure);
+        
given(service.createMeasure(measure)).willReturn(CREATE_MEASURE_FAIL_DUPLICATE);
+
+        mvc.perform(post(URLHelper.API_VERSION_PATH + "/measures")
+                .contentType(MediaType.APPLICATION_JSON).content(measureJson))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(410)));
+    }
+
+    @Test
+    public void testCreateNewMeasureForFailWithSaveException() throws 
Exception {
+        Measure measure = createATestGriffinMeasure("view_item_hourly", 
"test");
+        String measureJson = JsonUtil.toJson(measure);
+        
given(service.createMeasure(measure)).willReturn(GriffinOperationMessage.CREATE_MEASURE_FAIL);
+
+        mvc.perform(post(URLHelper.API_VERSION_PATH + 
"/measures").contentType(MediaType.APPLICATION_JSON).content(measureJson))
+                .andExpect(status().isOk())
+                .andExpect(jsonPath("$.code", is(401)));
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgControllerTest.java
----------------------------------------------------------------------
diff --git 
a/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgControllerTest.java
 
b/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgControllerTest.java
index bd3e2dc..df7fdca 100644
--- 
a/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgControllerTest.java
+++ 
b/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgControllerTest.java
@@ -34,7 +34,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import static 
org.apache.griffin.core.measure.MeasureTestHelper.createJobDetailMap;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
 import static org.hamcrest.Matchers.hasKey;

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgServiceImplTest.java
----------------------------------------------------------------------
diff --git 
a/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgServiceImplTest.java
 
b/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgServiceImplTest.java
index e69bec3..7eda50e 100644
--- 
a/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgServiceImplTest.java
+++ 
b/service/src/test/java/org/apache/griffin/core/measure/MeasureOrgServiceImplTest.java
@@ -31,8 +31,8 @@
 //import java.io.Serializable;
 //import java.util.*;
 //
-//import static 
org.apache.griffin.core.measure.MeasureTestHelper.createATestGriffinMeasure;
-//import static 
org.apache.griffin.core.measure.MeasureTestHelper.createJobDetailMap;
+//import static 
org.apache.griffin.core.util.EntityHelper.createATestGriffinMeasure;
+//import static org.apache.griffin.core.util.EntityHelper.createJobDetailMap;
 //import static org.assertj.core.api.Assertions.assertThat;
 //import static org.mockito.BDDMockito.given;
 //import static org.mockito.Mockito.when;

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/test/java/org/apache/griffin/core/measure/MeasureServiceImplTest.java
----------------------------------------------------------------------
diff --git 
a/service/src/test/java/org/apache/griffin/core/measure/MeasureServiceImplTest.java
 
b/service/src/test/java/org/apache/griffin/core/measure/MeasureServiceImplTest.java
index 659626a..c49ee82 100644
--- 
a/service/src/test/java/org/apache/griffin/core/measure/MeasureServiceImplTest.java
+++ 
b/service/src/test/java/org/apache/griffin/core/measure/MeasureServiceImplTest.java
@@ -21,8 +21,6 @@ package org.apache.griffin.core.measure;
 
 
 import org.apache.griffin.core.job.JobServiceImpl;
-import org.apache.griffin.core.measure.entity.DataConnector;
-import org.apache.griffin.core.measure.entity.GriffinMeasure;
 import org.apache.griffin.core.measure.entity.Measure;
 import org.apache.griffin.core.measure.repo.DataConnectorRepo;
 import org.apache.griffin.core.measure.repo.MeasureRepo;
@@ -31,7 +29,6 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.InjectMocks;
-import org.mockito.Matchers;
 import org.mockito.Mock;
 import org.springframework.test.context.junit4.SpringRunner;
 
@@ -39,11 +36,10 @@ import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
 
-import static 
org.apache.griffin.core.measure.MeasureTestHelper.createATestGriffinMeasure;
+import static 
org.apache.griffin.core.util.EntityHelper.createATestGriffinMeasure;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.doNothing;
 
 @RunWith(SpringRunner.class)
 public class MeasureServiceImplTest {

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/test/java/org/apache/griffin/core/measure/MeasureTestHelper.java
----------------------------------------------------------------------
diff --git 
a/service/src/test/java/org/apache/griffin/core/measure/MeasureTestHelper.java 
b/service/src/test/java/org/apache/griffin/core/measure/MeasureTestHelper.java
deleted file mode 100644
index dc9a659..0000000
--- 
a/service/src/test/java/org/apache/griffin/core/measure/MeasureTestHelper.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.griffin.core.measure;
-
-
-import org.apache.griffin.core.measure.entity.*;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.quartz.JobDataMap;
-import org.quartz.Trigger;
-import org.quartz.impl.JobDetailImpl;
-
-import java.io.Serializable;
-import java.util.*;
-
-public class MeasureTestHelper {
-    public static GriffinMeasure createATestGriffinMeasure(String name, String 
org) throws Exception {
-        HashMap<String, String> configMap1 = new HashMap<>();
-        configMap1.put("database", "default");
-        configMap1.put("table.name", "test_data_src");
-        HashMap<String, String> configMap2 = new HashMap<>();
-        configMap2.put("database", "default");
-        configMap2.put("table.name", "test_data_tgt");
-        String configJson1 = new ObjectMapper().writeValueAsString(configMap1);
-        String configJson2 = new ObjectMapper().writeValueAsString(configMap2);
-
-        DataSource dataSource = new DataSource("source", Arrays.asList(new 
DataConnector("source_name", "HIVE", "1.2", configJson1)));
-        DataSource targetSource = new DataSource("target", Arrays.asList(new 
DataConnector("target-name", "HIVE", "1.2", configJson2)));
-
-        List<DataSource> dataSources = new ArrayList<>();
-        dataSources.add(dataSource);
-        dataSources.add(targetSource);
-        String rules = "source.id=target.id AND source.name=target.name AND 
source.age=target.age";
-        Map<String, Object> map = new HashMap<>();
-        map.put("detail", "detail info");
-        Rule rule = new Rule("griffin-dsl", "accuracy", rules, map);
-        EvaluateRule evaluateRule = new EvaluateRule(Arrays.asList(rule));
-        return new GriffinMeasure(1L,name, "description", org, "batch", 
"test", dataSources, evaluateRule);
-    }
-
-    public static JobDetailImpl createJobDetail() {
-        JobDetailImpl jobDetail = new JobDetailImpl();
-        JobDataMap jobInfoMap = new JobDataMap();
-        jobInfoMap.put("triggerState", Trigger.TriggerState.NORMAL);
-        jobInfoMap.put("measureId", "1");
-        jobInfoMap.put("sourcePattern", "YYYYMMdd-HH");
-        jobInfoMap.put("targetPattern", "YYYYMMdd-HH");
-        jobInfoMap.put("jobStartTime", "1506356105876");
-        jobInfoMap.put("interval", "3000");
-        jobInfoMap.put("deleted", "false");
-        jobInfoMap.put("blockStartTimestamp", "1506634804254");
-        jobInfoMap.put("lastBlockStartTimestamp", "1506634804254");
-        jobInfoMap.put("groupName", "BA");
-        jobInfoMap.put("jobName", "jobName");
-        jobDetail.setJobDataMap(jobInfoMap);
-        return jobDetail;
-    }
-
-    public static Map<String, Object> createJobDetailMap() {
-        Map<String, Object> jobDetailMap = new HashMap<>();
-        jobDetailMap.put("jobName", "jobName");
-        jobDetailMap.put("measureId", "1");
-        jobDetailMap.put("groupName", "BA");
-        jobDetailMap.put("targetPattern", "YYYYMMdd-HH");
-        jobDetailMap.put("triggerState", Trigger.TriggerState.NORMAL);
-        jobDetailMap.put("nextFireTime", "1509613440000");
-        jobDetailMap.put("previousFireTime", "1509613410000");
-        jobDetailMap.put("interval", "3000");
-        jobDetailMap.put("sourcePattern", "YYYYMMdd-HH");
-        jobDetailMap.put("jobStartTime", "1506356105876");
-        return jobDetailMap;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/test/java/org/apache/griffin/core/measure/repo/MeasureRepoTest.java
----------------------------------------------------------------------
diff --git 
a/service/src/test/java/org/apache/griffin/core/measure/repo/MeasureRepoTest.java
 
b/service/src/test/java/org/apache/griffin/core/measure/repo/MeasureRepoTest.java
index 4052630..c7132e6 100644
--- 
a/service/src/test/java/org/apache/griffin/core/measure/repo/MeasureRepoTest.java
+++ 
b/service/src/test/java/org/apache/griffin/core/measure/repo/MeasureRepoTest.java
@@ -30,7 +30,7 @@
 //
 //import java.util.List;
 //
-//import static 
org.apache.griffin.core.measure.MeasureTestHelper.createATestGriffinMeasure;
+//import static 
org.apache.griffin.core.util.EntityHelper.createATestGriffinMeasure;
 //import static org.assertj.core.api.Assertions.assertThat;
 //
 //@RunWith(SpringRunner.class)

http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/44eea866/service/src/test/java/org/apache/griffin/core/util/EntityHelper.java
----------------------------------------------------------------------
diff --git 
a/service/src/test/java/org/apache/griffin/core/util/EntityHelper.java 
b/service/src/test/java/org/apache/griffin/core/util/EntityHelper.java
new file mode 100644
index 0000000..627325c
--- /dev/null
+++ b/service/src/test/java/org/apache/griffin/core/util/EntityHelper.java
@@ -0,0 +1,89 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+
+package org.apache.griffin.core.util;
+
+
+import org.apache.griffin.core.measure.entity.*;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.quartz.JobDataMap;
+import org.quartz.Trigger;
+import org.quartz.impl.JobDetailImpl;
+
+import java.io.Serializable;
+import java.util.*;
+
+public class EntityHelper {
+    public static GriffinMeasure createATestGriffinMeasure(String name, String 
org) throws Exception {
+        HashMap<String, String> configMap1 = new HashMap<>();
+        configMap1.put("database", "default");
+        configMap1.put("table.name", "test_data_src");
+        HashMap<String, String> configMap2 = new HashMap<>();
+        configMap2.put("database", "default");
+        configMap2.put("table.name", "test_data_tgt");
+        String configJson1 = new ObjectMapper().writeValueAsString(configMap1);
+        String configJson2 = new ObjectMapper().writeValueAsString(configMap2);
+
+        DataSource dataSource = new DataSource("source", Arrays.asList(new 
DataConnector("source_name", "HIVE", "1.2", configJson1)));
+        DataSource targetSource = new DataSource("target", Arrays.asList(new 
DataConnector("target-name", "HIVE", "1.2", configJson2)));
+
+        List<DataSource> dataSources = new ArrayList<>();
+        dataSources.add(dataSource);
+        dataSources.add(targetSource);
+        String rules = "source.id=target.id AND source.name=target.name AND 
source.age=target.age";
+        Map<String, Object> map = new HashMap<>();
+        map.put("detail", "detail info");
+        Rule rule = new Rule("griffin-dsl", "accuracy", rules, map);
+        EvaluateRule evaluateRule = new EvaluateRule(Arrays.asList(rule));
+        return new GriffinMeasure(1L,name, "description", org, "batch", 
"test", dataSources, evaluateRule);
+    }
+
+    public static JobDetailImpl createJobDetail() {
+        JobDetailImpl jobDetail = new JobDetailImpl();
+        JobDataMap jobInfoMap = new JobDataMap();
+        jobInfoMap.put("triggerState", Trigger.TriggerState.NORMAL);
+        jobInfoMap.put("measureId", "1");
+        jobInfoMap.put("sourcePattern", "YYYYMMdd-HH");
+        jobInfoMap.put("targetPattern", "YYYYMMdd-HH");
+        jobInfoMap.put("jobStartTime", "1506356105876");
+        jobInfoMap.put("interval", "3000");
+        jobInfoMap.put("deleted", "false");
+        jobInfoMap.put("blockStartTimestamp", "1506634804254");
+        jobInfoMap.put("lastBlockStartTimestamp", "1506634804254");
+        jobInfoMap.put("groupName", "BA");
+        jobInfoMap.put("jobName", "jobName");
+        jobDetail.setJobDataMap(jobInfoMap);
+        return jobDetail;
+    }
+
+    public static Map<String, Object> createJobDetailMap() {
+        Map<String, Object> jobDetailMap = new HashMap<>();
+        jobDetailMap.put("jobName", "jobName");
+        jobDetailMap.put("measureId", "1");
+        jobDetailMap.put("groupName", "BA");
+        jobDetailMap.put("targetPattern", "YYYYMMdd-HH");
+        jobDetailMap.put("triggerState", Trigger.TriggerState.NORMAL);
+        jobDetailMap.put("nextFireTime", "1509613440000");
+        jobDetailMap.put("previousFireTime", "1509613410000");
+        jobDetailMap.put("interval", "3000");
+        jobDetailMap.put("sourcePattern", "YYYYMMdd-HH");
+        jobDetailMap.put("jobStartTime", "1506356105876");
+        return jobDetailMap;
+    }
+}

Reply via email to