/*
* 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 org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.db.client.TimeSeriesQueryResult;
import com.emc.storageos.db.client.model.Event;
/**
* Implementation of DB time series based query result for monitoring events
*/
public class MonitoringEventQueryResult implements TimeSeriesQueryResult<Event> {
final private Logger _logger = LoggerFactory
.getLogger(MonitoringEventQueryResult.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 events
*/
private EventMarshaller _marshaller;
/**
* the putput writer for serializing events
*/
private Writer _out;
/**
* Create new metering query results with max count
*
* @param out
* the writer for writing results one by one
* @param limit
* the maximum number of records to return, 0 for no limit
*/
MonitoringEventQueryResult(EventMarshaller marshaller, Writer out) {
_out = out;
_marshaller = marshaller;
}
@Override
public void data(Event data, long insertionTimeMs) {
_logger.debug("Event #{}", _resultsCount.get());
try {
if (!_stopStreaming) {
_marshaller.marshal(data, _out);
_resultsCount.incrementAndGet();
}
} catch (MarshallingExcetion e) {
_logger.error("Error during event marshaling", e);
_stopStreaming = true;
}
}
@Override
public void done() {
_logger.info("Query Result Size = {}", _resultsCount.get());
}
@Override
public void error(Throwable e) {
_logger.error("Error during query execution", e);
}
}