Skip to content

Commit 3a2aef1

Browse files
committed
Include Validation error message, line and column.
1 parent e044829 commit 3a2aef1

2 files changed

Lines changed: 49 additions & 6 deletions

File tree

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,67 @@
11
package massbank_export_api.api;
22

33
import massbank.RecordParser;
4+
import massbank_export_api.model.ValidationError;
45
import org.petitparser.context.Result;
56
import org.springframework.context.annotation.Primary;
67
import org.springframework.http.HttpStatus;
8+
import org.springframework.http.MediaType;
79
import org.springframework.http.ResponseEntity;
810
import org.springframework.stereotype.Service;
911

1012
import java.util.HashSet;
13+
import java.util.Map;
1114

1215
@Primary
1316
@Service
1417
public class ValidateApiDelegateImpl implements ValidateApiDelegate {
1518

16-
final RecordParser recordparser = new RecordParser(new HashSet<>());
19+
private final RecordParser recordParser;
20+
21+
public ValidateApiDelegateImpl() {
22+
recordParser = new RecordParser(new HashSet<>());
23+
}
1724

1825
@Override
1926
public ResponseEntity<Void> validatePost(String body) {
20-
Result result = recordparser.parse(body);
21-
if (result.isSuccess()) return new ResponseEntity<>(HttpStatus.OK);
22-
else {
23-
return new ResponseEntity<>(HttpStatus.UNPROCESSABLE_ENTITY);
27+
if (body == null || body.trim().isEmpty()) {
28+
return ResponseEntity.badRequest().build();
29+
}
30+
31+
Result result = recordParser.parse(body);
32+
if (result.isSuccess()) {
33+
return ResponseEntity.ok().build();
34+
}
35+
36+
String message = result.getMessage();
37+
int pos = result.getPosition();
38+
39+
String[] tokens = body.split("\\n");
40+
int offset = 0;
41+
int lineNumber = 1;
42+
int col = 0;
43+
for (String token : tokens) {
44+
offset += token.length() + 1;
45+
if (pos < offset) {
46+
col = pos - (offset - (token.length() + 1));
47+
break;
48+
}
49+
lineNumber++;
2450
}
51+
52+
ValidationError error = new ValidationError();
53+
error.setMessage(message);
54+
error.setLine(lineNumber);
55+
error.setColumn(col);
56+
57+
ResponseEntity<ValidationError> respWithBody =
58+
ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY)
59+
.contentType(MediaType.APPLICATION_JSON)
60+
.body(error);
61+
62+
@SuppressWarnings("unchecked")
63+
ResponseEntity<Void> casted = (ResponseEntity<Void>)(ResponseEntity<?>) respWithBody;
64+
return casted;
2565
}
2666

2767
}

src/test/java/massbank_export_api/ExportApiControllerTest.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,10 +501,13 @@ public void testValidation() throws Exception {
501501
.content(validRecord))
502502
.andExpect(status().isOk());
503503

504+
String expectedResponse = "{ \"message\": \"letter or digit expected\", \"line\":1, \"column\":11 }";
504505
mockMvc.perform(post("/validate")
505506
.contentType("text/plain")
506507
.content(invalidRecord))
507-
.andExpect(status().isUnprocessableEntity());
508+
.andExpect(status().isUnprocessableEntity())
509+
.andExpect(content().contentType("application/json"))
510+
.andExpect(content().json(expectedResponse));
508511
}
509512

510513
}

0 commit comments

Comments
 (0)