/* * Copyright (c) 2013-2015 mgm technology partners GmbH * * 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 com.mgmtp.perfload.perfalyzer.reportpreparation; import static com.google.common.collect.Lists.newArrayListWithExpectedSize; import java.util.Collections; import java.util.List; import org.jfree.data.DomainOrder; import org.jfree.data.general.AbstractSeriesDataset; import org.jfree.data.xy.IntervalXYDataset; import org.jfree.data.xy.IntervalXYDelegate; import org.jfree.data.xy.XYDataset; /** * {@link XYDataset} implementation for lists of lists of Double objects. * * @author rnaegele */ public class NumberDataSet extends AbstractSeriesDataset implements IntervalXYDataset { private final List<NameSeriesWrapper> seriesList = newArrayListWithExpectedSize(5); private final IntervalXYDelegate intervalDelegate = new IntervalXYDelegate(this); /** * Adds a series to the dataset. * * @param name the series name * @param series the seris data */ public void addSeries(final String name, final List<SeriesPoint> series) { seriesList.add(new NameSeriesWrapper(name, series)); } public void addSeriesPoint(final String name, final SeriesPoint point) { for (NameSeriesWrapper wrapper : seriesList) { if (wrapper.name.equals(name)) { List<SeriesPoint> seriesPoints = wrapper.series; seriesPoints.add(point); return; } } List<SeriesPoint> seriesPoints = newArrayListWithExpectedSize(100); seriesPoints.add(point); NameSeriesWrapper wrapper = new NameSeriesWrapper(name, seriesPoints); seriesList.add(wrapper); } public boolean isEmpty() { for (NameSeriesWrapper wrapper : seriesList) { if (!wrapper.series.isEmpty()) { return false; } } return true; } /** * Sorts the list of series by their name. */ public void sortSeries() { Collections.sort(seriesList); } @Override public DomainOrder getDomainOrder() { return DomainOrder.NONE; } @Override public int getItemCount(final int series) { return seriesList.get(series).series.size(); } @Override public Number getX(final int series, final int item) { return seriesList.get(series).series.get(item).getX(); } @Override public double getXValue(final int series, final int item) { return getX(series, item).doubleValue(); } @Override public Number getY(final int series, final int item) { return seriesList.get(series).series.get(item).getY(); } @Override public double getYValue(final int series, final int item) { return getY(series, item).doubleValue(); } @Override public int getSeriesCount() { return seriesList.size(); } @SuppressWarnings("rawtypes") @Override public Comparable<String> getSeriesKey(final int series) { return seriesList.get(series).name; } public static class SeriesPoint { private final Number x; private final Number y; public SeriesPoint(final Number x, final Number y) { this.x = x; this.y = y; } /** * @return the x */ public Number getX() { return x; } /** * @return the y */ public Number getY() { return y; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (x == null ? 0 : x.hashCode()); result = prime * result + (y == null ? 0 : y.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } SeriesPoint other = (SeriesPoint) obj; if (x == null) { if (other.x != null) { return false; } } else if (!x.equals(other.x)) { return false; } if (y == null) { if (other.y != null) { return false; } } else if (!y.equals(other.y)) { return false; } return true; } } /** * Wraps series and series name for sorting. * * @author rnaegele */ static class NameSeriesWrapper implements Comparable<NameSeriesWrapper> { String name; List<SeriesPoint> series; public NameSeriesWrapper(final String name, final List<SeriesPoint> series) { this.name = name; this.series = series; } @Override public int compareTo(final NameSeriesWrapper other) { return name.compareTo(other.name); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (name == null ? 0 : name.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } NameSeriesWrapper other = (NameSeriesWrapper) obj; if (name == null) { if (other.name != null) { return false; } } else if (!name.equals(other.name)) { return false; } return true; } } @Override public Number getStartX(final int series, final int item) { return intervalDelegate.getStartX(series, item); } @Override public double getStartXValue(final int series, final int item) { return intervalDelegate.getStartXValue(series, item); } @Override public Number getEndX(final int series, final int item) { return intervalDelegate.getEndX(series, item); } @Override public double getEndXValue(final int series, final int item) { return intervalDelegate.getEndXValue(series, item); } @Override public Number getStartY(final int series, final int item) { return getY(series, item); } @Override public double getStartYValue(final int series, final int item) { return getYValue(series, item); } @Override public Number getEndY(final int series, final int item) { return getY(series, item); } @Override public double getEndYValue(final int series, final int item) { return getYValue(series, item); } }