2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.openecomp.sdc.be.auditing.impl;
23 import org.openecomp.sdc.be.auditing.api.AuditEventFactory;
24 import org.openecomp.sdc.be.config.ConfigurationManager;
25 import org.openecomp.sdc.be.dao.api.ActionStatus;
26 import org.openecomp.sdc.be.dao.cassandra.AuditCassandraDao;
27 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
28 import org.openecomp.sdc.be.dao.impl.AuditingDao;
29 import org.openecomp.sdc.be.resources.data.auditing.AuditRecordFactory;
30 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
31 import org.openecomp.sdc.be.resources.data.auditing.AuditingGenericEvent;
32 import org.openecomp.sdc.common.api.Constants;
33 import org.openecomp.sdc.common.datastructure.AuditingFieldsKeysEnum;
34 import org.openecomp.sdc.common.util.ThreadLocalsHolder;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37 import org.springframework.stereotype.Component;
40 import java.util.Map.Entry;
43 public class AuditingManager {
45 private static final Logger log = LoggerFactory.getLogger(AuditingManager.class);
46 private final AuditingDao auditingDao;
47 private final AuditCassandraDao cassandraDao;
49 public AuditingManager(AuditingDao auditingDao, AuditCassandraDao cassandraDao) {
50 this.auditingDao = auditingDao;
51 this.cassandraDao = cassandraDao;
54 // TODO remove after completing refactoring
55 public String auditEvent(Map<AuditingFieldsKeysEnum, Object> auditingFields) {
58 boolean disableAudit = ConfigurationManager.getConfigurationManager().getConfiguration().isDisableAudit();
62 // Adding UUID from thread local
63 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_REQUEST_ID, ThreadLocalsHolder.getUuid());
65 Object status = auditingFields.get(AuditingFieldsKeysEnum.AUDIT_STATUS);
66 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_STATUS, String.valueOf(status));
68 // normalizing empty string values - US471661
69 normalizeEmptyAuditStringValues(auditingFields);
72 formatModifier(auditingFields);
75 formatUser(auditingFields);
78 msg = AuditingLogFormatUtil.logAuditEvent(auditingFields);
80 // Determining the type of the auditing data object
81 AuditingActionEnum actionEnum = AuditingActionEnum.getActionByName((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_ACTION));
82 log.info("audit event {} of type {}", actionEnum.getName(), actionEnum.getAuditingEsType());
83 ActionStatus addRecordStatus = auditingDao.addRecord(auditingFields, actionEnum.getAuditingEsType());
84 if (!addRecordStatus.equals(ActionStatus.OK)) {
85 log.warn("Failed to persist auditing event: {}", addRecordStatus);
88 AuditingGenericEvent recordForCassandra = AuditRecordFactory.createAuditRecord(auditingFields);
89 if (recordForCassandra != null) {
90 saveEventToCassandra(recordForCassandra);
93 } catch (Exception e) {
94 // Error during auditing shouldn't terminate flow
95 log.warn("Error during auditEvent: {}", e);
101 public String auditEvent(AuditEventFactory factory) {
102 if (ConfigurationManager.getConfigurationManager().getConfiguration().isDisableAudit()) {
105 AuditingGenericEvent event = factory.getDbEvent();
107 //TODO - change this call after EELF Audit stuff merge
108 String msg = factory.getLogMessage();
109 AuditingLogFormatUtil.logAuditEvent(msg);
111 //TODO - remove this method after we got rid of ES
112 saveEventToElasticSearch(factory, event);
113 saveEventToCassandra(event);
117 private void saveEventToCassandra(AuditingGenericEvent event) {
118 CassandraOperationStatus result = cassandraDao.saveRecord(event);
119 if (!result.equals(CassandraOperationStatus.OK)) {
120 log.warn("Failed to persist to cassandra auditing event: {}", result.name());
124 private void saveEventToElasticSearch(AuditEventFactory factory, AuditingGenericEvent event) {
125 ActionStatus addRecordStatus = auditingDao.addRecord(event, factory.getAuditingEsType());
126 if (!addRecordStatus.equals(ActionStatus.OK)) {
127 log.warn("Failed to persist auditing event: {}", addRecordStatus.name());
132 private void formatUser(Map<AuditingFieldsKeysEnum, Object> auditingFields) {
133 if (auditingFields.get(AuditingFieldsKeysEnum.AUDIT_USER_UID) != null) {
134 String userDetails = (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_USER_UID);
136 String user = AuditingLogFormatUtil.getUser(userDetails);
137 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_USER_UID, user);
141 private void formatModifier(Map<AuditingFieldsKeysEnum, Object> auditingFields) {
142 String modifier = AuditingLogFormatUtil.getModifier((String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_MODIFIER_NAME), (String) auditingFields.get(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID));
143 auditingFields.put(AuditingFieldsKeysEnum.AUDIT_MODIFIER_UID, modifier);
144 auditingFields.remove(AuditingFieldsKeysEnum.AUDIT_MODIFIER_NAME);
147 private void normalizeEmptyAuditStringValues(Map<AuditingFieldsKeysEnum, Object> auditingFields) {
148 for (Entry<AuditingFieldsKeysEnum, Object> auditingEntry : auditingFields.entrySet()) {
149 if (auditingEntry.getKey().getValueClass().equals(String.class)) {
150 String auditingValue = (String) auditingEntry.getValue();
151 boolean isEmpty = false;
152 if (auditingValue != null) {
153 String trimmedValue = auditingValue.trim();
154 if ((trimmedValue.equals(Constants.EMPTY_STRING)) || trimmedValue.equals(Constants.NULL_STRING) || trimmedValue.equals(Constants.DOUBLE_NULL_STRING)) {
162 auditingEntry.setValue(Constants.EMPTY_STRING);