Skip to content

Commit b393a78

Browse files
committed
Changed error handling in load and controller to bubble up and return a 207 status code
1 parent 89189a1 commit b393a78

5 files changed

Lines changed: 63 additions & 32 deletions

File tree

memex/src/main/java/com/johnlpage/memex/VehicleInspection/controller/VehicleInspectionController.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.johnlpage.memex.VehicleInspection.repository.VehicleInspectionRepository;
1010
import com.johnlpage.memex.VehicleInspection.repository.VehicleRepository;
1111
import com.johnlpage.memex.generics.service.MongoDbJsonStreamingLoaderService;
12+
import com.johnlpage.memex.generics.service.DataLoadException;
1213
import com.johnlpage.memex.util.UpdateStrategy;
1314
import jakarta.servlet.http.HttpServletRequest;
1415

@@ -72,7 +73,12 @@ public ResponseEntity<Vehicle> vehicleById(@PathVariable Long id) {
7273
@PostMapping("/inspection")
7374
public void oneinspection(@RequestBody VehicleInspection inspection) {
7475
LOG.warn("Saving vehicle inspection: {}", inspection);
75-
vehicleInspectionRepository.save(inspection);
76+
try {
77+
vehicleInspectionRepository.save(inspection);
78+
}
79+
catch (Exception e) {
80+
LOG.error(e.getMessage());
81+
}
7682
}
7783

7884
/**
@@ -100,14 +106,17 @@ public ResponseEntity<MongoDbJsonStreamingLoaderService.JsonStreamingLoadRespons
100106
: null);
101107

102108
return new ResponseEntity<>(returnValue, HttpStatus.OK);
103-
} catch (Exception e) {
109+
} catch (DataLoadException e) {
104110
returnValue =
105111
new MongoDbJsonStreamingLoaderService.JsonStreamingLoadResponse(
106-
0, 0, 0, false, e.getMessage());
112+
e.getUpdates(), e.getDeletes(), e.getInserts(), false, e.getMessage());
107113

108114
// Log the exception if necessary and return HTTP 500 Internal Server Error
109-
return new ResponseEntity<>(returnValue, HttpStatus.INTERNAL_SERVER_ERROR);
115+
return new ResponseEntity<>(returnValue, HttpStatus.MULTI_STATUS);
116+
} catch (Exception e) {
117+
LOG.error(e.getMessage());
110118
}
119+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
111120
}
112121

113122
/**

memex/src/main/java/com/johnlpage/memex/generics/repository/MongoHistoryRepositoryImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
import static org.springframework.data.mongodb.core.aggregation.LookupOperation.newLookup;
2020

21-
public class MongoHistoryRepositoryImpl<T, I> implements MongoHistoryRepository<T, I> {
21+
public class MongoHistoryRepositoryImpl<T, I> implements MongoHistoryRepository<T, I> {
2222
private static final Logger LOG = LoggerFactory.getLogger(MongoHistoryRepositoryImpl.class);
2323
private static final int MAX_UNROLL_DEPTH = 10;
2424
private final MongoTemplate mongoTemplate;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.johnlpage.memex.generics.service;
2+
3+
import lombok.Getter;
4+
5+
@Getter
6+
public class DataLoadException extends Exception {
7+
private final long updates;
8+
private final long deletes;
9+
private final long inserts;
10+
11+
public DataLoadException(long updates, long deletes, long inserts,
12+
String message, Throwable cause) {
13+
super(message, cause);
14+
this.updates = updates;
15+
this.deletes = deletes;
16+
this.inserts = inserts;
17+
}
18+
19+
}

memex/src/main/java/com/johnlpage/memex/generics/service/MongoDbJsonStreamingLoaderService.java

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,17 @@
1212
import lombok.AllArgsConstructor;
1313
import lombok.Data;
1414
import lombok.RequiredArgsConstructor;
15-
import org.apache.catalina.connector.ClientAbortException;
1615
import org.slf4j.Logger;
1716
import org.slf4j.LoggerFactory;
1817
import org.springframework.beans.factory.annotation.Value;
1918
import org.springframework.stereotype.Service;
2019

2120
import java.io.BufferedInputStream;
22-
import java.io.EOFException;
2321
import java.io.InputStream;
2422
import java.util.ArrayList;
2523
import java.util.List;
2624
import java.util.concurrent.CompletableFuture;
27-
import java.util.concurrent.atomic.AtomicInteger;
25+
import java.util.concurrent.atomic.AtomicLong;
2826

2927
@Service
3028
@RequiredArgsConstructor
@@ -47,12 +45,12 @@ public JsonStreamingLoadResponse loadFromJsonStream(
4745
Class<T> type,
4846
InvalidDataHandlerService<T> invalidDataHandlerService,
4947
UpdateStrategy updateStrategy,
50-
PreWriteTriggerService<T> pretrigger,
51-
PostWriteTriggerService<T> posttrigger) {
48+
PreWriteTriggerService<T> preTrigger,
49+
PostWriteTriggerService<T> postTrigger) throws DataLoadException {
5250

53-
AtomicInteger updates = new AtomicInteger(0);
54-
AtomicInteger deletes = new AtomicInteger(0);
55-
AtomicInteger inserts = new AtomicInteger(0);
51+
AtomicLong updates = new AtomicLong(0);
52+
AtomicLong deletes = new AtomicLong(0);
53+
AtomicLong inserts = new AtomicLong(0);
5654
List<T> toSave = new ArrayList<>();
5755
List<CompletableFuture<BulkWriteResult>> futures = new ArrayList<>();
5856

@@ -70,9 +68,9 @@ public JsonStreamingLoadResponse loadFromJsonStream(
7068

7169
T document = objectMapper.treeToValue(node, type);
7270

73-
if (pretrigger != null) {
71+
if (preTrigger != null) {
7472
// For a mutable model
75-
pretrigger.modifyMutableDataPreWrite(document);
73+
preTrigger.modifyMutableDataPreWrite(document);
7674
// for an immutable model
7775
// document = pretrigger.newImmutableDataPreWritedocument);
7876
}
@@ -86,7 +84,7 @@ public JsonStreamingLoadResponse loadFromJsonStream(
8684
futures.add(
8785
repository
8886
.asyncWriteMany(
89-
copyOfToSave, type, invalidDataHandlerService, updateStrategy, posttrigger)
87+
copyOfToSave, type, invalidDataHandlerService, updateStrategy, postTrigger)
9088
.thenApply(
9189
bulkWriteResult -> {
9290
updates.addAndGet(bulkWriteResult.getModifiedCount());
@@ -103,7 +101,7 @@ public JsonStreamingLoadResponse loadFromJsonStream(
103101
futures.add(
104102
repository
105103
.asyncWriteMany(
106-
toSave, type, invalidDataHandlerService, updateStrategy, posttrigger)
104+
toSave, type, invalidDataHandlerService, updateStrategy, postTrigger)
107105
.thenApply(
108106
bulkWriteResult -> {
109107
updates.addAndGet(bulkWriteResult.getModifiedCount());
@@ -122,22 +120,23 @@ public JsonStreamingLoadResponse loadFromJsonStream(
122120
LOG.info("Processed {} docs. Time taken: {}ms.", count, endTime - startTime);
123121
LOG.info("Modified: {} Added: {} Removed: {}", updates, inserts, deletes);
124122
return new JsonStreamingLoadResponse(updates.get(), deletes.get(), inserts.get(), true, "");
125-
} catch (EOFException | ClientAbortException eofe) {
126-
LOG.error("Load Terminated as sender disconnected: {}", eofe.getMessage());
127-
return null;
128123
} catch (Exception e) {
129124
LOG.error("Error during data load process: {}", e.getMessage());
130-
return new JsonStreamingLoadResponse(
131-
updates.get(), deletes.get(), inserts.get(), false, e.getMessage());
125+
throw new DataLoadException(
126+
updates.get(),
127+
deletes.get(),
128+
inserts.get(),
129+
"Error during data load process: " + e.getMessage(),
130+
e );
132131
}
133132
}
134133

135134
@Data
136135
@AllArgsConstructor
137136
public static class JsonStreamingLoadResponse {
138-
int updates;
139-
int deletes;
140-
int inserts;
137+
long updates;
138+
long deletes;
139+
long inserts;
141140
boolean success;
142141
String message;
143142
}

memex/templates/controller/Controller.java.template

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,17 @@ public class __className__Controller {
8787
: null);
8888

8989
return new ResponseEntity<>(returnValue, HttpStatus.OK);
90-
} catch (Exception e) {
91-
returnValue =
92-
new MongoDbJsonStreamingLoaderService.JsonStreamingLoadResponse(
93-
0, 0, 0, false, e.getMessage());
94-
95-
return new ResponseEntity<>(returnValue, HttpStatus.INTERNAL_SERVER_ERROR);
96-
}
90+
} catch (DataLoadException e) {
91+
returnValue =
92+
new MongoDbJsonStreamingLoaderService.JsonStreamingLoadResponse(
93+
e.getUpdates(), e.getDeletes(), e.getInserts(), false, e.getMessage());
94+
95+
// Log the exception if necessary and return HTTP 500 Internal Server Error
96+
return new ResponseEntity<>(returnValue, HttpStatus.MULTI_STATUS);
97+
} catch (Exception e) {
98+
LOG.error(e.getMessage());
99+
}
100+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
97101
}
98102

99103
/**

0 commit comments

Comments
 (0)