Initial OpenECOMP SDC commit
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / auditing / impl / AuditingLogFormatUtil.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.openecomp.sdc.be.auditing.impl;
22
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.EnumMap;
26 import java.util.Formatter;
27 import java.util.Locale;
28
29 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
30 import org.openecomp.sdc.common.api.Constants;
31 import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34 import org.slf4j.Marker;
35 import org.slf4j.MarkerFactory;
36
37 public class AuditingLogFormatUtil {
38
39         // When adding any new fields here, please keep the convention <fieldName>=
40         // <value>, with the space between them.
41         private static Logger log = LoggerFactory.getLogger(AuditingLogFormatUtil.class.getName());
42
43         // This is the key by which audit marker is recognized in logback.xml
44         private static String AUDIT_MARKER_STR = "AUDIT_MARKER";
45
46         public static Marker auditMarker = MarkerFactory.getMarker(AUDIT_MARKER_STR);
47
48         protected static void logAuditEvent(EnumMap<AuditingFieldsKeysEnum, Object> auditingFields) {
49
50                 StringBuilder sb = new StringBuilder();
51                 Formatter formatter = new Formatter(sb, Locale.US);
52                 log.trace("logAuditEvent - start");
53
54                 try {
55
56                         // Common fields
57                         String modifier = getModifier((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_MODIFIER_NAME), (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID));
58                         Object statusObj = auditingFields.get(AuditingFieldsKeysEnum.AUDIT_STATUS);
59                         String status = null;
60                         if (statusObj != null) {
61                                 status = String.valueOf(statusObj);
62                         }
63                         String desc = (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_DESC);
64                         String action = (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_ACTION);
65
66                         AuditingActionEnum auditEventType = AuditingActionEnum.getActionByName(action);
67                         StringBuilder formattedEvent = getFormattedEvent(auditingFields, modifier, status, desc, action, auditEventType);
68                         String formattedString = formattedEvent.toString();
69
70                         // This is the only way to fix DE166225 without major refactoring,
71                         // after it was previously agreed with Ella that activity type will
72                         // be the method name.
73
74                         if (auditEventType.equals(AuditingActionEnum.AUTH_REQUEST)) {
75                                 HttpRequestAuthentication(formattedString);
76                         } else {
77                                 log.info(auditMarker, formattedString);
78                         }
79                 } catch (Exception e) {
80                         log.debug("unexpected error occurred: {} {}", e.getMessage(), e);
81
82                 } finally {
83                         formatter.close();
84                         log.trace("logAuditEvent - end");
85                 }
86
87         }
88
89         private static void HttpRequestAuthentication(String formattedString) {
90                 log.info(auditMarker, formattedString);
91         }
92
93         private static StringBuilder getFormattedEvent(EnumMap<AuditingFieldsKeysEnum, Object> auditingFields, String modifier, String status, String desc, String action, AuditingActionEnum auditEventType) {
94
95                 StringBuilder formattedString = new StringBuilder();
96
97                 switch (auditEventType) {
98                 case ADD_USER:
99                 case DELETE_USER:
100                 case UPDATE_USER:
101                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.USER_ADMIN_TEMPLATE_ARRAY, auditingFields);
102
103                         break;
104                 case USER_ACCESS:
105                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.USER_ACCESS_TEMPLATE_ARRAY, auditingFields);
106                         break;
107                 case DISTRIBUTION_REGISTER:
108                 case DISTRIBUTION_UN_REGISTER:
109                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.DISTRIBUTION_REGISTRATION_TEMPLATE_ARRAY, auditingFields);
110                         break;
111                 case UPDATE_RESOURCE_METADATA:
112                 case CREATE_RESOURCE:
113                 case IMPORT_RESOURCE:
114                         ArrayList<AuditingFieldsKeysEnum> createResourceList = new ArrayList(Arrays.asList(AuditingLogFormatConstants.CREATE_RESOURCE_TEMPLATE_PREFIX_ARRAY));
115                         createResourceList.addAll(Arrays.asList(AuditingLogFormatConstants.CREATE_RESOURCE_TEMPLATE_SUFFIX_ARRAY));
116                         if (auditEventType == AuditingActionEnum.IMPORT_RESOURCE) {
117                                 createResourceList.add(AuditingFieldsKeysEnum.AUDIT_RESOURCE_TOSCA_NODE_TYPE);
118                         }
119                         AuditingFieldsKeysEnum[] createResourceArray = new AuditingFieldsKeysEnum[100];
120                         createResourceArray = createResourceList.toArray(createResourceArray);
121                         formattedString = buildStringAccrodingToArray(createResourceArray, auditingFields);
122                         break;
123                 case CHECKIN_RESOURCE:
124                 case CHECKOUT_RESOURCE:
125                 case UNDO_CHECKOUT_RESOURCE:
126                 case CERTIFICATION_REQUEST_RESOURCE:
127                 case START_CERTIFICATION_RESOURCE:
128                 case CERTIFICATION_SUCCESS_RESOURCE:
129                 case FAIL_CERTIFICATION_RESOURCE:
130                 case CANCEL_CERTIFICATION_RESOURCE:
131                         ArrayList<AuditingFieldsKeysEnum> checkinFieldsList = new ArrayList(Arrays.asList(AuditingLogFormatConstants.CREATE_RESOURCE_TEMPLATE_PREFIX_ARRAY));
132                         checkinFieldsList.add(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT);
133                         checkinFieldsList.addAll(Arrays.asList(AuditingLogFormatConstants.CREATE_RESOURCE_TEMPLATE_SUFFIX_ARRAY));
134                         AuditingFieldsKeysEnum[] checkinFieldsArray = new AuditingFieldsKeysEnum[100];
135                         checkinFieldsArray = checkinFieldsList.toArray(checkinFieldsArray);
136                         String comment = (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT);
137                         if (comment == null || comment.equals(Constants.NULL_STRING)) {
138                                 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_RESOURCE_COMMENT, Constants.EMPTY_STRING);
139                         }
140                         formattedString = buildStringAccrodingToArray(checkinFieldsArray, auditingFields);
141                         break;
142                 case ARTIFACT_UPLOAD:
143                 case ARTIFACT_DELETE:
144                 case ARTIFACT_METADATA_UPDATE:
145                 case ARTIFACT_PAYLOAD_UPDATE:
146                 case ARTIFACT_DOWNLOAD:
147                         ArrayList<AuditingFieldsKeysEnum> artifactFieldsList = new ArrayList(Arrays.asList(AuditingLogFormatConstants.CREATE_RESOURCE_TEMPLATE_PREFIX_ARRAY));
148                         artifactFieldsList.add(AuditingFieldsKeysEnum.AUDIT_PREV_ARTIFACT_UUID);
149                         artifactFieldsList.add(AuditingFieldsKeysEnum.AUDIT_CURR_ARTIFACT_UUID);
150                         artifactFieldsList.add(AuditingFieldsKeysEnum.AUDIT_ARTIFACT_DATA);
151                         artifactFieldsList.addAll(Arrays.asList(AuditingLogFormatConstants.CREATE_RESOURCE_TEMPLATE_SUFFIX_ARRAY));
152                         artifactFieldsList.addAll(Arrays.asList(AuditingLogFormatConstants.EXTERNAL_DOWNLOAD_ARTIFACT_ARRAY));
153                         AuditingFieldsKeysEnum[] artifactFieldsArray = new AuditingFieldsKeysEnum[100];
154                         artifactFieldsArray = artifactFieldsList.toArray(artifactFieldsArray);
155                         formattedString = buildStringAccrodingToArray(artifactFieldsArray, auditingFields);
156                         break;
157                 case DOWNLOAD_ARTIFACT:
158                         ArrayList<AuditingFieldsKeysEnum> downloadArtifactFieldsList = new ArrayList(Arrays.asList(AuditingLogFormatConstants.EXTERNAL_DOWNLOAD_ARTIFACT_ARRAY));
159                         AuditingFieldsKeysEnum[] downloadArtifactFieldsArray = new AuditingFieldsKeysEnum[100];
160                         artifactFieldsArray = downloadArtifactFieldsList.toArray(downloadArtifactFieldsArray);
161                         formattedString = buildStringAccrodingToArray(artifactFieldsArray, auditingFields);
162                         break;
163                 case DISTRIBUTION_STATE_CHANGE_REQUEST:
164                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.ACTIVATE_DISTRIBUTION_ARRAY, auditingFields);
165                         break;
166                 case DISTRIBUTION_STATE_CHANGE_APPROV:
167                 case DISTRIBUTION_STATE_CHANGE_REJECT:
168                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.CHANGE_DISTRIBUTION_STATUS_ARRAY, auditingFields);
169                         break;
170                 case CREATE_DISTRIBUTION_TOPIC:
171                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.CREATE_TOPIC_TEMPLATE_ARRAY, auditingFields);
172                         break;
173                 case ADD_KEY_TO_TOPIC_ACL:
174                 case REMOVE_KEY_FROM_TOPIC_ACL:
175                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.ADD_REMOVE_TOPIC_KEY_ACL_TEMPLATE_ARRAY, auditingFields);
176                         break;
177                 case DISTRIBUTION_STATUS:
178                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.DISTRIBUTION_STATUS_TEMPLATE_ARRAY, auditingFields);
179                         break;
180                 case DISTRIBUTION_NOTIFY:
181                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.DISTRIBUTION_NOTIFY_ARRAY, auditingFields);
182                         break;
183                 case DISTRIBUTION_DEPLOY:
184                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.DISTRIBUTION_DEPLOY_ARRAY, auditingFields);
185                         break;
186                 case GET_UEB_CLUSTER:
187                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.GET_UEB_CLUSTER_ARRAY, auditingFields);
188                         break;
189                 case DISTRIBUTION_ARTIFACT_DOWNLOAD:
190                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.DISTRIBUTION_DOWNLOAD_TEMPLATE_ARRAY, auditingFields);
191                         break;
192                 case AUTH_REQUEST:
193                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.AUTH_TEMPLATE_ARRAY, auditingFields);
194                         break;
195                 case ADD_ECOMP_USER_CREDENTIALS:
196                 case GET_ECOMP_USER_CREDENTIALS:
197                 case DELETE_ECOMP_USER_CREDENTIALS:
198                 case UPDATE_ECOMP_USER_CREDENTIALS:
199                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.ECOMP_USER_TEMPLATE_ARRAY, auditingFields);
200                         break;
201                 case ADD_CATEGORY:
202                 case ADD_SUB_CATEGORY:
203                 case ADD_GROUPING:
204                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.CATEGORY_TEMPLATE_ARRAY, auditingFields);
205                         break;
206                 case GET_USERS_LIST:
207                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.GET_USERS_LIST_TEMPLATE_ARRAY, auditingFields);
208                         break;
209                 case GET_CATEGORY_HIERARCHY:
210                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.GET_CATEGORY_HIERARCHY_TEMPLATE_ARRAY, auditingFields);
211                         break;
212                 case GET_ASSET_LIST:
213                 case GET_FILTERED_ASSET_LIST:
214                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.EXTERNAL_GET_ASSET_LIST_TEMPLATE_ARRAY, auditingFields);
215                         break;
216                 case GET_ASSET_METADATA:
217                 case GET_TOSCA_MODEL:
218                         formattedString = buildStringAccrodingToArray(AuditingLogFormatConstants.EXTERNAL_GET_ASSET_TEMPLATE_ARRAY, auditingFields);
219                         break;
220                 case ARTIFACT_UPLOAD_BY_API:
221                 case ARTIFACT_DELETE_BY_API:
222                 case ARTIFACT_UPDATE_BY_API:
223                         ArrayList<AuditingFieldsKeysEnum> uploadArtifactFieldsList = new ArrayList(Arrays.asList(AuditingLogFormatConstants.EXTERNAL_CRUD_API_ARTIFACT_ARRAY));
224                         AuditingFieldsKeysEnum[] uploadArtifactFieldsArray = new AuditingFieldsKeysEnum[100];
225                         artifactFieldsArray = uploadArtifactFieldsList.toArray(uploadArtifactFieldsArray);
226                         formattedString = buildStringAccrodingToArray(artifactFieldsArray, auditingFields);
227                         break;
228                 default:
229                         break;
230                 }
231
232                 return formattedString;
233         }
234
235         private static StringBuilder buildStringAccrodingToArray(AuditingFieldsKeysEnum[] sortedFieldsArray, EnumMap<AuditingFieldsKeysEnum, Object> auditingFields) {
236                 StringBuilder formattedString = new StringBuilder();
237                 for (int i = 0; i < sortedFieldsArray.length; i++) {
238                         AuditingFieldsKeysEnum key = sortedFieldsArray[i];
239
240                         Object fieldVal = auditingFields.get(key);
241                         if (fieldVal != null) {
242                                 formattedString.append(key.getDisplayName()).append(" = \"").append(fieldVal).append("\"");
243                                 if (i < sortedFieldsArray.length - 1) {
244                                         formattedString.append(" ");
245                                 }
246                         }
247                 }
248                 return formattedString;
249         }
250
251         protected static String getModifier(String modifierName, String modifierUid) {
252                 if (modifierUid == null || modifierUid.equals(Constants.EMPTY_STRING)) {
253                         return Constants.EMPTY_STRING;
254                 }
255                 StringBuilder sb = new StringBuilder();
256                 if (modifierName != null) {
257                         sb.append(modifierName);
258                 }
259                 sb.append("(").append(modifierUid).append(")");
260                 return sb.toString();
261         }
262
263         protected static String getUser(String userData) {
264                 StringBuilder sb = new StringBuilder();
265                 sb.append(userData);
266                 return sb.toString();
267         }
268 }