/* * Copyright (c) 2012 EMC Corporation * All Rights Reserved */ package com.emc.storageos.api.service.impl.resource.utils; import java.io.Writer; import javax.ws.rs.core.MediaType; import com.emc.storageos.security.audit.AuditLogRequest; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.db.client.TimeSeriesMetadata; import com.emc.storageos.db.client.model.AuditLogTimeSeries; import com.emc.storageos.svcs.errorhandling.resources.APIException; import com.emc.storageos.api.service.impl.resource.utils.JSONAuditLogMarshaller; import com.emc.storageos.api.service.impl.resource.utils.XMLAuditLogMarshaller; import com.emc.storageos.api.service.impl.resource.utils.AuditLogQueryResult; /** * * An implementation of auditlog retriever from a dbClient * */ public class DbAuditLogRetriever extends AbstractDbRetriever implements AuditLogRetriever { private static final Logger log = LoggerFactory.getLogger(DbAuditLogRetriever.class); @Override public void getBulkAuditLogs(AuditLogRequest auditLogRequest, MediaType type, Writer writer) throws MarshallingExcetion { if (dbClient == null) { throw APIException.internalServerErrors.auditLogNoDb(); } AuditLogMarshaller marshaller = null; if (type.equals(MediaType.APPLICATION_XML_TYPE)) { marshaller = new XMLAuditLogMarshaller(); log.debug("Parser type: {}", type.toString()); } else if (type.equals(MediaType.APPLICATION_JSON_TYPE)) { marshaller = new JSONAuditLogMarshaller(); log.debug("Parser type: {}", type.toString()); } else if (type.equals(MediaType.TEXT_PLAIN_TYPE)) { marshaller = new TextAuditLogMarshaller(); log.debug("parser type: {}", type.toString()); } else { log.warn("unsupported type: {}, use XML", type.toString()); marshaller = new XMLAuditLogMarshaller(); } marshaller.setLang(auditLogRequest.getLanguage()); DateTime start = auditLogRequest.getStartTime(); DateTime end = auditLogRequest.getEndTime(); TimeSeriesMetadata.TimeBucket bucket = TimeSeriesMetadata.TimeBucket.HOUR; if (start.plusSeconds(59).isEqual(end.toInstant())){ bucket = TimeSeriesMetadata.TimeBucket.MINUTE; } AuditLogQueryResult result = new AuditLogQueryResult(marshaller, writer,auditLogRequest); marshaller.header(writer); log.info("Query time bucket {} to {}", start,end); for ( ; !start.isAfter(end.toInstant());start = start.plusHours(1)){ dbClient.queryTimeSeries(AuditLogTimeSeries.class, start, bucket, result, getThreadPool()); } result.outputCount(); marshaller.tailer(writer); } }