Code improvement, FilePublishInformation serializing 49/87149/2
authorPatrikBuhr <patrik.buhr@est.tech>
Wed, 8 May 2019 07:18:24 +0000 (07:18 +0000)
committerPatrikBuhr <patrik.buhr@est.tech>
Wed, 8 May 2019 07:18:24 +0000 (07:18 +0000)
Updated serializer of FilePublishInformation so that only elements that
should be part of publishing is included.

Change-Id: If5632af8bf9fd26f8bc96b25d8bfbccf63dfec2f
Issue-ID: DCAEGEN2-1488
Signed-off-by: PatrikBuhr <patrik.buhr@est.tech>
datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/model/FilePublishInformation.java
datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/model/JsonSerializer.java [moved from datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/model/CommonFunctions.java with 55% similarity]
datafile-app-server/src/main/java/org/onap/dcaegen2/collectors/datafile/tasks/DataRouterPublisher.java
datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/model/CommonFunctionsTest.java [deleted file]
datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/tasks/DataRouterPublisherTest.java

index 066402b..63ed0da 100644 (file)
@@ -23,7 +23,6 @@ import java.util.Map;
 
 import org.immutables.gson.Gson;
 import org.immutables.value.Value;
-import org.onap.dcaegen2.services.sdk.rest.services.model.DmaapModel;
 
 /**
  * Information needed to publish a file to DataRouter.
@@ -34,7 +33,7 @@ import org.onap.dcaegen2.services.sdk.rest.services.model.DmaapModel;
 
 @Value.Immutable
 @Gson.TypeAdapters
-public interface FilePublishInformation extends DmaapModel {
+public interface FilePublishInformation  {
 
     @SerializedName("productName")
     String getProductName();
@@ -54,15 +53,9 @@ public interface FilePublishInformation extends DmaapModel {
     @SerializedName("timeZoneOffset")
     String getTimeZoneOffset();
 
-    @SerializedName("name")
-    String getName();
-
     @SerializedName("location")
     String getLocation();
 
-    @SerializedName("internalLocation")
-    Path getInternalLocation();
-
     @SerializedName("compression")
     String getCompression();
 
@@ -72,6 +65,9 @@ public interface FilePublishInformation extends DmaapModel {
     @SerializedName("fileFormatVersion")
     String getFileFormatVersion();
 
-    @SerializedName("context")
+    Path getInternalLocation();
+
+    String getName();
+
     Map<String, String> getContext();
 }
 
 package org.onap.dcaegen2.collectors.datafile.model;
 
+import com.google.common.collect.Sets;
+import com.google.gson.ExclusionStrategy;
+import com.google.gson.FieldAttributes;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonPrimitive;
-import com.google.gson.JsonSerializationContext;
-import com.google.gson.JsonSerializer;
 
-import java.lang.reflect.Type;
-import java.nio.file.Path;
+import java.util.Set;
 
 /**
  * Helper class to serialize object.
  */
