Repository: incubator-griffin Updated Branches: refs/heads/master ada0add95 -> 4a9137d2e
fix repeat submission and update griffin version 1.fix front repeat submission 2.update griffin return version Author: ahutsunshine <[email protected]> Author: He Wang <[email protected]> Author: dodobel <[email protected]> Closes #227 from ahutsunshine/master. Project: http://git-wip-us.apache.org/repos/asf/incubator-griffin/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-griffin/commit/4a9137d2 Tree: http://git-wip-us.apache.org/repos/asf/incubator-griffin/tree/4a9137d2 Diff: http://git-wip-us.apache.org/repos/asf/incubator-griffin/diff/4a9137d2 Branch: refs/heads/master Commit: 4a9137d2eefddb11999a10d59a177314eeb5798f Parents: ada0add Author: ahutsunshine <[email protected]> Authored: Thu Mar 1 16:47:47 2018 +0800 Committer: Lionel Liu <[email protected]> Committed: Thu Mar 1 16:47:47 2018 +0800 ---------------------------------------------------------------------- .../core/info/GriffinInfoController.java | 2 +- .../apache/griffin/core/interceptor/Token.java | 28 ++++++++ .../core/interceptor/TokenInterceptor.java | 74 ++++++++++++++++++++ .../core/interceptor/WebAppConfigurer.java | 33 +++++++++ .../apache/griffin/core/job/JobController.java | 2 + .../apache/griffin/core/job/JobInstance.java | 2 + .../apache/griffin/core/job/JobServiceImpl.java | 2 + .../apache/griffin/core/job/SparkSubmitJob.java | 14 ++-- .../griffin/core/measure/MeasureController.java | 2 + .../measure/entity/AbstractAuditableEntity.java | 15 ++-- .../griffin/core/metric/MetricServiceImpl.java | 2 +- .../core/info/GriffinInfoControllerTest.java | 2 +- 12 files changed, 160 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/service/src/main/java/org/apache/griffin/core/info/GriffinInfoController.java ---------------------------------------------------------------------- diff --git a/service/src/main/java/org/apache/griffin/core/info/GriffinInfoController.java b/service/src/main/java/org/apache/griffin/core/info/GriffinInfoController.java index a3d403a..5c3c87a 100644 --- a/service/src/main/java/org/apache/griffin/core/info/GriffinInfoController.java +++ b/service/src/main/java/org/apache/griffin/core/info/GriffinInfoController.java @@ -29,6 +29,6 @@ public class GriffinInfoController { @RequestMapping(value = "/version", method = RequestMethod.GET) public String greeting() { - return "0.1.0"; + return "0.2.0"; } } http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/service/src/main/java/org/apache/griffin/core/interceptor/Token.java ---------------------------------------------------------------------- diff --git a/service/src/main/java/org/apache/griffin/core/interceptor/Token.java b/service/src/main/java/org/apache/griffin/core/interceptor/Token.java new file mode 100644 index 0000000..440d2a3 --- /dev/null +++ b/service/src/main/java/org/apache/griffin/core/interceptor/Token.java @@ -0,0 +1,28 @@ +/* +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.interceptor; + +import java.lang.annotation.*; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Token { +} http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/service/src/main/java/org/apache/griffin/core/interceptor/TokenInterceptor.java ---------------------------------------------------------------------- diff --git a/service/src/main/java/org/apache/griffin/core/interceptor/TokenInterceptor.java b/service/src/main/java/org/apache/griffin/core/interceptor/TokenInterceptor.java new file mode 100644 index 0000000..2e1ea39 --- /dev/null +++ b/service/src/main/java/org/apache/griffin/core/interceptor/TokenInterceptor.java @@ -0,0 +1,74 @@ +/* +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.interceptor; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.lang.reflect.Method; + +public class TokenInterceptor extends HandlerInterceptorAdapter { + private static final Logger LOGGER = LoggerFactory.getLogger(TokenInterceptor.class); + private static final String TOKEN = "token"; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (handler instanceof HandlerMethod) { + Method method = ((HandlerMethod) handler).getMethod(); + Token annotation = method.getAnnotation(Token.class); + if (annotation != null) { + if (isRepeatSubmit(request)) { + LOGGER.warn("Please don't repeat submit url {}.", request.getServletPath()); + return false; + } + return true; + } + return true; + } else { + return super.preHandle(request, response, handler); + } + + } + + private boolean isRepeatSubmit(HttpServletRequest request) { + String curToken = request.getHeader(TOKEN); + HttpSession session = request.getSession(); + Object preToken = session.getAttribute(TOKEN); + //if http header has no token,we ignore to deal with repeated submission. + if (curToken == null) { + return false; + } else if (preToken == null) { + session.setAttribute(TOKEN, curToken); + return false; + } else { + if (preToken.toString().equals(curToken)) { + return true; + } else { + session.setAttribute(TOKEN, curToken); + return false; + } + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/service/src/main/java/org/apache/griffin/core/interceptor/WebAppConfigurer.java ---------------------------------------------------------------------- diff --git a/service/src/main/java/org/apache/griffin/core/interceptor/WebAppConfigurer.java b/service/src/main/java/org/apache/griffin/core/interceptor/WebAppConfigurer.java new file mode 100644 index 0000000..4347c52 --- /dev/null +++ b/service/src/main/java/org/apache/griffin/core/interceptor/WebAppConfigurer.java @@ -0,0 +1,33 @@ +/* +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.interceptor; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +public class WebAppConfigurer extends WebMvcConfigurerAdapter { + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/api/v1/measures").addPathPatterns("/api/v1/jobs"); + super.addInterceptors(registry); + } +} http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/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 2d09d8b..37bac4f 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 @@ -19,6 +19,7 @@ under the License. package org.apache.griffin.core.job; +import org.apache.griffin.core.interceptor.Token; import org.apache.griffin.core.job.entity.JobDataBean; import org.apache.griffin.core.job.entity.JobHealth; import org.apache.griffin.core.job.entity.JobInstanceBean; @@ -48,6 +49,7 @@ public class JobController { @RequestMapping(value = "/jobs", method = RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) + @Token public JobSchedule addJob(@RequestBody JobSchedule jobSchedule) throws Exception { return jobService.addJob(jobSchedule); } http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/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 8df02af..f30bc0e 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 @@ -101,6 +101,7 @@ public class JobInstance implements Job { } + @SuppressWarnings("unchecked") private void setJobStartTime(JobDetail jobDetail) throws SchedulerException { Scheduler scheduler = factory.getScheduler(); JobKey jobKey = jobDetail.getKey(); @@ -223,6 +224,7 @@ public class JobInstance implements Job { return TimeZone.getTimeZone(timezone); } + @SuppressWarnings("unchecked") private boolean createJobInstance(Map<String, Object> confMap) throws Exception { Map<String, Object> config = (Map<String, Object>) confMap.get("checkdonefile.schedule"); Long interval = TimeUtil.str2Long((String) config.get("interval")); http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/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 af1312c..e671c47 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 @@ -104,6 +104,7 @@ public class JobServiceImpl implements JobService { return dataList; } + @SuppressWarnings("unchecked") private JobDataBean genJobData(JobKey jobKey, GriffinJob job) throws SchedulerException { Scheduler scheduler = factory.getScheduler(); List<Trigger> triggers = (List<Trigger>) scheduler.getTriggersOfJob(jobKey); @@ -538,6 +539,7 @@ public class JobServiceImpl implements JobService { return jobHealth; } + @SuppressWarnings("unchecked") private List<Trigger> getTriggers(GriffinJob job) { JobKey jobKey = new JobKey(job.getQuartzName(), job.getQuartzGroup()); List<Trigger> triggers; http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/service/src/main/java/org/apache/griffin/core/job/SparkSubmitJob.java ---------------------------------------------------------------------- diff --git a/service/src/main/java/org/apache/griffin/core/job/SparkSubmitJob.java b/service/src/main/java/org/apache/griffin/core/job/SparkSubmitJob.java index 88ea11d..8a4bfe2 100644 --- a/service/src/main/java/org/apache/griffin/core/job/SparkSubmitJob.java +++ b/service/src/main/java/org/apache/griffin/core/job/SparkSubmitJob.java @@ -85,7 +85,7 @@ public class SparkSubmitJob implements Job { int repeatCount = simpleTrigger.getRepeatCount(); int fireCount = simpleTrigger.getTimesTriggered(); if (fireCount > repeatCount) { - saveJobInstance(null, LivySessionStates.State.not_found, true); + saveJobInstance(null, LivySessionStates.State.not_found); } } @@ -128,12 +128,14 @@ public class SparkSubmitJob implements Job { setMeasureInstanceName(measure, jd); } + @SuppressWarnings("unchecked") private void setPredicates(String json) throws IOException { if (StringUtils.isEmpty(json)) { return; } List<Map<String, Object>> maps = JsonUtil.toEntity(json, new TypeReference<List<Map>>() { }); + assert maps != null; for (Map<String, Object> map : maps) { SegmentPredicate sp = new SegmentPredicate(); sp.setType((String) map.get("type")); @@ -203,23 +205,23 @@ public class SparkSubmitJob implements Job { jobService.pauseJob(group, name); LOGGER.info("Delete predicate job({},{}) success.", group, name); } - saveJobInstance(result, LivySessionStates.State.found, true); + saveJobInstance(result, LivySessionStates.State.found); } - private void saveJobInstance(String result, LivySessionStates.State state, Boolean pauseStatus) throws IOException { + private void saveJobInstance(String result, LivySessionStates.State state) throws IOException { TypeReference<HashMap<String, Object>> type = new TypeReference<HashMap<String, Object>>() { }; Map<String, Object> resultMap = null; if (result != null) { resultMap = JsonUtil.toEntity(result, type); } - setJobInstance(resultMap, state, pauseStatus); + setJobInstance(resultMap, state); jobInstanceRepo.save(jobInstance); } - private void setJobInstance(Map<String, Object> resultMap, LivySessionStates.State state, Boolean pauseStatus) { + private void setJobInstance(Map<String, Object> resultMap, LivySessionStates.State state) { jobInstance.setState(state); - jobInstance.setDeleted(pauseStatus); + jobInstance.setDeleted(true); if (resultMap == null) { return; } http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/service/src/main/java/org/apache/griffin/core/measure/MeasureController.java ---------------------------------------------------------------------- diff --git a/service/src/main/java/org/apache/griffin/core/measure/MeasureController.java b/service/src/main/java/org/apache/griffin/core/measure/MeasureController.java index d7917e4..f8ba3bf 100644 --- a/service/src/main/java/org/apache/griffin/core/measure/MeasureController.java +++ b/service/src/main/java/org/apache/griffin/core/measure/MeasureController.java @@ -19,6 +19,7 @@ under the License. package org.apache.griffin.core.measure; +import org.apache.griffin.core.interceptor.Token; import org.apache.griffin.core.measure.entity.Measure; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -67,6 +68,7 @@ public class MeasureController { @RequestMapping(value = "/measures", method = RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) + @Token public Measure createMeasure(@RequestBody Measure measure) { return measureService.createMeasure(measure); } http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/service/src/main/java/org/apache/griffin/core/measure/entity/AbstractAuditableEntity.java ---------------------------------------------------------------------- diff --git a/service/src/main/java/org/apache/griffin/core/measure/entity/AbstractAuditableEntity.java b/service/src/main/java/org/apache/griffin/core/measure/entity/AbstractAuditableEntity.java index 015633e..72125de 100644 --- a/service/src/main/java/org/apache/griffin/core/measure/entity/AbstractAuditableEntity.java +++ b/service/src/main/java/org/apache/griffin/core/measure/entity/AbstractAuditableEntity.java @@ -38,7 +38,7 @@ public abstract class AbstractAuditableEntity implements Serializable { private Long id; @JsonIgnore - private Timestamp createdDate = new Timestamp(System.currentTimeMillis()); + private Long createdDate = System.currentTimeMillis(); @JsonIgnore private Timestamp modifiedDate; @@ -51,11 +51,11 @@ public abstract class AbstractAuditableEntity implements Serializable { this.id = id; } - public Timestamp getCreatedDate() { + public Long getCreatedDate() { return createdDate; } - public void setCreatedDate(Timestamp createdDate) { + public void setCreatedDate(Long createdDate) { this.createdDate = createdDate; } @@ -88,13 +88,10 @@ public abstract class AbstractAuditableEntity implements Serializable { } AbstractAuditableEntity other = (AbstractAuditableEntity) obj; if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; + return other.id == null; + } else { + return id.equals(other.id); } - return true; } } http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/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 c126e29..a4d7cdd 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 @@ -70,7 +70,7 @@ public class MetricServiceImpl implements MetricService { List<AbstractJob> jobList = entry.getValue(); List<Metric> metrics = new ArrayList<>(); for (AbstractJob job : jobList) { - List<MetricValue> metricValues = getMetricValues(job.getMetricName(), 0, 300, job.getCreatedDate().getTime()); + List<MetricValue> metricValues = getMetricValues(job.getMetricName(), 0, 300, job.getCreatedDate()); metrics.add(new Metric(job.getMetricName(), measure.getDqType(), measure.getOwner(), metricValues)); } metricMap.put(measure.getName(), metrics); http://git-wip-us.apache.org/repos/asf/incubator-griffin/blob/4a9137d2/service/src/test/java/org/apache/griffin/core/info/GriffinInfoControllerTest.java ---------------------------------------------------------------------- diff --git a/service/src/test/java/org/apache/griffin/core/info/GriffinInfoControllerTest.java b/service/src/test/java/org/apache/griffin/core/info/GriffinInfoControllerTest.java index 426d705..5ef2735 100644 --- a/service/src/test/java/org/apache/griffin/core/info/GriffinInfoControllerTest.java +++ b/service/src/test/java/org/apache/griffin/core/info/GriffinInfoControllerTest.java @@ -43,6 +43,6 @@ public class GriffinInfoControllerTest { public void testGreeting() throws Exception { mockMvc.perform(get(URLHelper.API_VERSION_PATH + "/version")) .andExpect(status().isOk()) - .andExpect(jsonPath("$", is("0.1.0"))); + .andExpect(jsonPath("$", is("0.2.0"))); } } \ No newline at end of file
