/* * Copyright (c) 2012 EMC Corporation * All Rights Reserved */ package com.emc.storageos.api.service.impl.resource.utils; import java.io.Writer; import java.util.concurrent.atomic.AtomicLong; import com.emc.storageos.security.audit.AuditLogRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.TimeSeriesQueryResult; import com.emc.storageos.db.client.model.AuditLog; /** * Implementation of DB time series based query result for audit logs */ public class AuditLogQueryResult implements TimeSeriesQueryResult<AuditLog> { final private Logger _logger = LoggerFactory .getLogger(AuditLogQueryResult.class); private final AtomicLong _resultsCount = new AtomicLong(0); /** * indication of situation when streaming should be stopped */ boolean _stopStreaming = false; /** * the marshaller to be used for serializing audit logs */ private AuditLogMarshaller _marshaller; /** * the putput writer for serializing audit logs */ private Writer _out; /* * request contain the query parameter to filter out audit logs * */ private AuditLogRequest _request; /** * Create new auditlog query results with query filters * @param marshaller * auditlog marshaler * @param out * the writer for writing results one by one *@param auditLogFilter * the request contain the query filters */ AuditLogQueryResult(AuditLogMarshaller marshaller, Writer out, AuditLogRequest auditLogFilter) { _out = out; _marshaller = marshaller; _request = auditLogFilter; } @Override public void data(AuditLog data, long insertionTimeMs) { _logger.debug("AuditLog #{}", _resultsCount.get()); if (hasFilterOut(data)) { _logger.debug("Filter out the audit log {}",data); return ; } try { if (!_stopStreaming) { if (_marshaller.marshal(data, _out, _request.getKeyword())) { _resultsCount.incrementAndGet(); } } } catch (MarshallingExcetion e) { _logger.error("Error during auditlog marshaling", e); _stopStreaming = true; } } @Override public void done() { _logger.debug("Query Result Size = {}", _resultsCount.get()); } @Override public void error(Throwable e) { _logger.error("Error during query execution", e); } public void outputCount() { _logger.info("Query Result Size = {}", _resultsCount.get()); } private boolean filterByServiceType(AuditLog auditLog) { String sType = _request.getServiceType(); return (sType != null && !sType.isEmpty() && !sType.equalsIgnoreCase(auditLog.getServiceType())); } private boolean filterByUser(AuditLog auditLog) { String user = _request.getUser(); if (user == null || user.isEmpty()) return false; if (auditLog.getUserId() != null) { return (!user.equalsIgnoreCase(auditLog.getUserId().toString())); } return true; } private boolean filterByResult(AuditLog auditLog) { String result = _request.getResult(); return (result != null && !result.isEmpty() && !result.equalsIgnoreCase(auditLog.getOperationalStatus())); } private boolean hasFilterOut(AuditLog auditLog) { return filterByServiceType(auditLog) || filterByUser(auditLog) || filterByResult(auditLog); } }