-public class CommonFunctions {
+public abstract class JsonSerializer {
 
-    private static Gson gson =
-        new GsonBuilder().registerTypeHierarchyAdapter(Path.class, new PathConverter()).serializeNulls().create();
 
-    private CommonFunctions() {
-    }
+    private static Gson gson =
+        new GsonBuilder() //
+        .serializeNulls() //
+        .addSerializationExclusionStrategy(new FilePublishInformationExclusionStrategy()) //
+        .create(); //
 
     /**
      * Serializes a <code>filePublishInformation</code>.
@@ -46,18 +45,25 @@ public class CommonFunctions {
      *
      * @return a string with the serialized info.
      */
-    public static String createJsonBody(FilePublishInformation filePublishInformation) {
+    public static String createJsonBodyForDataRouter(FilePublishInformation filePublishInformation) {
         return gson.toJson(filePublishInformation);
     }
 
-    /**
-     * Json serializer that handles Path serializations, since <code>Path</code> does not implement the
-     * <code>Serializable</code> interface.
-     */
-    public static class PathConverter implements JsonSerializer<Path> {
+    private static class FilePublishInformationExclusionStrategy implements ExclusionStrategy {
+        /**
+         * Elements in FilePublishInformation to include in the file publishing Json string.
+         */
+        private final Set<String> inclusions =
+                Sets.newHashSet("productName", "vendorName", "lastEpochMicrosec", "sourceName", "startEpochMicrosec",
+                        "timeZoneOffset", "location", "compression", "fileFormatType", "fileFormatVersion");
+        @Override
+        public boolean shouldSkipField(FieldAttributes f) {
+            return !inclusions.contains(f.getName());
+        }
+
         @Override
-        public JsonElement serialize(Path path, Type type, JsonSerializationContext jsonSerializationContext) {
-            return new JsonPrimitive(path.toString());
+        public boolean shouldSkipClass(Class<?> clazz) {
+            return false;
         }
     }
 }
index 4028ac3..e5dd01e 100644 (file)
@@ -34,8 +34,8 @@ import org.apache.http.HttpResponse;
 import org.apache.http.client.methods.HttpPut;
 import org.apache.http.entity.ByteArrayEntity;
 import org.onap.dcaegen2.collectors.datafile.configuration.AppConfig;
-import org.onap.dcaegen2.collectors.datafile.model.CommonFunctions;
 import org.onap.dcaegen2.collectors.datafile.model.FilePublishInformation;
+import org.onap.dcaegen2.collectors.datafile.model.JsonSerializer;
 import org.onap.dcaegen2.collectors.datafile.model.logging.MappedDiagnosticContext;
 import org.onap.dcaegen2.collectors.datafile.service.HttpUtils;
 import org.onap.dcaegen2.collectors.datafile.service.producer.DmaapProducerHttpClient;
@@ -58,9 +58,6 @@ import reactor.core.publisher.Mono;
 public class DataRouterPublisher {
     private static final String X_DMAAP_DR_META = "X-DMAAP-DR-META";
     private static final String CONTENT_TYPE = "application/octet-stream";
-    private static final String NAME_JSON_TAG = "name";
-    private static final String INTERNAL_LOCATION_JSON_TAG = "internalLocation";
-    private static final String CONTEXT_JSON_TAG = "context";
     private static final String PUBLISH_TOPIC = "publish";
     private static final String DEFAULT_FEED_ID = "1";
 
@@ -112,11 +109,7 @@ public class DataRouterPublisher {
 
     private void prepareHead(FilePublishInformation publishInfo, HttpPut put) {
         put.addHeader(HttpHeaders.CONTENT_TYPE, CONTENT_TYPE);
-        JsonElement metaData = new JsonParser().parse(CommonFunctions.createJsonBody(publishInfo));
-        metaData.getAsJsonObject().remove(NAME_JSON_TAG).getAsString();
-        metaData.getAsJsonObject().remove(INTERNAL_LOCATION_JSON_TAG);
-        metaData.getAsJsonObject().remove(CONTEXT_JSON_TAG);
-
+        JsonElement metaData = new JsonParser().parse(JsonSerializer.createJsonBodyForDataRouter(publishInfo));
         put.addHeader(X_DMAAP_DR_META, metaData.toString());
         put.setURI(getPublishUri(publishInfo.getName()));
         MappedDiagnosticContext.appendTraceInfo(put);
diff --git a/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/model/CommonFunctionsTest.java b/datafile-app-server/src/test/java/org/onap/dcaegen2/collectors/datafile/model/CommonFunctionsTest.java
deleted file mode 100644 (file)
index 90237c9..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- *  Copyright (C) 2019 Nordix Foundation.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * SPDX-License-Identifier: Apache-2.0
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.dcaegen2.collectors.datafile.model;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import java.nio.file.Paths;
-import java.util.HashMap;
-
-import org.junit.jupiter.api.Test;
-
-public class CommonFunctionsTest {
-    @Test
-    public void createJsonBody_success() {
-        ImmutableFilePublishInformation filePublishInformation = ImmutableFilePublishInformation //
-            .builder() //
-            .productName("") //
-            .vendorName("") //
-            .lastEpochMicrosec("") //
-            .sourceName("") //
-            .startEpochMicrosec("") //
-            .timeZoneOffset("") //
-            .name("") //
-            .location("") //
-            .internalLocation(Paths.get("internalLocation")) //
-            .compression("") //
-            .fileFormatType("") //
-            .fileFormatVersion("") //
-            .context(new HashMap<String,String>())
-            .build();
-        String actualBody = CommonFunctions.createJsonBody(filePublishInformation);
-
-        assertTrue(actualBody.contains("\"internalLocation\":\"internalLocation\""));
-    }
-}
index 03122ea..8f768d3 100644 (file)
@@ -149,10 +149,6 @@ class DataRouterPublisherTest {
         Header[] metaHeaders = actualPut.getHeaders(X_DMAAP_DR_META);
         Map<String, String> metaHash = getMetaDataAsMap(metaHeaders);
 
-        // Note that the following line checks the number of properties that are sent to the data router.
-        // This should be 10 unless the API is updated. The class DataRouterPublisher removes
-        // info that should not be reported.
-        assertEquals(10, metaHash.size());
         assertEquals(PRODUCT_NAME, metaHash.get("productName"));
         assertEquals(VENDOR_NAME, metaHash.get("vendorName"));
         assertEquals(LAST_EPOCH_MICROSEC, metaHash.get("lastEpochMicrosec"));
@@ -163,6 +159,10 @@ class DataRouterPublisherTest {
         assertEquals(FTPES_ADDRESS, metaHash.get("location"));
         assertEquals(FILE_FORMAT_TYPE, metaHash.get("fileFormatType"));
         assertEquals(FILE_FORMAT_VERSION, metaHash.get("fileFormatVersion"));
+
+        // Note that the following line checks the number of properties that are sent to the data router.
+        // This should be 10 unless the API is updated (which is the fields checked above)
+        assertEquals(10, metaHash.size());
     }
 
     @Test