From 36a57bea6d6b053ff1a05af9000127dd851649d7 Mon Sep 17 00:00:00 2001 From: blavenie <benoit.lavenier@e-is.pro> Date: Thu, 19 Oct 2017 09:20:16 +0200 Subject: [PATCH] [fix] when updating document, avoid NullPointerException when no time field or no document --- .../duniter/elasticsearch/client/Duniter4jClient.java | 2 ++ .../elasticsearch/client/Duniter4jClientImpl.java | 9 +++++++++ .../elasticsearch/rest/AbstractRestPostUpdateAction.java | 2 +- .../duniter/elasticsearch/service/AbstractService.java | 2 +- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/client/Duniter4jClient.java b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/client/Duniter4jClient.java index 242a0cfb..d7afec69 100644 --- a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/client/Duniter4jClient.java +++ b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/client/Duniter4jClient.java @@ -62,6 +62,8 @@ public interface Duniter4jClient extends Bean, Client { Map<String, Object> getMandatoryFieldsById(String index, String type, String docId, String... fieldNames); + <T> T getMandatoryTypedFieldById(String index, String type, String docId, String fieldName); + String indexDocumentFromJson(String index, String type, String json); void updateDocumentFromJson(String index, String type, String id, String json); diff --git a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/client/Duniter4jClientImpl.java b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/client/Duniter4jClientImpl.java index 2f18e63b..6af177c6 100644 --- a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/client/Duniter4jClientImpl.java +++ b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/client/Duniter4jClientImpl.java @@ -325,6 +325,15 @@ public class Duniter4jClientImpl implements Duniter4jClient { return (T)getFieldById(index, type, docId, fieldName); } + @Override + public <T> T getMandatoryTypedFieldById(String index, String type, String docId, String fieldName) { + Object result = getFieldById(index, type, docId, fieldName); + if (result == null) { + throw new NotFoundException(String.format("Document [%s/%s/%s] missing value for mandatory field [%s].", index, type, docId, fieldName)); + } + return (T)result; + } + /** * Retrieve a document by id (safe mode) * @param docId diff --git a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/rest/AbstractRestPostUpdateAction.java b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/rest/AbstractRestPostUpdateAction.java index 42dd60bb..2daa5387 100644 --- a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/rest/AbstractRestPostUpdateAction.java +++ b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/rest/AbstractRestPostUpdateAction.java @@ -50,7 +50,7 @@ public abstract class AbstractRestPostUpdateAction extends BaseRestHandler { String typeName, JsonUpdater updater) { super(settings, controller, client); - log = Loggers.getLogger("duniter.rest" + indexName, settings, String.format("[%s]", indexName)); + log = Loggers.getLogger("duniter.rest." + indexName, settings, String.format("[%s]", indexName)); controller.registerHandler(POST, String.format("/%s/%s/{id}/_update", indexName, typeName), this); diff --git a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/service/AbstractService.java b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/service/AbstractService.java index cfc6306a..a0616ed9 100644 --- a/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/service/AbstractService.java +++ b/duniter4j-es-core/src/main/java/org/duniter/elasticsearch/service/AbstractService.java @@ -170,7 +170,7 @@ public abstract class AbstractService implements Bean { protected void verifyTimeForUpdate(String index, String type, String id, JsonNode actualObj, boolean allowOldDocuments, String timeFieldName) { // Check time has been increase - fix #27 int actualTime = getMandatoryField(actualObj, timeFieldName).asInt(); - int existingTime = client.getTypedFieldById(index, type, id, timeFieldName); + int existingTime = client.getMandatoryTypedFieldById(index, type, id, timeFieldName); if (actualTime <= existingTime) { throw new InvalidTimeException(String.format("Invalid '%s' value: can not be less or equal to the previous value.", timeFieldName, timeFieldName)); } -- GitLab