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