All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.taskurotta.service.metrics.handler.NumberDataHandler Maven / Gradle / Ivy

package ru.taskurotta.service.metrics.handler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.taskurotta.service.console.retriever.metrics.MetricsNumberDataRetriever;
import ru.taskurotta.service.metrics.MetricsDataUtils;
import ru.taskurotta.service.metrics.model.DataPointVO;
import ru.taskurotta.service.metrics.model.NumberDataRowVO;

import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Handler for metrics with simple numeric data. Stores and exposes data.
 * User: dimadin
 * Date: 25.10.13 10:30
 */
public class NumberDataHandler implements NumberDataListener, MetricsNumberDataRetriever {

    private static NumberDataHandler singleton;
    private Map dataHolder = new ConcurrentHashMap<>();
    private static final Logger logger = LoggerFactory.getLogger(NumberDataHandler.class);


    public static NumberDataHandler getInstance() {
        return singleton;
    }

    @PostConstruct
    public void init() {
        singleton = this;
    }

    @Override
    public void handleNumberData(String metricName, String datasetName, Number value, long currentTime, int maxPoints) {
        String holderKey = MetricsDataUtils.getKey(metricName, datasetName);

        NumberDataRowVO dataRow = dataHolder.get(holderKey);
        if(dataRow == null) {
            synchronized (dataHolder) {
                dataRow = dataHolder.get(holderKey);
                if(dataRow == null) {
                    dataRow = new NumberDataRowVO(maxPoints, metricName, datasetName);
                    dataHolder.put(holderKey, dataRow);
                }
            }
        }

        int position = dataRow.populate(value, currentTime);

        logger.debug("Handled [{}] data for position [{}], metric[{}], dataset[{}], value[{}], measurementTime[{}]", value.getClass(), position, metricName, datasetName, value, currentTime);

    }

    @Override
    public Collection getNumberMetricNames() {
        Set result = new HashSet<>();
        for (NumberDataRowVO value: dataHolder.values()) {
            result.add(value.getMetricsName());
        }
        return result;
    }

    @Override
    public Collection getNumberDataSets(String metricName) {
        Set result = new HashSet<>();
        for (NumberDataRowVO value: dataHolder.values()) {
            if (value.getMetricsName().equals(metricName)) {
                result.add(value.getDataSetName());
            }
        }
        return result;
    }

    @Override
    public DataPointVO[] getData(String metricName, String datasetName) {
        DataPointVO[] result = null;
        NumberDataRowVO value = dataHolder.get(MetricsDataUtils.getKey(metricName, datasetName));
        if (value != null) {
            result = value.getCurrentData();
        }

        return result;
    }

    @Override
    public Date getLastActivityTime(String metricName, String datasetName) {
        Date result = null;
        NumberDataRowVO value = dataHolder.get(MetricsDataUtils.getKey(metricName, datasetName));
        if (value != null) {
            result = new Date(value.getLatestActivity());
        }
        return result;
    }

    @Override
    public Number getLastValue(String metricName, String datasetName) {
        Number result = null;
        NumberDataRowVO value = dataHolder.get(MetricsDataUtils.getKey(metricName, datasetName));
        if (value != null) {
            DataPointVO[] data = value.getCurrentData();
            if (data!=null && data.length>0) {
                MetricsDataUtils.sortDataSet(data);
                result = data[data.length-1].getValue();
            }
        }
        logger.debug("Last value for metric[{}], dataset[{}] is [{}]", metricName, datasetName, result);
        return result;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy