Changed audit API of logger

Change-Id: I3e091ba7ce592fae536da1eaf28a220284b846c3
Issue-ID: SDC-772
Signed-off-by: olegb <olegb@amdocs.com>
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/AuditData.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/AuditData.java
new file mode 100644
index 0000000..7292762
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/AuditData.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * 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.
+ */
+
+package org.openecomp.sdc.logging.api;
+
+/**
+ * @author KATYR
+ * @since February 15, 2018
+ * This interface defines part of the Audit log application is responsible to provide.
+ * Fields list is according to ONAP application logging guidelines
+ * (https://wiki.onap.org/download/attachments/1015849/ONAP%20application%20logging%20guidelines.pdf?api=v2)
+ * StartTime -> BeginTimestamp (Date-time that processing for the activities begins)
+ * EndTime-> EndTimestamp (Date-time that processing for the activities being logged ends)
+ * StatusCode -> StatusCode (indicate high level success or failure of the operation activities that is invoked)
+ * ResponseCode -> ResponseCode(application-specific response code returned by the operation activities)
+ * ResponseDescription - > ResponseDescription (human readable description of the response code)
+ * ClientIpAddress -> ClientIpAddress (Requesting remote client application’s IP address)
+ */
+
+public interface AuditData {
+
+    enum StatusCode {
+        COMPLETE, ERROR
+    }
+
+    long getStartTime();
+
+    long getEndTime();
+
+    StatusCode getStatusCode();
+
+    String getResponseCode();
+
+    String getResponseDescription();
+
+    String getClientIpAddress();
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/Logger.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/Logger.java
index cf5bdf6..d02e99f 100644
--- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/Logger.java
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/Logger.java
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016-2017 European Support Limited
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -43,15 +43,7 @@
 
     boolean isAuditEnabled();
 
-    void audit(String msg);
-
-    void audit(String msg, Object arg);
-
-    void audit(String msg, Object arg1, Object arg2);
-
-    void audit(String msg, Object... arguments);
-
-    void audit(String msg, Throwable t);
+    void audit(AuditData data);
 
     boolean isDebugEnabled();
 
@@ -100,4 +92,4 @@
     void error(String msg, Object... arguments);
 
     void error(String msg, Throwable t);
-}
+}
\ No newline at end of file
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/LoggerFactory.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/LoggerFactory.java
index 826f6d5..399fd37 100644
--- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/LoggerFactory.java
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/main/java/org/openecomp/sdc/logging/api/LoggerFactory.java
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016-2017 European Support Limited
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -99,27 +99,7 @@
             }
 
             @Override
-            public void audit(String msg) {
-                // no-op
-            }
-
-            @Override
-            public void audit(String msg, Object arg) {
-                // no-op
-            }
-
-            @Override
-            public void audit(String msg, Object arg1, Object arg2) {
-                // no-op
-            }
-
-            @Override
-            public void audit(String msg, Object... arguments) {
-                // no-op
-            }
-
-            @Override
-            public void audit(String msg, Throwable t) {
+            public void audit(AuditData data) {
                 // no-op
             }
 
@@ -257,3 +237,4 @@
         }
     }
 }
+
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/LoggerFactoryTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/LoggerFactoryTest.java
index 9fde4e5..e174a32 100644
--- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/LoggerFactoryTest.java
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/LoggerFactoryTest.java
@@ -70,7 +70,7 @@
         logger.warn("");
         logger.info("");
         logger.debug("");
