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

info.mikaelsvensson.devtools.analysis.shared.AbstractLog Maven / Gradle / Ivy

/*
 * Copyright 2014 Mikael Svensson
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */

package info.mikaelsvensson.devtools.analysis.shared;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.math3.stat.descriptive.rank.Percentile;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class AbstractLog {
    private static final int MILLISECONDS_IN_MINUTE = 60 * 1000;
    protected List samples = new ArrayList();
    protected Date firstSampleDate = null;
    protected Date lastSampleDate = null;
    protected int minutesBetweenSessions;

    public AbstractLog()
    {
    }

    public AbstractLog(int minutesBetweenSessions)
    {
        this.minutesBetweenSessions = minutesBetweenSessions;
    }

    public static  int count(Collection samples, SampleFilter filter) {
        int count = 0;
        for (T sample : samples) {
            if (filter == null || filter.accepts(sample)) {
                count++;
            }
        }
        return count;
    }

    public static  int calculateMax(Collection samples) {
        int max = 0;
        for (T sample : samples) {
            max = sample.getResponseTime() > max ? sample.getResponseTime() : max;
        }
        return max;
    }

    public static  Date getLatestDate(Collection samples) {
        Date max = null;
        for (T sample : samples) {
            max = max == null || sample.getTimeStamp().after(max) ? sample.getTimeStamp() : max;
        }
        return max;
    }
    public static  Date getEarliestDate(Collection samples) {
        Date min = null;
        for (T sample : samples) {
            min = min == null || sample.getTimeStamp().before(min) ? sample.getTimeStamp() : min;
        }
        return min;
    }

    public static  int calculateMin(Collection samples) {
        int min = Integer.MAX_VALUE;
        for (T sample : samples) {
            min = sample.getResponseTime() < min ? sample.getResponseTime() : min;
        }
        return min;
    }

    public static  int calculateAverage(Collection samples) {
        return Math.round(calculateSum(samples) / samples.size());
    }

    public static  long calculateSum(Collection samples) {
        long sum = 0;
        for (T sample : samples) {
            sum += sample.getResponseTime();
        }
        return sum;
    }

    public static  double[] toDurationDoubles(Collection samples) {
        double[] responseTimes = new double[samples.size()];
        int x = 0;
        for (T sample : samples) {
            responseTimes[x++] = sample.getResponseTime();
        }
        return responseTimes;
    }

    public Date getFirstSampleDate() {
        return firstSampleDate;
    }

    public Date getLastSampleDate() {
        return lastSampleDate;
    }

    public Collection getSamples() {
        return samples;
    }

    public Map> getSamplesBy(SampleCollector sampleCollector) {
        return groupSamples(sampleCollector, samples);
    }

    protected Map> getSamplesBy(SampleGrouper sampleGrouper, SampleFilter sampleFilter) {
        return groupSamples(sampleGrouper, sampleFilter, samples);
    }

    public static  Map> groupSamples(SampleCollector sampleCollector, Collection samples) {
        return groupSamples(sampleCollector, sampleCollector, samples);
    }

    private static  Map> groupSamples(SampleGrouper sampleGrouper, SampleFilter sampleFilter, Collection samples)
    {
        Map> map = new TreeMap>();
        for (X sample : samples) {
            String groupName = sampleGrouper.getGroupName(sample);
            if (sampleFilter == null || sampleFilter.accepts(sample)) {
                if (!map.containsKey(groupName)) {
                    map.put(groupName, new LinkedList());
                }
                map.get(groupName).add(sample);
            }
        }
        return map;
    }

    public double[] getSampleDurations() {
        return toDurationDoubles(samples);
    }

    public Percentile getPercentileCalculator() {
        return getPercentileCalculator(samples);
    }

    public Percentile getPercentileCalculator(Collection samples) {
        double[] responseTimes = toDurationDoubles(samples);
        Arrays.sort(responseTimes);
        Percentile percentile = new Percentile();
        percentile.setData(responseTimes);
        return percentile;
    }

    protected Date parseDate(String value, SimpleDateFormat simpleDateFormat) {
        Date date = null;
        if (StringUtils.isNotEmpty(value)) {
            try {
                date = simpleDateFormat.parse(value);
            } catch (ParseException e) {
            }
        }
        return date;
    }

    public void sortSamples(Comparator comparator) {
        Collections.sort(samples, comparator);
    }

    protected void sortSamplesByTimeStamp() {
        Collections.sort(samples, new Comparator() {
            @Override
            public int compare(T o1, T o2) {
                final boolean isTimeStampSetForBothObjects = o1 != null && o1.getTimeStamp() != null && o2 != null && o2.getTimeStamp() != null;
                return isTimeStampSetForBothObjects ? o1.getTimeStamp().compareTo(o2.getTimeStamp()) : 0;
//                return o1.getTimeStamp().compareTo(o2.getTimeStamp());
            }
        });
    }

    protected void addSample(T sample)
    {
        samples.add(sample);
        Date timeStamp = sample.getTimeStamp();
        if (timeStamp != null)
        {
            if (null == firstSampleDate || firstSampleDate.after(timeStamp))
            {
                firstSampleDate = timeStamp;
            }
            if (null == lastSampleDate || lastSampleDate.before(timeStamp))
            {
                lastSampleDate = timeStamp;
            }
        }
    }

    protected void updateAllSampleSessionDates()
    {
        sortSamplesByTimeStamp();
        Date currentSessionDate = null;
        Date lastTime = null;
        for (T sample : samples)
        {
            Date currentDate = sample.getTimeStamp();
            if (lastTime == null || currentDate.getTime() - lastTime.getTime() > minutesBetweenSessions * MILLISECONDS_IN_MINUTE)
            {
                currentSessionDate = currentDate;
            }
            sample.setSessionDate(currentSessionDate);
            lastTime = currentDate;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy