Skip to content

Commit

Permalink
JAV-438 query request date support NaN-NaN-NaN NaN:NaN:NaN
Browse files Browse the repository at this point in the history
Signed-off-by: zhengyangyong <yangyong.zheng@huawei.com>
  • Loading branch information
zhengyangyong committed Oct 31, 2017
1 parent 304067b commit ddc7a28
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 15 deletions.
Expand Up @@ -24,6 +24,9 @@
import static org.springframework.web.bind.annotation.RequestMethod.GET;
import static org.springframework.web.bind.annotation.RequestMethod.POST;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
Expand Down Expand Up @@ -57,13 +60,15 @@ public class SagaController {
private final SagaExecutionComponent sagaExecutionComponent;
private final SagaEventRepo repo;
private final SagaExecutionQueryService queryService;
private final SimpleDateFormat dateFormat;

@Autowired
public SagaController(SagaExecutionComponent sagaExecutionComponent, SagaEventRepo repo,
SagaExecutionQueryService queryService) {
this.sagaExecutionComponent = sagaExecutionComponent;
this.repo = repo;
this.queryService = queryService;
this.dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}

@Trace("processRequests")
Expand Down Expand Up @@ -110,19 +115,26 @@ public ResponseEntity<SagaExecutionQueryResult> queryExecutions(
@RequestParam(name = "startTime") String startTime,
@RequestParam(name = "endTime") String endTime) {
if (isRequestParamValid(pageIndex, pageSize, startTime, endTime)) {
return ResponseEntity.ok(queryService.querySagaExecution(pageIndex, pageSize, startTime, endTime));
try {
return ResponseEntity.ok(queryService.querySagaExecution(pageIndex, pageSize, startTime, endTime));
} catch (ParseException ignored) {
throw new InvocationException(BAD_REQUEST, "illegal request content");
}
} else {
throw new InvocationException(BAD_REQUEST, "illegal request content");
}
}

private boolean isRequestParamValid(String pageIndex, String pageSize, String startTime, String endTime) {
try {
return Integer.parseInt(pageIndex) >= 0 && Integer.parseInt(pageSize) > 0
&& Long.parseLong(startTime) <= Long.parseLong(endTime);
} catch (NumberFormatException nfe) {
return false;
if (Integer.parseInt(pageIndex) >= 0 && Integer.parseInt(pageSize) > 0) {
Date start = "NaN-NaN-NaN NaN:NaN:NaN".equals(startTime) ? new Date(0) : this.dateFormat.parse(startTime);
Date end = "NaN-NaN-NaN NaN:NaN:NaN".equals(endTime) ? new Date(Long.MAX_VALUE) : this.dateFormat.parse(endTime);
return start.getTime() <= end.getTime();
}
} catch (NumberFormatException | ParseException ignored) {
}
return false;
}

@ApiResponses({
Expand Down
Expand Up @@ -19,6 +19,8 @@
import static javax.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
Expand Down Expand Up @@ -57,6 +59,7 @@
public class SagaExecutionQueryService {
private final SagaEventRepo repo;
private final FromJsonFormat<SagaDefinition> fromJsonFormat;
private final SimpleDateFormat dateFormat;

private final ObjectMapper mapper = new ObjectMapper();
private final GraphBuilder graphBuilder = new GraphBuilder(new GraphCycleDetectorImpl<>());
Expand All @@ -65,14 +68,18 @@ public class SagaExecutionQueryService {
public SagaExecutionQueryService(SagaEventRepo repo, FromJsonFormat<SagaDefinition> fromJsonFormat) {
this.repo = repo;
this.fromJsonFormat = fromJsonFormat;
this.dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}

public SagaExecutionQueryResult querySagaExecution(String pageIndex, String pageSize,
String startTime, String endTime) {
String startTime, String endTime) throws ParseException {

Date start = "NaN-NaN-NaN NaN:NaN:NaN".equals(startTime) ? new Date(0) : this.dateFormat.parse(startTime);
Date end = "NaN-NaN-NaN NaN:NaN:NaN".equals(endTime) ? new Date(Long.MAX_VALUE) : this.dateFormat.parse(endTime);

List<SagaExecution> requests = new ArrayList<>();
Page<SagaEventEntity> startEvents = repo.findByTypeAndCreationTimeBetweenOrderByIdDesc(
SagaStartedEvent.class.getSimpleName(),
new Date(Long.parseLong(startTime)), new Date(Long.parseLong(endTime)),
SagaStartedEvent.class.getSimpleName(), start, end,
new PageRequest(Integer.parseInt(pageIndex), Integer.parseInt(pageSize)));
for (SagaEventEntity event : startEvents) {
SagaEventEntity endEvent = repo
Expand Down
Expand Up @@ -212,8 +212,8 @@ public void testFailedRequest() throws Exception {
MvcResult resultJson = mockMvc.perform(get("/requests")
.param("pageIndex", "0")
.param("pageSize", "10")
.param("startTime", "1")
.param("endTime", String.valueOf(Long.MAX_VALUE)))
.param("startTime", "NaN-NaN-NaN NaN:NaN:NaN")
.param("endTime", "NaN-NaN-NaN NaN:NaN:NaN"))
.andExpect(status().isOk()).andReturn();
SagaExecutionQueryResult result = mapper
.readValue(resultJson.getResponse().getContentAsString(), SagaExecutionQueryResult.class);
Expand Down Expand Up @@ -253,8 +253,8 @@ public void processRequestByRest() throws Exception {
MvcResult resultJson = mockMvc.perform(get("/requests")
.param("pageIndex", "0")
.param("pageSize", "10")
.param("startTime", "1")
.param("endTime", String.valueOf(Long.MAX_VALUE)))
.param("startTime", "NaN-NaN-NaN NaN:NaN:NaN")
.param("endTime", "NaN-NaN-NaN NaN:NaN:NaN"))
.andExpect(status().isOk()).andReturn();
SagaExecutionQueryResult result = mapper
.readValue(resultJson.getResponse().getContentAsString(), SagaExecutionQueryResult.class);
Expand All @@ -278,14 +278,75 @@ public void queryRequestsWithBadParameter() throws Exception {
mockMvc.perform(get("/requests")
.param("pageIndex", "xxx")
.param("pageSize", "xxx")
.param("startTime", "xx0")
.param("startTime", "NaN-NaN-NaN NaN:NaN:NaN")
.param("endTime", "NaN-NaN-NaN NaN:NaN:NaN"))
.andExpect(status().is(HttpStatus.SC_BAD_REQUEST));
} catch (org.springframework.web.util.NestedServletException ex) {
assertThat(ex.getMessage(), containsString("illegal request content"));
}

try {
mockMvc.perform(get("/requests")
.param("pageIndex", "0")
.param("pageSize", "10")
.param("startTime", "x0")
.param("endTime", "x1"))
.andExpect(status().is(HttpStatus.SC_BAD_REQUEST));
} catch (org.springframework.web.util.NestedServletException ex) {
assertThat(ex.getMessage(), containsString("illegal request content"));
}
}

@Test
public void queryRequestsWithNANParameter() throws Exception {
mockMvc.perform(
post("/requests/")
.contentType(TEXT_PLAIN)
.content(sagaDefinition))
.andExpect(status().isOk());

MvcResult resultJson = mockMvc.perform(get("/requests")
.param("pageIndex", "0")
.param("pageSize", "10")
.param("startTime", "NaN-NaN-NaN NaN:NaN:NaN")
.param("endTime", "NaN-NaN-NaN NaN:NaN:NaN"))
.andExpect(status().is(HttpStatus.SC_OK)).andReturn();
SagaExecutionQueryResult result = mapper
.readValue(resultJson.getResponse().getContentAsString(), SagaExecutionQueryResult.class);
assertThat(result.requests.size(), is(1));

resultJson = mockMvc.perform(get("/requests")
.param("pageIndex", "0")
.param("pageSize", "10")
.param("startTime", "2000-1-1 00:00:00")
.param("endTime", "NaN-NaN-NaN NaN:NaN:NaN"))
.andExpect(status().is(HttpStatus.SC_OK)).andReturn();
result = mapper
.readValue(resultJson.getResponse().getContentAsString(), SagaExecutionQueryResult.class);
assertThat(result.requests.size(), is(1));

resultJson = mockMvc.perform(get("/requests")
.param("pageIndex", "0")
.param("pageSize", "10")
.param("startTime", "NaN-NaN-NaN NaN:NaN:NaN")
.param("endTime", "9999-12-31 12:59:59"))
.andExpect(status().is(HttpStatus.SC_OK)).andReturn();
result = mapper
.readValue(resultJson.getResponse().getContentAsString(), SagaExecutionQueryResult.class);
assertThat(result.requests.size(), is(1));

try {
mockMvc.perform(get("/requests")
.param("pageIndex", "0")
.param("pageSize", "10")
.param("startTime", "9999-12-31 12:59:59")
.param("endTime", "2000-1-1 00:00:00"))
.andExpect(status().is(HttpStatus.SC_BAD_REQUEST));
} catch (org.springframework.web.util.NestedServletException ex) {
assertThat(ex.getMessage(), containsString("illegal request content"));
}
}

@Test
public void allEvents() throws Exception {
mockMvc.perform(
Expand All @@ -300,6 +361,7 @@ public void allEvents() throws Exception {
.andExpect(content().string(containsString("SagaEndedEvent")));
}


private Matcher<SagaEventEntity> eventWith(
long eventId,
String type) {
Expand Down
4 changes: 2 additions & 2 deletions saga-web/web-site/web/result.jsp
Expand Up @@ -42,9 +42,9 @@
<table>
<tr>
<td>From:</td>
<td><input title="Saga Start Time From" id="startTime" onclick="SetDate(this,'yyyy-MM-dd hh:mm')"/></td>
<td><input title="Saga Start Time From" id="startTime" onclick="SetDate(this,'yyyy-MM-dd hh:mm:ss')"/></td>
<td>To:</td>
<td><input title="Saga End Time From" id="endTime" onclick="SetDate(this,'yyyy-MM-dd hh:mm')"/></td>
<td><input title="Saga End Time From" id="endTime" onclick="SetDate(this,'yyyy-MM-dd hh:mm:ss')"/></td>
<td>
<button onClick="refresh(this)">Search</button>
</td>
Expand Down

0 comments on commit ddc7a28

Please sign in to comment.