-        logger.audit("");
+        logger.audit(new SpyAuditData());
         logger.metrics("");
     }
 }
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/SpyAuditData.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/SpyAuditData.java
new file mode 100644
index 0000000..8766f25
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-api/src/test/java/org/openecomp/sdc/logging/api/SpyAuditData.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * 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.
+ */
+package org.openecomp.sdc.logging.api;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class SpyAuditData implements  AuditData{
+    private final Set<String> calledMethods = new HashSet<>();
+
+    @Override
+    public long getStartTime() {
+        calledMethods.add("getStartTime");
+        return 0;
+    }
+
+    @Override
+    public long getEndTime() {
+        calledMethods.add("getEndTime");
+        return 0;
+    }
+
+    @Override
+    public AuditData.StatusCode getStatusCode() {
+        calledMethods.add("getEndTime");
+        return null;
+    }
+
+    @Override
+    public String getResponseCode() {
+        calledMethods.add("getResponseCode");
+        return null;
+    }
+
+    @Override
+    public String getResponseDescription() {
+        calledMethods.add("getResponseDescription");
+        return null;
+    }
+
+    @Override
+    public String getClientIpAddress() {
+        calledMethods.add("getClientIpAddress");
+        return null;
+    }
+
+    public boolean wasCalled(String method) {
+        return calledMethods.contains(method);
+    }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapper.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapper.java
index 5d22345..416af8f 100644
--- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapper.java
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggerWrapper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2016-2017 European Support Limited
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -16,8 +16,15 @@
 
 package org.openecomp.sdc.logging.slf4j;
 
+import org.openecomp.sdc.logging.api.AuditData;
 import org.openecomp.sdc.logging.api.Logger;
 import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import static org.openecomp.sdc.logging.slf4j.SLF4JLoggingServiceProvider.PREFIX;
 
 /**
  * @author EVITALIY
@@ -25,6 +32,16 @@
  */
 class SLF4JLoggerWrapper implements Logger {
 
+    private static final String BEGIN_TIMESTAMP = PREFIX + "BeginTimestamp";
+    private static final String END_TIMESTAMP = PREFIX + "EndTimestamp";
+    private static final String ELAPSED_TIME = PREFIX + "ElapsedTime";
+    private static final String STATUS_CODE = PREFIX + "StatusCode";
+    private static final String RESPONSE_CODE = PREFIX + "ResponseCode";
+    private static final String RESPONSE_DESCRIPTION = PREFIX + "ResponsDescription";
+    private static final String CLIENT_IP_ADDRESS = PREFIX + "ClientIpAddress";
+
+    //The specified format presents time in UTC formatted per ISO 8601, as required by ONAP logging guidelines
+    private final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
     private final org.slf4j.Logger logger;
 
     SLF4JLoggerWrapper(Class<?> clazz) {
@@ -76,28 +93,43 @@
     }
 
     @Override
-    public void audit(String msg) {
-        logger.info(Markers.AUDIT, msg);
-    }
+    public void audit(AuditData data) {
 
-    @Override
-    public void audit(String msg, Object arg) {
-        logger.info(Markers.AUDIT, msg, arg);
-    }
+        if (data == null) {
+            return;
+        }
 
-    @Override
-    public void audit(String msg, Object arg1, Object arg2) {
-        logger.info(Markers.AUDIT, msg, arg1, arg2);
-    }
+        MDC.put(BEGIN_TIMESTAMP, DATE_FORMAT.format(new Date(data.getStartTime())));
+        MDC.put(END_TIMESTAMP,   DATE_FORMAT.format(new Date(data.getEndTime())));
+        MDC.put(ELAPSED_TIME,    String.valueOf(data.getEndTime() - data.getStartTime()));
 
-    @Override
-    public void audit(String msg, Object... arguments) {
-        logger.info(Markers.AUDIT, msg, arguments);
-    }
+        if (data.getStatusCode() != null) {
+            MDC.put(STATUS_CODE, data.getStatusCode() == AuditData.StatusCode.COMPLETE ? "COMPLETE" : "ERROR");
+        }
 
-    @Override
-    public void audit(String msg, Throwable t) {
-        logger.info(Markers.AUDIT, msg, t);
+        if (data.getResponseCode() != null) {
+            MDC.put(RESPONSE_CODE, data.getResponseCode());
+        }
+
+        if (data.getResponseDescription() != null) {
+            MDC.put(RESPONSE_DESCRIPTION, data.getResponseDescription());
+        }
+
+        if (data.getClientIpAddress() != null) {
+            MDC.put(CLIENT_IP_ADDRESS, data.getClientIpAddress());
+        }
+
+        try {
+            logger.info(Markers.AUDIT, "");
+        } finally {
+            MDC.remove(BEGIN_TIMESTAMP);
+            MDC.remove(END_TIMESTAMP);
+            MDC.remove(ELAPSED_TIME);
+            MDC.remove(STATUS_CODE);
+            MDC.remove(RESPONSE_CODE);
+            MDC.remove(RESPONSE_DESCRIPTION);
+            MDC.remove(CLIENT_IP_ADDRESS);
+        }
     }
 
     @Override
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java
index d2fb0b0..86b2297 100644
--- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/main/java/org/openecomp/sdc/logging/slf4j/SLF4JLoggingServiceProvider.java
@@ -1,12 +1,12 @@
 /*
- * Copyright © 2016-2017 European Support Limited
+ * Copyright © 2016-2018 European Support Limited
  *
  * 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.
@@ -16,20 +16,25 @@
 
 package org.openecomp.sdc.logging.slf4j;
 
+import java.util.Objects;
+import java.util.concurrent.Callable;
 import org.openecomp.sdc.logging.api.Logger;
 import org.openecomp.sdc.logging.spi.LoggingServiceProvider;
 import org.slf4j.MDC;
 
-import java.util.Objects;
-import java.util.concurrent.Callable;
-
 /**
  * @author evitaliy
  * @since 13/09/2016.
  */
 public class SLF4JLoggingServiceProvider implements LoggingServiceProvider {
 
+    public static final String PREFIX = "";
     private static final String KEY_CANNOT_BE_NULL = "Key cannot be null";
+    private static final String REQUEST_ID = PREFIX + "RequestId";
+    private static final String SERVICE_NAME = PREFIX + "ServiceName";
+    private static final String PARTNER_NAME = PREFIX + "PartnerName";
+
+    private static final String[] ALL_FIELDS = { REQUEST_ID, SERVICE_NAME, PARTNER_NAME };
 
     @Override
     public Logger getLogger(String className) {
@@ -69,12 +74,14 @@
     @Override
     public Runnable copyToRunnable(Runnable runnable) {
         Objects.requireNonNull(runnable, "Runnable cannot be null");
+        // TODO: Copy only the fields this service is responsible for
         return new MDCRunnableWrapper(runnable);
     }
 
     @Override
     public <V> Callable<V> copyToCallable(Callable<V> callable) {
         Objects.requireNonNull(callable, "Runnable cannot be null");
+        // TODO: Copy only the fields this service is responsible for
         return new MDCCallableWrapper<>(callable);
     }
 
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/LogFileCreationTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/LogFileCreationTest.java
new file mode 100644
index 0000000..4595e56
--- /dev/null
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/LogFileCreationTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright © 2016-2018 European Support Limited
+ *
+ * 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.
+ */
+
+package org.openecomp.sdc.logging;
+
+import org.openecomp.sdc.logging.api.AuditData;
+import org.openecomp.sdc.logging.api.Logger;
+import org.openecomp.sdc.logging.api.LoggerFactory;
+import org.testng.annotations.Test;
+
+public class LogFileCreationTest {
+    private static final boolean ENABLED = false; // for manual testing change to 'true'
+    private static final Logger LOGGER = LoggerFactory.getLogger(LogFileCreationTest.class);
+
+    @Test(enabled = ENABLED)
+    public void testMetrics() {
+        LOGGER.metrics("This is metrics");
+    }
+
+    @Test(enabled = ENABLED)
+    public void testAudit() {
+        SpyAuditData auditData = new SpyAuditData();
+        LOGGER.audit(auditData);
+    }
+
+    @Test(enabled = ENABLED)
+    public void testDebug() {
+        LOGGER.debug("This is debug");
+    }
+
+    @Test(enabled = ENABLED)
+    public void testInfo() {
+        LOGGER.info("This is info");
+    }
+
+    @Test(enabled = ENABLED)
+    public void testWarn() {
+        LOGGER.warn("This is warning");
+    }
+
+    @Test(enabled = ENABLED)
+    public void testError() {
+        LOGGER.error("This is error");
+    }
+
+    private class SpyAuditData implements AuditData {
+        @Override
+        public long getStartTime() {
+
+            return 0;
+
+        }
+
+        @Override
+        public long getEndTime(){
+
+            return 0;
+        }
+
+        @Override
+        public StatusCode getStatusCode(){
+
+            return null;
+
+        }
+
+        @Override
+        public String getResponseCode(){
+
+            return null;
+
+        }
+
+        @Override
+        public String getResponseDescription(){
+
+            return null;
+
+        }
+
+        @Override
+        public String getClientIpAddress(){
+
+            return null;
+
+        }
+    }
+}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/api/LoggerTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/api/LoggerTest.java
deleted file mode 100644
index 1359a1f..0000000
--- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/api/LoggerTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright © 2016-2017 European Support Limited
- *
- * 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.
- */
-
-package org.openecomp.sdc.logging.api;
-
-import org.testng.annotations.Test;
-
-/**
- * This is only for manual testing - change {@link #ENABLED} to 'true'
- *
- * @author evitaliy
- * @since 13/09/2016.
- */
-public class LoggerTest {
-
-    private static final boolean ENABLED = false; // for manual testing change to 'true'
-    private static final Logger LOGGER = LoggerFactory.getLogger(LoggerTest.class);
-
-    @Test(enabled = ENABLED)
-    public void testMetrics() {
-        LOGGER.metrics("This is metrics");
-    }
-
-    @Test(enabled = ENABLED)
-    public void testAudit() {
-        LOGGER.audit("This is audit");
-    }
-
-    @Test(enabled = ENABLED)
-    public void testDebug() {
-        LOGGER.debug("This is debug");
-    }
-
-    @Test(enabled = ENABLED)
-    public void testInfo() {
-        LOGGER.info("This is info");
-    }
-
-    @Test(enabled = ENABLED)
-    public void testWarn() {
-        LOGGER.warn("This is warning");
-    }
-
-    @Test(enabled = ENABLED)
-    public void testError() {
-        LOGGER.error("This is error");
-    }
-}
diff --git a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/aspects/MetricsAspectTest.java b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/aspects/MetricsAspectTest.java
index 42cbdce..4d3d6be 100644
--- a/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/aspects/MetricsAspectTest.java
+++ b/openecomp-be/lib/openecomp-sdc-logging-lib/openecomp-sdc-logging-core/src/test/java/org/openecomp/sdc/logging/aspects/MetricsAspectTest.java
@@ -21,6 +21,7 @@
 import org.aspectj.lang.reflect.SourceLocation;
 import org.aspectj.runtime.internal.AroundClosure;
 import org.easymock.EasyMock;
+import org.openecomp.sdc.logging.api.AuditData;
 import org.openecomp.sdc.logging.api.Logger;
 import org.openecomp.sdc.logging.api.LoggerFactory;
 import org.powermock.api.easymock.PowerMock;
@@ -296,27 +297,7 @@
     }
 
     @Override
-    public void audit(String var1) {
-      throw new RuntimeException("Not implemented");
-    }
-
-    @Override
-    public void audit(String var1, Object var2) {
-      throw new RuntimeException("Not implemented");
-    }
-
-    @Override
-    public void audit(String var1, Object var2, Object var3) {
-      throw new RuntimeException("Not implemented");
-    }
-
-    @Override
-    public void audit(String var1, Object... var2) {
-      throw new RuntimeException("Not implemented");
-    }
-
-    @Override
-    public void audit(String var1, Throwable throwable) {
+    public void audit(AuditData var1) {
       throw new RuntimeException("Not implemented");
     }